独自データでのGooglebColabでのyolov5モデルの訓練とローカルでの実行

# 自前データでGoogle Colabでyolov5を訓練してローカルで実行する覚え書き(2022.8.3)
 
ブログはじめました medical なことをpythonで処理していきます
[medical-python](http://medical-python.com/)
こちらもチェックしてください

初めての記事投稿になります。
yolov5モデルを自前データでやりたいが、コードはできるだけ書きたくない方向けです。
マウス操作でできる事を重視してかきましたが、最後にモデルの選択で少しだけプログラムの書き換えが必要です。

## 1．自前データのラベリング(labelimg使用）
1-1:以下のサイトにアクセス
https://github.com/heartexlabs/labelImg/releases
windows_v1.8.1.zipをダウンロードして任意のフォルダで解凍する

![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/d4b861e5-75d6-49ab-7453-5e5dd5e936c0.png)

**1-2:predefined class.txtの書き換え**
dataフォルダの中に、predefined classes.txtというファイルがある、これをメモ帳で開く
クラス名を以下のように書き換える
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/84609bdf-4793-6c06-0188-a157fd9a11d2.png)
検出したいクラスを縦にかく、アノテーションの時はクラス名ではなくクラスのインデックス番号が記載されるので、この順番は大事。(あとで、訓練の際に似たようなファイルを作るが、順番は統一しておく）
(post_short, medial_normal, medial_injuryなど他の部位を検出させたいときはこの下に追記するとクラスのインデックス番号の整合性が合う）
**1-3:labelimg.exeの起動とアノテーション**
labelimgを起動　**データ形式でyoloを選択(左列）　use default labeにチェックを入れる**
openDirで画像が保存されているフォルダを指定
change Save Dirでアノテーションしたファイルの保存先を指定
Create RectBoxから画像のアノテーションを行う
SaveしてNext Imageへ進む

![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/51820340-401e-410d-634d-62eb7c7c2896.png)

すべてのデータにラベル付けが終われば、google driveの直下に作るのフォルダに画像(jpeg :pngでうまくいかなかったことあり）とtextファイルを移す

## 2．GoogleDriveにフォルダを作成してフォルダを配置する
https://github.com/atstuyuki/elbow_OCD/blob/main/yolo_ocd3%20.zip
上記からyolov3の空のZipフォルダをダウンロードして展開し
google driveにyolov3というフォルダを作ってデータを以下のように配置する

google drive直下にyolo_ocd3というフォルダを作成した場合（本当はvalidフォルダのimage labeフォルダにもデータが入っている
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/7a5d7459-47ea-e481-3c4a-73956837d24a.jpeg)

エクスプローラーでフォルダを順番に開いたらこんな感じ
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/5cf49ce0-48c7-5b87-f1ff-d36142f902ac.png)


## 3．classes.txt, data.yamlファイルの中身をメモ帳で開いて確認　
違う名前で訓練していたり、ディレクトリのパスが違えば適宜　classes.txt data.yamlファイルの書き換えと上書き保存する
各クラスの並び順が大事（ocd=0番、ant_long=1番）になる、名前ではなく番号を学習するので、LabelIMGでアノテーションしたときと、クラスの並び順が異なれば学習ができない

![キャプチャ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/75a44f0e-cda7-b858-74ab-525cbe2a0e96.jpeg)
![キャプチャ4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/17ce733d-4bf8-f9b5-68be-b20b9003270a.jpeg)


## 4．GooglebColabに接続して訓練の実行
Githubのこのページにアクセス　https://github.com/atstuyuki/elbow_OCD/blob/main/yolov5_train_on_colab__ocd3_20220731.ipynb
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/d4074d8e-8804-167a-710c-0d0998e972bc.png)
左上のopen in colabから自分のgoogle アカウントでログインしてcolabノートブックを実行
#ランタイムの選択でGPUを選択しておくこと
#しばらく画面を操作しないと自動的に接続が切れる事がある

## 5．学習済みモデルのダウンロード
学習が終わればyolov5/runs/train/ocd/weights のフォルダにlast.ptという訓練済みモデルができるのでこれを右クリックでダウンロード
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/1073a404-95cf-6e00-2f09-d36c3d9cb6f6.png)

google colab上でモデルの動作確認をしたい場合は以下の記事を参考ください
[自前データで学習したyolov5モデルを使ってgoogle colab上で物体検出](https://qiita.com/atsuinui/items/1e9b30d7232c99c64d93)

## 6．ローカルでの環境構築(winpython編がメイン）
　1．anacondaを使うひとはanacomda prompt からyolov5という名前で仮想環境を構築して起動する
```python:仮想環境の構築と起動
conda create -n yolov5
conda activate yolov5
```

　2.　python使わないがyoloだけやってみたい人はWinpython環境を勧める。(Windowsのみ）
  https://sourceforge.net/projects/winpython/files/
  ↑から好きなpythonを選んでダウンロードする。ダウンロード数の多いものを選んでおけばだいたい大丈夫

　例えば
　https://sourceforge.net/projects/winpython/files/WinPython_3.10/3.10.4.0/　
　から、Winoython64-3.10.3.0.exeをクリックしてダウンロード
 pythorchが入っている必要があるので、重たいファイルをダウンロートしておく。
　![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/a751619f-1d5a-387f-9050-3aa9736c4b6f.png)
　任意の場所で解凍(extraxt)する(Cドライブ直下とか、外付けUSBとか）
  3．解凍したwinpythonフォルダでWinpython Command Prompt.exeをクリックして
```python:pip listでインストール済みのパッケージの確認
pip list
```
 を実行するとダウンロードしたWinpythonにインストール済みのパッケージが確認できる。torch(Deep Learning用のライブラリ）が入っている事を確認する。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/1d923018-d0f8-8d87-a558-b773f5358024.png)
　GUI用のライブラリPySimpleGUIも使うので、引き続きcommand promptに以下を入力してインストールする
```python:pip でPySimpleGUIをインストール
pip install pysimplegui
```
conda 環境の人はconda installで入れてください(https://anaconda.org/conda-forge/pysimplegui)
再び、pip listでPySimpleGUIが入っている事が確認できる。

(2022.8.30追記)
Winpythonのバージョンによってはpytorch実行時にnumpyのバージョンが合わずにエラーが出る様です。その修正方法について記事を書きました
[pytorchのnumpyバージョンエラーの修正](https://qiita.com/atsuinui/items/ef569d6ece3c7634a27d)
　
4．yolov5環境の構築
GitHubのこのページに移動(本家のページでも良いですが、このページでは病変の物体検出用のモデルを格納済みです）　https://github.com/atstuyuki/yolov5
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/b9885ba7-6be4-039b-c080-fcc938cabdbb.png)

codeからDownloadZipを選択してフォルダ(yolov5-master)をダウンロード・解凍する
winpythonフォルダを開けて、その中に'yolov5'というフォルダを新規作成
yolov5フォルダ内部に先ほど解凍したyolov5-master内部のフォルダをすべてコピーして貼り付ける
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/0a91eeb4-fed4-6097-65a1-e8829de534be.png)
自前の学習済みモデル(先ほどgoogle_colabで学習させてダウンロートしたlast.ptファイル)がある場合はそのファイルをこのフォルダ内にコピーして貼り付ける
## 7．ローカルでの実行
https://github.com/atstuyuki/elbow_OCD/blob/main/yolov5_ocd_detect.zip
上記から圧縮フォルダをダウンロードして解凍　
実行ファイル　yolov5_ocd_20220721.py　と
当方の学習済み重みファイル　ocd_20220413.pt　がある
実行ファイル(.py)をwinpython直下のディレクトリに置く
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/1544a89b-8ac4-1347-0382-cd7bd5769c66.png)
学習済み重みファイル(.pt)はサブフォルダのyolov5フォルダに置く
自分で学習させた重みファイルを使用する場合(先ほど訓練させた　last.pt)もこのフォルダに置く
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/6a4288e8-abda-4c08-1890-30eaab961660.png)
**どのモデルを使って検出させるかでpyファイルの書き換えが必要です**
yolov5_ocd_20220721.pyファイルをvscode.exeにドラッグアンドドロップして開く（もしくはメモ帳や自分の好きなeditorで開く）
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/51140e23-1c68-86ce-0eca-c97a83a1de00.png)
10~13行目が物体検出モデルの指定　デフォルトは80種類の物体を検出するCOCOモデル
自分の指定するモデルを使用するときは11行目に#をつけてコメントアウト
13行目の#を消去してプログラムを有効化　
```学習済みモデルの名前をpathに指定
#ocd検出モデルを読み込む場合　xx.ptモデルをyolov5ディレクトリに置いておく
model = torch.hub.load('','custom',path='ocd_20220413.pt',source='local',force_reload=True)
```
たとえばlast.ptを使うなら
```学習済みモデルの名前をpathに指定
#ocd検出モデルを読み込む場合　xx.ptモデルをyolov5ディレクトリに置いておく
model = torch.hub.load('','custom',path='last.pt',source='local',force_reload=True)
```
と書き換える。
下図の左が書き換え前　右が書き換え後
![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/26e13081-8311-2b96-074e-470f047faad8.png)

yolov5_ocd_20220721.pyファイルをWinPython Interpreter.exeにドラッグアンドドロップするとpyファイルが実行されるの（パラメーター設定したいときは上述のpyファイルを書き換えてください）
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/bcef6e6f-4ffa-e19f-b2e5-7d7dc2c8bb34.png)

しばらくすると起動してinput camera numberと出るので半角整数を入力(PCによってカメラ番号は異なるが、通常フロントカメラが0　エコーからの外部入力は1（PCに2つカメラがあれば外部入力は2）
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/5d4bb46f-7aec-cb9f-8d92-75f9bf04c6e6.png)

少し待つと左にカメラからの入力画像開始、startで検出開始　stopで検出終了　exitでプログラム終了
今回はcocoモデルを使っているので人物が検出されています
![スクリーンショット (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/77bf1382-4e30-1f61-3d13-1af1f14092d2.png)

どうしてもjupyter　notebook形式でinteractiveに操作したい人は
winpythonのJupyterLab.exeをクリックして起動後に新しいpythonファイルを作成し
![スクリーンショット (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444891/eb9e3cc6-3416-0424-32b8-8632b57ad3a0.png)

こちらのコードを参考に
https://github.com/atstuyuki/elbow_OCD/blob/main/yolov5_ocd_20220803.ipynb
同じ内容をipynb形式で作ったのでこれをコピーしてください
**注）PysimpleGUIを使っている関係でgoogle colabでは動きません**


(言語設定でエラーが出る事があり、コントロールパネル＞時計と地域＞地域＞管理＞システムロケールの変更で対応すると動く事あり）




## 8.  参考サイト
**全体的**
https://qiita.com/PoodleMaster/items/5f2cc3248c03b03821b8
https://farml1.com/tomato_yolov5/

**labelimg**
https://doc.gravio.com/manuals/gravio4/1/ja/topic/labelimg
https://laid-back-scientist.com/labelimg

**google colab1でyolov5**
https://qiita.com/DiNOV-Tokyo/items/1333ff4a6d9b4b5b79c0
https://laid-back-scientist.com/yolo-v5

**Winpythonについて**
https://www.kkaneko.jp/tools/win/winpython.html
https://resanaplaza.com/2022/01/24/%e3%80%90%e3%81%93%e3%82%8a%e3%82%83%e4%be%bf%e5%88%a9%e3%80%91winpython%e3%81%a7python%e7%92%b0%e5%a2%83%e3%82%92usb%e5%8c%96%e3%81%97%e3%82%88%e3%81%86%ef%bc%81/