ozkngnalp commited on
Commit
f67f0ed
·
verified ·
1 Parent(s): badc56e

Upload 3 files

Browse files
Data Fruit Classification.ipynb ADDED
@@ -0,0 +1,719 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "8cdbded1-80ec-4314-b141-3b0b4487881d",
6
+ "metadata": {},
7
+ "source": [
8
+ "# Data Fruit Classification / CNN"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "markdown",
13
+ "id": "d90f79c6-510a-4aef-b9cf-d44272627352",
14
+ "metadata": {},
15
+ "source": [
16
+ "# Amaç"
17
+ ]
18
+ },
19
+ {
20
+ "cell_type": "raw",
21
+ "id": "82fd1e63-d975-4e30-affe-96af4b079e25",
22
+ "metadata": {},
23
+ "source": [
24
+ "Bu projede 9 çeşit hurma görüntüsünü Deep Learning kullanarak sınıflandıracak bir model geliştireceğiz."
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 5,
30
+ "id": "bc8c1e62-f150-40d9-b622-49be146ec08f",
31
+ "metadata": {},
32
+ "outputs": [],
33
+ "source": [
34
+ "import cv2\n",
35
+ "import pandas as pd\n",
36
+ "import os\n",
37
+ "import numpy as np\n",
38
+ "import matplotlib.pyplot as plt\n",
39
+ "from sklearn.preprocessing import LabelEncoder"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "execution_count": 7,
45
+ "id": "1f14fc53-7349-44bd-a377-a207f26ded0e",
46
+ "metadata": {},
47
+ "outputs": [
48
+ {
49
+ "data": {
50
+ "text/plain": [
51
+ "['Ajwa',\n",
52
+ " 'Galaxy',\n",
53
+ " 'Medjool',\n",
54
+ " 'Meneifi',\n",
55
+ " 'Nabtat Ali',\n",
56
+ " 'Rutab',\n",
57
+ " 'Shaishe',\n",
58
+ " 'Sokari',\n",
59
+ " 'Sugaey']"
60
+ ]
61
+ },
62
+ "execution_count": 7,
63
+ "metadata": {},
64
+ "output_type": "execute_result"
65
+ }
66
+ ],
67
+ "source": [
68
+ "os.listdir('Date_Fruit')"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "code",
73
+ "execution_count": 9,
74
+ "id": "6b5d8bcc-0fe2-4c46-8b62-a3852a516375",
75
+ "metadata": {},
76
+ "outputs": [],
77
+ "source": [
78
+ "labels=['Ajwa','Galaxy','Medjool','Meneifi','Nabtat Ali','Rutab','Shaishe','Sokari','Sugaey']\n",
79
+ "img_path='Date_Fruit/'"
80
+ ]
81
+ },
82
+ {
83
+ "cell_type": "code",
84
+ "execution_count": 11,
85
+ "id": "71a9c2e1-db92-4d40-98e5-bc9bd751176c",
86
+ "metadata": {},
87
+ "outputs": [],
88
+ "source": [
89
+ "img_list=[]\n",
90
+ "label_list=[]\n",
91
+ "for label in labels:\n",
92
+ " for img_file in os.listdir(img_path+label):\n",
93
+ " img_list.append(img_path+label+'/'+img_file)\n",
94
+ " label_list.append(label)"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 13,
100
+ "id": "82c11ac6-87f1-4602-a22b-e8812e3e51d6",
101
+ "metadata": {},
102
+ "outputs": [],
103
+ "source": [
104
+ "df=pd.DataFrame({'img':img_list,'label':label_list})"
105
+ ]
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "execution_count": 15,
110
+ "id": "fb86889e-63c4-4220-a6ff-1ec644a9fd11",
111
+ "metadata": {},
112
+ "outputs": [
113
+ {
114
+ "data": {
115
+ "text/html": [
116
+ "<div>\n",
117
+ "<style scoped>\n",
118
+ " .dataframe tbody tr th:only-of-type {\n",
119
+ " vertical-align: middle;\n",
120
+ " }\n",
121
+ "\n",
122
+ " .dataframe tbody tr th {\n",
123
+ " vertical-align: top;\n",
124
+ " }\n",
125
+ "\n",
126
+ " .dataframe thead th {\n",
127
+ " text-align: right;\n",
128
+ " }\n",
129
+ "</style>\n",
130
+ "<table border=\"1\" class=\"dataframe\">\n",
131
+ " <thead>\n",
132
+ " <tr style=\"text-align: right;\">\n",
133
+ " <th></th>\n",
134
+ " <th>img</th>\n",
135
+ " <th>label</th>\n",
136
+ " </tr>\n",
137
+ " </thead>\n",
138
+ " <tbody>\n",
139
+ " <tr>\n",
140
+ " <th>0</th>\n",
141
+ " <td>Date_Fruit/Ajwa/Ajwa Date (1).JPG</td>\n",
142
+ " <td>Ajwa</td>\n",
143
+ " </tr>\n",
144
+ " <tr>\n",
145
+ " <th>1</th>\n",
146
+ " <td>Date_Fruit/Ajwa/Ajwa Date (10).JPG</td>\n",
147
+ " <td>Ajwa</td>\n",
148
+ " </tr>\n",
149
+ " <tr>\n",
150
+ " <th>2</th>\n",
151
+ " <td>Date_Fruit/Ajwa/Ajwa Date (100).JPG</td>\n",
152
+ " <td>Ajwa</td>\n",
153
+ " </tr>\n",
154
+ " <tr>\n",
155
+ " <th>3</th>\n",
156
+ " <td>Date_Fruit/Ajwa/Ajwa Date (101).JPG</td>\n",
157
+ " <td>Ajwa</td>\n",
158
+ " </tr>\n",
159
+ " <tr>\n",
160
+ " <th>4</th>\n",
161
+ " <td>Date_Fruit/Ajwa/Ajwa Date (102).JPG</td>\n",
162
+ " <td>Ajwa</td>\n",
163
+ " </tr>\n",
164
+ " </tbody>\n",
165
+ "</table>\n",
166
+ "</div>"
167
+ ],
168
+ "text/plain": [
169
+ " img label\n",
170
+ "0 Date_Fruit/Ajwa/Ajwa Date (1).JPG Ajwa\n",
171
+ "1 Date_Fruit/Ajwa/Ajwa Date (10).JPG Ajwa\n",
172
+ "2 Date_Fruit/Ajwa/Ajwa Date (100).JPG Ajwa\n",
173
+ "3 Date_Fruit/Ajwa/Ajwa Date (101).JPG Ajwa\n",
174
+ "4 Date_Fruit/Ajwa/Ajwa Date (102).JPG Ajwa"
175
+ ]
176
+ },
177
+ "execution_count": 15,
178
+ "metadata": {},
179
+ "output_type": "execute_result"
180
+ }
181
+ ],
182
+ "source": [
183
+ "df.head()"
184
+ ]
185
+ },
186
+ {
187
+ "cell_type": "code",
188
+ "execution_count": 17,
189
+ "id": "1d026716-944f-449b-8865-8f3e3e7cd168",
190
+ "metadata": {},
191
+ "outputs": [
192
+ {
193
+ "data": {
194
+ "text/html": [
195
+ "<div>\n",
196
+ "<style scoped>\n",
197
+ " .dataframe tbody tr th:only-of-type {\n",
198
+ " vertical-align: middle;\n",
199
+ " }\n",
200
+ "\n",
201
+ " .dataframe tbody tr th {\n",
202
+ " vertical-align: top;\n",
203
+ " }\n",
204
+ "\n",
205
+ " .dataframe thead th {\n",
206
+ " text-align: right;\n",
207
+ " }\n",
208
+ "</style>\n",
209
+ "<table border=\"1\" class=\"dataframe\">\n",
210
+ " <thead>\n",
211
+ " <tr style=\"text-align: right;\">\n",
212
+ " <th></th>\n",
213
+ " <th>img</th>\n",
214
+ " <th>label</th>\n",
215
+ " </tr>\n",
216
+ " </thead>\n",
217
+ " <tbody>\n",
218
+ " <tr>\n",
219
+ " <th>1653</th>\n",
220
+ " <td>Date_Fruit/Sugaey/Sugaey Date (95).JPG</td>\n",
221
+ " <td>Sugaey</td>\n",
222
+ " </tr>\n",
223
+ " <tr>\n",
224
+ " <th>1654</th>\n",
225
+ " <td>Date_Fruit/Sugaey/Sugaey Date (96).JPG</td>\n",
226
+ " <td>Sugaey</td>\n",
227
+ " </tr>\n",
228
+ " <tr>\n",
229
+ " <th>1655</th>\n",
230
+ " <td>Date_Fruit/Sugaey/Sugaey Date (97).JPG</td>\n",
231
+ " <td>Sugaey</td>\n",
232
+ " </tr>\n",
233
+ " <tr>\n",
234
+ " <th>1656</th>\n",
235
+ " <td>Date_Fruit/Sugaey/Sugaey Date (98).JPG</td>\n",
236
+ " <td>Sugaey</td>\n",
237
+ " </tr>\n",
238
+ " <tr>\n",
239
+ " <th>1657</th>\n",
240
+ " <td>Date_Fruit/Sugaey/Sugaey Date (99).JPG</td>\n",
241
+ " <td>Sugaey</td>\n",
242
+ " </tr>\n",
243
+ " </tbody>\n",
244
+ "</table>\n",
245
+ "</div>"
246
+ ],
247
+ "text/plain": [
248
+ " img label\n",
249
+ "1653 Date_Fruit/Sugaey/Sugaey Date (95).JPG Sugaey\n",
250
+ "1654 Date_Fruit/Sugaey/Sugaey Date (96).JPG Sugaey\n",
251
+ "1655 Date_Fruit/Sugaey/Sugaey Date (97).JPG Sugaey\n",
252
+ "1656 Date_Fruit/Sugaey/Sugaey Date (98).JPG Sugaey\n",
253
+ "1657 Date_Fruit/Sugaey/Sugaey Date (99).JPG Sugaey"
254
+ ]
255
+ },
256
+ "execution_count": 17,
257
+ "metadata": {},
258
+ "output_type": "execute_result"
259
+ }
260
+ ],
261
+ "source": [
262
+ "df.tail()"
263
+ ]
264
+ },
265
+ {
266
+ "cell_type": "code",
267
+ "execution_count": 19,
268
+ "id": "c77493fa-d345-4081-9d3f-e04ec26ffcaf",
269
+ "metadata": {},
270
+ "outputs": [
271
+ {
272
+ "data": {
273
+ "text/plain": [
274
+ "(1658, 2)"
275
+ ]
276
+ },
277
+ "execution_count": 19,
278
+ "metadata": {},
279
+ "output_type": "execute_result"
280
+ }
281
+ ],
282
+ "source": [
283
+ "df.shape"
284
+ ]
285
+ },
286
+ {
287
+ "cell_type": "code",
288
+ "execution_count": 23,
289
+ "id": "2edd192b-b779-4401-94df-f1c9ac941200",
290
+ "metadata": {},
291
+ "outputs": [],
292
+ "source": [
293
+ "d={'Ajwa':0,'Galaxy':1,'Medjool':2,'Meneifi':3,'Nabtat Ali':4,'Rutab':5,'Shaishe':6,'Sokari':7,'Sugaey':8} "
294
+ ]
295
+ },
296
+ {
297
+ "cell_type": "code",
298
+ "execution_count": 25,
299
+ "id": "5a83af74-83ae-4e26-942c-56770f0ce1bd",
300
+ "metadata": {},
301
+ "outputs": [],
302
+ "source": [
303
+ "df['class']=df['label'].map(d)"
304
+ ]
305
+ },
306
+ {
307
+ "cell_type": "code",
308
+ "execution_count": 27,
309
+ "id": "04dc6e8c-a920-406b-908a-f70a3166528a",
310
+ "metadata": {},
311
+ "outputs": [
312
+ {
313
+ "data": {
314
+ "text/html": [
315
+ "<div>\n",
316
+ "<style scoped>\n",
317
+ " .dataframe tbody tr th:only-of-type {\n",
318
+ " vertical-align: middle;\n",
319
+ " }\n",
320
+ "\n",
321
+ " .dataframe tbody tr th {\n",
322
+ " vertical-align: top;\n",
323
+ " }\n",
324
+ "\n",
325
+ " .dataframe thead th {\n",
326
+ " text-align: right;\n",
327
+ " }\n",
328
+ "</style>\n",
329
+ "<table border=\"1\" class=\"dataframe\">\n",
330
+ " <thead>\n",
331
+ " <tr style=\"text-align: right;\">\n",
332
+ " <th></th>\n",
333
+ " <th>img</th>\n",
334
+ " <th>label</th>\n",
335
+ " <th>class</th>\n",
336
+ " </tr>\n",
337
+ " </thead>\n",
338
+ " <tbody>\n",
339
+ " <tr>\n",
340
+ " <th>0</th>\n",
341
+ " <td>Date_Fruit/Ajwa/Ajwa Date (1).JPG</td>\n",
342
+ " <td>Ajwa</td>\n",
343
+ " <td>0</td>\n",
344
+ " </tr>\n",
345
+ " <tr>\n",
346
+ " <th>1</th>\n",
347
+ " <td>Date_Fruit/Ajwa/Ajwa Date (10).JPG</td>\n",
348
+ " <td>Ajwa</td>\n",
349
+ " <td>0</td>\n",
350
+ " </tr>\n",
351
+ " <tr>\n",
352
+ " <th>2</th>\n",
353
+ " <td>Date_Fruit/Ajwa/Ajwa Date (100).JPG</td>\n",
354
+ " <td>Ajwa</td>\n",
355
+ " <td>0</td>\n",
356
+ " </tr>\n",
357
+ " <tr>\n",
358
+ " <th>3</th>\n",
359
+ " <td>Date_Fruit/Ajwa/Ajwa Date (101).JPG</td>\n",
360
+ " <td>Ajwa</td>\n",
361
+ " <td>0</td>\n",
362
+ " </tr>\n",
363
+ " <tr>\n",
364
+ " <th>4</th>\n",
365
+ " <td>Date_Fruit/Ajwa/Ajwa Date (102).JPG</td>\n",
366
+ " <td>Ajwa</td>\n",
367
+ " <td>0</td>\n",
368
+ " </tr>\n",
369
+ " </tbody>\n",
370
+ "</table>\n",
371
+ "</div>"
372
+ ],
373
+ "text/plain": [
374
+ " img label class\n",
375
+ "0 Date_Fruit/Ajwa/Ajwa Date (1).JPG Ajwa 0\n",
376
+ "1 Date_Fruit/Ajwa/Ajwa Date (10).JPG Ajwa 0\n",
377
+ "2 Date_Fruit/Ajwa/Ajwa Date (100).JPG Ajwa 0\n",
378
+ "3 Date_Fruit/Ajwa/Ajwa Date (101).JPG Ajwa 0\n",
379
+ "4 Date_Fruit/Ajwa/Ajwa Date (102).JPG Ajwa 0"
380
+ ]
381
+ },
382
+ "execution_count": 27,
383
+ "metadata": {},
384
+ "output_type": "execute_result"
385
+ }
386
+ ],
387
+ "source": [
388
+ "df.head()"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 29,
394
+ "id": "94789c0e-287e-4076-a3ff-fe91773b543f",
395
+ "metadata": {},
396
+ "outputs": [],
397
+ "source": [
398
+ "x = []\n",
399
+ "for img_path in df['img']:\n",
400
+ " img = cv2.imread(img_path)\n",
401
+ " if img is None:\n",
402
+ " print(f\"Görüntü okunamadı: {img_path}\")\n",
403
+ " continue\n",
404
+ " img = cv2.resize(img, (64, 64)) \n",
405
+ " img = img / 255.0 \n",
406
+ " img = np.array(img)\n",
407
+ " x.append(img)"
408
+ ]
409
+ },
410
+ {
411
+ "cell_type": "code",
412
+ "execution_count": 31,
413
+ "id": "db2e3d7c-6442-4567-bb09-3c03b6f72bab",
414
+ "metadata": {},
415
+ "outputs": [],
416
+ "source": [
417
+ "y=df['class']"
418
+ ]
419
+ },
420
+ {
421
+ "cell_type": "code",
422
+ "execution_count": 33,
423
+ "id": "b5f360da-318f-4228-adba-d35db50d1396",
424
+ "metadata": {},
425
+ "outputs": [
426
+ {
427
+ "name": "stdout",
428
+ "output_type": "stream",
429
+ "text": [
430
+ "1658 1658\n"
431
+ ]
432
+ }
433
+ ],
434
+ "source": [
435
+ "print(len(x),len(y))"
436
+ ]
437
+ },
438
+ {
439
+ "cell_type": "code",
440
+ "execution_count": 35,
441
+ "id": "0719e23b-1892-44aa-8e76-987f97c2517f",
442
+ "metadata": {},
443
+ "outputs": [],
444
+ "source": [
445
+ "from sklearn.model_selection import train_test_split"
446
+ ]
447
+ },
448
+ {
449
+ "cell_type": "code",
450
+ "execution_count": 37,
451
+ "id": "931451d4-c057-42b0-95bb-742dc2ecdbb0",
452
+ "metadata": {},
453
+ "outputs": [],
454
+ "source": [
455
+ "x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.20,random_state=42)"
456
+ ]
457
+ },
458
+ {
459
+ "cell_type": "code",
460
+ "execution_count": 44,
461
+ "id": "d4480ed1-acfd-4d24-b456-e21cc812ee54",
462
+ "metadata": {},
463
+ "outputs": [
464
+ {
465
+ "data": {
466
+ "image/png": "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",
467
+ "text/plain": [
468
+ "<Figure size 640x480 with 1 Axes>"
469
+ ]
470
+ },
471
+ "metadata": {},
472
+ "output_type": "display_data"
473
+ }
474
+ ],
475
+ "source": [
476
+ "plt.imshow(x_train[500])\n",
477
+ "plt.title(labels[int(y_train[500])]);"
478
+ ]
479
+ },
480
+ {
481
+ "cell_type": "code",
482
+ "execution_count": 46,
483
+ "id": "8c24d037-b396-439c-8e48-517577aacb02",
484
+ "metadata": {},
485
+ "outputs": [],
486
+ "source": [
487
+ "from keras.models import Sequential \n",
488
+ "from keras.layers import Conv2D, Dense, Flatten,Input,MaxPooling2D,Dropout,BatchNormalization, Reshape"
489
+ ]
490
+ },
491
+ {
492
+ "cell_type": "code",
493
+ "execution_count": 47,
494
+ "id": "ee560446-a6dd-4d90-bbff-13811b531453",
495
+ "metadata": {},
496
+ "outputs": [],
497
+ "source": [
498
+ "# CNN Convolutional Neural Networks"
499
+ ]
500
+ },
501
+ {
502
+ "cell_type": "code",
503
+ "execution_count": 51,
504
+ "id": "4ddce14a-3110-475c-8b81-56bb37cfdfea",
505
+ "metadata": {},
506
+ "outputs": [],
507
+ "source": [
508
+ "model=Sequential()\n",
509
+ "model.add(Input(shape=(64,64,3)))\n",
510
+ "model.add(Conv2D(32,kernel_size=(3,3),activation='relu'))\n",
511
+ "model.add(MaxPooling2D(pool_size=(2,2)))\n",
512
+ "model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))\n",
513
+ "model.add(MaxPooling2D(pool_size=(2,2)))\n",
514
+ "model.add(Flatten())\n",
515
+ "model.add(Dense(128))\n",
516
+ "model.add(Dense(9, activation='softmax')) # 10 fakli cevap classification 0-9 a kadar olan rakamlar\n",
517
+ "model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])"
518
+ ]
519
+ },
520
+ {
521
+ "cell_type": "code",
522
+ "execution_count": 53,
523
+ "id": "7bb84861-b91e-46ed-b2f4-2c8d7eac17f8",
524
+ "metadata": {},
525
+ "outputs": [
526
+ {
527
+ "name": "stdout",
528
+ "output_type": "stream",
529
+ "text": [
530
+ "Epoch 1/10\n",
531
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 62ms/step - accuracy: 0.2891 - loss: 2.2812 - val_accuracy: 0.6084 - val_loss: 0.9882\n",
532
+ "Epoch 2/10\n",
533
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 54ms/step - accuracy: 0.7351 - loss: 0.8048 - val_accuracy: 0.8494 - val_loss: 0.5426\n",
534
+ "Epoch 3/10\n",
535
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 53ms/step - accuracy: 0.8432 - loss: 0.4989 - val_accuracy: 0.9006 - val_loss: 0.4098\n",
536
+ "Epoch 4/10\n",
537
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 53ms/step - accuracy: 0.8551 - loss: 0.4488 - val_accuracy: 0.8524 - val_loss: 0.4367\n",
538
+ "Epoch 5/10\n",
539
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 58ms/step - accuracy: 0.8967 - loss: 0.3137 - val_accuracy: 0.8976 - val_loss: 0.3452\n",
540
+ "Epoch 6/10\n",
541
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 54ms/step - accuracy: 0.9051 - loss: 0.2614 - val_accuracy: 0.8855 - val_loss: 0.4056\n",
542
+ "Epoch 7/10\n",
543
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 56ms/step - accuracy: 0.9230 - loss: 0.2285 - val_accuracy: 0.8916 - val_loss: 0.3586\n",
544
+ "Epoch 8/10\n",
545
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 52ms/step - accuracy: 0.9174 - loss: 0.2410 - val_accuracy: 0.8524 - val_loss: 0.4916\n",
546
+ "Epoch 9/10\n",
547
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 51ms/step - accuracy: 0.9376 - loss: 0.1994 - val_accuracy: 0.9127 - val_loss: 0.2717\n",
548
+ "Epoch 10/10\n",
549
+ "\u001b[1m42/42\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 47ms/step - accuracy: 0.9446 - loss: 0.1586 - val_accuracy: 0.9096 - val_loss: 0.2972\n"
550
+ ]
551
+ }
552
+ ],
553
+ "source": [
554
+ "history=model.fit(np.array(x_train), np.array(y_train), epochs=10, validation_data=(np.array(x_test), np.array(y_test)), verbose=1)"
555
+ ]
556
+ },
557
+ {
558
+ "cell_type": "code",
559
+ "execution_count": 55,
560
+ "id": "9d17a076-3ec6-4f62-9659-9a6afcb0e328",
561
+ "metadata": {},
562
+ "outputs": [
563
+ {
564
+ "name": "stderr",
565
+ "output_type": "stream",
566
+ "text": [
567
+ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
568
+ ]
569
+ }
570
+ ],
571
+ "source": [
572
+ "model.save('my_cnn_datafruit_model.h5')"
573
+ ]
574
+ },
575
+ {
576
+ "cell_type": "code",
577
+ "execution_count": 57,
578
+ "id": "7eacfe70-defc-41e1-bead-4927e7f60f8f",
579
+ "metadata": {},
580
+ "outputs": [],
581
+ "source": [
582
+ "# 0.9096 val_accuracy, 10 epoch ile model oldukça başarılı"
583
+ ]
584
+ },
585
+ {
586
+ "cell_type": "code",
587
+ "execution_count": null,
588
+ "id": "c61eaf4d-0ee3-4190-9e36-2465b6c938ed",
589
+ "metadata": {},
590
+ "outputs": [],
591
+ "source": []
592
+ },
593
+ {
594
+ "cell_type": "code",
595
+ "execution_count": null,
596
+ "id": "f375d212-8fed-4620-9a2d-6eb0dc6da2e1",
597
+ "metadata": {},
598
+ "outputs": [],
599
+ "source": []
600
+ },
601
+ {
602
+ "cell_type": "code",
603
+ "execution_count": null,
604
+ "id": "a77e2b08-d091-4479-8717-abaaf6ba0d60",
605
+ "metadata": {},
606
+ "outputs": [],
607
+ "source": []
608
+ },
609
+ {
610
+ "cell_type": "code",
611
+ "execution_count": null,
612
+ "id": "d1377ba8-e2bf-4580-bec6-84260f797cc8",
613
+ "metadata": {},
614
+ "outputs": [],
615
+ "source": []
616
+ },
617
+ {
618
+ "cell_type": "code",
619
+ "execution_count": null,
620
+ "id": "1c4070a6-7bb8-4bb3-889a-08859667dbc1",
621
+ "metadata": {},
622
+ "outputs": [],
623
+ "source": []
624
+ },
625
+ {
626
+ "cell_type": "code",
627
+ "execution_count": null,
628
+ "id": "b3e4ee1c-d710-4fe1-9243-9712d640cdc7",
629
+ "metadata": {},
630
+ "outputs": [],
631
+ "source": []
632
+ },
633
+ {
634
+ "cell_type": "code",
635
+ "execution_count": null,
636
+ "id": "802ebe07-1797-42b9-bdb9-92a7ce47b189",
637
+ "metadata": {},
638
+ "outputs": [],
639
+ "source": []
640
+ },
641
+ {
642
+ "cell_type": "code",
643
+ "execution_count": null,
644
+ "id": "4df65765-f973-45d3-a242-6013797291f3",
645
+ "metadata": {},
646
+ "outputs": [],
647
+ "source": []
648
+ },
649
+ {
650
+ "cell_type": "code",
651
+ "execution_count": null,
652
+ "id": "898a5a29-53dd-4c09-bc61-e5271c2e754a",
653
+ "metadata": {},
654
+ "outputs": [],
655
+ "source": []
656
+ },
657
+ {
658
+ "cell_type": "code",
659
+ "execution_count": null,
660
+ "id": "5ce6f931-32c1-4a90-bbc4-9edb18259d97",
661
+ "metadata": {},
662
+ "outputs": [],
663
+ "source": []
664
+ },
665
+ {
666
+ "cell_type": "code",
667
+ "execution_count": null,
668
+ "id": "c3195610-5e79-4e10-9d6c-264a50438249",
669
+ "metadata": {},
670
+ "outputs": [],
671
+ "source": []
672
+ },
673
+ {
674
+ "cell_type": "code",
675
+ "execution_count": null,
676
+ "id": "39b98025-c021-4632-b6e1-9ff1c04d1cdf",
677
+ "metadata": {},
678
+ "outputs": [],
679
+ "source": []
680
+ },
681
+ {
682
+ "cell_type": "code",
683
+ "execution_count": null,
684
+ "id": "d858fe6a-5a5f-4ab7-95ef-b7160115c0c0",
685
+ "metadata": {},
686
+ "outputs": [],
687
+ "source": []
688
+ },
689
+ {
690
+ "cell_type": "code",
691
+ "execution_count": null,
692
+ "id": "da2135fb-ee9a-4e72-818e-ec07bd530d6d",
693
+ "metadata": {},
694
+ "outputs": [],
695
+ "source": []
696
+ }
697
+ ],
698
+ "metadata": {
699
+ "kernelspec": {
700
+ "display_name": "Python 3 (ipykernel)",
701
+ "language": "python",
702
+ "name": "python3"
703
+ },
704
+ "language_info": {
705
+ "codemirror_mode": {
706
+ "name": "ipython",
707
+ "version": 3
708
+ },
709
+ "file_extension": ".py",
710
+ "mimetype": "text/x-python",
711
+ "name": "python",
712
+ "nbconvert_exporter": "python",
713
+ "pygments_lexer": "ipython3",
714
+ "version": "3.12.7"
715
+ }
716
+ },
717
+ "nbformat": 4,
718
+ "nbformat_minor": 5
719
+ }
data_fruit.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from tensorflow.keras.models import load_model
3
+ from PIL import Image
4
+ import numpy as np
5
+
6
+ model=load_model('my_cnn_datafruit_model.h5')
7
+
8
+ def process_image(img):
9
+ img=img.resize((64, 64))
10
+ img=np.array(img)
11
+ img=img/255.0
12
+ img=np.expand_dims(img,axis=0)
13
+ return img
14
+
15
+ st.title("Hurma Tür Sınıflandırılması")
16
+ st.write('Resim seç')
17
+
18
+ file=st.file_uploader('Bir Resim Seç',type=['jpg','jpeg', 'png'])
19
+
20
+ if file is not None:
21
+ img=Image.open(file)
22
+ st.image(img,caption='yüklenen resim')
23
+ image= process_image(img)
24
+ prediction=model.predict(image)
25
+ predicted_class=np.argmax(prediction)
26
+
27
+ class_names=['Ajwa','Galaxy','Medjool','Meneifi','Nabtat Ali','Rutab','Shaishe','Sokari','Sugaey']
28
+ st.write(class_names[predicted_class])
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ tensorflow
2
+ streamlit