【Google Colab＆YOLOv5で物体検出】シンプルなコードでカンタン物体抽出

# はじめに
プログラミング(Python)を学び始めたきっかけとなったのは、近年の災害時における救助活動の様子をメディアの取材から聞く中で、ドローンで撮影した動画などに対して簡単に素早く要救助者を認識する事ができれば、救助隊員の負担を減らしつつ素早い救助に大きく貢献出来るのではないかと考えたためでした。
そして、被写体を分類出来る技術がもっと使われるようになれば、農業など多くの現場においても作業者の負荷を軽減出来ると考えています。
最近プログラミングスクールのカリキュラム内でディープラーニングを学び、色々と調べていく中で物体検出に興味を持ち、中でもYOLOを使えば簡単に画像や動画の被写体を認識する事ができるため、Pythonを学び始めた上記の目的が達成出来ると思ったため、初めてのチャレンジのまとめとしてQiitaの記事にまとめてみました。

# 解決したい課題
特に災害救助など、一刻も早い救助が必須であるケースにおいては、どのような天候や環境であってもどれだけ早く人と人以外を見分けられるかが求められますが、実際の現場においてはまだ人と人以外を素早く見分けるのは難しいと聞きました。
そのため、物体検出技術によって現在どの位の確率で人がきちんと認識されるのかを確認しつつ、動画に写った被写体がどのような分類で検出されるのか、などを確認してみる事により、将来的に実際の現場において物体検出が使われるような技術開発のきっかけになればいいと考えています。

# 使用する物体検出モデル
今回は比較的使いやすいYOLO(You Only Look Once)を使います。
YOLOはいくつかのバージョンが出ていますが、物体検出のための深層学習アルゴリズムであり、今回は解説も多くて使用しやすいV5を使用してみたいと思います。
Pytorchベースで作成されており、非常に簡単な操作で非常に高い精度を出すことが可能です。

# 利用データ
地域の夏祭りの一部を撮影した動画

# 実行環境
パソコン：Windows 11
開発環境：Google Coraboratory
言語：Python

# 分析の流れ(過程)、実行したコード
動画からの物体検出処理の手順をシンプルにまとめました。

### 手順(1) 環境構築
まずはGoogle Colaboratoryを起動して、Yolov5の準備を行うため、以下のコードを実行します。

```
!git clone https://github.com/ultralytics/yolov5
%cd yolov5/
!pip install -qr requirements.txt
```
### 手順(2)実際に撮影した動画から物体検出
学習済みモデルを使用するので、誰でもすぐに再現することが可能です。

この動画の保管先を実行するコードに入力して物体検出処理をしていきます。
以下の通り実行します。
今回使用する動画は地域の夏祭りの一部を撮影した動画です。

```
!python detect.py --source 20240713_祇園山笠.mp4 --weights yolov5s.pt --conf 0.3 --name demo --exist-ok
```
実行すると以下のような実行過程が表示され、終わると自動的に保存されます。
実行画面の最初はこんな感じで続きます…。
```
detect: weights=yolov5s.pt, source=20240713_祇園山笠.mp4, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_csv=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1
YOLOv5 🚀 v7.0-339-g150a1a31 Python-3.10.12 torch-2.3.0+cu121 CPU

Fusing layers... 
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs
video 1/1 (1/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 15 persons, 1 handbag, 1 tie, 1 skateboard, 256.1ms
video 1/1 (2/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 14 persons, 1 tie, 1 baseball glove, 1 skateboard, 305.4ms
video 1/1 (3/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 16 persons, 1 tie, 1 skateboard, 239.0ms
```
そして、処理が終わると一番最後はこんな感じに表示されます。

```
video 1/1 (799/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 16 persons, 2 cars, 1 backpack, 1 handbag, 385.2ms
video 1/1 (800/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 13 persons, 2 cars, 1 backpack, 1 handbag, 385.4ms
video 1/1 (801/801) /content/yolov5/yolov5/20240713_祇園山笠.mp4: 384x640 15 persons, 2 cars, 1 backpack, 1 handbag, 400.4ms
Speed: 1.3ms pre-process, 276.8ms inference, 2.6ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs/detect/demo
```


処理が終了すると、以下の場所に保存されたことが表示されます。
（今回は"demo"を保存場所に指定したのでdemoに保存されています。）
`/content/yolov5/runs/detect/demo`

![物体検出終了⇒保存されている場所-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806184/843627b2-435b-5f9e-7e8f-b94730217295.jpeg)

物体検出の処理が終わると、人をメインとした物体検出処理が完了した動画となっています。
しかし、きちんと検出は出来ているのですが、なぜか音声が抜けてしまっています…。

https://youtu.be/sn-AvO8j_EU




# 課題
今回の物体検出において、検出をかけた元の動画から音声が抜けてしまったため、次回は元の動画からの音声抽出と、無音になってしまった動画の合成を行って動画を完成させます。
他の動画でも試したのですが、物体検出をかけた後は同じように音声が抜ける傾向が見られたため、今後は物体検出処理の時に音声を残したままで処理できる方法を模索していく予定です。
また、人は高確率で検出できているものの、それ以外は検出出来たり出来なかったりとばらつきが見られたため、用途に応じてファインチューニングをしてYOLOに学習させるなどの方法も検討していきます。


# 考察
課題の項目でも書きましたが、他の動画でも同じように物体検出をかけた後は音声が抜けてしまう傾向が見られました。
（検証はしていないため、あくまでも推察の域を出ませんが…）もしかしたら検出処理をする際にYoloの方で処理に必要な画像は処理したものの、音声は物体検出には不要のため除かれたのではないかと考えています。


# まとめ
今回は物体検出処理をいかに簡単なコードで行えるのか、その手順をまとめてみました。
動画から直接物体検出処理を実施することで、動画内容の分析や情報の把握の自動化への活用が期待できるため、今後も様々な場面で積極的に活用していこうと思います。
次回は、ドローンでの空撮動画に対して物体検出処理を行ってみようと考えています。