【YOLO】実際に使ってみた【物体検出アルゴリズム】

# 1.はじめに

https://qiita.com/kindamu24005/items/efd53c7511a40ddac636

・上の記事で**YOLOの仕組み**を簡単に理解したので、実際に使ってみます。
※YOLOはPython動かせるので、<B>Python言語</B>を使います。

**物体検出モデル**には**2種類**あります。

①：**既に学習されたモデルを使う**
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/a1ab2956-2399-7a31-74bd-698845fdea6e.jpeg)
・yoloには**既に開発者が学習して作ったモデル**があります。
・モデルは**既に学習されている**ので、画像に写ってるものが何なのか**検出する事ができます。**



②：**自分でオリジナルのモデルを作って使う**
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/a74ca79b-ccc9-3b8a-a597-be91bfb9ea17.jpeg)
・モデルはまだ学習されていないので、**画像に何が写ってるか判断できません。**
・自分でたくさんの画像を読み込ませて、**画像に何が写っているかモデルに教え込みます。**

:::note info
今回は①の**既に学習されたモデル**を使ってみます。
:::
# 2.既に学習されたモデルを使う
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/a1ab2956-2399-7a31-74bd-698845fdea6e.jpeg)
<B>・仮想環境を作る</B>
　　　　⇩
<B>・仮想環境に入る</B>
　　　　⇩
<B>・YOLOのダウンロード</B>
　　　　⇩
<B>・必要なライブラリのインストール</B>
　　　　⇩
<B>・画像の保存</B>
　　　　⇩
<B>・yoloの実行</B>

## 2.1.仮想環境を作る
・一般的にPythonによる開発は、**開発プロジェクトごとに仮想環境を構築**して行います。
・ライブラリのバージョンの違いによるエラーを防ぎます。
・仮想環境は**anacondaプロンプト**で以下のコマンドを打てば作る事ができます。
![anacondaprompto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/0f8d56f3-c40c-6b1b-8d49-07467ad022d8.png)
```:(base)C:¥Users¥ユーザー名
conda create -n "仮想環境の名前(自分で決める)" python=3.8
```
・例えば<B>"yolov5"</B>という名前の仮想環境を作りたい場合は下記のコマンドを打ちます。
```:(base)C:¥Users¥ユーザー名
conda create -n yolov5
```

## 2.2.仮想環境に「入る」
```:(base)C:¥Users¥ユーザー名
conda activate "仮想環境の名前(自分で決める)"
```
・例えば<B>"yolov5"</B>という名前の仮想環境を作り、その仮想環境に入りたい場合は下記のコマンドを打ちます。
```:(base)C:¥Users¥ユーザー名
conda activate yolov5
```
・そうすると<B>(bash)</B>が<font size="7" color="red"><B>(yolov5)</B></font>に変わります。
```:<font size="7" color="red"><B>(yolov5)</B></font>C:¥Users¥ユーザー名
conda activate yolov5
```
↓実際の写真
![enter venv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/7e2708cd-e51f-0bc4-73d5-5f3aeb81b826.png)
・これで仮想環境"yolov5"に<B>「入れました。」</B>


## 2.3.YOLOのダウンロード

https://github.com/ultralytics/yolov5

・仮想環境内で下記のコマンドを打ちます。
```:(yolov5)C:¥Users¥ユーザー名
git clone https://github.com/ultralytics/yolov5
```
・**github**でYOLOのコードが公開されています。
・githubにあるYOLOのコードを<B>ダウンロード(=クローン)</B>します。
↓ダウンロードできました。
![check dl yolo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/bd20e460-f199-0e45-3dff-aa5f80467557.png)


## 2.4.必要なライブラリのインストール
・下記コマンドを打って<B>フォルダ</B>の現在位置を<B>"ユーザー名"</B>から<B>"yolov5"</B>に移動します。
```:(yolov5)C:¥Users¥ユーザー名
cd yolov5
```
↓
```:(yolov5)C:¥Users¥ユーザー名<font size="7" color="red"><B>¥yolov5</B></font>
```
・この状態で下記のコマンドを打ちます。
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
pip install -r requirements.txt
```

## 2.5.画像の保存
・物体検出したい画像を<B>imagesフォルダの中</B>に入れます。
・フォルダは下記の場所にあります。
```
C:/Users/ユーザー名/yolov5/data/images
```
・今回は<B>"vid_4_6260.jpg"</B>という画像をimagesフォルダの中に入れます。
```
C:/Users/ユーザー名/yolov5/data/images/vid_4_6260.jpg
```
↓デフォルトで**bus**と**zidane**という画像も入っています。
![check inside of images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/f0814b66-6a83-7223-c870-5ebb6cabb996.png)



## 2.6.yoloの実行
・下記のフォルダの位置で、下記の形式のコマンドを実行します。
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
python detect.py --source ./data/images/"保存した画像の名前" --weights yolov5s.pt --conf "0から１の間の数字"
```
:::note warn
もし<B>"unacceptable character #x0080: special characters are not allowed"</B>というエラーが出たら<B>"coco128.yaml"</B>ファイルの<B>1行目から7行目を消して</B>保存します。
![delete commentout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/554153d0-2761-e41a-9985-66d22247e098.png)
:::
・実行後、分析が終わった画像は下記の<B>"detect"のフォルダの中にexpというフォルダが出来ています。</B>
・実行するごとにexpフォルダが増えていき、<B>中に画像が保存されています。</B>
```
C:/Users/ユーザー名/yolov5/runs/detect
```
![check done yolo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/9e9cd396-24b9-076c-131d-48fe2aaa1cb6.png)


### ◎コマンドの意味
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
python detect.py --source ./data/images/"保存した画像の名前" --weights yolov5s.pt --conf "0から１の間の数字"
```
・<B>python detect.py</B>：detect.py(yolo)を実行します。
・<B>--source ./data/images/"保存した画像の名前"</B>：物体検出する画像の位置を記載します。
・<B>--weights yolov5s.pt</B>：実行する既に学習されたモデル(yolov5s.pt)を選びます。
・<font size="7" color="red"><B>--conf "0から１の間の数字"</B></font>：**しきい値**を設定します。

### ◎しきい値って何？

<font size="7" color="red">**どれくらい枠線を消すかの基準を決める数字**</font>
$$ \huge{{0\leqq IoU\leqq1}} $$
・yoloでは**しきい値**のことを**IoU**と言います。
・<B>IoU</B>は<font color="Red"><B>0</B></font>から<font color="Blue"><B>1</B></font>までの間の数字です。
・<B>しきい値によって検出される範囲が異なってきます。</B>

### ◎しきい値が0.4の時
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
python detect.py --source ./data/images/vid_4_6260.jpg --weights yolov5s.pt --conf 0.4
```
![vid_4_6260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/795ae3a9-7d4e-824e-1c15-3f2f585dce24.jpeg)

### ◎しきい値が0.3の時
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
python detect.py --source ./data/images/vid_4_6260.jpg --weights yolov5s.pt --conf 0.3
```
![vid_4_6260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/eb31e5e7-2885-2eb3-38ca-c3512079760a.jpeg)
・若干精度が上がりました。


### ◎しきい値が0.1の時
```:(yolov5)C:¥Users¥ユーザー名¥yolov5
python detect.py --source ./data/images/vid_4_6260.jpg --weights yolov5s.pt --conf 0.1
```
![vid_4_6260.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658998/eaa09dcd-baf2-c927-59a9-a656fb2b73bd.jpeg)
<B>・信号機が認識されるようになった！！！！！！</B> （スコアは低め）

# YOLOシリーズの違いを簡単にまとめてみた
https://qiita.com/kindamu24005/items/6374b17cb6a3effa80c6

# yoloが使われてる面白そうな技術

https://qiita.com/sibkin/items/c7642aff71df7e79f353

https://www.wantedly.com/portfolio/projects/60825



## 参考ページ

https://pjreddie.com/darknet/yolo/

https://pjreddie.com/media/files/papers/yolo_1.pdf