Pythonマルチプロセスアプリケーション-リアルタイムのビデオ表示分析

前の記事から続く出来上がり:jupyterノートブックは単にビデオ再生と深層学習テストのための表示インターフェースを作ります

はじめに:前回のvoilaの記事では、ビデオフレームの処理と表示を行うことが目的であり、元の画像と同期して表示する必要があります。これは、実際にvoilaで実行できます。この記事は、上記に基づいてリアルタイムである必要があります。主に、リアルタイムへの道のりで解決する必要のある問題と、それらをどのように解決したかについてお話します。

ビデオ内の時間のかかるコードを分析する

処理する必要のあるビデオは1秒で25フレームあり、1フレームは45ミリ秒の情報を表します。opencvの読み取り機能を使用して読み取ると、読み取るのに約5ミリ秒かかります。したがって、本当にリアルタイムのパフォーマンスを実現する必要がある場合は、各フレームの処理機能時間を30ミリ秒未満に短縮するのが最適です。

ここでのもう1つの問題は、出来上がりで表示される場合、画像numpy.arrayをバイトに変換する必要があることです。つまり、画像形式のストリームデータへの変換(エンコード)imgbox = cv2.imencode('.jpg',frame)[1].tobytes()(このコードのtobytes()には約5ミリ秒かかります。コードを実行してリソースを
圧縮する場合は、約10ミリ秒かかります。フラスコも変換する必要があります)エンコード変換の問題-その後、出来上がりは直接破棄され、opencvのimshow機能を使って直接表示され、元の画像と結果の画像がマージされ、表示されるテキストの結果が画像フレームの周りに書き込まれました。もちろん、imshowのサイズにも時間がかかります。

私たちのプロジェクトでは、各フレーム画像を処理する必要がある2つの機能があり、1つの機能は20フレームの画像グループを処理することです。その中で、画像の各フレームを処理する機能:関数aは主にopencvの関数を使用し、関数bは主に深度モデルを使用します。多くの変更を加えた後、cudaによってコンパイルされたopencvも使用しました(以前にopencvのcudaコンパイルに関するチュートリアルを作成しました)。関数aの1フレームには約20ミリ秒かかります。関数bは約25msかかります。リアルタイムはほとんど達成されませんが、エンコードを使用すると、フレームは50ミリ秒を超えます。

関数cは、テスト用に20フレームの画像をモデルに配置することであり、結果はテキスト結果です。関数cは、リアルタイムのパフォーマンスを必要としません。
上記の機能はすべてシリアルに実行されています。

マルチプロセス操作のための3つの機能

並列操作を実現するために、複数のスレッドまたは複数のプロセスが使用されます。私は消費者とプロデューサーから始めました。プロデューサーの消費者問題は、マルチスレッドとマルチプロセッシングの古典的な問題です。ここで言うことはあまりありません。この古典的な問題は主にキュー機能を使用します。生産ラインとして、キューはこの記事で画像フレームを格納するためのキューです。しかし、私たちは1対多の問題であり、キューはここでの使用には適していません。(queue.get()の後にコピーする、2つのキューを生成する、2つのビデオを同時に読み取るなど、キューに対して多くの試行を行いました)。

マルチプロセス共有リソースに関する記事をいくつか読みましたが、理解できませんでしたが、まだ乾燥しているので、ここに置いて見やすくします。-兄弟のおかげでここでPythonプロセスの
利点の間でデータを共有します。兄弟は別の記事を参照して、画像フレームのマルチプロセス共有リソースのコードを記述します。私の兄弟のコードによると、3つの関数を貼り付け、マルチプロセスを完全に示しています。 。
私もこの記事を投稿し、この記事も勉強しています。- Pythonのマルチプロセッシングを使用する場合の大きな配列を共有するには

この記事では、プロセスプールを使用するときに大きなnumpy配列を共有する方法について説明します。

よくわからないので、まずはここに書きます。
..。

おすすめ

転載: blog.csdn.net/qq_38469784/article/details/110537909