model,interface,examples added
Browse files- .gitignore +2 -0
- README.md +5 -1
- app.ipynb +329 -0
- app.py +38 -4
- models/musical-instrument-recognizer-v6.pkl +3 -0
- test_data/bansuri.jfif +0 -0
- test_data/harmonium.jfif +0 -0
- test_data/pakhawaj.jfif +0 -0
- test_data/santoor.jfif +0 -0
- test_data/sarengi.jfif +0 -0
- test_data/sarod.jfif +0 -0
- test_data/shehnai.jfif +0 -0
- test_data/sitar.jfif +0 -0
- test_data/tabla.jfif +0 -0
- test_data/tanpura.jfif +0 -0
.gitignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
**/__pycache__/
|
2 |
+
venv/
|
README.md
CHANGED
@@ -10,4 +10,8 @@ pinned: false
|
|
10 |
license: mit
|
11 |
---
|
12 |
|
13 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
|
|
|
|
|
|
10 |
license: mit
|
11 |
---
|
12 |
|
13 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference <br/>
|
14 |
+
|
15 |
+
HuggingFace spaces app URL : https://huggingface.co/spaces/mhdhrubo/indian_classical_musical_instrument_recognizer
|
16 |
+
|
17 |
+
Gradio app URL : https://d713594b371184c30d.gradio.live/
|
app.ipynb
ADDED
@@ -0,0 +1,329 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {
|
7 |
+
"id": "UtWMVEPUgurg"
|
8 |
+
},
|
9 |
+
"outputs": [],
|
10 |
+
"source": [
|
11 |
+
"#|default_exp app"
|
12 |
+
]
|
13 |
+
},
|
14 |
+
{
|
15 |
+
"cell_type": "markdown",
|
16 |
+
"metadata": {
|
17 |
+
"id": "wU2LMUSGhUbE"
|
18 |
+
},
|
19 |
+
"source": [
|
20 |
+
"#Musical Instrument Recognizer"
|
21 |
+
]
|
22 |
+
},
|
23 |
+
{
|
24 |
+
"cell_type": "code",
|
25 |
+
"execution_count": 1,
|
26 |
+
"metadata": {
|
27 |
+
"colab": {
|
28 |
+
"base_uri": "https://localhost:8080/"
|
29 |
+
},
|
30 |
+
"id": "3txLmR_EhYZA",
|
31 |
+
"outputId": "2f7a0b63-d437-42db-cc3a-bac114b2b184"
|
32 |
+
},
|
33 |
+
"outputs": [
|
34 |
+
{
|
35 |
+
"name": "stderr",
|
36 |
+
"output_type": "stream",
|
37 |
+
"text": [
|
38 |
+
"ERROR: Some build dependencies for cymem==2.0.2 from https://files.pythonhosted.org/packages/8b/dc/0976e04cc46f86e0dd3ee3797ec68057eaafebf31daca9a076dc138b9920/cymem-2.0.2.tar.gz (from fastai) conflict with the backend dependencies: wheel==0.42.0 is incompatible with wheel>=0.32.0,<0.33.0.\n"
|
39 |
+
]
|
40 |
+
}
|
41 |
+
],
|
42 |
+
"source": [
|
43 |
+
"!pip install -Uqq fastai fastbook nbdev gradio"
|
44 |
+
]
|
45 |
+
},
|
46 |
+
{
|
47 |
+
"cell_type": "code",
|
48 |
+
"execution_count": 1,
|
49 |
+
"metadata": {
|
50 |
+
"id": "15NDmjd8hmMm"
|
51 |
+
},
|
52 |
+
"outputs": [
|
53 |
+
{
|
54 |
+
"ename": "ModuleNotFoundError",
|
55 |
+
"evalue": "No module named 'fastai'",
|
56 |
+
"output_type": "error",
|
57 |
+
"traceback": [
|
58 |
+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
59 |
+
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
|
60 |
+
"\u001b[1;32md:\\Data Science\\MasterCourse\\Capstone Project 2 - image recognizer\\Project Files\\indian_classical_musical_instrument_recognizer\\app.ipynb Cell 4\u001b[0m line \u001b[0;36m2\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/Data%20Science/MasterCourse/Capstone%20Project%202%20-%20image%20recognizer/Project%20Files/indian_classical_musical_instrument_recognizer/app.ipynb#W5sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m \u001b[39m#!export\u001b[39;00m\n\u001b[1;32m----> <a href='vscode-notebook-cell:/d%3A/Data%20Science/MasterCourse/Capstone%20Project%202%20-%20image%20recognizer/Project%20Files/indian_classical_musical_instrument_recognizer/app.ipynb#W5sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mfastai\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mvision\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mall\u001b[39;00m \u001b[39mimport\u001b[39;00m load_learner\n\u001b[0;32m <a href='vscode-notebook-cell:/d%3A/Data%20Science/MasterCourse/Capstone%20Project%202%20-%20image%20recognizer/Project%20Files/indian_classical_musical_instrument_recognizer/app.ipynb#W5sZmlsZQ%3D%3D?line=2'>3</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mgradio\u001b[39;00m \u001b[39mas\u001b[39;00m \u001b[39mgr\u001b[39;00m\n",
|
61 |
+
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'fastai'"
|
62 |
+
]
|
63 |
+
}
|
64 |
+
],
|
65 |
+
"source": [
|
66 |
+
"#!export\n",
|
67 |
+
"from fastai.vision.all import load_learner\n",
|
68 |
+
"import gradio as gr"
|
69 |
+
]
|
70 |
+
},
|
71 |
+
{
|
72 |
+
"cell_type": "code",
|
73 |
+
"execution_count": 16,
|
74 |
+
"metadata": {
|
75 |
+
"id": "CXrdoKsLiCgz"
|
76 |
+
},
|
77 |
+
"outputs": [],
|
78 |
+
"source": [
|
79 |
+
"#!export\n",
|
80 |
+
"model = load_learner(f\"models/musical-instrument-recognizer-v6.pkl\")"
|
81 |
+
]
|
82 |
+
},
|
83 |
+
{
|
84 |
+
"cell_type": "code",
|
85 |
+
"execution_count": 17,
|
86 |
+
"metadata": {
|
87 |
+
"id": "ikyofbmki9rk"
|
88 |
+
},
|
89 |
+
"outputs": [],
|
90 |
+
"source": [
|
91 |
+
"#|export\n",
|
92 |
+
"musical_instruments = (\n",
|
93 |
+
" 'Bansuri',\n",
|
94 |
+
" 'Harmonium',\n",
|
95 |
+
" 'Pakhawaz',\n",
|
96 |
+
" 'Santoor',\n",
|
97 |
+
" 'Sarangi',\n",
|
98 |
+
" 'Sarod',\n",
|
99 |
+
" 'Shehnai',\n",
|
100 |
+
" 'Sitar',\n",
|
101 |
+
" 'Tabla',\n",
|
102 |
+
" 'Tanpura'\n",
|
103 |
+
")\n",
|
104 |
+
"\n",
|
105 |
+
"def recognize_image(image):\n",
|
106 |
+
" pred, idx, probs = model.predict(image)\n",
|
107 |
+
" return dict(zip(musical_instruments, map(float, probs)))"
|
108 |
+
]
|
109 |
+
},
|
110 |
+
{
|
111 |
+
"cell_type": "code",
|
112 |
+
"execution_count": 18,
|
113 |
+
"metadata": {
|
114 |
+
"colab": {
|
115 |
+
"base_uri": "https://localhost:8080/",
|
116 |
+
"height": 209
|
117 |
+
},
|
118 |
+
"id": "8QOU1viCkYPy",
|
119 |
+
"outputId": "df789043-f5df-4c1a-e581-5ce62439f948"
|
120 |
+
},
|
121 |
+
"outputs": [
|
122 |
+
{
|
123 |
+
"data": {
|
124 |
+
"image/png": "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",
|
125 |
+
"text/plain": [
|
126 |
+
"<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=192x192>"
|
127 |
+
]
|
128 |
+
},
|
129 |
+
"execution_count": 18,
|
130 |
+
"metadata": {},
|
131 |
+
"output_type": "execute_result"
|
132 |
+
}
|
133 |
+
],
|
134 |
+
"source": [
|
135 |
+
"from PIL import Image\n",
|
136 |
+
"img = Image.open(f'test_data/bansuri.jfif')\n",
|
137 |
+
"img.thumbnail((192,192))\n",
|
138 |
+
"img"
|
139 |
+
]
|
140 |
+
},
|
141 |
+
{
|
142 |
+
"cell_type": "code",
|
143 |
+
"execution_count": 19,
|
144 |
+
"metadata": {
|
145 |
+
"colab": {
|
146 |
+
"base_uri": "https://localhost:8080/",
|
147 |
+
"height": 191
|
148 |
+
},
|
149 |
+
"id": "GjFbAe0WlPX5",
|
150 |
+
"outputId": "d94b325b-4c3e-4b9d-800f-450fc8b30413"
|
151 |
+
},
|
152 |
+
"outputs": [
|
153 |
+
{
|
154 |
+
"data": {
|
155 |
+
"text/html": [
|
156 |
+
"\n",
|
157 |
+
"<style>\n",
|
158 |
+
" /* Turns off some styling */\n",
|
159 |
+
" progress {\n",
|
160 |
+
" /* gets rid of default border in Firefox and Opera. */\n",
|
161 |
+
" border: none;\n",
|
162 |
+
" /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
|
163 |
+
" background-size: auto;\n",
|
164 |
+
" }\n",
|
165 |
+
" progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
|
166 |
+
" background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
|
167 |
+
" }\n",
|
168 |
+
" .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
|
169 |
+
" background: #F44336;\n",
|
170 |
+
" }\n",
|
171 |
+
"</style>\n"
|
172 |
+
],
|
173 |
+
"text/plain": [
|
174 |
+
"<IPython.core.display.HTML object>"
|
175 |
+
]
|
176 |
+
},
|
177 |
+
"metadata": {},
|
178 |
+
"output_type": "display_data"
|
179 |
+
},
|
180 |
+
{
|
181 |
+
"data": {
|
182 |
+
"text/html": [],
|
183 |
+
"text/plain": [
|
184 |
+
"<IPython.core.display.HTML object>"
|
185 |
+
]
|
186 |
+
},
|
187 |
+
"metadata": {},
|
188 |
+
"output_type": "display_data"
|
189 |
+
},
|
190 |
+
{
|
191 |
+
"data": {
|
192 |
+
"text/plain": [
|
193 |
+
"{'Bansuri': 0.9995973706245422,\n",
|
194 |
+
" 'Harmonium': 3.5202569961256813e-06,\n",
|
195 |
+
" 'Pakhawaz': 2.915377308454481e-06,\n",
|
196 |
+
" 'Santoor': 2.1727865373577515e-07,\n",
|
197 |
+
" 'Sarangi': 4.1493856883789704e-07,\n",
|
198 |
+
" 'Sarod': 1.0827788088363377e-07,\n",
|
199 |
+
" 'Shehnai': 0.0003836842952296138,\n",
|
200 |
+
" 'Sitar': 9.002708793559577e-06,\n",
|
201 |
+
" 'Tabla': 2.717604274948826e-06,\n",
|
202 |
+
" 'Tanpura': 1.3091357686789706e-07}"
|
203 |
+
]
|
204 |
+
},
|
205 |
+
"execution_count": 19,
|
206 |
+
"metadata": {},
|
207 |
+
"output_type": "execute_result"
|
208 |
+
}
|
209 |
+
],
|
210 |
+
"source": [
|
211 |
+
"recognize_image(img)"
|
212 |
+
]
|
213 |
+
},
|
214 |
+
{
|
215 |
+
"cell_type": "code",
|
216 |
+
"execution_count": 20,
|
217 |
+
"metadata": {
|
218 |
+
"colab": {
|
219 |
+
"base_uri": "https://localhost:8080/"
|
220 |
+
},
|
221 |
+
"id": "_3eo0O8tmwi5",
|
222 |
+
"outputId": "eeb35528-c779-46d6-cc8a-3c39efca8dbb"
|
223 |
+
},
|
224 |
+
"outputs": [
|
225 |
+
{
|
226 |
+
"name": "stderr",
|
227 |
+
"output_type": "stream",
|
228 |
+
"text": [
|
229 |
+
"/usr/local/lib/python3.10/dist-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",
|
230 |
+
" warnings.warn(\n",
|
231 |
+
"/usr/local/lib/python3.10/dist-packages/gradio/deprecation.py:40: UserWarning: `optional` parameter is deprecated, and it has no effect\n",
|
232 |
+
" warnings.warn(value)\n",
|
233 |
+
"/usr/local/lib/python3.10/dist-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",
|
234 |
+
" warnings.warn(\n",
|
235 |
+
"/usr/local/lib/python3.10/dist-packages/gradio/deprecation.py:40: UserWarning: The 'type' parameter has been deprecated. Use the Number component instead.\n",
|
236 |
+
" warnings.warn(value)\n"
|
237 |
+
]
|
238 |
+
},
|
239 |
+
{
|
240 |
+
"name": "stdout",
|
241 |
+
"output_type": "stream",
|
242 |
+
"text": [
|
243 |
+
"IMPORTANT: You are using gradio version 3.13.0, however version 3.14.0 is available, please upgrade.\n",
|
244 |
+
"--------\n",
|
245 |
+
"Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n",
|
246 |
+
"\n",
|
247 |
+
"Setting up a public link... we have recently upgraded the way public links are generated. If you encounter any problems, please report the issue and downgrade to gradio version 3.13.0\n",
|
248 |
+
".\n",
|
249 |
+
"Running on public URL: https://9fc74c01-6bc9-4897.gradio.live\n",
|
250 |
+
"\n",
|
251 |
+
"This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces\n"
|
252 |
+
]
|
253 |
+
},
|
254 |
+
{
|
255 |
+
"data": {
|
256 |
+
"text/plain": []
|
257 |
+
},
|
258 |
+
"execution_count": 20,
|
259 |
+
"metadata": {},
|
260 |
+
"output_type": "execute_result"
|
261 |
+
}
|
262 |
+
],
|
263 |
+
"source": [
|
264 |
+
"#!export\n",
|
265 |
+
"image = gr.inputs.Image(shape=(192,192))\n",
|
266 |
+
"label = gr.outputs.Label()\n",
|
267 |
+
"examples = [\n",
|
268 |
+
" 'test_data/bansuri.jfif',\n",
|
269 |
+
" 'test_data/harmonium.jfif',\n",
|
270 |
+
" 'test_data/pakhawaj.jfif',\n",
|
271 |
+
" 'test_data/santoor.jfif',\n",
|
272 |
+
" 'test_data/sarengi.jfif',\n",
|
273 |
+
" 'test_data/sarod.jfif',\n",
|
274 |
+
" 'test_data/shehnai.jfif',\n",
|
275 |
+
" 'test_data/sitar.jfif',\n",
|
276 |
+
" 'test_data/tabla.jfif',\n",
|
277 |
+
" 'test_data/tanpura.jfif'\n",
|
278 |
+
"]\n",
|
279 |
+
"\n",
|
280 |
+
"iface = gr.Interface(fn=recognize_image, inputs = image, outputs= label, examples = examples)\n",
|
281 |
+
"iface.launch(inline =False, share = True)"
|
282 |
+
]
|
283 |
+
},
|
284 |
+
{
|
285 |
+
"cell_type": "markdown",
|
286 |
+
"metadata": {
|
287 |
+
"id": "lMYKAOtLuLLA"
|
288 |
+
},
|
289 |
+
"source": [
|
290 |
+
"# Notebook to Python Script Export"
|
291 |
+
]
|
292 |
+
},
|
293 |
+
{
|
294 |
+
"cell_type": "code",
|
295 |
+
"execution_count": 22,
|
296 |
+
"metadata": {
|
297 |
+
"id": "mkTtKu_GuPHT"
|
298 |
+
},
|
299 |
+
"outputs": [],
|
300 |
+
"source": [
|
301 |
+
"# from nbdev.export import notebook2script\n",
|
302 |
+
"# notebook2script('app.ipynb')"
|
303 |
+
]
|
304 |
+
}
|
305 |
+
],
|
306 |
+
"metadata": {
|
307 |
+
"colab": {
|
308 |
+
"provenance": []
|
309 |
+
},
|
310 |
+
"kernelspec": {
|
311 |
+
"display_name": "Python 3",
|
312 |
+
"name": "python3"
|
313 |
+
},
|
314 |
+
"language_info": {
|
315 |
+
"codemirror_mode": {
|
316 |
+
"name": "ipython",
|
317 |
+
"version": 3
|
318 |
+
},
|
319 |
+
"file_extension": ".py",
|
320 |
+
"mimetype": "text/x-python",
|
321 |
+
"name": "python",
|
322 |
+
"nbconvert_exporter": "python",
|
323 |
+
"pygments_lexer": "ipython3",
|
324 |
+
"version": "3.12.0"
|
325 |
+
}
|
326 |
+
},
|
327 |
+
"nbformat": 4,
|
328 |
+
"nbformat_minor": 0
|
329 |
+
}
|
app.py
CHANGED
@@ -1,7 +1,41 @@
|
|
|
|
1 |
import gradio as gr
|
2 |
|
3 |
-
|
4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastai.vision.all import load_learner
|
2 |
import gradio as gr
|
3 |
|
4 |
+
musical_instruments = (
|
5 |
+
'Bansuri',
|
6 |
+
'Harmonium',
|
7 |
+
'Pakhawaz',
|
8 |
+
'Santoor',
|
9 |
+
'Sarangi',
|
10 |
+
'Sarod',
|
11 |
+
'Shehnai',
|
12 |
+
'Sitar',
|
13 |
+
'Tabla',
|
14 |
+
'Tanpura'
|
15 |
+
)
|
16 |
|
17 |
+
model = load_learner(f"models/musical-instrument-recognizer-v6.pkl")
|
18 |
+
|
19 |
+
def recognize_image(image):
|
20 |
+
pred, idx, probs = model.predict(image)
|
21 |
+
return dict(zip(musical_instruments, map(float, probs)))
|
22 |
+
|
23 |
+
|
24 |
+
|
25 |
+
image = gr.inputs.Image(shape=(192,192))
|
26 |
+
label = gr.outputs.Label()
|
27 |
+
examples = [
|
28 |
+
'test_data/bansuri.jfif',
|
29 |
+
'test_data/harmonium.jfif',
|
30 |
+
'test_data/pakhawaj.jfif',
|
31 |
+
'test_data/santoor.jfif',
|
32 |
+
'test_data/sarengi.jfif',
|
33 |
+
'test_data/sarod.jfif',
|
34 |
+
'test_data/shehnai.jfif',
|
35 |
+
'test_data/sitar.jfif',
|
36 |
+
'test_data/tabla.jfif',
|
37 |
+
'test_data/tanpura.jfif'
|
38 |
+
]
|
39 |
+
|
40 |
+
iface = gr.Interface(fn=recognize_image, inputs = image, outputs= label, examples = examples)
|
41 |
+
iface.launch(inline =False, share = True)
|
models/musical-instrument-recognizer-v6.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f6f72048c87cc551047b98e82b20eb8fa33e503ec068298c2cbc66dd22cd652d
|
3 |
+
size 87516925
|
test_data/bansuri.jfif
ADDED
Binary file (2.75 kB). View file
|
|
test_data/harmonium.jfif
ADDED
Binary file (9.25 kB). View file
|
|
test_data/pakhawaj.jfif
ADDED
Binary file (7.44 kB). View file
|
|
test_data/santoor.jfif
ADDED
Binary file (8.87 kB). View file
|
|
test_data/sarengi.jfif
ADDED
Binary file (6.25 kB). View file
|
|
test_data/sarod.jfif
ADDED
Binary file (5.53 kB). View file
|
|
test_data/shehnai.jfif
ADDED
Binary file (4.97 kB). View file
|
|
test_data/sitar.jfif
ADDED
Binary file (6.58 kB). View file
|
|
test_data/tabla.jfif
ADDED
Binary file (13.3 kB). View file
|
|
test_data/tanpura.jfif
ADDED
Binary file (5.2 kB). View file
|
|