こんにちは、さすを(@sasuwo0409)です。
いきなりですが、
楽して物体検出したい!
映えるようなプログラムを書いてみたい!
と思ってはいませんか?
今回の記事は、YOLOv5を使って物体検出する方法を解説していきます。
この記事を読めば、たったの5分で、映える物体検出ができるようになります。
それでは本文をどうぞ。
できるだけ楽に物体検出プログラムを書いてみたい。
あと、どうやって使えばいいのかもおしえてほしいな、、。
この悩みを解決します!
※0円のサンプルテキストという近道
独学よりプログラミングスクールの方が効果は出やすいですが、値段が高く、なかなか手を出しづらいですよね。techgymでは無料のサンプルテキストと解説動画をもらえるので、これを使ってお得にPythonの基礎を学ぶのもオススメです。
最短1分でできる!
YOLOv5を使って物体検出する方法
YOLOv5とは
YOLOv5とは、ultralyticsが2020年6月に公開した物体検出モデルです。
「You Only Look Once」の略で、処理速度が非常に早く、リアルタイムで物体検出できるのが特徴となっています。
PyTorchというディープラーニングフレームワークを用いており、検出精度と演算負荷に応じて「n、s、m、l、x」の5つのモデルがあります。
YOLOv5を使うためには、以下の条件を満たす必要があります。
そして、YOLOv5を使うと、このようなことができるようになります。
- 顔認識
- 物体検出
- 人体の検知
- モニターでの監視
- 自動運転の物体検出
YOLOv5は、YOLOv3の後継で、より短時間に処理を実行できるようになっているワン!
Pythonを使ったことがなくても、簡単に使うことができます!
YOLOv5を使うための環境構築
今回はGoogle Colaboratory上で環境構築をしていきます。
Google Colaboratoryの使い方については「【3分で解決!】Google Colaboratoryの使い方【無料ですぐにPythonを使えます】」で解説しているので、使い方がわからない方はそちらを参考にしてみてください。
Pythonを使って自動でGoogle画像を収集するための手順は以下の4ステップです。
- リポジトリのクローンを作成する
- ライブラリをインストールする
- 物体検出したい画像・動画を格納する
- 処理を実行する
それでは、始めていきましょう!
その①:リポジトリのクローンを作成する
まず初めに、リポジトリのクローンを作成していきます。
また、今回のプログラムでは、画像・動画を扱うので、ドライブをマウントしてから実装していきます。
ドライブをマウントするプログラムはこちらです。
#ドライブをマウントする
from google.colab import drive
drive.mount('/content/drive')
補足:
上記のコマンドを実行すると、以下の画面が現れます。手順通りに操作すればOKです。
1.Googleドライブに接続
2.希望のアカウントを選択
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/」直下に入れてください。
この記事では、画像については、サンプルにある「zidane.jpg」を使用していきます。動画については、自分で撮った動画「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
実行結果の出力ファイルは「/content/yolov5/run/detect/exp」に出力されます。
「yolov5n、yolov5s、yolo5m、yolov5l、yolov5x」は精度と処理速度が違います!
処理速度を優先するなら「yolov5n」、精度を優先するなら「yolov5x」といった感じだワン!
Model | Size | mAP^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) |
YOLOv5n | 640 | 28.4 | 46.0 | 45 | 6.3 | 0.6 | 1.9 | 4.5 |
YOLOv5s | 640 | 37.2 | 56.0 | 98 | 6.4 | 0.9 | 7.2 | 16.5 |
YOLOv5m | 640 | 45.2 | 63.9 | 224 | 8.2 | 1.7 | 21.2 | 49.0 |
YOLOv5l | 640 | 48.8 | 67.2 | 430 | 10.1 | 2.7 | 46.5 | 109.1 |
YOLOv5x | 640 | 50.7 | 68.9 | 766 | 12.1 | 4.8 | 86.7 | 205.7 |
最後に:1から作ることはもうやめよう
Google Colaboratoryを使って自動でGoogle画像を収集する方法を解説してきました。
最近の開発では、1から作ることはほとんどなく、いかに「今あるもの」をうまく使えるかがカギになってきます。
趣味の場合は「使えるものを全て」、商用利用する場合は「どこまで使っていいのか」を確認しつつ、時間とコストを抑えて開発していくことが大切です。
というわけで、これからも、便利なものを活用しつつ、作りたいものを作っていきたいと思います。
この記事が、あなたの役に立っていたらうれしいです!
それでは!
最短1分でできる!
参考にした記事:PythonスクレイピングでGoogle画像検索ページから画像を取得
コメント