今回の記事はPythonでYOLOv3をオリジナル画像で学習させる方法をご紹介する記事です。初心者にもわかりやすいように画像付きで説明してきますので是非参考にして下さい。
PythonのYOLOv3環境
まずは、Pythonの実行環境を準備します。私は最新のPythonをインストールしました。
Python 3.9.4
私の実行環境はMacですが、Windowsでも動くことを確認しています。
まずは仮想環境を作成します。
#Mac
Python3 -m venv env
source env/source/activate
#Windows
Python -m venv env
cd env/Scripts
activate
cd ../..
次にWindowsの方はバッシュコマンドを使用するためにWindows for gitをインストールし、バッシュを使用できるようにして下さい。
仮想環境に入れれば後はpipで必要なライブラリをインストールします。
!pip install numpy matplotlib terminaltables pillow tqdm torch torchvision torchaudio pytorchyolo
以上でPython環境構築は終了です。また、この環境はAnacondaで行っても問題ないです。私がAnacondaが嫌いなだけです。
では次にgitでライブラリをインストールします。
git clone https://github.com/eriklindernoren/PyTorch-YOLOv3
現在のフォルダ構成は下記のようになっていればOKです。
プロジェクトフォルダ
├── PyTorch-YOLOv3
└── env
これでプロジェクトの環境構築完了です。
YOLOv3の事前学習モデルダウンロード
ここからはwgetコマンドとシェルスクリプトが使える場合はMacの場合と同じように操作を行い、使用できない場合はWindowsの方と同様に操作をして下さい。
PyTorch-YOLOv3/weights/download_weights.sh
PyTorch-YOLOv3フォルダのファイル書き換え
全作業は下記のようになっています。
- custom.dataにクラス数を記載
- classes.namesの名前一覧を作成
- yolov3-custom.cfgのクラス数を作成
- 訓練用データを配置
- labelsフォルダにラベルデータを配置
順番に説明していきます。
custom.dataにクラス数を記載
まずはクラス数や訓練画像のフォルダパスなどを記載しているファイルのcustom.dataを編集します。
classes= 1
train=data/custom/train.txt
valid=data/custom/valid.txt
names=data/custom/classes.names
これを下記のように修正します。
# Macの場合
classes= ○ ←識別するクラス数
train=data\custom\train.txt
valid=data\custom\valid.txt
names=data\custom\classes.names
# Windowsの場合
classes= ○
train=フルパス¥PyTorch-YOLOv3¥data¥custom¥train.txt ←Windows用のパスの書き方に変更
valid=フルパス¥PyTorch-YOLOv3¥data¥custom¥valid.txt
names=フルパス¥PyTorch-YOLOv3¥data¥custom¥classes.names
classes.namesの名前一覧を作成
例)person、bicyle、carに分けるときは下記のように「PyTorch-YOLOv3/data/custom/classes.names」ファイルを書き換える。
train
↓
person
bicycle
car
yolov3-custom.cfgのクラス数を作成
既存の「PyTorch-YOLOv3\config\yolov3-custom.cfg」ファイルを一度削除してから下記を実行します。
PyTorch-YOLOv3/config/create_custom_model.sh ◯←クラス数
訓練用データを配置
訓練用のデータはVottなどを使って、アノテーションデータを配置して下さい。YOLO形式のアノテーションデータはVottでは出力できませんが、簡単な変換方法でPascalVOC形式をYOLO形式に変換できるのでその方法で作成可能です。詳しくは下記記事を参考にデータを変換してみてください。
これで画像などのパスを記載したテキストファイルの「train.txt」「valid.txt」、アノテーションした座法などを記載している「xmlファイル」を変換した「labelファイル」が出力されます。
これらを「PyTorch-YOLOv3/data/custom」に保存していきます。
labelファイル → PyTorch-YOLOv3/data/custom/labelsフォルダ以下
train.txt → PyTorch-YOLOv3/data/custom/train.txtと置き換え
valid.txt → PyTorch-YOLOv3/data/custom/valid.txtと置き換え
画像 → PyTorch-YOLOv3/data/custom/imagesフォルダ以下
これでデータ配置は完了です。
オリジナル画像で学習
学習は下記コマンドで実行可能です。
python PyTorch-YOLOv3/pytorchyolo/train.py \
-m PyTorch-YOLOv3/config/yolov3-custom.cfg \
-d PyTorch-YOLOv3/config/custom.data \
-e 2 \
--pretrained_weights PyTorch-YOLOv3/weights/darknet53.conv.74 \
# -m yolov3-custom.cfgパス
# -d custom.dataのパス
# -e エポック数
# --pretrained_weights 重さ
# その他引数は「-h」で確認可能(PCスペックによって画像サイズ、バッチサイズを調整)
ファイルが見つからないなどのエラーがある場合は全てフルパスに置き換えて試してください。
学習が始まれば「PyTorch-YOLOv3」と同フォルダに「checkpoints」というフォルダが作成され、その中に「yolov3_ckpt_○.pth」(○には数字が入ります。)というファイルが作成され、これが重みとなります。最も数字が大きいものが学習が最も進んだモデルです。
オリジナル画像で学習したモデルで物体検出
学習した重みを使って画像を物体検出してみます。
今回はPyTorch-YOLOv3と同フォルダにtargetというフォルダを作成して、その中に「target/images」と「target/output」というフォルダを作成しました。
プロジェクトフォルダ
|--PyTorch-YOLOv3
|--env
|--output
|--target
| |--images ←物体検出をかける画像
| |--output ←物体検出をおこなった画像が格納されるフォルダ
|--checkpoints
準備ができれば下記コマンドで物体検出をおこなってみます。
python PyTorch-YOLOv3/pytorchyolo/detect.py \
-m PyTorch-YOLOv3/config/yolov3-custom.cfg \
-w checkpoints/yolov3_ckpt_○.pth \
-i target/images \
-c PyTorch-YOLOv3/data/custom/classes.names \
-o target/output \
--conf_thres 0.85
# -m モデル定義パス
# -w 重さパス(学習モデルの場合は一番数字の大きいものを採用)
# -i 物体検出画像パス
# -c 名前一覧パス
# -o 出力パス
# --conf_thres 0.85 精度が85%より上で検出したもののみを出力します。
# その他引数は「-h」で確認可能(PCスペックによって画像サイズ、バッチサイズを調整)
正常に完了すれば「target/output」に物体検出を行い、四角で検出した物体を囲んだ画像が出力されます。
では今回の記事は以上です。YOLO以外にも「Object Detection API」というtensorflowベースの物体検出をおこなったりもしております。興味あれば是非サイト内見て行って下さい。
コメント