いまさらyolov5を使ってさいころの出目検知をしてみた

※ //　これはコメントです

# やったこと
さいころの出目をカメラで検知した
ちんちろ用の検出をしたかった
使ったモデルはyolo v5

# 使ったマシン
1. ノートPC
用途:アノテーションと実行
2. ゲーミングPC
用途: 学習

# やり方の流れ
1. データセットを作る
2. 各PCにyolo v5をいれる
3. ゲーミングPCにデータセットを入れ学習させる
4. 学習によって得られたbest.ptファイルをノートPCに入れて実行

# データセットを作る
## 画像を集める
まず検知したい写真を用意してください。最終的に今回はさいころ3つある写真を230枚ほど用意しました。学習、実行だけなら15枚でも動きますが精度が悪いので画像はたくさん用意しましょう。

## アノテーションをする on WSL
今回はwslにアノテーション用の環境を作って実行しました。windows環境汚してもいい人はwindowsでやった方が楽だと思います。やったことないけど
### wsl でwindow出力できるようにする
まずwslv2になってることを確認してください
Power Shellで
```
wsl -l -v
```
ってやって使いたいディストリビューションの横に2って書いてあればOK

v2 なら
```
sudo apt install x11-apps
```
ってやってあげてwslを再起動したら画面出力できるようになってると思う
確認の仕方は
```
xclock
```
ってやって画面が出てきたらOK
※筆者のゲーミングPCではなぜかできなくてアノテーションをノートPCでやる羽目になりました。
つまりできない可能性もあります。パソコン1つしかなくて...って人は頑張って対策調べてみて下さい。個人的に怪しいなと思うところはGPUのドライバーです。

### アノテーションをしよう
適当にフォルダ作ってその中に入ってください
そこで
```bash
sudo apt install python3-pip pyqt5-dev-tools
// 仮想環境使いたい人はこれ
python3 -m venv venv 
source venv/bin/activate

//仮想環境知らない人はここから再開
pip3 install lxml pyqt5
git clone https://github.com/tzutalin/labelImg.git
cd labelImg
//make は初回だけ
make qt5py3
```
で準備完了

で、せっかくだからこのディレクトリの中に画像のフォルダを作ってぶち込んでください。

そしたら
```
python3 labelImg.py
```
で実行されると思います。
したら左側にフォルダを開く敵なのが出ると思うので開てください。
フォルダを開くの下にセーブするところを選べると思うので画像のところと同じところにして下さい。ほかの記事では画像とラベルでフォルダを分けてますが、なぜか筆者の環境だとトラブったので同じフォルダに入れておけば楽です。
また、labelImgの/data/にpredefined_classes.txtがあるので中身をからにしておいてください。
したらアノテーションをしましょう

w押して四角作って、それに対応するラベルを付ける。
セーブして次の画像へ

これを繰り返してください。
今回は出目の判定のために3つのさいころひとつづつに資格を作って出目をラベルにしました。
全部の画像が終わったらアノテーションは終了です。40%くらいの疲れはここから来ました。

## 各PCにyolov5を入れる
いつも通り適当にディレクトリを作ってそこに入ってください。
そこで
```
git clone https://github.com/ultralytics/yolov5
//仮想環境を使う人は
python3 -m venv venv 
source venv/bin/activate
//使わない人はここから再開
cd yolov5
pip install -r requirements.txt
```
実行ノートPCではwsl上とwindows上両方に入れました。
というのもwsl上だとカメラを使うのが大変で、windows上だと少しコードを書き換えないといけないという感じです。
まだ問題に直面しないのでこの辺のトラブル回避は後述します。
※とにかくカメラ使うならwindows上にyoloを入れたほうがいいです。
※学習だけならwsl上でいいです。現に私はゲーミングPCのほうではwslにしか入れてない

## ゲーミングPCで学習する
まず先ほどアノテーションした画像とラベルが入ってるフォルダ名をtrainにしてください。次にtrainと同じ階層にvalというフォルダを作ってください。
最後にtrainの中のnペア分のデータをvalに移してください。nは200個データがあったときは10個くらいでした。

train とvalを一つのフォルダに入れてそれを学習用のyoloのdataの中に入れてください。
私の場合は一度google driveに入れてから落としてきました。scp使いたい人はそれ使ってください。

で、yolov5/dataの中にdata.yamlファイルを作って
```
train: {trainのパス　ex. data/dice/train}
val: {valのパス ex. data/dice/train}

nc: 6 //クラスの数　今回はさいころの出目なので6
names: ['dice', .....]　//ラベルを入れていってください
```
{}はいりません
: の後には半角スペース入れてください
nameに1,2,3以外にdiceが入ってる理由はなぜかそれだと動いたからです。多分アノテーションするときにdiceというラベルを作っちゃったんだと思う。
names にはtrain の中にclasses.txtの中にあるものを順番に文字列で入れていけばいいと思う

ここまで来たら学習開始です
```
train.py --data data.yaml --weights yolov5s.pt --epochs 200 --batch 8
```
epochs は画像の数にしておいて batch はなんとなくで8にしました。
あと結構時間かかります。

## 学習によってゲットしたやつで実行
学習終わると最後に
```
Result saved to runs/train/exp{数字}
```
とか出てくるからそこに行ってbest.ptをとってきてください
これを実行用のyoloのところにコピーします。

### windowsでやる場合
いったんyolov5のところで
```
python detect.py --source 1 --weight best.pt
```
とやってください
0はカメラの番号です
たいていwebカメがこれ
で、もしエラーがでずに動いた場合おめでとうございます！
エラーで
 cannot instantiate 'PosixPath' on your system
と言われた人は
detect.py
の
```
from pathlib import Path
```
この行の下に
```
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
```
を追加してください
これで動きます。

### wslで実行したい場合
執筆時点ではwsl では母艦に接続されているカメラは/dev/video*に出てきません。
※もし、/dev/video0なりなんなりがある人は読み飛ばして実行のステップまで行ってください。
そのために
usbipdで認識させた後にカーネルをごにょごにょして/dev/video*として認識させる必要があります。
書くのが難しいので端折りますが、

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb
これしてください
で、
https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf?tab=readme-ov-file
してください。
そうしたら出てきます。

で、出てきたら
/dev/video0を777にしてください
アクセスできるようになります。
### wslでの実行
yolov5の下のところにbest.ptをコピーして
```
python detect.py --source 1 --weight best.pt
```

これでできるはずです
wslでやるとカメラが重くてとても検知しても面白みがないですよね。
まじで実行するだけならwindowsをお勧めします。


お疲れさまでした。



# お世話になったリンク
https://qiita.com/fujioka244kogacity/items/e5acf8d9bb728e7d1bcc
https://qiita.com/02130515/items/cfbb9dcd8291418476ab
https://zenn.dev/pinto0309/articles/e1432253d29e30
https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf?tab=readme-ov-file
https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb
https://github.com/ultralytics/yolov5/issues/11330

ベストサンクス
ChatGPT