2017-02-16 2 views
0

Ziel des Skripts ist die Verwendung des vorhandenen Bildvorverarbeitungsmoduls von Keras zur Videodatenerweiterung. In diesem Prototyp wird eine Probe Video in eine Anordnung von Rahmen aufgeteilt und verarbeitet werden, wobei die letzten Schritte zufällige Drehungen beinhalten Durchführung Verschiebungen, Scheren, und zoomt:Keras Image Preprocessing: Tupel-Index außerhalb des gültigen Bereichs

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)) 

Wenn das Skript der Lauf ist, wird folgende Fehler erscheint: Output Error

Antwort

0

Das Problem lag an den ungleichen Rahmenabmessungen. Die Lösung bestand darin, zuerst die Rahmenabmessungen vor dem Anwenden der Transformationen zu entzerren:

# 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

Können Sie genauer sein, wenn Sie "ungleiche Rahmenabmessungen" sagen? Was waren die Dimensionen vor und nach deinen Änderungen? – Benjamin

+0

@ Benjamin anfangs haben alle Rahmen die gleichen Abmessungen (1980 x 1080), aber nach Anwendung der Kaskadenklassifizierung zum Lokalisieren und Zuschneiden des oralen Bereichs haben die Rahmen nicht mehr die gleichen Größen (z. B. Mund offen vs. Mund geschlossen, bei Variation Grad, wodurch die Höhe von ~ 85-110 und die Breite von ~ 135-170 reichen. Größe ändern, um ihre Abmessungen zu 100x150 zu standardisieren (grober Durchschnitt ihrer Breiten/Höhen) reparierte es. –

2

Schauen Sie sich die Parameter an: https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py#L25.

Sie geben frames als ein flaches Array, aber es erwartet ein Array mit mindestens drei Achsen, so dass es row_axis=1, col_axis=2 standardmäßig annehmen kann. Geben Sie diese Parameter entweder korrekt an oder stellen Sie sie mit einem korrekt geformten Array bereit.

+0

Hallo @Benjamin Frames ist eine Liste von 2D numpy Arrays, bevor es in ein numpy Array selbst umgewandelt wird. Ist das nicht ein 3D-Tensor? –

+0

Das Problem gefunden. Es lag an den ungleichen Rahmenmaßen. Durch das Anpassen der Rahmenabmessungen wird das Problem behoben. Vielen Dank. –

Verwandte Themen