【物体検出】ColabでYOLOv5を使ってみた

# はじめに
以前『[【Python】YOLOv3を使ってみた](https://qiita.com/konan/items/f29ac144f960d0f6a8ec)』という記事を出しました。その後月日が流れてYOLOv5やYOLORなどYOLOの発展系や派生系が続々でていました。
最近では、YOLOをスマホなどのデバイスに入れて動くというエッジAI化もされているとのことです。とてもスゴイですね！

#そもそもYOLOって？？
YOLOとはYou Only Look Once(一度見るだけで)の略らしいです。面白いですね！NN(ニューラルネット)を一からモデルを構築しなくても、YOLOなら大丈夫でYOLOをダウンロードすれば構築ができているので通すだけでできました。また画像だけでなく、Webカメラなどとも連動できるので、リアルタイムの検出も可能ですので画像において色々な場面で活躍ができそうだと感じました。[YOLOの公式サイト](https://pjreddie.com/darknet/yolo/)
実際にYOLOを使うとこのようなことができます。

#YOLOをColabで実行
Google Colabを使用します。Google ColabはGoogleアカウントがあれば誰でも無料で(有料版のアップグレード版もあり)使えるので、気軽にコードを試すのには最適です！それでは、使っていきましょう。

まずはmoduleをinstallします。

```
#GithubからYOLOv5をCloneし必要なmoduleをinstall
!git clone https://github.com/ultralytics/yolov5
%cd yolov5/
!pip install -qr requirements.txt
```

次に推論の関数が入っているdetect.pyを動かします。引数として物体検知したい画像のパスを指定します。

```
!python detect.py --source /content/yolov5/data/images/zidane.jpg
```

上の実行が終了したら、実際に推論結果を可視化してみましょう！！matplotlibを使用します。

```
import matplotlib.pyplot as plt
img = plt.imread('/content/yolov5/runs/detect/exp/zidane.jpg')
plt.imshow(img)
plt.show()
```

これを実行することで可視化することが可能です。
サンプル画像ですが、実行結果この通りになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328847/1a5cba75-32c9-0f27-3489-737b9b2b4534.png" width="500" height="300">

この通り「どこに」「何が」あるかをしっかりと認識しています！！
次の画像でもみてみましょう！


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328847/61852245-2a0b-fe54-0734-c040f0fe18f2.png" width="500" height="300">

私の記事を見たことある方はこの猫がよくでてくる事は知っているかと思います。この猫意外と曲者で、顔だけしか写っていないのと、耳が片耳しか写っていないのでモデルによっては反応しないこともあってよくお世話になっています..
物体検知を行ってみたら0.25と確信度自体は低いですがcatと認識をしています！！とてもよくできたモデルですし、githubを読み込んだり推論して思ったのですが、このモデルとても軽くて早くて使いやすくでYOLOv3に比べてパワーアップしているなと感じました。

以上、使ってみたでした。
このコードを用いての実装はここまでですが、この記事では、理論のところまで少しだけ踏み込んでみたいと思います！！興味ある人は読んでみてください。


#YOLOのちょっとだけ理論編~どうやって推論しているの？？~
私自身2021#2のE資格をなんとか合格できE資格を取得したので、ただ「使えた、やったー🤗」だけでなく論文や公式サイトを読んだりすることが少し増えました。少しだけ紹介いたします！！(もし、間違っていたらご指摘ください)
>[E資格の合格体験記](https://qiita.com/konan/items/cb3a53596b55149339b5)の記事も書いています！もしよかったらみてください

そもそも「物体検知」というのは、「どこに」「何が」あるかを推論するタスクになります。つまり推論が**2つ**必要になります。
「物体検知」のモデルを評価する指標には、推論が2つする必要があるので評価指標も2つ必要になります。

###「どこに」に対する指標:IoU(Intersection over Union)
IoUとは、予測した領域に対する評価指標です。領域のことをこの分野の専門用語ですが「バウンディングボックス」と呼ばれています！
下の図がイメージになります。オレンジ色が予測したい**正解のバウンディングボックス**とします。赤色が**予測したバウンディングボックス**とします。この時左と右どちらがより予測していると言えるでしょうか？正解のバウンディングボックスとより重なっている面積が大きい左の方が直感的により良いモデルと言えると思います。

![スクリーンショット 2021-11-20 16.41.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328847/0d68ca0e-cd74-7ac9-e025-b6c779d35296.png)

これを数式で表すと、
![スクリーンショット 2021-11-20 16.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328847/26743ba5-247c-df8b-dfed-90e83cc0c4eb.png)


グレーの部分の面積を考えます。これらを全てのバウンディングボックスに当てはめ平均をとることでモデルのIoUとして定義しています。

###「何を」に対する指標:Accuracy
次に、「何を」に対する指標ですが、画像分類などでもよく使われるAccuracyです。Accuracyとは、予測結果全体と正解がどれくらい一致しているかという指標になります。一言で言うと「正解率」です。モデルがどの程度頭いいかを示しています。

「物体検知」はこの2つを指標がどちらも良い精度でないと「物体検知」の指標としては良いとは言えません。そのため、今までも色々な考えのもとモデルが構築され考えられてきました。(こちらも後で記事にしようと思います！この辺の歴史も面白いです🤗)

##YOLOのモデルの推論手順について
**手順1)**YOLOのモデルは、まずS*Sになるように画像に区切り線を入れ分解します。(1つ1つをグリッドセルと呼ぶ)
**手順2)**セルごとにB個のバウンディングボックス(通常2個)を推定します
手順2)で行っていることを簡単に言うと「領域の大きさを推定」ということを行っています。
**手順2-2)**
一つの領域ごとに決める変数として、
x:ボックスの中心のx座標(グリッドセルの端から)
y:ボックスの中心のy座標(グリッドセルの端から)
w:ボックスの幅
h:ボックスの高さ
confidence:物体である確率×IoU(正解の領域との近さ)

**手順3)**物体推定
セルごとに物体の分類確立を推定します
この手順3を一言で言うと物体検知の大きなタスクとして示した『「どこに」「何が」写っているか』の「何が」にあたります。

YOLOの特徴的なところとして「どこに」「何が」という推論を1つの同一のCNNを使うことで高速にすることが可能になりました。最近の物体検知ではYOLOとSSDという2つが主に使われているという話を聞きますが、SSDも理論をみてみると面白いし頭いい使い方をしています。またいつか記事にまとめようと思います！！


以上、最後まで読んでいただきありがとうございます。
フォローLGTMよろしくお願いします。また他にも記事を書いていますので、是非読んでみてください。

##参考文献
[【Python】YOLOv3を使ってみた](https://qiita.com/konan/items/f29ac144f960d0f6a8ec)
[物体検出の評価指標IoUの計算方法](https://qiita.com/shoku-pan/items/35eae224c59989957623)
[YOLO: Real-Time Object Detection](https://pjreddie.com/darknet/yolo/)
[YOLO V5(V3との比較有)を簡単サクッと試す！](https://ai-coordinator.jp/yolov5)