Armadilloフォーラム

Armadillo-loT G4を用いてのYOLOv5のdetect.pyをdemo_applicationのyolov5_tflite_inference.pyに転用したい件について

yuki.shigefuji

2023年7月31日 11時23分

お世話になっております。
表題の件につきまして、転用し実行しようとしたところ以下となります。

Traceback (most recent call last):
File "/taksys/PEdetection/demo_detection.py", line 919, in
main()
File "/taksys/PEdetection/demo_detection.py", line 901, in main
inferencer = ScrewDetector(
File "/taksys/PEdetection/demo_detection.py", line 792, in __init__
super().__init__(
File "/taksys/PEdetection/yolov5_tflite_inference.py", line 75, in __init__
dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt, vid_stride=vid_stride)
File "/taksys/PEdetection/utils/dataloaders.py", line 358, in __init__
assert cap.isOpened(), f'{st}Failed to open {s}'
AssertionError: 1/1: /dev/video2... Failed to open /dev/video2

検出が出来ない原因が分からないため手詰まりとなっております。
可能であればお早い返答をお待ちしております。よろしくお願い致します。

ファイル ファイルの説明
提出.zip
コメント

at_satoshi.ohta

2023年7月31日 17時29分

yuki.shigefujiさん

太田です。

エラー表記の最後の行を見ると、

> AssertionError: 1/1: /dev/video2... Failed to open /dev/video2

このエラーには以下の原因が考えられると思いますので下記2点をご確認いただけますでしょうか?

1. コンテナに/dev/video2 をopenする権限が与えられていない可能性があります。
 コンテナの自動起動に使用したconfファイルの内容をお見せいただけますでしょうか?
 confファイルのパスは下記です。

/etc/atmark/containers/コンテナ名.conf

2. 接続したカメラのパスが/dev/video2でない可能性があります。
 カメラを接続した状態で、Armadillo上(コンテナの外)で下記のコマンドを実行した結果をお見せいただけますでしょうか?

armadillo:~# apk add v4l-utils
armadillo:~# v4l2-ctl --list-devices

よろしくお願いいたします。

yuki.shigefuji

2023年8月1日 7時27分

太田様

1:起動しているコンテナのオプション

set_image localhost/taksys_testmode:latest
set_command weston --tty=7
set_command sh -c 'cron & exec weston --tty 7'
add_volumes /var/app/volumes/sd:/dev/sd
add_ports 1883:1883/tcp
add_args -ti --privileged
add_args --env=VIV_VX_ENABLE_CACHE_GRAPH_BINARY=1
add_args --env=VIV_VX__CACHE_BINARY_GRAPH_DIR=/val/cache/armadillo-demo-experience
add_volumes /sys /dev /run/udev /opt/firmware
add_volumes cache:/var/cache/armadillo-demo-experiencei
add_device /dev/video2

2:コマンドの実行結果

MS-M213FHUS: MS-M213FHUS USB Ca (usb-xhci-hcd.1.auto-1):
        /dev/video2
        /dev/video3
        /dev/media0
 
Failed to open /dev/video0: Resource busy

以上です。ご確認よろしくお願い致します。
> yuki.shigefujiさん
>
> 太田です。
>
> エラー表記の最後の行を見ると、
>
> > AssertionError: 1/1: /dev/video2... Failed to open /dev/video2
>
> このエラーには以下の原因が考えられると思いますので下記2点をご確認いただけますでしょうか?
>
> 1. コンテナに/dev/video2 をopenする権限が与えられていない可能性があります。
>  コンテナの自動起動に使用したconfファイルの内容をお見せいただけますでしょうか?
>  confファイルのパスは下記です。
>

> /etc/atmark/containers/コンテナ名.conf
> 

>
> 2. 接続したカメラのパスが/dev/video2でない可能性があります。
>  カメラを接続した状態で、Armadillo上(コンテナの外)で下記のコマンドを実行した結果をお見せいただけますでしょうか?
>

> armadillo:~# apk add v4l-utils
> armadillo:~# v4l2-ctl --list-devices
> 

>
> よろしくお願いいたします。

at_satoshi.ohta

2023年8月1日 10時34分

yuki.shigefujiさん

太田です。
実行結果の内容をお見せいただきありがとうございます。

confファイルの内容とv4l2-ctlの実行結果を見た限りではArmadilloはカメラを認識していて、
カメラの権限もvideo2としてコンテナに権限を与えていると思います。

その上で下記の2つを試して頂ければ幸いです。

1. v4l2-ctlの実行結果からカメラをvideo2ではなくvideo3として認識していることも考えられます。
 video2ではなくvideo3としてconfファイルおよび作成したプログラムを修正した上で
 実行してみていただけますでしょうか?

2. 直接は関係ないと思いますが念のため、confファイルに誤字がありますので修正した上で
 実行していただけますでしょうか?

修正前:add_args --env=VIV_VX__CACHE_BINARY_GRAPH_DIR=/val/cache/armadillo-demo-experience
修正後:add_args --env=VIV_VX_CACHE_BINARY_GRAPH_DIR=/var/cache/armadillo-demo-experience

修正前:add_volumes cache:/var/cache/armadillo-demo-experiencei
修正後:add_volumes cache:/var/cache/armadillo-demo-experience

それでも実行できないようでしたら一度試しにご使用のカメラでarmadillo-demo-experienceが
実行可能か確認してみることも確認方法の一つとして有益かと思います。
製品マニュアルの該当箇所へのリンクは下記となります。

https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

よろしくお願いいたします。

yuki.shigefuji

2023年8月1日 12時15分

太田様

指摘事項を実行致しました。
1:video3に変更しましたが同様の結果となりました。

2:confの変更を加えたが本件とは関係なかった。

またdemo-experienceだけではないですが、yolov5_tflite_inference.pyの74~76行目の下記をコメントアウトするとカメラ関係含め問題なく動作いたします。

        webcam ='/dev/video2'
        if webcam:
            dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=ptt
, vid_stride=vid_stride)
            bs = len(dataset)

本件の目的はyolov5に搭載されているdetect.pyがyolov5_tflite_inference.pyを単独で使用するよりも検出率の上昇がみられたため、yolov5_tflite_inference.pyにdetect.pyの検出機能を組み込み(乗せ換え)を目的としています。
以上、ご確認よろしくお願い致します。

> yuki.shigefujiさん
>
> 太田です。
> 実行結果の内容をお見せいただきありがとうございます。
>
> confファイルの内容とv4l2-ctlの実行結果を見た限りではArmadilloはカメラを認識していて、
> カメラの権限もvideo2としてコンテナに権限を与えていると思います。
>
> その上で下記の2つを試して頂ければ幸いです。
>
> 1. v4l2-ctlの実行結果からカメラをvideo2ではなくvideo3として認識していることも考えられます。
>  video2ではなくvideo3としてconfファイルおよび作成したプログラムを修正した上で
>  実行してみていただけますでしょうか?
>
> 2. 直接は関係ないと思いますが念のため、confファイルに誤字がありますので修正した上で
>  実行していただけますでしょうか?
>
> 修正前:add_args --env=VIV_VX__CACHE_BINARY_GRAPH_DIR=/val/cache/armadillo-demo-experience
> 修正後:add_args --env=VIV_VX_CACHE_BINARY_GRAPH_DIR=/var/cache/armadillo-demo-experience
>
> 修正前:add_volumes cache:/var/cache/armadillo-demo-experiencei
> 修正後:add_volumes cache:/var/cache/armadillo-demo-experience
>
> それでも実行できないようでしたら一度試しにご使用のカメラでarmadillo-demo-experienceが
> 実行可能か確認してみることも確認方法の一つとして有益かと思います。
> 製品マニュアルの該当箇所へのリンクは下記となります。
>
> https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
>
> よろしくお願いいたします。

at_satoshi.ohta

2023年8月1日 13時38分

yuki.shigefujiさん

太田です。
1、2ともに実行しても結果は変わらないとのことで了解しました。

> yolov5_tflite_inference.pyにdetect.pyの検出機能を組み込み(乗せ換え)を目的としています。

こちらでも原因を考えるためにyolov5のdetect.pyをyolov5_tflite_inference.pyに組み込んだソースファイルの中身を検討したいです。
はじめに頂いた提出.zipの中にdetect.pyを組み込んだyolov5_tflite_inference.pyが見当たりませんでしたので、改めてご提出頂ければ幸いです。

よろしくお願いいたします。

yuki.shigefuji

2023年8月1日 14時33分

太田様

現在組み込みを含めた実装テストなため添付している状態しかできておりません。
実装を踏まえた知識の共有が叶えばと思います。

以上、ご確認よろしくお願い致します。

at_satoshi.ohta

2023年8月1日 15時38分

yuki.shigefujiさん

太田です。
ご返信ありがとうございます。
了解致しました。

1点確認ですが、プログラムの中でcv2.VideoCapture()によって同一カメラデ
バイスを複数回openしようとしていませんか?
2回目以降はopenに失敗してエラーとなるはずです。

ご確認よろしくお願いいたします。

yuki.shigefuji

2023年8月1日 16時13分

太田様

お世話になっております。

それはdemo_detection.pyのお話でしょうか。
こちらは現状問題なく動作しております。

現在yolov5_tflite_inference.pyを書き換えdect.pyで行われている検出機の利用を目指しており、書き換え前の状態であれば元のPGでカメラ起動、検出まで動作を確認しております。
detect.pyの機能を移す際に表題のエラーが出ている状況です。
> yuki.shigefujiさん
>
> 太田です。
> ご返信ありがとうございます。
> 了解致しました。
>
> 1点確認ですが、プログラムの中でcv2.VideoCapture()によって同一カメラデ
> バイスを複数回openしようとしていませんか?
> 2回目以降はopenに失敗してエラーとなるはずです。
>
> ご確認よろしくお願いいたします。

at_satoshi.ohta

2023年8月1日 17時04分

yuki.shigefujiさん

太田です。
ご返信ありがとうございます。

お互いの認識を共有するために確認したいのですが、
頂いた提出.zipの中身のdemo_detection.pyは問題なく動作するものでしょうか?

一番はじめのエラー文をみると

> File "/taksys/PEdetection/demo_detection.py", line 919, in
:省略

とあるようにdemo_detection.pyを実行した結果によるエラーだと認識していました。

ご確認よろしくお願いいたします。

yuki.shigefuji

2023年8月1日 17時30分

太田様

お世話になっております。

送信したPGではdemo_detectionは問題なく動作します。
先ほどのコメントアウト部分を外したり追記した場合に前述のエラー等が出てしまい実行できなくなっています。
>

yuki.shigefujiさん
>
> 太田です。
> ご返信ありがとうございます。
>
> お互いの認識を共有するために確認したいのですが、
> 頂いた提出.zipの中身のdemo_detection.pyは問題なく動作するものでしょうか?
>
> 一番はじめのエラー文をみると
>
> > File "/taksys/PEdetection/demo_detection.py", line 919, in
> :省略
>
> とあるようにdemo_detection.pyを実行した結果によるエラーだと認識していました。
>
> ご確認よろしくお願いいたします。

at_satoshi.ohta

2023年8月1日 18時06分

yuki.shigefujiさん

太田です。
ご返信ありがとうございます。

> 先ほどのコメントアウト部分を外したり追記した場合に前述のエラー等が出てしまい実行できなくなっています。

先程コメントアウトした部分ではLoadStreamsクラスのインスタンスが生成されています。

dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=ptt, vid_stride=vid_stride)

LoadStreamsクラスのコンストラクタ(__init__メソッド)の中身をみると(提供.zipにあるdataloaders.py)下記のようにcv2.VideoCapture()が使われています。

    assert not is_kaggle(), '--source 0 webcam unsupported on Kaggle. Rerun command in a local environment.'
cap = cv2.VideoCapture(s)
assert cap.isOpened(), f'{st}Failed to open {s}'

LoadStreamsクラスのインスタンスを生成するより前に、cv2.VideoCapture()で/dev/video2をopenしていませんか?
その場合、LoadStreamクラスのコンストラクタ内の

cap = cv2.VideoCapture(s)

に失敗し、次の行の

assert cap.isOpened(), f'{st}Failed to open {s}'

でエラーとなるように見えます。

ご確認よろしくお願いいたします。