Yolov9で物体検出(静止画、動画、自作データ）

ここではyolov9を使い、静止画、動画、自作データの物体検出方法を記述しています。
windows11 で Google Colab　を利用しました。（初心者向け）
（リアルタイム検出はGoogle Colabではできないです）
### 物体検出イメージ

こんな感じの物体認識を自分のPCで簡単にやってみたい
![mac.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/242319f6-8f5e-5dd1-f77b-16236365011c.jpeg)
動画も
<iframe width="560" height="315" src="https://www.youtube.com/embed/IdLfSLFqbK4?si=yCD_G-84IU95YClu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## Google ColabでYolov9を体験してみる
普段使っているWindowsのPCでGoogle Colabを使いました。
（めちゃくちゃ初心者向けです）
### Google Colabを開く
（Google Colabを使用したことがある方は読み飛ばしてください）
Google Colabを使用したことがない方は順番に操作してください。

1. google colab　と検索すると
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/07ab72a8-e2dc-5237-44fc-98c4b85706c1.png)


1. google colaboratory　を選択し、`ノートブックを新規作成`をクリックする
新規にノートブックが開き、カーソルの位置にプログラムを入力していきます。

1. GPUで処理をすると早いので、まずはランタイムのタイプを変更します。

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/6efe8982-dde1-1a5b-be8b-0bd4431c0e54.png)

![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/c8604122-6cbe-0eab-3c71-96b0229c94bd.png)


#### ドライブをマウントする
ご自分のgoogledriveにデータをダウンロードするため、アクセスできるようにしておきます。
カーソルの位置に以下を入力します。
```
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
```
入力したプログラムを実行するには実行ボタンをクリックします

![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/1feeb9a9-1032-f2b5-ec44-ee7bb7eda2d1.png)

アクセスを許可するので`googleドライブに接続`をクリック

![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/fd9c729a-112b-4f29-2a1c-ccf7ef64384f.png) 


・使用するGoogleアカウントを選択します。
・Google Drive for desktopにログインするので`次へ`をクリック
・追加アクセスを求めていますと表示されたら`続行`をクリック
　googleドライブ上のMyDriveがマウントされます。
・フォルダアイコンをクリックするとMyDriveフォルダを確認できます。

![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/40b70a81-46c9-67f2-7dc0-3efb994883d3.png)　![img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/ec0d4bef-78fb-ad5e-2dcf-a38de75f0925.png)

次のプログラムを入力するので`+コード`をクリックします。

![img8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/4fb8c6d7-ff52-1932-5703-9b1b2fa028e0.png)


#### yolov9をダウンロード
先ほどマウントしたMyDriveにyolov9をダウンロードして、
yolov9フォルダにディレクトリを移動します。
```
!git clone https://github.com/WongKinYiu/yolov9
%cd yolov9
```

※yolov9のフォルダができてますので確認してみてください。
`+コード`をクリックして入力画面を追加してください。
weightsフォルダを作成し、学習済みのモデルをダウンロードします。
```
!mkdir -p weights
!wget -P weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c.pt
!wget -P weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt
!wget -P weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-c.pt
!wget -P weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-e.pt
```
### 検出
yolov9/data/images/フォルダにサンプル画像　horses.jpg　があります。
これを使って検出してみます。
```
!python detect.py --weights weights/yolov9-c.pt --conf 0.1 --source data/images/horses.jpg --device 0
```
:::note warn
次のようなエラーが出ると思いますが、yolov9/utils/general.py `を開いて 903 行を
`prediction = prediction[0][1]`に変更してください。
どうやらweightsにyolov9-c.ptまたはyolov9-e.ptを使用した場合はうまくいかないので変更するようです。
:::


![img9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/aa05743c-a79a-c36c-e005-7eb64000c3ab.png)

うまくいくと、結果がruns/detect/exp･･･　に保存されます。
![horses.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/21349fe2-ef2a-7619-f06c-5a35f8296598.png)


#### 好きな画像を入れて検出してみましょう
先ほどのサンプル画像　horse.jpgと同じ場所、yolov9/data/images/　フォルダ内に　好きな画像ファイルを入れて、実行します。
```
!python detect.py --weights weights/yolov9-c.pt --conf 0.1 --source data/images/入れたファイル名.jpg --device 0
```
ex.
![mac.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/99da98b6-ebf1-4c15-3f8a-b780e990a226.jpeg)

ここで検出される項目は学習済モデルをもとにしています。（以下参考）
![name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/4443ecf8-d2e1-3547-04b9-2c13b9a8056a.png)

#### 動画で確認してみましょう

好きな動画を　yolov9/data/images/　フォルダ内に入れて実行してみてください。
```
!python detect.py --weights weights/yolov9-c.pt --conf 0.1 --source data/images/入れたファイル名.mp4 --device 0
```


## 自作データを使って検出
「学習済モデルの中に検出したい項目がない」時や「自作の画像」は学習をさせるところから行います。

ex.項目にlionやtigerがないため不正確　→　新たに学習させて正確に検出
![lion_tiger1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/98c5a7ae-790b-f94e-8c59-15fc83e1eb39.jpeg)![lion_tiger2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/e6ca0eae-ecae-8f52-6e32-0d1da29c651b.jpeg)


#### データの準備
まずは、学習させたいデータ（jpgなどの画像）を準備します。(私はお試しでlion25枚tiger25枚用意しました）

#### ラベルをつける(アノテーション）
画像認識させるためには「どの部分」を「どんな名前」で認識させるかを登録します。
ラベル付けをするソフトはいろいろありますが、私は　labelImg　を使いました。

1. pythonが必要なので　[pythonのインストール](https://www.python.org/)　をします
1. windowsマークより[コマンドプロンプト」または「windows powershell]を起動
1. コマンドプロンプトの場合は次に`python`と入力し実行する
1. labelImgのインストール
　`pip install labelImg`と入力し実行する
1. labelImgの起動
　`labelImg`と入力し実行する
 

アノテーションのやり方は　「yolov5で物体検出（静止画、動画、自作データ、リアルタイム）」のアノテーション（ラベル付け）をご覧ください。

https://qiita.com/suginaga/items/468ea7d232b8a24501bf

もし、labelImg操作中で、落ちることがあればこちらを参考にしてください。（私は落ちました）

https://note.com/nagisa_hoshimori/n/n4bb4a4a5019d

#### 自作データの保存
こんな感じのフォルダを作成し、ラベル付けしたjpgとtxtファイルを保存しておきます。
![img10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/756bcdf8-8930-59b5-4a60-9134167bd717.png)

#### data.yamlの作成
学習に必要な項目を記述したdata.yamlファイルを作成します。
ex.　lionとtigerのラベリングをした場合
![img11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666944/d22372f6-877b-c539-e531-5dda966a689b.png)

新規作成するので、テキストエディタを開き、
path：　データセットの場所
train：　学習用の画像フォルダの場所（path:からの相対）
valid：　検証用の画像フォルダの場所（path:からの相対）
test:　　テスト用の画像フォルダの場所（path:からの相対）
nc : ラベルの項目数
names：　ラベルの名前
を入力し、yolov9/data/ の中に　data.yaml の名前で保存します。

#### 学習を実行する
少ない学習回数　epochs 25　くらいでやってみる
```
!python train.py \
--batch 16 --epochs 25 --img 640 --device 0 --min-items 0 --close-mosaic 15 \
--data /content/drive/MyDrive/yolov9/data/data.yaml \
--weights /content/drive/MyDrive/yolov9/weights/gelan-c.pt \
--cfg models/detect/gelan-c.yaml \
--hyp hyp.scratch-high.yaml
```
学習結果はruns/train/exp に保存されます。

#### 学習した結果をもとに物体検出してみる
weightsを学習したファイルに変えます。（runs/train/exp/weights/best.pt)

:::note warn
weightsを`yolov9-c.pt`から変更した場合は`yolov9/utils/general.py `を開いて 903 行を`prediction = prediction[0]`に戻してください。
:::
以下を実行します
```
!python detect.py --weights runs/train/exp/weights/best.pt --conf 0.1 --source data/images/物体検出したいファイル.jpg --device 0
```
結果は　runs/detect/exp･･･　です。