質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

並列処理

複数の計算が同時に実行される手法

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3224閲覧

動画のframeに対する重い処理の実装について

hayata-yamamto

総合スコア31

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

並列処理

複数の計算が同時に実行される手法

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/01/22 11:48

###前提・実現したいこと
Python, OpenCVを用いてキャプチャした画像に対して画像処理を行い、
動画のFPSをなるべく落とさずに、動画をストリーミングさせながら、
処理の結果を受け取って、動画の中に表示させたい。

私自身、ベストプラクティスが不明なので、こういうやり方がありますということを教えてもらえると非常に助かります。

###発生している問題
動画の1フレームに対して、画像の処理をかけます。
この処理が数秒かかる処理で、何もしないとこの処理の部分で動画がかなりの時間フリーズします。

###イメージ
全体的なコードのイメージ(あんまり参考になりませんが)

python:

1#coding utf-8 2 3cap = cv2.VideoCapture(0) 4ret, frame = cap.read() 5 6while ret: 7 8 if condition: 9 フレームに対して重い処理 10 11cap.release() 12 13

現状、フレームに対して行なっている重い処理は、クラスインスタンスのメソッドになっています。
理想的には、whileがifの処理が走っている間も周りながら、フレームに対して行う処理も別スレッドもしくは別プロセスで行うような感じにしたいと思っています。処理が走っている間は、例えば、concurrent.futureとかなら、runningとかで制御できれば良いですね。

###試したこと
並行処理、並列処理などが該当するかと思ってmultiprocessing, concurrent, asyncioなど試して見たのですが、
多少処理が早くなる程度で、結局動画がフリーズしてしまう問題になります。
オーバーヘッドに時間がかかってしまっているのではないかという予測もしています。

###補足情報(言語/FW/ツール等のバージョンなど)
Python 3.5
Opencv 3.3.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Pythonを使わず、C++でやるのが前提として、処理済みframeをバッファリングしてあげるべきでしょうね。15秒とかdelayさせて処理時間を稼ぎます。

投稿2018/01/22 12:48

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayata-yamamto

2018/01/22 13:36

回答ありがとうございます! やはり、C++になりますか。。。 機械学習系のアルゴリズムとの相性も考えてpythonで実装してたんですが、言語的な限界ですかね。。
mkgrei

2018/01/22 13:50

バッファリングなので言語は関係ないのではないでしょうか? https://svds.com/streaming-video-analysis-python/ ただ処理が致命的に遅いのならC++のほうが最終的にはいいのかもしれません。 やることにもよりますが、処理することが重要ならなんとか頑張るしかありませんが、ユーザーに見せるのが目的ならうまいサボり方を検討するほうが楽かもしれません。
yumetodo

2018/01/22 14:54

>バッファリングなので言語は関係ないのではないでしょうか? C++で書くことでコピーを減らせる可能性があります。これはOpenCVで重たい処理をしようとする時に無視できないコストです。 また、生産者ー消費者パターンで実装すれば軽量に非同期処理が実装できます(簡単とは言っていない)
mkgrei

2018/01/22 15:11

おっしゃる通りですね。 C++で書くことでそもそも重たい処理じゃなくなってバッファリングが必要なくなる可能性もあります。
hayata-yamamto

2018/01/23 02:21

@yumetodo -san, @mkgrei -san こちらの視点も非常に参考になります! 結局、Opencvを使うとするとC++で直接書くほうがベターな感じなのですね、やはり、、、 一般的な質問になってしまいますが、動画に関するタスクをする際に、言語的に気にするポイント等あったりしますでしょうか?
yumetodo

2018/01/23 03:36

GCのない言語を使う一択では。使用メモリー量が多くなりがちなので、メモリー確保しに失敗しやすくなる。その時にGCがない言語なら自力でなんとかしやすい。
guest

0

ベストアンサー

処理の並列化がご質問でしたね。
別プロセスを立てればフリーズは回避できます。

考えるべきことは処理が逐次処理されるべきなのか、
処理のデータのやり取りはどうするのか、
という2点です。

1つ目は、時系列データなので遅延が蓄積します。
遅延があっても全て処理すべきなのか、ある程度のリアルタイム性があるため一定以上の遅延は破棄するのか、について考えるべきです。
基本的にこの管理の実装がメインです。

2つ目はプロセス間のやり取りですね。
データ量が多ければ一度書き出して受け渡すしかありませんがだいぶ遅くなります。
少なければパイプやソケットで処理できます。

やり方としてはsubprocessを立てる方法と、サーバーを立てる方法があるかと思います。

subprocessの場合プロセスが増えることを制限・管理する必要があります。
実装は素直ですが考えることは多いです。
やり取りはパイプラインで受け渡しができます。

サーバーなら処理をキューに並べればよいでしょう。
ライブラリを使えば負荷も分散できます。
こっちはソケット通信ですね。

投稿2018/01/22 15:22

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/01/22 17:03

ああ、そういえば重たい処理は複数のサーバーに分散させて金の力で殴る、という手法もありといえばありでした、サーバーとか言われて思い出した。
hayata-yamamto

2018/01/23 02:22 編集

@mkgrei -san pythonでやるならという文脈で回答をもらえてありがたいです。 遅延についてはある程度許容するしかないので、何かしらの条件にTrueを返さない限り、プロセスが走らないようにしていこうと思っています。 1点追加で質問させてください subprocessについてなのですが、これは処理用のpythonファイルを別で作成していおいて、そのファイルをsubprocessでコマンドラインから叩くというような認識で良いのでしょうか?
mkgrei

2018/01/23 10:10

仰る通りです。 それが最も単純な実装です。 subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None) stdinに入力を受け取って、stdoutに結果を出力する処理を作成すればいけます。 subprocessは立ち上げるのにコストがかかります。 予め立ち上げたものにソケットを通じてデータをやり取りさせることも考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問