forked from bipulshahi/codes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Seedling_classification.py
215 lines (140 loc) · 6.52 KB
/
Seedling_classification.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# coding: utf-8
# In[1]:
import numpy as np #supporting multi-dimensional arrays and matrices
import os #read or write a file
import cv2
import pandas as pd #data manipulation and analysis
from tqdm import tqdm # for well-established ProgressBar
from random import shuffle #only shuffles the array along the first axis of a multi-dimensional array. The order of sub-arrays is changed but their contents remains the same.
LR = 0.003
MODEL_NAME = 'plantclassfication-{}-{}.model'.format(LR, '2conv-basic') # just so we remember which save
# In[2]:
data_dir = '../input/'
train_dir = os.path.join(data_dir, 'train')
test_dir = os.path.join(data_dir, 'test')
IMG_SIZE = 128
# In[3]:
#list of categories in array format
CATEGORIES = ['Black-grass', 'Charlock', 'Cleavers', 'Common Chickweed', 'Common wheat', 'Fat Hen', 'Loose Silky-bent',
'Maize', 'Scentless Mayweed', 'Shepherds Purse', 'Small-flowered Cranesbill', 'Sugar beet']
NUM_CATEGORIES = len(CATEGORIES)
print (NUM_CATEGORIES)
# In[4]:
''' function that accept plant category and return array format of the vlaue , one-hot array
am sure there's better way to do this .......'''
def label_img(word_label):
if word_label == 'Black-grass': return [1,0,0,0,0,0,0,0,0,0,0,0]
elif word_label == 'Charlock': return [0,1,0,0,0,0,0,0,0,0,0,0]
elif word_label == 'Cleavers': return [0,0,1,0,0,0,0,0,0,0,0,0]
elif word_label == 'Common Chickweed': return [0,0,0,1,0,0,0,0,0,0,0,0]
elif word_label == 'Common wheat': return [0,0,0,0,1,0,0,0,0,0,0,0]
elif word_label == 'Fat Hen': return [0,0,0,0,0,1,0,0,0,0,0,0]
elif word_label == 'Loose Silky-bent': return [0,0,0,0,0,0,1,0,0,0,0,0]
elif word_label == 'Maize': return [0,0,0,0,0,0,0,1,0,0,0,0]
elif word_label == 'Scentless Mayweed': return [0,0,0,0,0,0,0,0,1,0,0,0]
elif word_label == 'Shepherds Purse': return [0,0,0,0,0,0,0,0,0,1,0,0]
elif word_label == 'Small-flowered Cranesbill': return [0,0,0,0,0,0,0,0,0,0,1,0]
elif word_label == 'Sugar beet': return [0,0,0,0,0,0,0,0,0,0,0,1]
# In[5]:
'''function that will create train data , will go thought all the file do this
----read the image in grayscale mode ,resize it
---change it to numpy arrays and append it to dataframe train with it`s associated category '''
def create_train_data():
train = []
for category_id, category in enumerate(CATEGORIES):
for img in tqdm(os.listdir(os.path.join(train_dir, category))):
label=label_img(category)
path=os.path.join(train_dir,category,img)
img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))
train.append([np.array(img),np.array(label)])
shuffle(train)
return train
# In[6]:
train_data = create_train_data()
# In[7]:
'''function that will create test data , will go thought file do this
----read the image in grayscale mode ,resize it
---change it to numpy arrays and append it to dataframe test but no category here of course '''
def create_test_data():
test = []
for img in tqdm(os.listdir(test_dir)):
path = os.path.join(test_dir,img)
img_num = img
img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))
test.append([np.array(img), img_num])
shuffle(test)
return test
# In[8]:
test_data = create_test_data()
# In[9]:
import tensorflow as tf #used for machine learning applications such as neural networks
import tflearn #modular and transparent deep learning library built on top of Tensorflow
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression
tf.reset_default_graph()
convnet = input_data(shape=[None, IMG_SIZE, IMG_SIZE, 1], name='input')
convnet = conv_2d(convnet, 32, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = conv_2d(convnet, 64, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = conv_2d(convnet, 32, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = conv_2d(convnet, 64, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = conv_2d(convnet, 32, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = conv_2d(convnet, 64, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)
convnet = fully_connected(convnet, 1024, activation='relu')
convnet = dropout(convnet, 0.8)
convnet = fully_connected(convnet, 12, activation='softmax')
convnet = regression(convnet, optimizer='adam', learning_rate=LR, loss='categorical_crossentropy', name='targets')
model = tflearn.DNN(convnet, tensorboard_dir='log')
if os.path.exists('{}.meta'.format(MODEL_NAME)):
model.load(MODEL_NAME)
print('model loaded!')
train = train_data
test = train_data
X = np.array([i[0] for i in train]).reshape(-1,IMG_SIZE,IMG_SIZE,1)
Y = [i[1] for i in train]
test_x = np.array([i[0] for i in test]).reshape(-1,IMG_SIZE,IMG_SIZE,1)
test_y = [i[1] for i in test]
model.fit({'input': X}, {'targets': Y}, n_epoch=5, validation_set=({'input': test_x}, {'targets': test_y}),
snapshot_step=500, show_metric=True, run_id=MODEL_NAME)
# In[10]:
model.save(MODEL_NAME)
# In[11]:
#return Indexes of the maximal elements of a array
def label_return (model_out):
if np.argmax(model_out) == 0: return 'Black-grass'
elif np.argmax(model_out) == 1: return 'Charlock'
elif np.argmax(model_out) == 2: return 'Cleavers'
elif np.argmax(model_out) == 3: return 'Common Chickweed'
elif np.argmax(model_out) == 4: return 'Common wheat'
elif np.argmax(model_out) == 5: return 'Fat Hen'
elif np.argmax(model_out) == 6: return 'Loose Silky-bent'
elif np.argmax(model_out) == 7: return 'Maize'
elif np.argmax(model_out) == 8: return 'Scentless Mayweed'
elif np.argmax(model_out) == 9: return 'Shepherds Purse'
elif np.argmax(model_out) == 10: return 'Small-flowered Cranesbill'
elif np.argmax(model_out) == 11: return 'Sugar beet'
# In[16]:
import matplotlib.pyplot as plt
test_data = create_test_data()
fig=plt.figure(figsize = (18,10))
for num,data in enumerate(test_data[:12]):
img_num = data[1]
img_data = data[0]
y = fig.add_subplot(3,4,num+1)
orig = img_data
data = img_data.reshape(IMG_SIZE,IMG_SIZE,1)
model_out = model.predict([data])[0]
str_label=label_return (model_out)
y.imshow(orig,cmap='gray',interpolation='nearest')
plt.title(str_label)
y.axes.get_xaxis().set_visible(False)
y.axes.get_yaxis().set_visible(False)
plt.show()