Yolov5 on jetson nano

jetson nano に yolov5 をインストールして推論したいが、カメラをimx219で考えたい。
yolov5のdetect.pyを見ると、csiカメラを使うようになっておらず、コードの改造が必要で、
gstremer パイプラインを設定し、opencvの使ってフレームを渡すことまでは理解できました。

ただ、そのあと、コードをどのように修正したら良いかわからない。

Hi,

Do you use the Ultralytics source?
If yes, please try to update your custom GStreamer pipeline in the below:

Thanks.

hi my name is kitai.

この写真が見えますか?
jetson nano に CSI-camera を接続して、どうにかyolov5 v6.0 の推論を実行したいが、
カメラを認識しません。

上記のテストでは映像がリアルタイムに表示するので、ハードが故障している可能性は
無いと考えています。

写真で大変申し訳ありません。
gstremer pipline が悪いのか 何が悪いのかわからず、途方に暮れています。

help me!!!

Hi,

Just want to double-confirm that are you able to read the camera.
Or OpenCV fail to open/read the frame with the pipeline you shared above?

Thanks.

hi!
Thank you for your answer

opencvの単体テストでは、gstremer pipelineが正常に働き、画像を表示します。

Hi,

Does that working test use the identical GStreamer pipeline?
Could you also attach the screenshot or share the source for that test?

Thanks.

hi! my name is kitai

piplineの記述が間違っていたようです。csiカメラから正常に画像が取り出され、
推論が実行されましたが、別の問題が発生しました。

停止するときに cntl+c で終了すると、gstremerのメモリが解放されていない と思われる
不具合が発生し、しばらく待つと コアダンプ と表示されます。
安全かつ正常に、推論を終了する方法がわからず、困っています。

よろしくお願いします。

Hi,

It looks like ‘q’ is used for exiting in your implementation.
Could you try to type ‘q’ to see if the app can exist successfully?

Please also check if the while loop breaks and the last two line are executed when typing ‘q’.

Thanks.

こんにちわ。長文で申し訳ありません。

ご指摘の画像は、CSIカメラがopencvで使えるかどうかをテストしたものです。(camera_test.py)
状況は変わっておらず、相変わらず強制終了しており、シグナルハンドリングを使ったリソース解放を検討しているところです。

別の問題が発生しています。

yolov5v6.0のdetect.pyがCSIカメラで実行できることはわかりました。
次は、自身のデータでtrain.pyを動かしてみたいと思っています。ところが、実行してすぐに
tensolboardが無いというエラーが出ました。これは、yolov5をインストールするときに、 requirements.txtにtensolboardがあると失敗するからコメントアウトしたからです。
(htopなどもダメです)

私の環境は、下記の順番でインストールされています。

JetPack 4.6
opencv4.5.0(CUDA:YES)
cython=0.29.37
numpy=1.19.5
pytorch1.9.0 (nvidia公式)
torchvision v0.10.0 (nvidia公式)
yolov5 v6.0
matplotlib>=3.2.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.41.0
pandas>=1.1.4
seaborn>=0.11.0

tensolboardをpip3でインストールすると、おそらくopencvの内部とyoloとの間で依存関係が崩れるので、gstremerが正常に機能しなくなるのでしょう。
2時間かけてopencvを入れなおすと、何やらエラーが出るものの、復旧しました。

最も効果的な対策を教えてほしい。

tensolboardが無いと、学習の段階でエラーになるので、インストールできるtensolboardの
バージョンがあるなら知りたい。
また、train.pyの中でtensolboardを無効可する方法があるなら、それも良いでしょう。
そもそも、jetsonで学習することが間違っているというなら、googlecolaboなどで学習して
ptファイルを生成するほうが良いというなら、jetsonにて実行可能な方法を教えてほしい。

よろしくお願いします。

Hi,

Which train.py do you indicate?
Do you mean train_ssd.py from jetson-inference:

Thanks.

hi!
it is detect of yolov5 v6.0

yolov5/utils/datasets.py

class LoadStreams:
# YOLOv5 streamloader, i.e. python detect.py --source 'rtsp://example.com/media.mp4' # RTSP, RTMP, HTTP streams
def init(self, sources=‘streams.txt’, img_size=640, stride=32, auto=True):
self.mode = ‘stream’
self.img_size = img_size
self.stride = stride

    if os.path.isfile(sources):
        with open(sources, 'r') as f:
            sources = [x.strip() for x in f.read().strip().splitlines() if len(x.strip())]
    else:
        sources = [sources]

    n = len(sources)
    self.imgs, self.fps, self.frames, self.threads = [None] * n, [0] * n, [0] * n, [None] * n
    self.sources = [clean_str(x) for x in sources]  # clean source names for later
    self.auto = auto

    import gi
    gi.require_version('Gst', '1.0')
    from gi.repository import Gst

    def gstreamer_pipeline(capture_width=640, capture_height=480, display_width=640, display_height=480, framerate=30, flip_method=0):

        return (
            f'nvarguscamerasrc ! '
            f'video/x-raw(memory:NVMM), width=(int){capture_width}, height=(int){capture_height}, '
            f'format=(string)NV12, framerate=(fraction){framerate}/1 ! '
            f'nvvidconv flip-method={flip_method} ! '
            f'video/x-raw, width=(int){display_width}, height=(int){display_height}, format=(string)BGRx ! '
            f'videoconvert ! video/x-raw, format=(string)BGR ! appsink'
        )

    Gst.init(None) # Gstreamer init
    pipeline = gstreamer_pipeline()

    for i, s in enumerate(sources):  # index, source
        # Start thread to read frames from video stream
        print(f'{i + 1}/{n}: {s}... ', end='')
        if 'youtube.com/' in s or 'youtu.be/' in s:  # if source is YouTube video
            check_requirements(('pafy', 'youtube_dl'))
            import pafy
            s = pafy.new(s).getbest(preftype="mp4").url  # YouTube URL
        s = eval(s) if s.isnumeric() else s  # i.e. s = '0' local webcam
        # cap = cv2.VideoCapture(s)
        cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)
        assert cap.isOpened(), f'Failed to open {s}'
        w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        self.fps[i] = max(cap.get(cv2.CAP_PROP_FPS) % 100, 0) or 30.0  # 30 FPS fallback
        self.frames[i] = max(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)), 0) or float('inf')  # infinite stream fallback

        _, self.imgs[i] = cap.read()  # guarantee first frame
        self.threads[i] = Thread(target=self.update, args=([i, cap, s]), daemon=True)
        print(f" success ({self.frames[i]} frames {w}x{h} at {self.fps[i]:.2f} FPS)")
        self.threads[i].start()
    print('')  # newline

Hi,

Do you use the source from Ultralytics?

Thanks.

そうです。

こんにちは、AastaLLLさん。
お忙しいようですね。

jetson nanoにcsiカメラを接続して、リアルタイムにyoloの推論を行う人はほかにもいると
思います。
初学者の場合、推論ができるところまでは到達できても、cntr+cで 強制終了した場合、
gstremerのリソースが解放されず、コアダンプが発生し、rebootを余儀なくされる方も
いらっしゃるのではないでしょうか

ここでは、そういった悩める子羊に救いの手を差し伸べてくださる場所と思っていたのですが、
そうではないのですね。
いろいろ相談にのってくださり、ありがとうございました。

私はjetsonnanoと三菱のPLCを接続して、認識した物体の数値をMCプロトコルで送信する仕組みを
構築しようとしています。
cntr+c の方法だと、システム的に強制終了するので、リソースを解放する間もなくシャットダウン
してしまい、安定性に欠けることがわかりました。
そのため、cv2のimshowを出力しているところでキー入力の「q」を検出するようにして、
グローバルのフラグを立て、推論のforループから抜けるようにしました。
また、class LoadStreams にstop処理を追加して、リソースの不条理を避けるようにして、
一応の解決を迎えました。

また、私のつまらない話を聞いてください。
日本から・・・ありがとうございました。

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.