Обработка видео и распознавание действий являются важными задачами компьютерного зрения и широко используются в системах наблюдения, умных домах, спортивном анализе и других областях. Используя Python и технологию глубокого обучения, мы можем создать простую систему распознавания действий. В этой статье рассказывается, как использовать Python для реализации обработки видео и распознавания действий, а также приводятся подробные примеры кода.
pip install tensorflow opencv-python matplotlib
Мы будем использовать набор данных UCF101, который является широко используемым набором данных для распознавания действий. Вот код для загрузки и предварительной обработки данных:
import tensorflow as tf
import os
import cv2
import numpy as np
# Загрузите и разархивируйте набор данных UCF101.
url = "https://www.crcv.ucf.edu/data/UCF101/UCF101.rar"
data_dir = tf.keras.utils.get_file('UCF101', origin=url, untar=True)
# Определить функции загрузки и предварительной обработки видео.
def load_video(path, max_frames=0, resize=(224, 224)):
cap = cv2.VideoCapture(path)
frames = []
try:
while True:
ret, frame = cap.read()
if not ret:
break
frame = cv2.resize(frame, resize)
frame = frame[:, :, [2, 1, 0]] # BGR to RGB
frames.append(frame)
if max_frames and len(frames) == max_frames:
break
finally:
cap.release()
return np.array(frames)
# Пример: загрузить видео
video_path = os.path.join(data_dir, 'ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01.avi')
video = load_video(video_path)
print(f"Video shape: {video.shape}")
Мы будем использовать предварительно обученную модель InceptionV3 в качестве экстрактора признаков и строить на ее основе модель распознавания действий. Ниже приведен код определения модели:
from tensorflow.keras.applications import InceptionV3
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, TimeDistributed, LSTM
# Загрузите предварительно обученную модель InceptionV3.
base_model = InceptionV3(weights='imagenet', include_top=False)
# Постройте модель распознавания действий
model = Sequential([
TimeDistributed(base_model, input_shape=(None, 224, 224, 3)),
TimeDistributed(GlobalAveragePooling2D()),
LSTM(64),
Dense(101, activation='softmax') # UCF101 имеет 101 категорию действий.
])
# Скомпилировать модель
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Посмотреть структуру модели
model.summary()
Мы определим генератор данных и будем использовать его для обучения модели. Вот код для обучения модели:
from tensorflow.keras.utils import Sequence
class VideoDataGenerator(Sequence):
def __init__(self, video_paths, labels, batch_size=8, max_frames=40, resize=(224, 224)):
self.video_paths = video_paths
self.labels = labels
self.batch_size = batch_size
self.max_frames = max_frames
self.resize = resize
def __len__(self):
return len(self.video_paths) // self.batch_size
def __getitem__(self, idx):
batch_x = self.video_paths[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_y = self.labels[idx * self.batch_size:(idx + 1) * self.batch_size]
return np.array([load_video(path, self.max_frames, self.resize) for path in batch_x]), np.array(batch_y)
# Пример: создание генератора данных
video_paths = [os.path.join(data_dir, 'ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01.avi')] * 10
labels = [0] * 10 # Предположим, что метки всех видео равны 0.
train_generator = VideoDataGenerator(video_paths, labels)
# Модель обучения
model.fit(train_generator, epochs=10)
Мы можем оценить производительность модели, используя тестовые данные. Вот код для оценки модели:
# Пример: оценка модели
test_video_paths = [os.path.join(data_dir, 'ApplyEyeMakeup/v_ApplyEyeMakeup_g01_c01.avi')] * 2
test_labels = [0] * 2
test_generator = VideoDataGenerator(test_video_paths, test_labels)
loss, accuracy = model.evaluate(test_generator)
print(f"Test accuracy: {accuracy * 100:.2f}%")
Мы можем использовать Matplotlib для отображения результатов обработки видео и распознавания действий. Ниже приведен код для визуализации:
import matplotlib.pyplot as plt
# Визуализируйте видеокадры
def visualize_video(video):
fig, axes = plt.subplots(1, len(video), figsize=(20, 5))
for i, frame in enumerate(video):
axes[i].imshow(frame)
axes[i].axis('off')
plt.show()
# Пример:Визуализируйте видеокадры
visualize_video(video[:5])
С помощью описанных выше шагов мы реализовали простую систему обработки видео и распознавания действий. Эта система может загружать видеоданные, извлекать функции и определять действия в видео. Надеюсь, этот урок поможет вам!