Magicode logo
Magicode
1
6 min read

AIの画像認識で自作データを作ってみよう~yolov5学習編~

https://cdn.apollon.ai/media/notebox/81422b36-a459-4c01-8ebb-0a5244a919a1.jpeg
  • 前回までのあらすじ
    • Pythoのインストール
    • yolov5のgit clone
    • 推論の実行
前回の記事はこちら

YOLOv5で学習

1.labelimgの用意

学習のためのアノテーションツールをダウンロード
labelimgを使うことにします
C:\>git clone https://github.com/tzutalin/labelImg.git
labelImgを使用するに必要なライブラリーをインストール
C:\>pip install PyQt5
C:\>pip install lxml
labelImgに移動し、libsフォルダーの中にresources.pyを作成
C:\>cd labelImg
pyrcc5にはPyQt5が必要となります
C:\labelImg>pyrcc5 –o libs/resources.py resources.qrc
アノテーション用の名前編集
場所はdataの中にあります
labelImg
  ├─ data
       └─ predefined_classes.txt
predefined_classes.txt中身

dog
person
cat
tv
car
meatballs
marinara sauce
tomato soup
chicken noodle soup
french onion soup
chicken breast
ribs
pulled pork
hamburger
cavity

中身が上記のようになっているので、アノテーションしたい名前に変更

2.labelimgの使い方

下記の部分をYOLOに変更
VOCYOLO
ファイルを開くから画像を選択したら 右クリックから短形を作成を選択
アノテーションしたい部分(この場合は車)を囲んで
label(predefined_classesの中身)を選んだら、保存をクリック
新規の場合は保存先を選択して、保存完了

便利な設定&ショートカット

  • 大量の画像を処理したい場合 ディレクトリを開くから、アノテーションしたい画像が入ったフォルダーを選択
    ついでに表示(V)から自動保存を選択しておくと、大量の画像をアノテーションする際に使いやすい
    (していないと、毎回保存しますか? と聞かれる)
  • ショートカット一覧
    • dで次に進む
    • aで前に戻る
    • wで短形を作成する
    • Ctrl + dで短形の複製
    • Deleteで短形の削除 これらは非常によく使う
参考サイト
labelimgのインストール方法と使い方
ちなみに、アノテーションのコツの一つとして、テンプレートマッチングを利用して、アノテーションファイルを作成するというものがあります
python
import cv2
def annotation(images = "image_sozai.jpg", templates = "template_sozai.jpg"):
    template = cv2.imread(templates)
    image = cv2.imread(images)
    h, w = image.shape[:2]

    map_cc = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

    _, max_val, _, max_loc = cv2.minMaxLoc(map_cc)


    center = (max_loc[0] + template.shape[1]/2, max_loc[1] + template.shape[0]/2)
    str_pos = "0 {:7f} {:7f} {:7f} {:7f}\n".format(center[0]/w, center[1]/h, template.shape[1]/w, template.shape[0]/h)

    with open(images[:-4] + ".txt","a") as f:
        f.write(str_pos)

if __name__ == "__main__":
    annotation()
アノテーションしたい画像をimages アノテーションしたい部分をtemplatesに入れて、うまく行けば アノテーションされたimage_sozai.txtが生成されます
それをlabelImgで確認すると……
エラーが起きます!
そのため、labelImgを起動してアノテーションを確認する前に、class.txtを作成しておいてください
中身はアノテーションの名前(なければpredefined_classes.txtと同じのでも入れておけばいいかと)
PS.目的に応じて変数str_posの0は任意の値に変更していただくよう、よろしくお願いします
大量にある場合は適当にfor文を駆使して編集してください

3.学習の準備

学習に必要なファイルはこのようになります
yolov5
 ├─ data.yaml
 ├─ train
 │    ├─ images
 │    │     └─ *.jpg
 │    ├─ labels
 │           └─ *.txt
 ├─ valid 
       ├─ images
       │     └─ *.jpg
       ├─ labels
              └─ *.txt
data.yamlの中身

train : train/images # 学習画像パス
val: valid/images # 検証用動画パス
nc: 2 # クラス数
names: ["dummy_1" , "dummy_2"] # クラス名

data(名前は何でもいい).yamlファイルを作成して、パスと学習させたいクラスを記載
train(学習)フォルダーとvalid(検証)フォルダーを用意
8:2の割合で画像とアノテーションしたテキストファイルをimagesフォルダーとlabelsフォルダーに分けて入れてください
C:\yolov5>python train.py --data data.yaml --cfg models/hub/yolov5n6.yaml --weights "" --batch-size 8 --epochs 300
Linuxの場合
python3で記述
  • 各項目
    • --cfg
    • --weights
    • --batch-size
    • --epochs について
--cfg models/hub/yolov5n6.yaml
cfgは使いたいmodelの性能から選んで記載
性能表は下記参照
ちなみにyolov5sはyolov3の演算量が1/3で同等の性能だとか
基本的に我慢できる時間に応じて選べばいいかと
性能順にx>l>m>s>n
かかる時間はこの逆
--epochs 300
default(未入力)でも300に設定されてます
選ぶcfg次第では300もいかずに途中で終わります
--batch-size 8
defaultでは16
class数に応じて選べばいいとかどうとか――基本適当に書いてます
学習が進むと新たにtrainファイルができます
yolov5
  ├── runs
           ├── train
                    ├── exp
                           ├── weights
                                  ├── best.pt
                                  └── last.pt
best.pt #一番結果の良かった重みファイル
last.pt #一番最後の重みファイル
ちなみに、途中で中断した場合
--weightsの場所にlast.ptを入れてやればおk
これで、途中から始められます

そして……最後に

運用するにあたってyolov5のdetect.pyを使いやすく編集しよう!
って内容を考えていましたが、あまりにも記事が長くなりすぎるので後回しです
新たに書きますので、そのときはぜひ覗いてください
とりあえず、これで学習ができれば、前回の記事と合わせて推論が出来るかと思いますのでAIを試して見てはいかがでしょうか
ではでは~
参考サイト
labelimgのインストール方法と使い方
https://laid-back-scientist.com/labelimg
YOLOv5を使った物体検出
https://www.alpha.co.jp/blog/202108_02

Discussion

コメントにはログインが必要です。