CNN: Том и Джерри… Вы можете поймать меня?
В предыдущей главе мы говорили о том, «как построить модель CNN» для классификации изображений, классифицируя собаку и кошку. В этом блоге мы будем применять модель CNN с видеовходом.
Как работать с видеоданными?
Собственно, видео создано из серии изображений. Итак, нам нужно извлечь изображение кадр за кадром из видео. Вот и все!!!
В этом примере мы создадим модель CNN, чтобы рассчитать экранное время «Тома» и «Джерри».
Начнем!!!
Шаг 0. Во-первых, нам нужно импортировать необходимое в нашу модель.
import cv2 # для захвата видео
import math # для математических операций
import matplotlib.pyplot as plt # для построения изображений
%matplotlib inline
import pandas as pd
from keras.preprocessing import image # для предварительной обработки изображений
import numpy as np # для математических операций
from keras.utils import np_utils
from skimage.transform import resize # для изменения размера изображений
Шаг 1. Прочтите видео про Тома и Джерри, извлеките из него кадры и сохраните их как изображения.
#########################################
#Шаг — 1: Чтение видео, извлекать из него кадры и сохранять их как изображения
################################### ######
count = 0
videoFile = «Tom and jerry.mp4»
cap = cv2.VideoCapture(videoFile) # захват видео с заданного пути
frameRate = cap.get(5) #частота кадров
x=1
while(cap.isOpened()):
frameId = cap.get(1) #номер текущего кадра
> ret, frame = cap.read()
if (ret != True):
break
if (frameId % math.floor(frameRate) == 0):
имя_файла = "frame%d.jpg" % count;count+=1
cv2.imwrite(имя файла, кадр)
cap.release()
print ("Готово!")
> img = plt.imread('frame0.jpg') # чтение изображения по его имени
plt.imshow(img)
# визуализировать изображение (кадр)
img = plt.imread(‘frame0.jpg’) # чтение изображения по его имени
plt.imshow(img)
Шаг 2. Пометьте несколько изображений для обучения модели
#########################################
#Шаг — 2: Метка несколько изображений для обучения модели
######################################## #
#0 — ни JERRY, ни TOM
#1 — для JERRY
#2 — для TOM
data = pd.read_csv('mapping.csv') # чтение csv file
data.head() # печатаем первые пять строк файла
#читаем изображения, которые мы будем делать на основе их имен
X = [ ] # создаем пустой массив
для img_name в data.Image_ID:
img = plt.imread('' + img_name )
X.append(img) # сохранение каждого изображения в массиве X
X = np.array(X) # преобразование списка в массив
# закодировать три класса с помощью to_categorical()
y = data.Class
dummy_y = np_utils.to_categorical(y) # один класс горячего кодирования
#Изменить размер всего изображения с помощью функции resize()
image =[]
for i in range(0,X.shape[0]):
a = resize(X[i], save_range =True, output_shape=(224,224)).astype(int) #reshape to 224*224*3
image.append(a)
X = np.массив (изображение)
#Предварительная обработка
from keras.applications.vgg16 import preprocess_input
X = preprocess_input(X, mode = ‘tf’) #предварительная обработка входных данных
#validation установлен для проверки производительности модели на невидимых изображениях
из sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X, dummy_y, test_size=0.3, random_state=42) # подготовка набора для проверки
Шаг 3. Создание модели
#########################################
#Шаг 3. Создание модель
########################################
# импортировать необходимые библиотеки для построения модели
из keras.models import Sequential
из keras.applications.vgg16 import VGG16
из keras.layers import Dense, InputLayer, Dropout
# загрузите предварительно обученную модель VGG16 и сохраните ее как base_model
base_model = VGG16(weights=’imagenet’, include_top=False, input_shape=(224, 224, 3)) # include_top=False, чтобы удалить верхний слой
# делать прогнозы, используя эту модель для X_train и X_valid, получать функции, а затем использовать эти функции для повторного обучения модели
X_train = base_model.predict(X_train)
X_valid = base_model.predict(X_valid)
X_train.shape, X_valid.shape
#Форма X_train и X_valid: (208, 7, 7, 512), (90, 7, 7, 512) = › изменить форму на 1D.
X_train = X_train.reshape(208, 7* 7*512) # преобразование в 1-D
X_valid = X_valid.reshape(90, 7*7*512)
#Предварительно обработайте изображение и сделайте его центрированным по нулю, что поможет модели быстрее сходиться
train = X_train/X_train.max() # центрирование данных
X_valid = X_valid/X_train.max()
########################################
#Build the Model_This шаг может быть разделен на 3 подэтапа:
#Построение модели
#Компиляция модели
#Обучение модели
# я. Построение модели
model = Sequential()
model.add(InputLayer((7*7*512,))) # входной слой
model.add(Dense(units=1024, активация ='sigmoid')) # скрытый слой
model.add(Dense(3, активация='softmax')) # выходной слой
#проверить сводку модели с помощью функции summary():
model.summary()
# ii. Компиляция модели
model.compile(loss=’categorical_crossentropy’, Optimizer=’adam’, metrics=[‘accuracy’])
# III. Обучение модели
model.fit(train, y_train, epochs=100, validation_data=(X_valid, y_valid))
#################### #####################
Шаг 4. Расчет экрана времени
#########################################
#Шаг 4: Расчет экранное время
#########################################
# загрузите видео и извлеките кадры
count = 0
videoFile = «Tom and Jerry 3.mp4»
cap = cv2.VideoCapture(videoFile)
frameRate = cap.get( 5) #частота кадров
x=1
while(cap.isOpened()):
frameId = cap.get(1) #номер текущего кадра
ret, frame = cap .read()
if (ret != True):
break
if (frameId % math.floor(frameRate) == 0):
filename =”test%d .jpg” % count;count+=1
cv2.imwrite(имя файла, кадр)
cap.release()
print («Готово!»)
# загрузите файл test.csv, содержащий имена всех извлеченных кадров
test = pd.read_csv(‘test.csv’)
#импортируйте изображения для тестирования, а затем измените их форму в соответствии с требованиями вышеупомянутой предварительно обученной модели:
test_image = []
для img_name в test.Image_ID:
img = plt.imread(' ' + img_name)
test_image.append(img)
test_img = np.array(test_image)
test_image = []
for i in range(0,test_img.shape[0]):
a = resize(test_img[i], save_range=True, output_shape=(224,224)).astype(int )
test_image.append(a)
test_image = np.array(test_image)
### предварительно обработайте изображения, используйте функцию base_model.predict() для извлечения признаков из этих изображений с помощью предварительно обученной модели VGG16, преобразуйте эти изображения в одномерную форму и сделайте их центрированными по нулю:
# предварительная обработка изображения
test_image = preprocess_input(test_image, mode='tf')
# извлечение признаков из изображений с помощью предварительно обученной модели
test_image = base_model.predict(test_image)
# преобразование изображений в 1D-форму
test_image = test_image.reshape(186, 7*7*512)
# изображения с нулевым центром
test_image = test_image/test_image.max()
########################################
Шаг 5. Сделайте прогноз
#########################################
#Шаг 5: Делайте прогнозы для остальных изображений
##########################################
прогнозы = model.predict_classes (test_image)
########################################
Шаг 6. Захватите их на экране!!!
#########################################
#Шаг 6: Расчет экранное время Тома и Джерри
######################################## #
print("Экранное время ДЖЕРРИ равно", Predictions[predictions==1].shape[0], "секунды")
print("Экранное время ТОМА равно", Predictions[predictions==2] .shape[0], «секунды»)
########################################
Выходы…
Экранное время JERRY составляет 5 секунд
Экранное время TOM составляет 131 секунду
Наконец, мы можем рассчитать экранное время как для «Тома», так и для «Джерри», предсказав изображение или кадр (извлеченный из видео) с помощью модели CNN.
Надеюсь, тебе понравится!
Ссылка: https://www.analyticsvidhya.com/blog/2018/09/deep-learning-video-classification-python/