Обучение классификатора изображений с нуля с помощью TensorFlow 2.0

Мы будем обучать CNN классифицировать логотип конкретного персонажа. В этом примере я взял пять разных персонажей, а именно Бэтмен, Супермен, Зеленый Фонарь, Чудо-женщину и Флэш. Это будет конец до конца статьи. Он включает в себя шаги от сбора данных до сохранения обученной модели.

Предпосылки

  1. Знание Python
  2. Аккаунт Google: поскольку мы будем использовать Google Colab

Итак, пора запачкать руки!

Сначала мы будем собирать данные с помощью GoogleImagesDownload, очень удобного пакета Python для загрузки изображений из поиска Google. Теперь мы загрузим изображения для каждого класса (здесь у нас есть пять классов: Бэтмен, Супермен, Зеленый фонарь, Чудо-женщина и Флэш). Пожалуйста, обратитесь к документации об использовании инструмента, упомянутого в указанной выше ссылке.

Вот ссылка на ChromeDriver, если у вас возникнут проблемы с ее поиском.

googleimagesdownload - ключевые слова «логотип бэтмена» - chromedriver chromedrvier - лимит 300

Я запустил приведенный выше оператор в командной строке, чтобы получить изображения для каждого класса, изменив ключевые слова поиска. Теперь я выбрал файлы с расширением .jpg, так как он также загружает файлы с другими расширениями. Мне пришлось вручную удалить некоторые ненужные изображения. Затем я переименовал изображения. Я делал это для каждого класса. Для переименования и выбора только файлов .jpg я предоставил скрипты в репозитории Github. Вам просто нужно будет позаботиться о путях перед их выполнением.

Наконец, я создал папку с именем data, содержащую изображения для каждого класса. Иерархия каталогов выглядела так, как показано на снимке ниже.

Теперь загрузите эту папку на свой гугл-диск. После загрузки этой папки на Google Диск, мы создадим новый блокнот colab по этой ссылке. Google colab предоставляет нам среду jupyter. Вы можете обратиться к записной книжке jupyter в репозитории Github. Теперь мы начнем с предварительной обработки, а затем определим модель для ее обучения.

!pip install tensorflow==2.0

Итак, в первой ячейке мы установили TensorFlow 2.0. Теперь мы импортируем все нужные нам пакеты.

import cv2
import os
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
from tensorflow.keras import layers, models
from google.colab import drive
drive.mount('/content/drive')

Мы используем cv2 для обработки изображений, os для работы с путями. numpy используется для массивов numpy. TensorFlow будет использоваться для определения и обучения моделей. Здесь я использовал перемешивание из sklearn.utils для перемешивания данных изображения при выполнении разделения на поезд-тест. Наконец, диск из google.colab будет использоваться для монтирования диска Google на ноутбуке colab.

После выполнения последней строки указанной выше ячейки будет предоставлена ​​ссылка с токеном проверки. Как только токен будет предоставлен, диск Google будет установлен на ноутбуке Colab. Я определил две функции loadTrain () и readData (), loadTrain () помогут в предварительной обработке изображения. Предварительная обработка изображения включает изменение размера, нормализацию и присвоение меток соответствующим изображениям.

validationSize = 0.2
imageSize = 128
numChannels = 3
dataPath = "/content/drive/My Drive/comic/data"
classes = os.listdir(dataPath)
numClasses = len(classes)
print("Number of classes are : ", classes)
print("Training data Path : ",dataPath)

Примечание. Позаботьтесь о пути к папке с данными. Здесь я держал это под комиксом.

Здесь validationSize задано значение 0,2, поэтому 80% будут нашими данными обучения и 20% данными тестирования. imageSize задает размер изображения, которое будет передано модели на вход. numChannels присваивается значение 3, так как наше изображение будет считываться в каналы RGB.

data = readData(dataPath,classes,imageSize,validationSize)

X_train,y_train,names_train,cls_train = data.train.getData()
X_test,y_test,names_test,cls_test = data.valid.getData()

print("Training data X : " , X_train.shape)
print("Training data y : " , y_train.shape)
print("Testing data X : ",X_test.shape)
print("Testing data y : ",y_test.shape)

Теперь у нас есть готовые данные для обучения и тестирования. Пришло время определить нашу модель и обучить ее.

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(5, activation='softmax'))

За слоем Conv следует слой max-pooling. Здесь форма ввода 128 * 128 * 3, поскольку мы изменили размер нашего изображения до разрешения 128 * 128, а 3 - это количество каналов. Опять же, у нас есть слой Conv, за которым следует max-pooling. Затем снова слой Conv, и теперь тензор выравнивается в следующем слое. Теперь у нас есть плотный слой, связанный с нашим выходным слоем. Здесь выходной слой состоит из 5 единиц, так как у нас есть пять классов для классификации.

model.summary()

Мы получаем краткое изложение нашей определенной модели. Пришло время тренироваться.

history = model.fit(X_train,y_train, epochs=4, 
                    validation_data=(X_test,y_test))

Я также упомянул графики и метрики точности. Вы можете проверить это в моем блокноте jupyter.

model.save("comic.h5")

Мы сохраняем нашу модель в файле .h5, но он является локальным для colab, поэтому мы сохраним его на Google Диске.

!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive 
from google.colab import auth 
from oauth2client.client import GoogleCredentials

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()          
drive = GoogleDrive(gauth)
model_file = drive.CreateFile({'title' : 'comic.h5'})                       
model_file.SetContentFile('comic.h5')                       
model_file.Upload()
drive.CreateFile({'id': model_file.get('id')})

Итак, теперь наша обученная модель будет сохранена на Google Диске. Его легко скачать с гугл-диска.

Теперь для классификации я написал сценарий с именем classify.py. Здесь мы передадим путь к нашему изображению в качестве аргумента CLI. Наш вывод будет предсказуемым классом. Фактически мы получаем вероятности для каждого класса, выберем один с максимумом. Иногда модель делает неправильную классификацию. Работаем над повышением точности, сейчас точность составляет 80%.

Вот ссылка на мое репозиторий на Github.

Далее я постараюсь описать свой опыт развертывания его как API на облачной платформе. Вы также можете развернуть его на мобильных устройствах, преобразовав модель в облегченную версию и сохранив ее в файл .tflite. Дополнительные сведения см. В документации TensorFlow Lite. Не стесняйтесь связываться со мной в LinkedIn, Github и Instagram. Сообщите мне о любых импровизациях.

Спасибо!