2017-06-01 4 views
0

Ich versuche, einen Videoclip Bild für Bild in eine HDF5-Datei zu speichern. Mein Code funktioniert soweit, aber mir ist aufgefallen, dass die Größe der hdf5-Datei im Vergleich zur Quellvideodatei mehr als 10 mal größer ist.Python speichern Video als HDF5 ergibt große Dateigröße

Eingabedatei: AVI 200 x 126px, Dauer: 16 Minuten, Größe: 82 MB

Ausgabedatei: hdf5, gzip Kompression, Kompression = 9, Größe: 1 GB

Der Code, den Rahmen zu speichern, ist ziemlich einfach:

import h5py 
from skvideo.io import VideoCapture 
frames = [] 
cap = VideoCapture('/home/ubuntu/PycharmProjects/video2H5Test/data/video_F100_scaled2.avi') 
cap.open() 

it = 0 
while True: 
    retval, image = cap.read() 
    if image != None: 
     frames.append(image) 
     it += 1 
     if (it % 1000 == 0): 
      print('Processed %d frames so far' % (it)) 
    if not retval: 
     break 

with h5py.File('./test3.hdf5','w') as h5File: 
    h5File.create_dataset('camera1',data=frames,compression='gzip',compression_opts=9) 

Wie Sie können sehen, ich verwende bereits gzip, um meine Datenmenge zu komprimieren.

Gibt es eine andere Möglichkeit, Speicherverbrauch zu sparen?

Antwort

1

Für diejenigen, die über das gleiche Problem kamen:

initialisieren Ihren Datensatz mit dem ersten Bild:

myDataSet = myFile.create_dataset('someName', data=image[None, ...], maxshape=(
       None, image.shape[0], image.shape[1], image.shape[2]), chunks=True) 

ein Bild fügen Sie einfach den gesamten Datensatz der Größe:

myDataSet.resize(myDataSet.len() + 1, axis=0) 
myDataSet[myDataSet.len() - 1] = image 
+0

Sie haben vergessen, die Komprimierung hinzuzufügen. Ohne sie ist die Dateigröße die gleiche wie das Erstellen von separaten Datensätzen für jeden Frame, aber dauert 10 mal länger – crazjo

0

Was ist Ihr Chunking-Schema in der Ausgabe-hdf-Datei? Die Komprimierung erfolgt über Chunks. Wenn Sie also bedenken, dass sich die meisten Informationen im Video nicht von Frame zu Frame ändern, sollten Sie ein wesentlich besseres Komprimierungsverhältnis erzielen, wenn im selben Chunk unterschiedliche Frames vorhanden sind. Ich kann es ausprobieren, wenn Sie eine Beispielvideodatei bereitstellen.

+0

Gerade jetzt es gibt kein Chunking. Gibt es eine Möglichkeit, das Dataset in meiner While-Schleife zu speichern? Im Falle einer größeren Videodatei könnte die Rahmenliste sehr groß sein. – johni07

+0

Ja können Sie hdf Datei in Teile schreiben. Dies ist einer der Vorteile dieses Dateiformats. – kakk11

+0

@ kakk11: Könnten Sie sich die Frage https://StackOverflow.com/questions/46278714/how-to-compress-the-data-that-saved-in-hdf5 ansehen? Ich habe das gleiche Problem wie oben – user8264