この ラボ3 では、 e IQ ™ MLソフトウェア開発環境 を使用して、i.MX8ボード上の OpenCV DNN アプリケーションのデモを開始する方法について説明します。
Code Auroraで入手可能なソースコードを取得します。
OpenCV推論
OpenCVは、ニューラルネットワーク推論(DNNモジュール)と従来の機械学習アルゴリズム(MLモジュール)の両方に対応するユニタリソリューションを提供します。さらに、多くのコンピュータービジョン機能が含まれているため、他のライブラリに依存することなく、複雑な機械学習アプリケーションを短時間で簡単に構築できます。
OpenCV DNNモデルは基本的に推論エンジンです。モデル学習機能の提供を目的としたものではありません。トレーニングには、機械学習フレームワークなどの専用ソリューションを使用する必要があります。OpenCVの推論エンジンは、TensorFlow、Caffe、Torch/PyTorchなど、さまざまな入力モデル形式をサポートしています。
Arm NNとの比較
Arm NNは、ニューラルネットワークに深く焦点を当てたライブラリです。Arm Neonのアクセラレーションを提供しますが、VivanteGPUは現在サポートされていません。Arm NN は、従来の非ニューラル機械学習アルゴリズムをサポートしていません。
OpenCVは、コンピュータービジョンに焦点を当てたより複雑なライブラリです。画像と視覚に特化したアルゴリズムに加えて、ニューラルネットワーク機械学習だけでなく、従来の非ニューラル機械学習アルゴリズムもサポートしています。OpenCVは、アプリケーションがニューラルネットワーク推論エンジンだけでなく、他のコンピュータービジョン機能も必要とする場合に最適です。
ボードの設定
ステップ1 - 次のフォルダを作成し、次のように権限を付与します。
root@imx8mmevk:# mkdir -p /opt/opencv/model
root@imx8mmevk:# mkdir -p /opt/opencv/media
root@imx8mmevk:# chmod 777 /opt/opencvステップ2 - デモをボードに簡単に展開するには、ifconfigコマンドを使用してボードのIPアドレスを取得し、次のようにIMX_INET_ADDR環境変数を設定します。
$ export IMX_INET_ADDR=ステップ3 - ターゲットデバイスで、必要な変数をエクスポートします。
root@imx8mmevk:~# export LD_LIBRARY_PATH=/usr/local/lib
root@imx8mmevk:~# export PYTHONPATH=/usr/local/lib/python3.5/site-packages/
ホストのセットアップ
ステップ1 - eIQサンプルアプリからアプリケーションをダウンロードします。
ステップ 2 - モデルとデータセットを取得します。次のコマンド ラインは、デモに必要なフォルダー構造を作成し、デモに必要なすべてのデータとモデル ファイルを取得します。
$ mkdir -p model
$ wget -qN https://github.com/diegohdorta/models/raw/master/caffe/MobileNetSSD_deploy.caffemodel -P model/
$ wget -qN https://github.com/diegohdorta/models/raw/master/caffe/MobileNetSSD_deploy.prototxt -P model/
ステップ 3 - ビルドされたファイルをボードにデプロイします。
$ scp -r src/* モデル/メディア/root@${IMX_INET_ADDR}:/opt/opencv
OpenCV DNNアプリケーション
このアプリケーションは、次のものに基づいていました。
1 - OpenCV DNN の例: ファイルベース
フォルダ構造は、次の条件と等しくなければなりません。
├── file.py
├── camera.py
├── media
└── ...
├── model
│├── MobileNetSSD_deploy.caffemodel
│└── MobileNetSSD_deploy.prototxtこの例では、たとえば 1 つの画像を実行しますが、必要な数の画像を 渡して media/ フォルダー内に保存します。アプリケーションは、画像内のすべてのオブジェクトを認識しようとします。
ステップ1 - 新しい画像を メディア/ フォルダにコピーする場合:
root@imx8mmevk:/opt/opencv/media# cp .
ステップ 2 - サンプルイメージを実行します。
root@imx8mmevk:/opt/opencv# ./file.py手記:GPUが利用可能な場合、例は次のように表示されます:[INFO:0] OpenCLランタイムを初期化します
このデモでは、 Caffe モデルを使用して推論を実行し、 media/ フォルダー内のすべての画像に対していくつかの種類のオブジェクトを認識します。これには、入力画像で認識された各オブジェクトのラベルが含まれます。処理された画像は、 media-labeled/ フォルダにあります。ラベリングの前と後を参照してください。
ステップ3 - ラベル付けされた画像を次の行で表示します。
root@imx8mmevk:/opt/opencv/media-labeled# gst-launch-1.0 filesrc location= ! jpegdec ! imagefreeze ! autovideosink 2 - OpenCV DNNの例:MIPIカメラ
この例は上記と同じですが、カメラ入力を使用する点が異なります。MIPI カメラを有効にし、キャプチャされた各フレームに対して推論を実行し、それをウィンドウ インターフェイスにリアルタイムで表示します。
root@imx8mmevk:/opt/opencv# ./camera.py3 - OpenCV DNN の例: MIPI カメラの改善
この例は、GStreamer の追加サポートが適用されているため、上記とは異なります。Leaky Bucket アルゴリズムの考え方を使用すると、GStreamer パイプラインは、フレームが推論スレッドによって処理されなかった (バケツの水容量) 場合でも、カメラが独自のスレッド (いっぱいになるとバケツのオーバーフロー) を実行し続けることを可能にします。
この Leaky Bucket アルゴリズムの結果、このデモでは、推論プロセスで一部のフレームがドロップされるという犠牲を払って、カメラ ビデオが滑らかになります。
root@imx8mmevk:/opt/opencv# ./camera_improved.pyeIQサンプルアプリ-TFLiteを使用した顔認識に移動します。
こんにちは coindu、
vanessamaegimaが前に言ったように、私たちはまだビデオファイルソースのための検証済みのソリューションを持っていませんが、私はOpenCV VideoCaptureプロパティで直接ビデオファイルを使用すると、最悪の結果を返すことが予想されます。
そのため、次の例のように、ビデオ ファイルを GStreamer パイプラインに適用してみてください。
filesrc location=video_device.mp4 typefind=true !デコードビン!imxvideoconvert_g2d !video/x-raw,format=RGBA,width={},height={} !ビデオ変換 ! appsink sync=false
BR,
Marco
camera_improved.pyデモを参照し、v4l2の代わりにビデオを入力します。ビデオのfpsは15で、画面時間の表示時間が0.067秒であることを意味します。ただし、1 つのフレームを解析するには 0.6 秒かかりますが、そのフレームは 480x272 です。そのため、物体認識ブロック図は動画よりも遅れることになります。
ビデオの最初のフレームが再生されたときに、10番目のフレームを解析したいと思います。ただし、この方法では特定のフレームに移動できません。
こんにちは coindu、
ステップ3(3 - OpenCV DNNの例:MIPIカメラの改善)でパフォーマンスを向上させたデモを提供しました。同じアプローチは、ビデオ入力ではまだ検証されていません。試してみて、それが役立つかどうか試してみませんか?
marcofranchi、参考までに。
ありがとうございます
Vanessa
hi:
この例をビデオでテストしてみます。しかし、dnnがフレームを解析する時間は、ビデオの10フレームの表示時間にほぼ近いことがわかりました。
def dnn_parse(nn,frame,multipe=1): height,width,color_lane=frame.shape if multipe != 1: height = int(height*multipe) width = int(width*multipe) print "h:{}w:{}".format(height,width) frame=opencv.resize(frame,(height,width))start_time=time.time() blob = opencv.dnn.blobFromImage(フレーム,0.009718,(高さ,幅),127.5)nn.set入力(blob) det=nn.forward() end_time=time.time() print "height{} width{} time{}".format(高さ,幅,end_time-start_time)高さ:136幅:240高さ:136 幅:240 時間:0.264429092407高さ:272幅480 時間0.620328903198h:544w:960高さ544幅960時間2.25029802322次に、dnn 分析 (k =, 1, 2, 3 ...) の場合は、N * k フレームを直接分析することを検討してください。ただし、opencvはフレームのスキップとビデオフレームの総数の計算をサポートしていないことがわかりました。
(python:4431):GStreamer-CRITICAL **:gst_query_set_position:アサーション 'format == g_value_get_enum(gst_structure_id_get_value GST_QUARK)
Wayland-EGL の使用
'xdg-shell-v6' シェル統合の使用
frame_count.-1.0
警告: h264bsdDecodeSeiParameters が無効です
この問題を解決する方法は?
ありがとう。。そしてもう1つ、OpencvはGPUまたはCPUで推論を実行しますか?
こんにちはディネシュ、
リポジトリに移動して「summary」をクリックすると、その下にクローンリンクがあり、gitツールを使用してリポジトリをダウンロードできます。
$ git clone https://source.codeaurora.org/external/imxsupport/eiq_sample_apps
「eiq_sample_apps」にクローンしています...
remote:オブジェクトを数えています:87、完了。
リモート:オブジェクトの圧縮:100%(79/79)、完了。
リモート:合計87(デルタ30)、再利用26(デルタ4)
オブジェクトの開梱:100%(87/87)、完了。
$ cd eiq_sample_apps/
これがお役に立てば幸いです![]()
ありがとうございます
ディエゴ