目標
RaspberryPiZERO2で物体検出をする.
手順1.環境構築
python3 -m venv .venv
.venv/Scripts/activate
仮想環境を作ったら以下を実行
pip3 install labelimg ultralytics
labelimg : セグメンテーションソフト
ultralytics : YOLOを使えるライブラリ
手順2.セグメンテーション(学習データづくり)
まず,以下のようにディレクトリを構成する.
作業ディレクトリ/
├──images/
│ ├──train/
│ ├──val/
│ └──test/
└──labels/
├──train/
├──val/
└──test/
/train,/val,/testに画像データを分ける.ただし,枚数が少ない場合は/trainと/valのみでよい.
仮想環境をactivateした状態で
labelimg
を実行.ソフトが開く.
OpenDirで画像が入っているディレクトリを設定,ChangeSaveDirにラベルの保存先を設定.ChangeSaveFormatをYOLOに変更.
これで準備OK.
/trainから順番にアノテーションしていく.
全て終わったら,datasets.yamlを記述する
アノテーションしようとすると鬼のようにエラーが出るので,エラーメッセージに沿ってライブラリを修正する.基本的には返り値がfloat型によるエラーだからint()に型変換してあげればよい.
# Path
path: ./datasets/
train: images/train
val: images/val
test: images/test
# Classes
nc: 2 #各自設定
names: ["name1","name2"] #各自設定
これで学習させる準備が整った.
手順3.学習
from ultralytics import YOLO
model = YOLO('yolo11n.pt')
model.train(data="datasets.yaml", epochs=100, batch=8)
上のコードをコピペして実行する.
学習が始まるが,GPUが載っていないとCPUが頑張るのでPCが悲鳴を上げます.(100枚程度の学修にAMD Ryzen 7 5700Uでは15分ぐらい)
終わるまで待ちましょう.
手順4.RaspberryPiへ移行
ここからはRaspberryPiでの操作です.
マイクロSDにOSを書き込んでいきましょう.気を付けることは唯一つ,64bitを選択しましょう.それ以外はいつもどうり.
OSは64bitを選択.
筆者はこれに気が付かず(前にも同じことしたのに),半日溶かしました.
sudo apt install python3-opencv
pip3 install ultralytics --break-system-packages
を実行する.RaspberryPiZERO2Wだと結構時間がかかる.
終わり次第,学習したモデル/runs/detect/train/weights/last.ptをRaspberryPiへコピー.
from ultralytics import YOLO
import os
import cv2
model = YOLO("last.pt")
_ = model("test.jpg",save=True,)
上をコピペして実行.すると,runs/detect/predictというディレクトリが作られる.この中に認識結果が保存される.
ちなみに,RaspberryPiZERO2Wでは,640x480の画像を認識するのに2.5秒ほどかかった.
そこでモデルをエクスポートして軽量化してみよう.
手順5.軽量化
さすがは有名なライブラリ.エクスポートも簡単.
from ultralytics import YOLO
import time
model = YOLO("last.pt")
st = time.time()
model.export(format="ncnn")
print(time.time()-st)
これを実行するだけ.するとlast_ncnn_modelというディレクトリが作成される.これにPiTourch形式のモデルをNCNN形式というモバイル向けに最適化されたモデルが作成/保存される.
では,早速,処理速度を見てみよう.
from ultralytics import YOLO
import os
import cv2
import time
model = YOLO("last_ncnn_model")
st = time.time()
ret = model("test.jpg",save=True,)
print(time.time()-st)
「あれれ?処理時間が長くなった?」.調べてみると,推論の最初はncnnの設定を色々するために時間がかかるらしい.
なので...
from ultralytics import YOLO
import os
import cv2
import time
model = YOLO("last_ncnn_model")
ret = model("test.jpg",save=True,)
st = time.time()
ret = model("test.jpg",save=True,)
print(time.time()-st)
おぉ!速くなりました.ほんとうは,エクスポート時の設定やncnnの設定で,さらに軽量化/最適化できるらしい.
まとめ
YOLOモデルをncnnにエクスポートすることで,RaspberryPiZERO2Wでも高速に処理できました.