138
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【YOLOv5】マスクしてる人・してない人を物体検出

Last updated at Posted at 2020-07-06

YOLOv5がリリースされたとのことなので試してみました。
https://github.com/ultralytics/yolov5/

目次

  1. 使用データと目的
  2. 実装例
    1. データ準備
    2. COCOデータのpretrainedモデルのダウンロード
    3. コードのダウンロード
    4. 環境準備
    5. コード実行
    6. コード説明
  3. 最後に

1. 使用データと目的

以下のサイトから物体検出用の画像を拾ってきました。
https://public.roboflow.ai/object-detection/
色んなデータがありますが、コロナの時期なのでマスク有り無しのデータを選択してみました。

目的は図のようにマスクをしている人・していない人の物体検出を行うことです。
before.PNG

2. 実装例

2-1. データ準備

まずデータをダウンロードします。
以下のURLにアクセスします。
https://public.roboflow.ai/object-detection/

Mask Wearing Datasetをクリックします。
data1.png

416x416-black-paddingをクリックします。
data2.png

右上のダウンロードをクリックし、YOLOv5 Pytorchを選択、Continueをクリックしてダウンロードします。
※認証が必要だったかもしれません。忘れました。
data3.png
YOLOv5 Pytorchですぐ動かせる形式でダウンロードしてくれます。

2-2. COCOデータのpretrainedモデルのダウンロード

以下から一式ダウンロードしてください。
https://drive.google.com/drive/folders/1Drs_Aiu7xx6S-ix95f9kNsA6ueKRpN2J

COCOデータセットについては以下を参照してください。
COCOデータセット

2-3. コードのダウンロード

下記GitHubからYOLOv5.ipynbをダウンロードしてください。
https://github.com/yuomori0127/YOLOv5_mask_wearing_data

GoogleColabでコードを見てみたい方はコチラ

2-4. 環境準備

環境はGoogleColabを使用しました。
使用方法は以下の記事をご覧ください。サーバ代は無料です。
Google Colabの使い方まとめ

GooleDriveの任意のフォルダに以下3つを入れてください。
・2-1. でダウンロードしたデータ
・2-2. でダウンロードしたpretrainedモデル
・2-3. でダウンロードしたYOLOv5.ipynb

2-5. コード実行

GooleDriveからYOLOv5.ipynbGoogleColabで開いてください。
※初回はインストールが必要だった気がします。
drive.png

まずはGPUのリセマラが必要です。
一番上の!nvidia-smi を実行(Shift + Enter)し、Tesla P100が出るまでリセマラしてください。
大体5回以内で引けます。
nvideasmi.png

リセットは以下からできます。
リセマラ.png

ランタイム->すべての処理を実行を実施すると全て実行してくれますが、
おそらくフォルダ名や階層が合わないです。
コードも短いですしそんなに大変ではないはずですので、なんとか合わせてください。すみません。

2-6. コード説明

短いので、一つ一つコードを説明します。

GPUを確認しています。

!nvidia-smi

インポート。

from IPython.display import Image, clear_output  # to display images

GoogleDriveをマウントしています。

from google.colab import drive
drive.mount('/content/drive')

ディレクトリ移動

import os
os.chdir("./drive/My Drive/YOLOv5/")

リソースを確認しています。
主にRAMを確認するためですが、今回はデータも少ないですし100epochなのであまり気にしなくて良いです。

!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi
!pip install gputil
!pip install psutil
!pip install humanize
import psutil
import humanize
import os
import GPUtil as GPU
GPUs = GPU.getGPUs()
# XXX: only one GPU on Colab and isn’t guaranteed
gpu = GPUs[0]
def printm():
    process = psutil.Process(os.getpid())
    print("Gen RAM Free: " + humanize.naturalsize( psutil.virtual_memory().available ), " | Proc size: " + humanize.naturalsize( process.memory_info().rss))
    print("GPU RAM Free: {0:.0f}MB | Used: {1:.0f}MB | Util {2:3.0f}% | Total {3:.0f}MB".format(gpu.memoryFree, gpu.memoryUsed, gpu.memoryUtil*100, gpu.memoryTotal))
printm()

yolov5をcloneしています。

!git clone https://github.com/ultralytics/yolov5

実行に必要なパッケージをインストールしています。

!pip install -r yolov5/requirements.txt

apexをインストールしています。学習が早くなります。

!git clone https://github.com/NVIDIA/apex
!pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./apex

tensorboardの準備。

# Start tensorboard
%load_ext tensorboard
%tensorboard --logdir runs

ちなみに、100epoch学習後はこんな感じでした。
100だと全然足りてないですね。(lossの画像取り忘れました。。)
tensorboard.png

学習します。引数についてはtrain.pyを見れば書いてあるのですが、ここでも簡単に説明します。

#--img:画像サイズ
#--batch:バッチサイズ
#--epochs:エポック数。
#--data:データ定義ファイル。データダウンロード時に自動的に作成されています。シンプルなので是非中身を見てみてください。
#--cfg:モデルの構成ファイル。
#--name:モデルファイル名。学習後のモデルで最も精度の高いものはbest_mask_wearing.ptという名前で保存されます。
#--weights:ファインチューニング元のモデル。今回はCOCOのpretrainedモデルを指定していますが、自分で学習したモデルも指定できます。
!python yolov5/train.py --img 416 --batch 16 --epochs 100 --data data/data.yaml --cfg yolov5/models/yolov5x.yaml --name mask_wearing --weights yolov5_models/yolov5x.pt

推論させています。
見栄えする良い感じの画像がテストデータになかったので、今回は学習データを推論させています。

!python yolov5/detect.py --weights weights/best_mask_wearing.pt --img 416 --conf 0.4 --source data/train/images/
Image(filename='/content/drive/My Drive/YOLOv5/inference/output/0_10725_jpg.rf.99ff78c82dadd6d49408164489cb6582.jpg', width=600)

after.png

3. 最後に

YOLOv5かなり使いやすかったです。
データを指定してtrain.py実行するだけで学習できてしまいます。
メジャーなData Augmentationは半自動で実施でき、パラメータも結構調整してあります。
もしかしたらkaggleのようなデータ分析者の腕の見せ所はどんどんなくなっていくのかもしれません。

138
136
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
138
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?