![見出し画像](https://assets.st-note.com/production/uploads/images/133905229/rectangle_large_type_2_5fdbf5c5edf2ac37d5ba2c7fcf790dfa.png?width=1200)
はじめての画像判定 〜無料枠でやってみた〜
トッポとポッキーを見分けるサービスを作ってみたくて、機械学習の基礎知識すらない状態から手探りでやっていく…🖋
備忘録です。
使うもの
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
次に、学習するために必要な情報を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)
参考サイト
この記事が気に入ったらサポートをしてみませんか?