0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

目標

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にラベルの保存先を設定.ChangeSaveFormatYOLOに変更.
これで準備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でも高速に処理できました.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?