2017-02-16 7 views
0

Целью скрипта является использование существующего модуля предварительной обработки изображений 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)) 

Когда сценарий вводного следующее сообщение об ошибке : Output Error

ответ

0

Проблема была связана с неравными размерами рамы. Раствор сначала уравнять размеры рамы перед наклеиванием преобразований:

# pre-pad short sequences, equalize frame dimensions, 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 = [cv2.resize(frame, (self_columns, self_rows)).astype('float32') for frame in frames] 
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)) 
+0

Можете ли вы уточнить, когда вы говорите «неравные размеры рамки»? Каковы были размеры до и после ваших изменений? – Benjamin

+0

@ Benjamin изначально, все рамки имеют одинаковые размеры (1980 x 1080), но после применения каскадной классификации для локализации и обрезания полости рта рамы больше не имеют одинаковых размеров (например, рот открыт против рта закрыт, при варьировании градусов, что приводит к тому, что высота колеблется от ~ 85-110 и шириной до ~ 135-170). Изменили их размеры, чтобы стандартизировать их размеры до 100x150 (среднее значение их ширины/высоты). –

2

Посмотрите параметры: https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py#L25.

Вы даете frames как плоский массив, но он ожидает массив с не менее чем тремя осями, поэтому по умолчанию может принимать row_axis=1, col_axis=2. Либо укажите эти параметры правильно, либо укажите массив правильной формы.

+0

Привет @Benjamin кадров является список 2D Numpy массивов, прежде чем он преобразуется в самой Numpy в массиве. Разве это не делает 3D тензор? –

+0

Обнаружена проблема. Это было связано с неравными размерами рамы. Выравнивание размеров рамки устраняет проблему. Благодарю. –