LongAnam commited on
Commit
81dbb71
·
1 Parent(s): 2525193

initialize

Browse files
Files changed (20) hide show
  1. .github/workflows/deploy.yaml +9 -0
  2. .github/workflows/test.yaml +7 -0
  3. .gitignore +144 -0
  4. IP1.jpg +0 -0
  5. IP2.jpg +0 -0
  6. IVP1.jpg +0 -0
  7. IVP2.jpg +0 -0
  8. LICENSE +201 -0
  9. MANIFEST.in +5 -0
  10. Noise1.jpg +0 -0
  11. Noise2.jpg +0 -0
  12. _quarto.yml +37 -0
  13. ap.ipynb +429 -0
  14. app.py +27 -0
  15. export.pkl +3 -0
  16. index.ipynb +96 -0
  17. requirements.txt +3 -0
  18. settings.ini +45 -0
  19. setup.py +57 -0
  20. styles.css +18 -0
.github/workflows/deploy.yaml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ name: Deploy to GitHub Pages
2
+ on:
3
+ push:
4
+ branches: [ "main", "master" ]
5
+ workflow_dispatch:
6
+ jobs:
7
+ deploy:
8
+ runs-on: ubuntu-latest
9
+ steps: [uses: fastai/workflows/quarto-ghp@master]
.github/workflows/test.yaml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ name: CI
2
+ on: [workflow_dispatch, pull_request, push]
3
+
4
+ jobs:
5
+ test:
6
+ runs-on: ubuntu-latest
7
+ steps: [uses: fastai/workflows/nbdev-ci@master]
.gitignore ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _docs/
2
+
3
+ *.bak
4
+ .gitattributes
5
+ .last_checked
6
+ .gitconfig
7
+ *.bak
8
+ *.log
9
+ *~
10
+ ~*
11
+ _tmp*
12
+ tmp*
13
+ tags
14
+ *.pkg
15
+
16
+ # Byte-compiled / optimized / DLL files
17
+ __pycache__/
18
+ *.py[cod]
19
+ *$py.class
20
+
21
+ # C extensions
22
+ *.so
23
+
24
+ # Distribution / packaging
25
+ .Python
26
+ env/
27
+ build/
28
+ develop-eggs/
29
+ dist/
30
+ downloads/
31
+ eggs/
32
+ .eggs/
33
+ lib/
34
+ lib64/
35
+ parts/
36
+ sdist/
37
+ var/
38
+ wheels/
39
+ *.egg-info/
40
+ .installed.cfg
41
+ *.egg
42
+
43
+ # PyInstaller
44
+ # Usually these files are written by a python script from a template
45
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
46
+ *.manifest
47
+ *.spec
48
+
49
+ # Installer logs
50
+ pip-log.txt
51
+ pip-delete-this-directory.txt
52
+
53
+ # Unit test / coverage reports
54
+ htmlcov/
55
+ .tox/
56
+ .coverage
57
+ .coverage.*
58
+ .cache
59
+ nosetests.xml
60
+ coverage.xml
61
+ *.cover
62
+ .hypothesis/
63
+
64
+ # Translations
65
+ *.mo
66
+ *.pot
67
+
68
+ # Django stuff:
69
+ *.log
70
+ local_settings.py
71
+
72
+ # Flask stuff:
73
+ instance/
74
+ .webassets-cache
75
+
76
+ # Scrapy stuff:
77
+ .scrapy
78
+
79
+ # Sphinx documentation
80
+ docs/_build/
81
+
82
+ # PyBuilder
83
+ target/
84
+
85
+ # Jupyter Notebook
86
+ .ipynb_checkpoints
87
+
88
+ # pyenv
89
+ .python-version
90
+
91
+ # celery beat schedule file
92
+ celerybeat-schedule
93
+
94
+ # SageMath parsed files
95
+ *.sage.py
96
+
97
+ # dotenv
98
+ .env
99
+
100
+ # virtualenv
101
+ .venv
102
+ venv/
103
+ ENV/
104
+
105
+ # Spyder project settings
106
+ .spyderproject
107
+ .spyproject
108
+
109
+ # Rope project settings
110
+ .ropeproject
111
+
112
+ # mkdocs documentation
113
+ /site
114
+
115
+ # mypy
116
+ .mypy_cache/
117
+
118
+ .vscode
119
+ *.swp
120
+
121
+ # osx generated files
122
+ .DS_Store
123
+ .DS_Store?
124
+ .Trashes
125
+ ehthumbs.db
126
+ Thumbs.db
127
+ .idea
128
+
129
+ # pytest
130
+ .pytest_cache
131
+
132
+ # tools/trust-doc-nbs
133
+ docs_src/.last_checked
134
+
135
+ # symlinks to fastai
136
+ docs_src/fastai
137
+ tools/fastai
138
+
139
+ # link checker
140
+ checklink/cookies.txt
141
+
142
+ # .gitconfig is now autogenerated
143
+ .gitconfig
144
+
IP1.jpg ADDED
IP2.jpg ADDED
IVP1.jpg ADDED
IVP2.jpg ADDED
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2022, fastai
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
MANIFEST.in ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ include settings.ini
2
+ include LICENSE
3
+ include CONTRIBUTING.md
4
+ include README.md
5
+ recursive-exclude * __pycache__
Noise1.jpg ADDED
Noise2.jpg ADDED
_quarto.yml ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ ipynb-filters: [nbdev_filter]
3
+
4
+ project:
5
+ type: website
6
+ output-dir: _docs
7
+ preview:
8
+ port: 3000
9
+ browser: false
10
+
11
+ format:
12
+ html:
13
+ theme: cosmo
14
+ css: styles.css
15
+ toc: true
16
+
17
+ website:
18
+ title: "nbdev"
19
+ twitter-card: true
20
+ reader-mode: true
21
+ repo-branch: master
22
+ repo-url: https://github.com/fastai/nbdev
23
+ repo-actions: [issue]
24
+ navbar:
25
+ background: primary
26
+ search: true
27
+ left:
28
+ - text: Home
29
+ file: index.ipynb
30
+ right:
31
+ - icon: github
32
+ href: https://github.com/fastai/nbdev/
33
+ sidebar:
34
+ style: "floating"
35
+
36
+ metadata-files:
37
+ - sidebar.yml
ap.ipynb ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "#| default_exp app"
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 2,
15
+ "metadata": {},
16
+ "outputs": [
17
+ {
18
+ "name": "stderr",
19
+ "output_type": "stream",
20
+ "text": [
21
+ "/home/long_ng/anaconda3/envs/pytorch/lib/python3.9/site-packages/scipy/__init__.py:146: UserWarning: A NumPy version >=1.16.5 and <1.23.0 is required for this version of SciPy (detected version 1.23.1\n",
22
+ " warnings.warn(f\"A NumPy version >={np_minversion} and <{np_maxversion}\"\n"
23
+ ]
24
+ }
25
+ ],
26
+ "source": [
27
+ "#|export\n",
28
+ "from fastai.vision.all import *\n",
29
+ "from huggingface_hub import push_to_hub_fastai, from_pretrained_fastai\n",
30
+ "import gradio as gr"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": 11,
36
+ "metadata": {},
37
+ "outputs": [
38
+ {
39
+ "data": {
40
+ "image/png": "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",
41
+ "text/plain": [
42
+ "PILImage mode=RGB size=192x188"
43
+ ]
44
+ },
45
+ "execution_count": 11,
46
+ "metadata": {},
47
+ "output_type": "execute_result"
48
+ }
49
+ ],
50
+ "source": [
51
+ "im = PILImage.create('IP1.jpg')\n",
52
+ "im.thumbnail((192,192))\n",
53
+ "im"
54
+ ]
55
+ },
56
+ {
57
+ "cell_type": "code",
58
+ "execution_count": 5,
59
+ "metadata": {},
60
+ "outputs": [],
61
+ "source": [
62
+ "#|export\n",
63
+ "learner = load_learner('export.pkl')"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "code",
68
+ "execution_count": 8,
69
+ "metadata": {},
70
+ "outputs": [
71
+ {
72
+ "data": {
73
+ "text/html": [
74
+ "\n",
75
+ "<style>\n",
76
+ " /* Turns off some styling */\n",
77
+ " progress {\n",
78
+ " /* gets rid of default border in Firefox and Opera. */\n",
79
+ " border: none;\n",
80
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
81
+ " background-size: auto;\n",
82
+ " }\n",
83
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
84
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
85
+ " }\n",
86
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
87
+ " background: #F44336;\n",
88
+ " }\n",
89
+ "</style>\n"
90
+ ],
91
+ "text/plain": [
92
+ "<IPython.core.display.HTML object>"
93
+ ]
94
+ },
95
+ "metadata": {},
96
+ "output_type": "display_data"
97
+ },
98
+ {
99
+ "data": {
100
+ "text/html": [],
101
+ "text/plain": [
102
+ "<IPython.core.display.HTML object>"
103
+ ]
104
+ },
105
+ "metadata": {},
106
+ "output_type": "display_data"
107
+ },
108
+ {
109
+ "name": "stdout",
110
+ "output_type": "stream",
111
+ "text": [
112
+ "CPU times: user 799 ms, sys: 0 ns, total: 799 ms\n",
113
+ "Wall time: 94.7 ms\n"
114
+ ]
115
+ },
116
+ {
117
+ "data": {
118
+ "text/plain": [
119
+ "('Noise', TensorBase(2), TensorBase([2.0159e-12, 1.9818e-06, 1.0000e+00]))"
120
+ ]
121
+ },
122
+ "execution_count": 8,
123
+ "metadata": {},
124
+ "output_type": "execute_result"
125
+ }
126
+ ],
127
+ "source": [
128
+ "%time learner.predict(im)"
129
+ ]
130
+ },
131
+ {
132
+ "cell_type": "code",
133
+ "execution_count": 9,
134
+ "metadata": {},
135
+ "outputs": [],
136
+ "source": [
137
+ "#|export\n",
138
+ "categories = ('In-phase', 'Invert-Phase', 'Noise')\n",
139
+ "\n",
140
+ "def classify_image(img):\n",
141
+ " pred, idx, probs = learner.predict(img)\n",
142
+ " return dict(zip(categories, map(float, probs)))"
143
+ ]
144
+ },
145
+ {
146
+ "cell_type": "code",
147
+ "execution_count": 12,
148
+ "metadata": {},
149
+ "outputs": [
150
+ {
151
+ "data": {
152
+ "text/html": [
153
+ "\n",
154
+ "<style>\n",
155
+ " /* Turns off some styling */\n",
156
+ " progress {\n",
157
+ " /* gets rid of default border in Firefox and Opera. */\n",
158
+ " border: none;\n",
159
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
160
+ " background-size: auto;\n",
161
+ " }\n",
162
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
163
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
164
+ " }\n",
165
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
166
+ " background: #F44336;\n",
167
+ " }\n",
168
+ "</style>\n"
169
+ ],
170
+ "text/plain": [
171
+ "<IPython.core.display.HTML object>"
172
+ ]
173
+ },
174
+ "metadata": {},
175
+ "output_type": "display_data"
176
+ },
177
+ {
178
+ "data": {
179
+ "text/html": [],
180
+ "text/plain": [
181
+ "<IPython.core.display.HTML object>"
182
+ ]
183
+ },
184
+ "metadata": {},
185
+ "output_type": "display_data"
186
+ },
187
+ {
188
+ "data": {
189
+ "text/plain": [
190
+ "{'In-phase': 0.9999990463256836,\n",
191
+ " 'Invert-Phase': 9.950312005457818e-07,\n",
192
+ " 'Noise': 1.0946109574305751e-09}"
193
+ ]
194
+ },
195
+ "execution_count": 12,
196
+ "metadata": {},
197
+ "output_type": "execute_result"
198
+ }
199
+ ],
200
+ "source": [
201
+ "classify_image(im)"
202
+ ]
203
+ },
204
+ {
205
+ "cell_type": "code",
206
+ "execution_count": 13,
207
+ "metadata": {},
208
+ "outputs": [
209
+ {
210
+ "name": "stderr",
211
+ "output_type": "stream",
212
+ "text": [
213
+ "/home/long_ng/anaconda3/envs/pytorch/lib/python3.9/site-packages/gradio/inputs.py:256: UserWarning: Usage of gradio.inputs is deprecated, and will not be supported in the future, please import your component from gradio.components\n",
214
+ " warnings.warn(\n",
215
+ "/home/long_ng/anaconda3/envs/pytorch/lib/python3.9/site-packages/gradio/deprecation.py:40: UserWarning: `optional` parameter is deprecated, and it has no effect\n",
216
+ " warnings.warn(value)\n",
217
+ "/home/long_ng/anaconda3/envs/pytorch/lib/python3.9/site-packages/gradio/outputs.py:196: UserWarning: Usage of gradio.outputs is deprecated, and will not be supported in the future, please import your components from gradio.components\n",
218
+ " warnings.warn(\n",
219
+ "/home/long_ng/anaconda3/envs/pytorch/lib/python3.9/site-packages/gradio/deprecation.py:40: UserWarning: The 'type' parameter has been deprecated. Use the Number component instead.\n",
220
+ " warnings.warn(value)\n"
221
+ ]
222
+ },
223
+ {
224
+ "name": "stdout",
225
+ "output_type": "stream",
226
+ "text": [
227
+ "Running on local URL: http://127.0.0.1:7860/\n",
228
+ "\n",
229
+ "To create a public link, set `share=True` in `launch()`.\n"
230
+ ]
231
+ },
232
+ {
233
+ "data": {
234
+ "text/plain": [
235
+ "(<gradio.routes.App at 0x7f280164cfd0>, 'http://127.0.0.1:7860/', None)"
236
+ ]
237
+ },
238
+ "execution_count": 13,
239
+ "metadata": {},
240
+ "output_type": "execute_result"
241
+ },
242
+ {
243
+ "data": {
244
+ "text/html": [
245
+ "\n",
246
+ "<style>\n",
247
+ " /* Turns off some styling */\n",
248
+ " progress {\n",
249
+ " /* gets rid of default border in Firefox and Opera. */\n",
250
+ " border: none;\n",
251
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
252
+ " background-size: auto;\n",
253
+ " }\n",
254
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
255
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
256
+ " }\n",
257
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
258
+ " background: #F44336;\n",
259
+ " }\n",
260
+ "</style>\n"
261
+ ],
262
+ "text/plain": [
263
+ "<IPython.core.display.HTML object>"
264
+ ]
265
+ },
266
+ "metadata": {},
267
+ "output_type": "display_data"
268
+ },
269
+ {
270
+ "data": {
271
+ "text/html": [],
272
+ "text/plain": [
273
+ "<IPython.core.display.HTML object>"
274
+ ]
275
+ },
276
+ "metadata": {},
277
+ "output_type": "display_data"
278
+ },
279
+ {
280
+ "data": {
281
+ "text/html": [
282
+ "\n",
283
+ "<style>\n",
284
+ " /* Turns off some styling */\n",
285
+ " progress {\n",
286
+ " /* gets rid of default border in Firefox and Opera. */\n",
287
+ " border: none;\n",
288
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
289
+ " background-size: auto;\n",
290
+ " }\n",
291
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
292
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
293
+ " }\n",
294
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
295
+ " background: #F44336;\n",
296
+ " }\n",
297
+ "</style>\n"
298
+ ],
299
+ "text/plain": [
300
+ "<IPython.core.display.HTML object>"
301
+ ]
302
+ },
303
+ "metadata": {},
304
+ "output_type": "display_data"
305
+ },
306
+ {
307
+ "data": {
308
+ "text/html": [],
309
+ "text/plain": [
310
+ "<IPython.core.display.HTML object>"
311
+ ]
312
+ },
313
+ "metadata": {},
314
+ "output_type": "display_data"
315
+ },
316
+ {
317
+ "data": {
318
+ "text/html": [
319
+ "\n",
320
+ "<style>\n",
321
+ " /* Turns off some styling */\n",
322
+ " progress {\n",
323
+ " /* gets rid of default border in Firefox and Opera. */\n",
324
+ " border: none;\n",
325
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
326
+ " background-size: auto;\n",
327
+ " }\n",
328
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
329
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
330
+ " }\n",
331
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
332
+ " background: #F44336;\n",
333
+ " }\n",
334
+ "</style>\n"
335
+ ],
336
+ "text/plain": [
337
+ "<IPython.core.display.HTML object>"
338
+ ]
339
+ },
340
+ "metadata": {},
341
+ "output_type": "display_data"
342
+ },
343
+ {
344
+ "data": {
345
+ "text/html": [],
346
+ "text/plain": [
347
+ "<IPython.core.display.HTML object>"
348
+ ]
349
+ },
350
+ "metadata": {},
351
+ "output_type": "display_data"
352
+ },
353
+ {
354
+ "data": {
355
+ "text/html": [
356
+ "\n",
357
+ "<style>\n",
358
+ " /* Turns off some styling */\n",
359
+ " progress {\n",
360
+ " /* gets rid of default border in Firefox and Opera. */\n",
361
+ " border: none;\n",
362
+ " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
363
+ " background-size: auto;\n",
364
+ " }\n",
365
+ " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
366
+ " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
367
+ " }\n",
368
+ " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
369
+ " background: #F44336;\n",
370
+ " }\n",
371
+ "</style>\n"
372
+ ],
373
+ "text/plain": [
374
+ "<IPython.core.display.HTML object>"
375
+ ]
376
+ },
377
+ "metadata": {},
378
+ "output_type": "display_data"
379
+ },
380
+ {
381
+ "data": {
382
+ "text/html": [],
383
+ "text/plain": [
384
+ "<IPython.core.display.HTML object>"
385
+ ]
386
+ },
387
+ "metadata": {},
388
+ "output_type": "display_data"
389
+ }
390
+ ],
391
+ "source": [
392
+ "#|export\n",
393
+ "image = gr.inputs.Image(shape=(192,192))\n",
394
+ "label = gr.outputs.Label()\n",
395
+ "examples = ['IVP1.jpg','IVP2.jpg', 'IP1.jpg', 'IP2.jpg','Noise1.jpg', 'Noise2.jpg']\n",
396
+ "\n",
397
+ "intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n",
398
+ "intf.launch(inline=False)"
399
+ ]
400
+ }
401
+ ],
402
+ "metadata": {
403
+ "kernelspec": {
404
+ "display_name": "Python 3.9.12 ('pytorch')",
405
+ "language": "python",
406
+ "name": "python3"
407
+ },
408
+ "language_info": {
409
+ "codemirror_mode": {
410
+ "name": "ipython",
411
+ "version": 3
412
+ },
413
+ "file_extension": ".py",
414
+ "mimetype": "text/x-python",
415
+ "name": "python",
416
+ "nbconvert_exporter": "python",
417
+ "pygments_lexer": "ipython3",
418
+ "version": "3.9.12"
419
+ },
420
+ "orig_nbformat": 4,
421
+ "vscode": {
422
+ "interpreter": {
423
+ "hash": "116405ed73c8aa81284e79f7dbed5bb2183b3f2b3168f79d61a0664a2160e2ed"
424
+ }
425
+ }
426
+ },
427
+ "nbformat": 4,
428
+ "nbformat_minor": 2
429
+ }
app.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AUTOGENERATED! DO NOT EDIT! File to edit: ../ap.ipynb.
2
+
3
+ # %% auto 0
4
+ __all__ = ['learner', 'categories', 'image', 'label', 'examples', 'intf', 'classify_image']
5
+
6
+ # %% ../ap.ipynb 1
7
+ from fastai.vision.all import *
8
+ from huggingface_hub import push_to_hub_fastai, from_pretrained_fastai
9
+ import gradio as gr
10
+
11
+ # %% ../ap.ipynb 3
12
+ learner = load_learner('export.pkl')
13
+
14
+ # %% ../ap.ipynb 5
15
+ categories = ('In-phase', 'Invert-Phase', 'Noise')
16
+
17
+ def classify_image(img):
18
+ pred, idx, probs = learner.predict(img)
19
+ return dict(zip(categories, map(float, probs)))
20
+
21
+ # %% ../ap.ipynb 7
22
+ image = gr.inputs.Image(shape=(192,192))
23
+ label = gr.outputs.Label()
24
+ examples = ['IVP1.jpg','IVP2.jpg', 'IP1.jpg', 'IP2.jpg','Noise1.jpg', 'Noise2.jpg']
25
+
26
+ intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)
27
+ intf.launch(inline=False)
export.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:51d64d7df5fde01736bc84a108514ce744c6ff014b3d2b72e559165ff3693498
3
+ size 47017825
index.ipynb ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "#|hide\n",
10
+ "from PPG_classification.core import *"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "markdown",
15
+ "metadata": {},
16
+ "source": [
17
+ "# Project name here\n",
18
+ "\n",
19
+ "> Summary description here."
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "markdown",
24
+ "metadata": {},
25
+ "source": [
26
+ "This file will become your README and also the index of your documentation."
27
+ ]
28
+ },
29
+ {
30
+ "cell_type": "markdown",
31
+ "metadata": {},
32
+ "source": [
33
+ "## Install"
34
+ ]
35
+ },
36
+ {
37
+ "cell_type": "markdown",
38
+ "metadata": {},
39
+ "source": [
40
+ "```sh\n",
41
+ "pip install your_project_name\n",
42
+ "```"
43
+ ]
44
+ },
45
+ {
46
+ "cell_type": "markdown",
47
+ "metadata": {},
48
+ "source": [
49
+ "## How to use"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "markdown",
54
+ "metadata": {},
55
+ "source": [
56
+ "Fill me in please! Don't forget code examples:"
57
+ ]
58
+ },
59
+ {
60
+ "cell_type": "code",
61
+ "execution_count": null,
62
+ "metadata": {},
63
+ "outputs": [
64
+ {
65
+ "data": {
66
+ "text/plain": [
67
+ "2"
68
+ ]
69
+ },
70
+ "execution_count": null,
71
+ "metadata": {},
72
+ "output_type": "execute_result"
73
+ }
74
+ ],
75
+ "source": [
76
+ "1+1"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": null,
82
+ "metadata": {},
83
+ "outputs": [],
84
+ "source": []
85
+ }
86
+ ],
87
+ "metadata": {
88
+ "kernelspec": {
89
+ "display_name": "Python 3.9.7 ('base')",
90
+ "language": "python",
91
+ "name": "python3"
92
+ }
93
+ },
94
+ "nbformat": 4,
95
+ "nbformat_minor": 4
96
+ }
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastai
2
+ git+https://github.com/huggingface/huggingface_hub
3
+ gradio
settings.ini ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [DEFAULT]
2
+ # All sections below are required unless otherwise specified
3
+ # see https://github.com/fastai/nbdev/blob/master/settings.ini for examples
4
+
5
+ ### Python Library ###
6
+ lib_name = PPG_classification
7
+ min_python = 3.9
8
+ version = 0.0.1
9
+
10
+ ### OPTIONAL ###
11
+
12
+ # requirements = fastcore pandas
13
+ # dev_requirements =
14
+ # console_scripts =
15
+
16
+ ### nbdev ###
17
+ nbs_path = .
18
+ doc_path = _docs
19
+ recursive = False
20
+ tst_flags = notest
21
+
22
+ ### Documentation ###
23
+ host = github
24
+ repo = PPG_classification
25
+ branch = main
26
+ custom_sidebar = False
27
+
28
+ ### PyPI ###
29
+ audience = Developers
30
+ author = longnguyen1984
31
+ author_email = [email protected]
32
+ copyright = Put your copyright info here
33
+ description = Cat and Dog app classifier
34
+ keywords = nbdev
35
+ language = English
36
+ license = apache2
37
+ status = 2
38
+ user = LongAnam
39
+
40
+ ### Inferred From Other Values ###
41
+ doc_host = https://%(user)s.github.io
42
+ doc_baseurl = /%(lib_name)s/
43
+ git_url = https://github.com/%(user)s/%(repo)s/
44
+ lib_path = %(lib_name)s
45
+ title = %(lib_name)s
setup.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pkg_resources import parse_version
2
+ from configparser import ConfigParser
3
+ import setuptools
4
+ assert parse_version(setuptools.__version__)>=parse_version('36.2')
5
+
6
+ # note: all settings are in settings.ini; edit there, not here
7
+ config = ConfigParser(delimiters=['='])
8
+ config.read('settings.ini')
9
+ cfg = config['DEFAULT']
10
+
11
+ cfg_keys = 'version description keywords author author_email'.split()
12
+ expected = cfg_keys + "lib_name user branch license status min_python audience language".split()
13
+ for o in expected: assert o in cfg, "missing expected setting: {}".format(o)
14
+ setup_cfg = {o:cfg[o] for o in cfg_keys}
15
+
16
+ licenses = {
17
+ 'apache2': ('Apache Software License 2.0','OSI Approved :: Apache Software License'),
18
+ 'mit': ('MIT License', 'OSI Approved :: MIT License'),
19
+ 'gpl2': ('GNU General Public License v2', 'OSI Approved :: GNU General Public License v2 (GPLv2)'),
20
+ 'gpl3': ('GNU General Public License v3', 'OSI Approved :: GNU General Public License v3 (GPLv3)'),
21
+ 'bsd3': ('BSD License', 'OSI Approved :: BSD License'),
22
+ }
23
+ statuses = [ '1 - Planning', '2 - Pre-Alpha', '3 - Alpha',
24
+ '4 - Beta', '5 - Production/Stable', '6 - Mature', '7 - Inactive' ]
25
+ py_versions = '3.6 3.7 3.8 3.9 3.10'.split()
26
+
27
+ requirements = cfg.get('requirements','').split()
28
+ if cfg.get('pip_requirements'): requirements += cfg.get('pip_requirements','').split()
29
+ min_python = cfg['min_python']
30
+ lic = licenses.get(cfg['license'].lower(), (cfg['license'], None))
31
+ dev_requirements = (cfg.get('dev_requirements') or '').split()
32
+
33
+ setuptools.setup(
34
+ name = cfg['lib_name'],
35
+ license = lic[0],
36
+ classifiers = [
37
+ 'Development Status :: ' + statuses[int(cfg['status'])],
38
+ 'Intended Audience :: ' + cfg['audience'].title(),
39
+ 'Natural Language :: ' + cfg['language'].title(),
40
+ ] + ['Programming Language :: Python :: '+o for o in py_versions[py_versions.index(min_python):]] + (['License :: ' + lic[1] ] if lic[1] else []),
41
+ url = cfg['git_url'],
42
+ packages = setuptools.find_packages(),
43
+ include_package_data = True,
44
+ install_requires = requirements,
45
+ extras_require={ 'dev': dev_requirements },
46
+ dependency_links = cfg.get('dep_links','').split(),
47
+ python_requires = '>=' + cfg['min_python'],
48
+ long_description = open('README.md').read(),
49
+ long_description_content_type = 'text/markdown',
50
+ zip_safe = False,
51
+ entry_points = {
52
+ 'console_scripts': cfg.get('console_scripts','').split(),
53
+ 'nbdev': [f'{cfg.get("lib_path")}={cfg.get("lib_path")}._modidx:d']
54
+ },
55
+ **setup_cfg)
56
+
57
+
styles.css ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .cell-output pre {
2
+ margin-left: 0.8rem;
3
+ margin-top: 0;
4
+ background: none;
5
+ border-left: 2px solid lightsalmon;
6
+ border-top-left-radius: 0;
7
+ border-top-right-radius: 0;
8
+ }
9
+
10
+ .cell-output .sourceCode {
11
+ background: none;
12
+ margin-top: 0;
13
+ }
14
+
15
+ .cell > .sourceCode {
16
+ margin-bottom: 0;
17
+ }
18
+