Целью скрипта является использование существующего модуля предварительной обработки изображений Keras для увеличения видеоданных. В этом прототипе, видео образец разбивается на массив кадров и обрабатываются, где окончательные шаги включают в себя выполнение случайных поворотов, смены, ножницы и масштабирование:Keras Image Preprocessing: Tuple Index Out of Range
from keras import backend as K
from keras.preprocessing.image import random_rotation, random_shift, random_shear, random_zoom
K.set_image_dim_ordering("th")
import cv2
import numpy as np
video_file_path = "./training-data/yes/1.mov"
samples_generated_per_sample = 10
self_rows = 100
self_columns = 150
self_frames_per_sequence = 45
# haar cascades for localizing oral region
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
mouth_cascade = cv2.CascadeClassifier('haarcascade_mcs_mouth.xml')
video = cv2.VideoCapture(video_file_path)
success, frame = video.read()
frames = []
success = True
# convert to grayscale, localize oral region, equalize dimensions,
# normalize pixels, equalize lengths, and accumulate valid frames
while success:
success, frame = video.read()
if success:
# convert to grayscale
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# localize single facial region
faces_coords = face_cascade.detectMultiScale(frame, 1.3, 5)
if len(faces_coords) == 1:
face_x, face_y, face_w, face_h = faces_coords[0]
frame = frame[face_y:face_y + face_h, face_x:face_x + face_w]
# localize oral region
mouth_coords = mouth_cascade.detectMultiScale(frame, 1.3, 5)
threshold = 0
for (mouth_x, mouth_y, mouth_w, mouth_h) in mouth_coords:
if (mouth_y > threshold):
threshold = mouth_y
valid_mouth_coords = (mouth_x, mouth_y, mouth_w, mouth_h)
else:
pass
mouth_x, mouth_y, mouth_w, mouth_h = valid_mouth_coords
frame = frame[mouth_y:mouth_y + mouth_h, mouth_x:mouth_x + mouth_w]
frames.append(frame)
# ignore multiple facial region detections
else:
pass
# pre-pad short sequences and equalize sequence lengths
if len(frames) < self_frames_per_sequence:
frames = [frames[0]]*(self_frames_per_sequence - len(frames)) + frames
frames = frames[0:self_frames_per_sequence]
frames = np.asarray(frames)
rotated_frames = random_rotation(frames, rg=45)
shifted_frames = random_shift(rotated_frames, wrg=0.25, hrg=0.25)
sheared_frames = random_shear(shifted_frames, intensity=0.79)
zoomed_frames = random_zoom(sheared_frames, zoom_range=(1.25, 1.25))
Когда сценарий вводного следующее сообщение об ошибке :
Можете ли вы уточнить, когда вы говорите «неравные размеры рамки»? Каковы были размеры до и после ваших изменений? – Benjamin
@ Benjamin изначально, все рамки имеют одинаковые размеры (1980 x 1080), но после применения каскадной классификации для локализации и обрезания полости рта рамы больше не имеют одинаковых размеров (например, рот открыт против рта закрыт, при варьировании градусов, что приводит к тому, что высота колеблется от ~ 85-110 и шириной до ~ 135-170). Изменили их размеры, чтобы стандартизировать их размеры до 100x150 (среднее значение их ширины/высоты). –