2017-01-18 12 views
0

私はh5f5を使ってhdf5にmp4ビデオのフレームを保存しようとしています。最初は、単にデータを圧縮しないようにしました。これにより、5000 MBのビデオがhdf5に格納されたときに約500 GBになりました。データセットを管理しやすくするためにgzip圧縮を試していますが、圧縮を使用するとビデオの1フレームを保存するのに約1分かかります。ここでは、最小限のコード例では、h5pyでgzip圧縮を高速化するにはどうすればよいですか?

import h5py 
hdf5 = h5py.File(file, mode='a') 
dset = hdf5.create_dataset(dset_name, shape=(70000, 1080, 1920, 3), 
    dtype=np.uint8, chunks=True, compression='gzip') 

for i, frame in enumerate(video_stream): 
    dset[i] = frame 

ある各ビデオは1080 RBG画像の70e3について持っています。 video_streamは、反復処理されたときに配列を返すオブジェクトです(1080,1920,3)。それが重要だと思うなら、それをhereで見ることができます。だから私はどのように妥当な速度でhdf5にこのデータを保存し、妥当なファイルサイズで終わることができますか? mp4圧縮に近づけることは可能ですか?

答えて

2

MP4は、ビデオを保存するように特に設計された、かなり高度な標準で、ハードウェアアクセラレーションを使用することがよくあります。わずか50億バイトで4,000億以上の値をパックすることができれば、その効率性がわかります。

HDF5はビデオ規格ではありませんが、GZipはビデオにはあまり適していません。 Pythonはおそらくgzip圧縮がおそらくC言語で行われているので多分問題ではありませんが、コードはシングルスレッドであることに注意してください。要約すると、MP4に近いものは得られません。

正直言って、なぜあなたも試していますか?私はまだビデオデータとの親和性があまりないと思う。

+0

あなたは正しいビデオデータに関する多くの経験はありません。私はビデオデータのニューラルネットワークをトレーニングしています。現時点では、ビデオファイルから画像を取り出してニューラルネットワークに供給するためにVideoStreamを使用していますが、それを行うには時間がかかり、プログラムのボトルネックになります。 1つのビデオをhdf5に転送することをテストしました。それはずっと速いですが、余りにも多くのスペースを占めます。私は、各ビデオのストレージ容量を約半分にすることなく、ビデオから画像を素早く引き出す方法を見つけたいと考えています。 – mdornfe1

+0

@ mdornfe1:まず、隣接するビデオフレームは非常に似ているので、MP4は個々のフレームを圧縮しないので、MP4から単一のフレームを伸張するのはかなり高価です。それでも、あなたのGPUは1バッチの画像(GPUでCNNを使用していますか?)を処理するのにかなり忙しくなりますので、CPU上の次の画像バッチを並行して伸張してください。 – MSalters

+0

ありがとう、私はそれが解決策かもしれないと思います。 – mdornfe1

関連する問題