В сегодняшнем блоге мы будем использовать трансферное обучение для реализации нашего сегодняшнего проекта — классификации пород обезьян. Трансферное обучение — это просто использование уже обученной модели для нашего текущего варианта использования. В этом случае мы будем использовать 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