見出し画像

はじめての画像判定 〜無料枠でやってみた〜

トッポとポッキーを見分けるサービスを作ってみたくて、機械学習の基礎知識すらない状態から手探りでやっていく…🖋
備忘録です。


使うもの

  • YOLOv7(学習モデルというらしい)

  • Google colab(オンラインでGPU使えるのでここでコーディング)

  • Label Studio(データセットを作るために必要)

機械学習の準備

YOLOの環境構築

Google colabを用いて実施する。

Google colabのプロジェクトを新規で作成し、「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
CPUでもできなくはないけど、学習に時間がかなりかかるのでGPUを用いる。使いすぎると課金しないとダメになるけど、基本は無料で使える。

新規のプロジェクトができたら、まずは自分のGoogle Driveにマウントしてアクセスできるようにする。

# 自分のドライブにマウントする
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive

公式のgithubから、YOLOv7をcloneしてくる。

!git clone https://github.com/WongKinYiu/yolov7

次に必要なライブラリをインポートする。

!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7x.pt

ここまでやると、YOLOv7を使えるようになる。

教師データとは

機械学習やディープラーニングにおいて、モデルの訓練を行う際に使用されるデータセットのうち、入力データとそれに対応する正解ラベル(またはターゲット)が含まれる部分のこと。
元々ある教師データを流用することもできるらしい。
せっかくなので自分で画像を集めて、それにラベリングし、教師データを作成していく。

教師データ作成のために画像データを集める

icrawlerというPythonのライブラリを用いて、ウェブ上から指定した画像を集めることができる。

まずはインストールする。

!pip install icrawler

インストールが完了したら、以下のコマンドで収集する。

from icrawler.builtin import BingImageCrawler
crawler = BingImageCrawler(storage={"root_dir": "pocky"})
crawler.crawl(keyword="ポッキー", max_num=10)

root_dir:収集した画像の格納先
keyword:この単語に関連する画像を検索して収集する
max_num:収集する画像の枚数

画像データにアノテーションをする

収集した画像を、物体検知ができるようにアノテーションしていく。
アノテーションとは、機械学習やコンピュータビジョンの分野において、データセット内の個々のデータ(画像、ビデオ、テキストなど)に対するラベルや情報を付与すること。
今回はLabel Studioを利用して付与していく。

Label Studioの環境構築と、アノテーション実施

Label Studioは、無料の範囲内でもアノテーションできるサービス。

ターミナルで、以下コマンドを叩く。

# Install the cask
brew install humansignal/tap/label-studio

インストールが完了したら、以下コマンドでブラウザで利用できるようになる。

# Launch it!
label-studio

最初はアカウント登録が必要だが、感覚的に利用できる。
以下の記事を参照した。

アノテーションが完了したら、ExportでYOLO形式を選択し、ダウンロードする。
zipファイルを解凍すると、以下のような構造でデータが作成されるので、imagesとlabelsをこの後利用する。

project_name/
├─ classes.txt
├─ images/
│   ├─ XXX.jpg
│   └─ ...
├─ labels/
│   ├─ XXX.txt
│   └─ ...
└─ notes.json

学習データを用いて学習させる

教師データをGoogle colabに格納する

マウントしたドライブの中の、yolov7 > data 配下にディレクトリを作成する。
エクスポートした教師データを学習用と評価用に使うため、半分に分け、以下のようにデータを配置する。

yolov7
┗ data
 ┗ train_test(好きにしていい)
  ┠ train
  ┃ ┠ images
  ┃ ┗ labels
  ┗ valid
   ┠ images
   ┗ labels

s

次に、学習するために必要な情報をyamlファイルに記載して、格納する。(今回はtrain_test.yamlと命名した)
これは、yolov7の直下に格納する。

train: data/train_test/train/images # 学習の画像のパス
val: data/train_test/valid/images # 検証用画像のパス

nc: 2 # クラスの数
names: [ 'toppo', 'pocky' ] # クラス名

yolov7
┗ data
┃┗ train_test(好きにしていい)
┃ ┠ train
┃ ┃ ┠ images
┃ ┃ ┗ labels
┃ ┗ valid
┃  ┠ images
┃  ┗ labels
┗ train_test.yaml

学習させる

以下のコマンドで学習を開始する。(自分が yolov7 ディレクトリに移動していることを確認してから実施。)
これは、GPUを用いている。

!python train.py --workers 8 --batch-size 16 --data ○○.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x --hyp data/hyp.scratch.p5.yaml --epochs 300 --device 0 

batch-sizeを小さくしすぎると学習が途中で止まってしまいますので、注意。
Google colabで学習する場合にはinput sizeを640、batch-sizeを16とすれば問題なく学習ができる。

※使いすぎると制限がかかって、GPU使うのに課金が必要になるので、CPUでもできるコマンドはこちら。日付が変わると利用制限がリセットされてまた使えるようになる。epochsが学習回数っぽいんだけど、CPUだとすごく遅いから、30くらいにしても1時間とか結構時間かかる…デフォルトの300でやると多分一生終わらない。。

!python train.py --workers 8 --batch-size 16 --data train_test.yaml --cfg cfg/training/yolov7x.yaml --weights 'yolov7x.pt' --name yolov7x --hyp data/hyp.scratch.p5.yaml --epochs 30 --device cpu

学習が完了すると、yolov7 > runs > train > yolo7x > weightsの中に学習結果(best.pt)が格納される。
※途中でセッションが切れてしまったら、先ほどの学習のコマンドの最後に引数 --resumeをつけると再開できる。

推論させる

推論に利用したい画像を、yolo7x 直下に格納する。
以下コマンドで推論を開始する。

!python detect.py --weights runs/train/yolov7x/weights/best.pt --conf 0.25 --img-size 640 --source (画像の名前)

推論が完了すると、yolov7 > runs > detect > expの中に推論結果が格納される。

Google colab上で結果を表示させる

画像表示に必要なモジュールをインポートする

from PIL import Image
from IPython.display import display

推論の後、そのまま表示まで入れると結果の画像がコードの下に表示される

!python detect.py --weights runs/train/yolov7x/weights/best.pt --conf 0.25 --img-size 640 --source (画像の名前)
# 推論結果のパスを指定する
img = Image.open("/content/drive/MyDrive/yolov7/runs/detect/exp/TP_test.jpeg")
# 表示
display(img)

参考サイト

この記事が気に入ったらサポートをしてみませんか?