Картинки борща, пельменей и кофе я спарсил из гугла и яндекса. Далее разложил их по папкам train и data. Засада оказалась в керасе, а именно в модуле image generator. Я не хотел что бы датасет занимал всю оперативку, но почему то когда программа доходила до этого модуля, то она зависала. Ну тогда я решил идти простым пу тем и просто забил весь датасет в оперативку.
def data_load_image(folder, y, z): imagePath = folder + '/' jpg1 = ".jpg" y = int(y) global number global dataset_X global dataset_Y global dataval_X global dataval_Y for file in glob.glob(folder +"/*"): identify = os.path.splitext(os.path.basename(file))[0] #print (identify) cv = imagePath + identify + jpg1 #print (cv) img = (cv2.imread(cv)) img = cv2.resize(img,(224,224)) #img = np.reshape(img,(3,224,224)) if z == 1: dataset_X[number, :, : , :] = img/255.0 dataset_Y[number, y] = 1 else: dataval_X[number, :, :, :] = img/255.0 dataval_Y[number, y] = 1 number = number + 1
Далее скачиваем библиотеку Resnet-50 без подключенных верхних слоев и замораживаем их. Обучение наиважнейшей задаче по рапознованию пельмешек было опробованно так же на VGG-19 и MobileNet, но они с задачей не справлялись от слова совсем.
model = applications.ResNet50( weights = 'imagenet',include_top = False, input_tensor = img, input_shape = None, pooling = 'avg')for layer in model.layers: layer.trainable = False
Добавляем слои для transfer learning
#Adding custom Layers x = model.layers[-1].output#x = Flatten()(x)#x = Dense(128, activation="relu")(x)x = Dropout(0.1)(x)x = Dense(256, activation="relu")(x)predictions = Dense(4, activation="sigmoid")(x)# creating the final model model_final = Model(input = model.input, output = predictions)
Функция для перемешивания наших картинок, что бы нейросети было сложнее обучаться. Хочу заметить что я не задавал конкретного значения для функции рандома. Модель обучалась несколько раз с разным значением рандома и каждый раз результат был более 90 процентов. Похоже правило счастливого билета действует только для больших нейронных сетей.
def unison_shuffled_copies(a, b): assert len(a) == len(b) z = np.arange(a.shape[0]) np.random.shuffle(z) print(z.shape) return a[z,:], b[z,:]
Для обучения я использовал категориальную кросэнтропию, а оптимизатор адам.
model_final.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])model.summary()
Ну и сам процесс обучения. Здесь я перемешивал картинки каждую эпоху
for i in range(30):print('STEP ' + str(i))model_final.fit(dataset_X, dataset_Y, epochs=1, batch_size=15)dataset_X, dataset_Y = unison_shuffled_copies(dataset_X,dataset_Y)
Результат на видео.
Ссылка на исходники.
Для запуски нейронки запустите файл opencv-camera.py