OSOYOO PI CARキット ROS2化 #6 – 自律制御検討 YOLOv5 オブジェクト検知 その1

OSOYOO PI CAR

動きはぎこちないですが、一通りPI CARキットを操作できるようにりましたので、次は自律制御に挑戦してみようと思います。前回の試験ででは一升瓶を回ってスタート地点に戻ってくるテストを行いましたが、できればあれを自動でやりたいと思い立ちました。
現在のところ、自身には何の知識もありませんので、何から手を付けてよいのかわかりません。
ですが、周回対象のオブジェクトを検知する必要がありそうだなと思い、今回は、YOLOv5を試してみることにしました。まずは、Raspberry PI3で使い物になるかどうかを試してみてから、使い方を考えてみることにしました。

Raspberry PIにYOLO v5を下記のように導入します。(githubの記述に従っただけです)
ここではworkspaceの下にyolov5を導入します。

$ cd workspace
$ git clone https://github.com/Ultralytics/yolov5.git
$ cd yolov5
$ pip3 install -r requirements.txt
$ pip3 uninstall torch torchvision
$ pip3 install torch==1.11.0 torchvision==0.12.0

動作確認は下記のようなpythonコードをworkspace直下に用意して、YOLO v5の動作確認とともに動作スピードの確認を行いました。
学習データは、テストですのでyolov5直下にある‘yolo5s.pt’を使用しました。

import glob
import torch
import cv2
import shutil
import math

if __name__ == '__main__':
    # this configures detection paramters.
    model = torch.hub.load('./yolov5', 'custom',
        path='./yolov5s.pt', source='local');
    model.conf = 0.5
    capture = cv2.VideoCapture(0)

    while (True):
        ret, frame = capture.read()
        if ret:
            # this detects objects.
            results = model(frame)

            # this converts color order.
            results.save(save_dir="tmp")
            img = cv2.cvtColor(cv2.imread("tmp/image0.jpg"), cv2.COLOR_BGR2RGB)
            shutil.rmtree("tmp")

            # this displayes information of each objects.
            results.print()
            height, width = img.shape[:2]
            for idx, row in enumerate(results.pandas().xyxyn[0].itertuples()):
                xmin = math.floor(width * row.xmin)
                xmax = math.floor(width * row.xmax)
                ymin = math.floor(height * row.ymin)
                ymax = math.floor(height * row.ymax)
                print(row.name, ':(', xmin, ',', ymin, ')-(', xmax, ',', ymax,
                    '):', row.confidence)

            cv2.imshow('camera', img)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    capture.release()
    cv2.destroyAllWindows()

画像出力とともに検知しているオブジェクトなどを確認しましたが、それなりに動作しているように見えます。

動作確認結果

画像解像度は640×480で、大体1フレームあたりの処理時間が4~6秒程度かかっています。
さらには、CPU使用率の問題があり、下記のようにCPU使用率=400%となっています。Raspberry PI3のコアが完全燃焼してます。
YOLO v5のデモデータということもあり、結構なクラスが学習されているからなのかもしれませんが、この値を見る限りでは、常に検知状態で使用するのはまず無理だと分かりました。

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
10021 --- 20 0 1373180 497080 129648 R 400.0 56.7 14:52.31 python3
10038 --- 20 0 10524 3260 2668 R 29.2 0.4 0:00.20 top
803 root 20 0 7588 1936 1760 S 4.2 0.2 0:02.67 apache2
10007 root 20 0 0 0 0 I 4.2 0.0 0:01.01 kworker+
10034 root 20 0 0 0 0 I 4.2 0.0 0:00.16 kworker+

YOLOv5を導入後、ROS2で下記のようにパッケージビルドを行うとワーニングが発生するようになりました。

/.local/lib/python3.10/site-packages/setuptools/command/develop.py:40: EasyInstallDeprecationWarning: easy_install command is deprecated.
!!
        ********************************************************************************
        Please avoid running ``setup.py`` and ``easy_install``.
        Instead, use pypa/build, pypa/installer or other
        standards-based tools.

        See https://github.com/pypa/setuptools/issues/917 for details.
        ********************************************************************************
!!
  easy_install.initialize_options(self)

理由は、YOLOv5とROS2で使用するsetuptoolsのバージョンが以下のように異なるためのようです。

ROS2 humbleの推奨バージョンYOLOv5の推奨バージョン
58.2.0069.2.0
setuptoolsバージョン

YOLOv5インストール後のsetuptoolsのバージョンを確認すると、以下のように更新されていました。

$ pip3 list | grep setup
colcon-python-setup-py                   0.2.8
setuptools                               69.2.0

考えられる対処法は、2つあると思います。
1つ目の方法は、下記のような方法でsetuptoolsをダウングレードする方法です。
setuptoolsをダウングレードしてもYOLOv5は動作するようですが、非推奨となってしまうので、あまりよろしくありませんので、今回は実施しませんでした。

$ pip3 install setuptools==58.2.00

2つ目は、特定のワーニングを消し去る方法です。
.bashrcに下記の記述を行いワーニングを無視するように設定します。
緑部分を”ignore:”に変更すると全ワーニングが表示されなくなります。
今回は、対象のワーニングだけを消したいので、下記のように設定しました。

PYTHONWARNINGS="ignore:easy_install command is deprecated." 
export PYTHONWARNINGS

YOLO v5とROS2の共存ができそうなところまでは確認できました。
次回は、YOLOv5をROS2に組み込んでいこうとおもいます。
また、よろしければ見ていただけるとありがたいです。

タイトルとURLをコピーしました