В сегодняшнем блоге мы будем использовать трансферное обучение для реализации нашего сегодняшнего проекта — классификации пород обезьян. Трансферное обучение — это просто использование уже обученной модели для нашего текущего варианта использования. В этом случае мы будем использовать Mobilenet, предварительно обученный на Imagenet. Так что без каких-либо дополнительных должностей.
Прочитайте полную статью с исходным кодом здесь —https://machinelearningprojects.net/monkey-breed-classification/
Давай сделаем это…
Шаг 1 — Импорт необходимых библиотек для классификации пород обезьян.
from tensorflow.keras.applications.mobilenet import MobileNet from tensorflow.keras.layers import Dense,Dropout,GlobalAveragePooling2D,Conv2D,MaxPooling2D,Activation from tensorflow.keras.models import Model from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.callbacks import EarlyStopping,ModelCheckpoint from tensorflow.keras.optimizers import RMSprop
Шаг 2 — Создание экземпляра Mobilenet с весами Imagenet.
height = 224 width = 224 mobilenet = MobileNet(weights='imagenet', include_top=False, input_shape=(height,width,3)) for layer in mobilenet.layers: layer.trainable = False for i,layers in enumerate(mobilenet.layers): print(f'Layer {i+1} --> ',layers.__class__.__name__,layers.trainable)
- Объявление высоты и ширины изображений.
- Декларируя Mobilenet с весами Imagenet, топ не входит.
- Невключение top означает, что полносвязные слои в последних частях реальной модели Mobilenet здесь не загружаются. Мы создадим и обучим наши собственные полносвязные слои.
- Мы устанавливаем для обучаемого параметра слоев значение False, потому что мы не хотим изменять веса сети изображений.
- Последний шаг — это просто печать имен слоев и их обучаемых параметров.
- Без верха будет 86 слоев, как показано ниже. На изображении ниже показаны только 20 слоев, но на самом деле таких слоев 86.
Шаг 3 — Создание топ-модели для модели классификации пород обезьян.
def add_top_layers_to_MobileNet(bottom_model,num_classes): top_model = bottom_model.output top_model = GlobalAveragePooling2D()(top_model) top_model = Dense(1024,activation='relu')(top_model) top_model = Dense(1024,activation='relu')(top_model) top_model = Dense(512,activation='relu')(top_model) top_model = Dense(num_classes,activation='softmax')(top_model) return top_model
- На этом шаге создается голова модели, которая будет размещена на нижней модели (импортированная модель мобильной сети с 86 слоями).
- Мы говорим, что это голова, но на самом деле это не голова, поскольку она соединяется после 86 слоев, как мы видели выше.
- Это просто наши полносвязные слои, которые в основном будут обучаться в соответствии с нашим вариантом использования классификации.
- Строка 2. Прежде всего, мы получаем выходные данные слоев мобильной сети.
- Строка 3. Затем мы добавляем слой GlobalAveragePooling2D, который будет принимать среднее значение всех значений в одном фильтре.
- Строка 4–6 — мы добавляем 3 полносвязных слоя или плотных слоя с 1024, 1024 и 512 узлами соответственно с активацией relu во всех из них.
- Строка 7 — Наконец, последний плотный слой с 10 узлами. Здесь мы использовали 10 узлов, потому что в наших данных есть 10 классов обезьян.
- Строка 8 — Наконец возвращаем модель.
Шаг 4 — Соедините нижнюю и верхнюю модели.
self_made_layers = add_top_layers_to_MobileNet(mobilenet,10) model = Model(inputs = mobilenet.input , outputs = self_made_layers) model.compile(loss='categorical_crossentropy', optimizer=RMSprop(learning_rate=0.001), metrics=['accuracy']) print(model.summary())
- Строка 1 — мы получаем топ-модель, которую построили выше.
- Линия 2 — соединение обеих моделей.
- Затем просто скомпилируйте нашу модель и распечатайте сводку модели.
- Резюме намного длиннее, чем это, но из-за ограничений изображения я могу показать вам только это.
Шаг 5 — Создайте экземпляры ImageDataGenerators для увеличения данных.
train_dir = 'monkey_breed\\train' validation_dir = 'monkey_breed\\validation' train_gen = ImageDataGenerator(rescale=1./255, rotation_range=45, height_shift_range=0.3, width_shift_range=0.3, horizontal_flip=True, fill_mode='nearest') validation_gen = ImageDataGenerator(rescale=1./255)
- Создание экземпляра ImageDataGenerator для обучения и проверки увеличения данных.
Шаг 6 — Дополнение данных для классификации пород обезьян.
training_data = train_gen.flow_from_directory(train_dir, batch_size=1, shuffle=True, class_mode='categorical', target_size=(rows,columns)) valiadtion_data = validation_gen.flow_from_directory(validation_dir, batch_size=1, shuffle=False, class_mode='categorical', target_size=(rows,columns))
Шаг 7 — Создание обратных вызовов для модели классификации пород обезьян.
checkpoint = ModelCheckpoint('model/monkey_breed_MobileNet_V1.h5', verbose=1, mode='min', monitor='val_loss', save_best_only=True) earlystopping = EarlyStopping(verbose=1, monitor='val_loss', restore_best_weights=True, patience=3, min_delta=0) callbacks = [earlystopping,checkpoint]
- Блокпойнт всегда спасет лучшую модель.
- Здесь лучше всего подразумевается модель с минимальным val_loss.
- EarlyStopping остановит наше обучение, если val_loss не уменьшается даже после 3 эпох.
Шаг 8 — Объявите некоторые константы.
train_samples = 1098 validation_samples = 272 epochs = 5 batch_size = 1
Шаг 9 — Окончательное обучение модели классификации пород обезьян.
history = model.fit(training_data, epochs=epochs, steps_per_epoch=train_samples//batch_size, validation_data=valiadtion_data, callbacks=callbacks, validation_steps=validation_samples//batch_size)
Шаг 10 — Живой прогноз на 10 случайных изображениях.
import os import cv2 import numpy as np import random from keras.models import load_model model = load_model('model\\monkey_breed_MobileNet_V1.h5') acc=[] monkey_breed_dict={'[0]':'mantled_howler', '[1]':'patas_monkey', '[2]':'bald_uakari', '[3]':'japanese_macaque', '[4]':'pygmy_marmoset', '[5]':'white_headed_capuchin', '[6]':'silvery_marmoset', '[7]':'common_squirrel_monkey', '[8]':'black_headed_night_monkey', '[9]':'nilgiri_langur'} for i in range(10): monkey_class = np.random.randint(0,9) all_class_list = os.listdir('monkey_breed\\validation') select_one_class = all_class_list[monkey_class] pick_one_pic = random.choice(os.listdir('monkey_breed\\validation\\'+str(select_one_class)+'\\')) org_img = cv2.imread('monkey_breed\\validation\\'+str(select_one_class)+'\\'+pick_one_pic) org_img = cv2.resize(org_img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA) img = org_img.copy() show_img = org_img.copy() show_img = cv2.resize(show_img,(500,500),interpolation=cv2.INTER_LINEAR) img = cv2.resize(img,(224,224),interpolation=cv2.INTER_LINEAR) img = img/255 img = img.reshape(1,224,224,3) true = monkey_breed_dict[str([monkey_class])] predicted = monkey_breed_dict[str([np.argmax(model.predict(img,1,verbose=0))])] cv2.putText(show_img,'true - '+true,(10,40),cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,255,255),2) cv2.putText(show_img,'predicted - '+predicted,(10,60),cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,255,255),2) cv2.imshow('random img',show_img) acc.append(np.equal(monkey_class,np.argmax(model.predict(img,1,verbose=0)))) cv2.waitKey(0) cv2.destroyAllWindows() print('\n') print('Accuracy ---> ',str(round(np.mean(acc)*100,2))+' %')
- Здесь мы просто случайным образом берем 10 изображений из папки проверки и предсказываем их классы.
- Мы получаем точность около 80% и 90% каждый раз.
Дайте мне знать, если есть какие-либо вопросы относительно классификации пород обезьян, связавшись со мной по электронной почте или в LinkedIn.
Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог — Проекты машинного обучения
Для дальнейшего объяснения кода и исходного кода посетите здесь — https://machinelearningprojects.net/monkey-breed-classification/
Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…
Прочитайте мой предыдущий пост: ОПРЕДЕЛЕНИЕ ВОЗРАСТА С ИСПОЛЬЗОВАНИЕМ CNN С KERAS