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