Python

【5分でできる!】YOLOv5を使って物体検出する方法を徹底解説!

【5分でできる!】YOLOv5を使って物体検出する方法を徹底解説!
スポンサーリンク

こんにちは、さすを(@sasuwo0409)です。

いきなりですが、

楽して物体検出したい!

映えるようなプログラムを書いてみたい!

と思ってはいませんか?

今回の記事は、YOLOv5を使って物体検出する方法を解説していきます。

この記事を読めば、たったの5分で、映える物体検出ができるようになります。

それでは本文をどうぞ。

困っている人
困っている人

できるだけ楽に物体検出プログラムを書いてみたい。

あと、どうやって使えばいいのかもおしえてほしいな、、。

さすを
さすを

この悩みを解決します!

この記事を読むとわかること:

  • YOLOv5を使って物体検出する方法
  • YOLOv5の使い方

筆者の情報:

  • 現役システムエンジニア 兼 ブロガー
  • 過去に6,000万のPython案件を受注
  • 最近ハマっていることは機械学習

注意:
使用する画像・動画によっては著作権に引っかかる可能性があります。
各画像の規約を守って、正しく活用しましょう。

※0円のサンプルテキストという近道


独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストと解説動画をもらえるので、これを使ってお得にPythonの基礎を学ぶのもオススメです。

スポンサーリンク

YOLOv5を使って物体検出する方法

YOLOv5を使って物体検出する方法

YOLOv5とは

YOLOv5とは、ultralyticsが2020年6月に公開した物体検出モデルです。

「You Only Look Once」の略で、処理速度が非常に早く、リアルタイムで物体検出できるのが特徴となっています。

PyTorchというディープラーニングフレームワークを用いており、検出精度と演算負荷に応じて「n、s、m、l、x」の5つのモデルがあります。

YOLOv5を使うためには、以下の条件を満たす必要があります。

YOLOv5を使うための条件:

  • OS:Windows、macOS、Linuxのどれか
  • サポート対象となるPythonのバージョン:Python3.6以降(2021年12月31日現在)

そして、YOLOv5を使うと、このようなことができるようになります。

  • 顔認識
  • 物体検出
  • 人体の検知
  • モニターでの監視 
  • 自動運転の物体検出
イッヌ
イッヌ

YOLOv5は、YOLOv3の後継で、より短時間に処理を実行できるようになっているワン!

さすを
さすを

Pythonを使ったことがなくても、簡単に使うことができます!

YOLOv5を使うための環境構築

今回はGoogle Colaboratory上で環境構築をしていきます。

Google Colaboratoryの使い方については「【3分で解決!】Google Colaboratoryの使い方【無料ですぐにPythonを使えます】」で解説しているので、使い方がわからない方はそちらを参考にしてみてください。

Pythonを使って自動でGoogle画像を収集するための手順は以下の4ステップです。

  1. リポジトリのクローンを作成する
  2. ライブラリをインストールする
  3. 物体検出したい画像・動画を格納する
  4. 処理を実行する
さすを
さすを

それでは、始めていきましょう!

その①:リポジトリのクローンを作成する

まず初めに、リポジトリのクローンを作成していきます。

  • リポジトリ:システムを構成するデータやプログラム情報が格納されているデータベースのこと。
  • データベース:データを整理し、検索・抽出などができるようにデータを格納したもの。
  • クローン:あるコンピュータ、仮想環境で動作しているもんを、全く同じ状態で別のコンピュータに複製・動作させること。

また、今回のプログラムでは、画像・動画を扱うので、ドライブをマウントしてから実装していきます。

ドライブをマウントするプログラムはこちらです。

#ドライブをマウントする
from google.colab import drive
drive.mount('/content/drive')

補足:
上記のコマンドを実行すると、以下の画面が現れます。手順通りに操作すればOKです。

1.Googleドライブに接続

図1:マウントの手順①
図1:マウントの手順①

2.希望のアカウントを選択

図2:マウントの手順②
図2:マウントの手順②

3.許可を押下

図3:マウントの手順③
図3:マウントの手順③

ドライブのマウントが終わったら、リポジトリのクローンを作成していきます。

#リポジトリのクローンを作成
!git clone https://github.com/ultralytics/yolov5
#実行結果
Cloning into 'yolov5'...
remote: Enumerating objects: 10344, done.
remote: Total 10344 (delta 0), reused 0 (delta 0), pack-reused 10344
Receiving objects: 100% (10344/10344), 10.58 MiB | 9.38 MiB/s, done.
Resolving deltas: 100% (7141/7141), done.
さすを
さすを

これでYOLOv5が使えるようになりました!

その②:ライブラリをインストールする

プログラムを動かすうえでライブラリは必要不可欠なので、一括でインストールします。

カレントディレクトリを移動して、以下のコマンドを入力しましょう。

#カレントディレクトリの移動
%cd yolov5
#pipで一括インストール
!pip install -r requirements.txt

内容は多少変わりますが、以下のようにライブラリが一括でインストールされていればOKです。

#実行結果
Requirement already satisfied: matplotlib>=3.2.2 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 4)) (3.2.2)
Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 5)) (1.19.5)
Requirement already satisfied: opencv-python>=4.1.2 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 6)) (4.1.2.30)
Requirement already satisfied: Pillow>=7.1.2 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 7)) (7.1.2)
Collecting PyYAML>=5.3.1
  Downloading PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)
     |████████████████████████████████| 596 kB 11.7 MB/s 
Requirement already satisfied: requests>=2.23.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 9)) (2.23.0)
Requirement already satisfied: scipy>=1.4.1 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 10)) (1.4.1)
Requirement already satisfied: torch>=1.7.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 11)) (1.10.0+cu111)
Requirement already satisfied: torchvision>=0.8.1 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 12)) (0.11.1+cu111)
Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 13)) (4.62.3)
Requirement already satisfied: tensorboard>=2.4.1 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 16)) (2.7.0)
Requirement already satisfied: pandas>=1.1.4 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 20)) (1.1.5)
Requirement already satisfied: seaborn>=0.11.0 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 21)) (0.11.2)
Collecting thop
  Downloading thop-0.0.31.post2005241907-py3-none-any.whl (8.7 kB)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.2.2->-r requirements.txt (line 4)) (0.11.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.2.2->-r requirements.txt (line 4)) (3.0.6)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.2.2->-r requirements.txt (line 4)) (1.3.2)
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.2.2->-r requirements.txt (line 4)) (2.8.2)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.23.0->-r requirements.txt (line 9)) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.23.0->-r requirements.txt (line 9)) (1.24.3)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.23.0->-r requirements.txt (line 9)) (2.10)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.23.0->-r requirements.txt (line 9)) (2021.10.8)
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch>=1.7.0->-r requirements.txt (line 11)) (3.10.0.2)
Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.0.1)
Requirement already satisfied: absl-py>=0.4 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.12.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.4.6)
Requirement already satisfied: protobuf>=3.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (3.17.3)
Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.6.1)
Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.37.0)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.8.0)
Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (57.4.0)
Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.35.0)
Requirement already satisfied: grpcio>=1.24.3 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.42.0)
Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard>=2.4.1->-r requirements.txt (line 16)) (3.3.6)
Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=1.1.4->-r requirements.txt (line 20)) (2018.9)
Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from absl-py>=0.4->tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.15.0)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard>=2.4.1->-r requirements.txt (line 16)) (4.2.4)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.2.8)
Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth<3,>=1.6.3->tensorboard>=2.4.1->-r requirements.txt (line 16)) (4.8)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.4.1->-r requirements.txt (line 16)) (1.3.0)
Requirement already satisfied: importlib-metadata>=4.4 in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard>=2.4.1->-r requirements.txt (line 16)) (4.8.2)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata>=4.4->markdown>=2.6.8->tensorboard>=2.4.1->-r requirements.txt (line 16)) (3.6.0)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard>=2.4.1->-r requirements.txt (line 16)) (0.4.8)
Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=2.4.1->-r requirements.txt (line 16)) (3.1.1)
Installing collected packages: thop, PyYAML
  Attempting uninstall: PyYAML
    Found existing installation: PyYAML 3.13
    Uninstalling PyYAML-3.13:
      Successfully uninstalled PyYAML-3.13
Successfully installed PyYAML-6.0 thop-0.0.31.post2005241907

その③:物体検出したい画像・動画を格納する

ライブラリの一括インストールが完了したら、 処理を実行するために物体検出したい画像・動画を格納していきます。

格納する場所は「/content/yolov5/data/images/」直下に入れてください。

図4:ファイル格納場所
図4:ファイル格納場所

注意:物体検出できるファイルの拡張子は以下の通りです。それ以外の拡張子のファイルだとエラーになります。

  • 画像:[‘bmp’, ‘jpg’, ‘jpeg’, ‘png’, ‘tif’, ‘tiff’, ‘dng’, ‘webp’, ‘mpo’]
  • 動画:[‘mov’, ‘avi’, ‘mp4’, ‘mpg’, ‘mpeg’, ‘m4v’, ‘wmv’, ‘mkv’]

この記事では、画像については、サンプルにある「zidane.jpg」を使用していきます。動画については、自分で撮った動画「sample.mp4」を格納しておきます。

図5:入力画像(zidane.jpg)
図5:入力画像(zidane.jpg)
図6:入力動画(sample.mp4)
図6:入力動画(sample.mp4)
さすを
さすを

実際には、あなたが物体検出したい画像や動画を入れていただければOKです!

その④:処理を実行する

ライブラリの一括インストールが完了したら、いよいよ処理を実行していきます。

とはいっても、プログラムを1行書くだけです。

#画像の物体検出
!python detect.py --source data/images/bus.jpg --conf 0.5 --weights yolov5s.pt
#動画の物体検出
!python detect.py --source data/images/sample.mp4 --conf 0.4 --weights yolov5l.pt

プログラムオプションの説明:

  • source:画像のフォルダ、または画像のパスを指定。
  • conf:指定した値以下の確率値は表示しない
  • weights:事前学習済みモデルの重みファイルを指定
    (yolov5n、yolov5s、 yolo5m、yolov5l、yolov5x)

実行結果の出力ファイルは「/content/yolov5/run/detect/exp」に出力されます。

図7:実行結果①(zidane.jpg)
図7:実行結果①(zidane.jpg)
図8:実行結果(sample.mp4)
さすを
さすを

「yolov5n、yolov5s、yolo5m、yolov5l、yolov5x」は精度と処理速度が違います!

イッヌ
イッヌ

処理速度を優先するなら「yolov5n」、精度を優先するなら「yolov5x」といった感じだワン!

ModelSizemAP^val
0.5:0.95
mAP^val
0.5
Speed
CPU b1
(ms)
Speed
V100 b1
(ms)
Speed
V100 b32
(ms)
params
(M)
FLOPs
@640
(B)
YOLOv5n64028.446.0456.30.61.94.5
YOLOv5s64037.256.0986.40.97.216.5
YOLOv5m64045.263.92248.21.721.249.0
YOLOv5l64048.867.243010.12.746.5109.1
YOLOv5x64050.768.976612.14.886.7205.7
weight設定の情報(青:〇、赤:△)

最後に:1から作ることはもうやめよう

Google Colaboratoryを使って自動でGoogle画像を収集する方法を解説してきました。

最近の開発では、1から作ることはほとんどなく、いかに「今あるもの」をうまく使えるかがカギになってきます。

趣味の場合は「使えるものを全て」、商用利用する場合は「どこまで使っていいのか」を確認しつつ、時間とコストを抑えて開発していくことが大切です。

というわけで、これからも、便利なものを活用しつつ、作りたいものを作っていきたいと思います。

この記事が、あなたの役に立っていたらうれしいです!

それでは!

参考にした記事:PythonスクレイピングでGoogle画像検索ページから画像を取得


コメント

タイトルとURLをコピーしました