Google Colaboratory環境で、YOLOv4-tinyを使って学習をさせます。
学習用データの構造
YOLOの学習に必要なデータは次の通りです。
- obj.data 学習の設定ファイル、クラス数を定義
- 上記の例ですと分類種別は2種類。
- 学習用データはフォルダ「data」にある「train.txt」で定義。
- 学習結果評価用データはフォルダ「data」にある「test.txt」で定義。
- 分類の名前はフォルダ「data」にある「obj.names」で定義。
- 学習中、学習後のweightを「backup」フォルダに保存します。
- data/train.txt,data/test.txt
- imgx.jpg,imagx.txt
- obj.names
例
classes= 3 train = result/train.txt valid = result/test.txt names = result/obj.names backup = backup/
一行ずつ学習用画像、学習結果評価用画像へのpathを示します。trainは学習用、testは学習結果評価用。
例
data/obj/img1.jpg data/obj/img2.jpg data/obj/img3.jpg
「imgx.jpg」はjpeg画像で、上記「train.txt」、「test.txt」で指定されるもの。’imagx’の部分はそれぞれ任意の名前で良い。「imagx.txt」は画像中の対象物のclass、boundingbox情報でjpeg画像と同じファイル名として同じディレクトリに置く。画像中には複数の対象が写っていてもOKです。
「imgx.txt」には一行にひとつの対象の情報を入力します。それぞれの値は画像全体を1.0としてスケーリングしています。
原点は左上
<object-class><x_center><y_center><width> <height>
例 1画像にクラス1が2つ、クラス0が1つ写っている場合
1 0.716797 0.395833 0.216406 0.147222 0 0.687109 0.379167 0.255469 0.158333 1 0.420312 0.395833 0.140625 0.166667
クラスの名称を示すテキストファイル。次の例の場合、クラス0は猫、クラス1は犬。
例
cat dog ・ ・
CFGファイルの変更
- CFGファイルのダウンロード
- 2)yolov4-tiny_obj.cfgの編集
- Batch数を変更します。batch=64
- Subdivisionsを変更します。subdivisions=8
- 学習するクラス数に合わせて、最大バッチ回数を指定します。学習するクラス数×2000となります。 3クラスでの学習の際には、max_batches=6000 とします。
- Stepsを最大バッチ回数の80%と90%になるように修正します。 最大バッチ回数が6000の場合は、steps=4800,5400とします。
- 2つある[yolo]レイヤーのClassesを、今回学習させる3に変更します。
- [yolo]レイヤー直前の[convolutional]レイヤーのfiltersを変更します。filtersの値は、(classes + 5)×3とします。
3クラスの場合は、(3+5)×3=24を指定します。 - yolo3-tiny_obj2.cfgをgoogleドライブのdarknet-data1にアップロードします。
googleドライブのdarknet-cfgフォルダの中にある「yolov4-tiny_obj.cfg」ファイルをダウンロードします。
次の通り変更します。ファイル名を「yolo4-tiny_my.cfg」としました。
①[yolo]の項2箇所
今回はクラス数を3としたので、classesを変更する他、クラス数nとして層数は3x(n+5)になるので、直前のconvolutionalの出力層filtersを3x(3+5)=24に変更します。なお3はmaskの数です。
[convolutional] size=1 stride=1 pad=1 #filters=255 filters=24 activation=linear [yolo] mask = 3,4,5 anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 #classes=80 classes=3 num=6 jitter=.3 ignore_thresh = .7 truth_thresh = 1 random=1 ・ ・ [convolutional] size=1 stride=1 pad=1 #filters=255 filters=24 activation=linear [yolo] mask = 0,1,2 anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 #classes=80 classes=3 num=6 jitter=.3 ignore_thresh = .7 truth_thresh = 1 random=1
②batch、subdivisions
batchは1回の重み更新に使う学習データの数。batch数をまとめて学習した後に重みを更新します。
subdivisionsはbatchをさらにいくつに分割するかを示します。メモリエラーが出たのでbatchを小さくして、subdivisionsを大きくしました。
[net] # Testing #batch=1 #subdivisions=1 # Training #batch=64 batch=32 #subdivisions=2 subdivisions=8
Out of Memory
Out of Memoryが出る場合、GPUのメモリ不足となり、設定ファイルの変更が必要となります。設定ファイルで設定した、 subdivisions=16 を「32」や「64」へ変更し実行可能な設定へ変更が必要です。
32の倍数での画像サイズの縮小でも学習時のメモリサイズを減らすことが出来ます。width=256、height=256 などへwidth, heightを変更。
学習の実行
クラスを「1」としてCFGファイルを作成して学習をしてみます。学習データは「動画を使ったYOLO用の学習データの作成」で作成したプログラムを実行して作成しました。
フォルダ構成を次に示します。
>tree /f result フォルダー パスの一覧 ボリューム シリアル番号は 000000E7 0AB1:FB08 です F:\DOCUMENT\PYCHARMPROJECTS\VOCFORMAT\RESULT │ classes.txt │ obj.data │ test.txt │ train.txt │ yolov4-tiny-my.cfg │ ├─annotation │ video_0000.xml │ video_0001.xml │ video_0002.xml │ video_0003.xml │ video_0004.xml │ ・・・l │ video_0094.xml │ video_0095.xml │ video_0096.xml │ video_0097.xml │ video_0098.xml │ video_0099.xml │ ├─image │ video_0000.jpg │ video_0000.txt │ video_0001.jpg │ video_0001.txt │ video_0002.jpg │ video_0002.txt │ video_0003.jpg │ video_0003.txt │ video_0004.jpg │ video_0004.txt │ ・・・・・ │ │ video_0096.jpg │ video_0096.txt │ video_0097.jpg │ video_0097.txt │ video_0098.jpg │ video_0098.txt │ video_0099.jpg │ video_0099.txt │ └─train train.txt
obj.data
classes= 1 train = result/train.txt valid = result/test.txt names = result/classes.txt backup = backup/
- 次のコマンドで学習を実行します。
- Google Colaboratoryの時間切れで、次のコマンドで再学習を実行します(途中から)。作成されたweightsファイルをパラメータで与えます。
%%bash cd /content/drive/My\ Drive/YOLO/darknet ./darknet detector train result/obj.data result/yolov4-tiny-my.cfg
次のように結果が表示されました。
yolov4-tiny-my net.optimized_memory = 0 mini_batch = 8, batch = 64, time_steps = 1, train = 1 Create CUDA-stream - 0 Create cudnn-handle 0 nms_kind: greedynms (1), beta = 0.600000 nms_kind: greedynms (1), beta = 0.600000 Learning Rate: 0.00261, Momentum: 0.9, Decay: 0.0005 Detection layer: 30 - type = 28 Detection layer: 37 - type = 28 Loaded: 9.192887 seconds 1: 297.283234, 297.283234 avg loss, 0.000000 rate, 3.203550 seconds, 64 images, -1.000000 hours left Loaded: 3.497591 seconds - performance bottleneck on CPU or Disk HDD/SSD 2: 297.145569, 297.269470 avg loss, 0.000000 rate, 4.184250 seconds, 128 images, 6.920324 hours left Loaded: 2.329539 seconds - performance bottleneck on CPU or Disk HDD/SSD 3: 297.529205, 297.295441 avg loss, 0.000000 rate, 3.568059 seconds, 192 images, 6.893755 hours left Loaded: 2.904125 seconds - performance bottleneck on CPU or Disk HDD/SSD 4: 297.033478, 297.269257 avg loss, 0.000000 rate, 3.836481 seconds, 256 images, 6.857973 hours left Loaded: 2.603577 seconds - performance bottleneck on CPU or Disk HDD/SSD 5: 297.338196, 297.276154 avg loss, 0.000000 rate, 4.010636 seconds, 320 images, 6.826766 hours left Loaded: 2.365756 seconds - performance bottleneck on CPU or Disk HDD/SSD 6: 296.832520, 297.231781 avg loss, 0.000000 rate, 4.187423 seconds, 384 images, 6.795152 hours left Loaded: 1.898525 seconds - performance bottleneck on CPU or Disk HDD/SSD 7: 296.825623, 297.191162 avg loss, 0.000000 rate, 3.702998 seconds, 448 images, 6.763498 hours left Loaded: 2.406489 seconds - performance bottleneck on CPU or Disk HDD/SSD ・・・ 1990: 0.018042, 0.012795 avg loss, 0.000026 rate, 3.985619 seconds, 127360 images, 0.180462 hours left Loaded: 1.958378 seconds - performance bottleneck on CPU or Disk HDD/SSD 1991: 0.013597, 0.012875 avg loss, 0.000026 rate, 3.788878 seconds, 127424 images, 0.178821 hours left Loaded: 1.711885 seconds - performance bottleneck on CPU or Disk HDD/SSD 1992: 0.003557, 0.011943 avg loss, 0.000026 rate, 4.083362 seconds, 127488 images, 0.177177 hours left Loaded: 1.730051 seconds - performance bottleneck on CPU or Disk HDD/SSD 1993: 0.014088, 0.012158 avg loss, 0.000026 rate, 3.687835 seconds, 127552 images, 0.175534 hours left Loaded: 2.336628 seconds - performance bottleneck on CPU or Disk HDD/SSD 1994: 0.021443, 0.013086 avg loss, 0.000026 rate, 3.822275 seconds, 127616 images, 0.173884 hours left Loaded: 2.348815 seconds - performance bottleneck on CPU or Disk HDD/SSD 1995: 0.024312, 0.014209 avg loss, 0.000026 rate, 3.765541 seconds, 127680 images, 0.172248 hours left Loaded: 2.306531 seconds - performance bottleneck on CPU or Disk HDD/SSD 1996: 0.015411, 0.014329 avg loss, 0.000026 rate, 3.825183 seconds, 127744 images, 0.170610 hours left Loaded: 2.105787 seconds - performance bottleneck on CPU or Disk HDD/SSD 1997: 0.015185, 0.014414 avg loss, 0.000026 rate, 4.161763 seconds, 127808 images, 0.168972 hours left Loaded: 1.866899 seconds - performance bottleneck on CPU or Disk HDD/SSD 1998: 0.021202, 0.015093 avg loss, 0.000026 rate, 3.928898 seconds, 127872 images, 0.167335 hours left Loaded: 2.088360 seconds - performance bottleneck on CPU or Disk HDD/SSD 1999: 0.004125, 0.013996 avg loss, 0.000026 rate, 3.693082 seconds, 127936 images, 0.165694 hours left Loaded: 2.253876 seconds - performance bottleneck on CPU or Disk HDD/SSD 2000: 0.014520, 0.014049 avg loss, 0.000026 rate, 3.643529 seconds, 128000 images, 0.164053 hours left If you want to train from the beginning, then use flag in the end of training command: -clear IOPub data rate exceeded. The notebook server will temporarily stop sending output to the client in order to avoid crashing it. To change this limit, set the config variable `--NotebookApp.iopub_data_rate_limit`. Current values: NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec) NotebookApp.rate_limit_window=3.0 (secs)
「darknet/backup」フォルダに、「yolov4-tiny-my_1000.weights」「yolov4-tiny-my_2000.weights」「yolov4-tiny-my__final.weights」「yolov4-tiny-my_last.weights」が作られてました。
%%bash cd /content/drive/My\ Drive/YOLO/darknet ./darknet detector train result/obj.data result/yolov4-tiny-my.cfg backup/yolov4-tiny-my_last.weights
物体検出の実行
- 試しに次のコマンドで1枚判定させてみます。
%%bash cd /content/drive/My\ Drive/YOLO/darknet ./darknet detector test result/obj.data result/yolov4-tiny-my.cfg backup/yolov4-tiny-my_final.weights -ext_output data/WINx_20220210.jpg 最後に出来上がったweights(=yolov4-tiny-my_final.weights)
検出結果を次に示します。
net.optimized_memory = 0 mini_batch = 1, batch = 8, time_steps = 1, train = 0 Create CUDA-stream - 0 Create cudnn-handle 0 nms_kind: greedynms (1), beta = 0.600000 nms_kind: greedynms (1), beta = 0.600000 seen 64, trained: 128 K-images (2 Kilo-batches_64) Error: in the file result/classes.txt number of names 2 that isn't equal to classes=1 in the file result/yolov4-tiny-my.cfg Detection layer: 30 - type = 28 Detection layer: 37 - type = 28 data/WINx_20220210.jpg: Predicted in 15.759000 milli-seconds. m1: 100% (left_x: 235 top_y: 243 width: 432 height: 422) CUDA-version: 11010 (11020), cuDNN: 7.6.5, GPU count: 1 OpenCV isn't used - data augmentation will be slow 0 : compute_capability = 370, cudnn_half = 0, GPU: Tesla K80 layer filters size/strd(dil) input output 0 conv 32 3 x 3/ 2 416 x 416 x 3 -> 208 x 208 x 32 0.075 BF 1 conv 64 3 x 3/ 2 208 x 208 x 32 -> 104 x 104 x 64 0.399 BF 2 conv 64 3 x 3/ 1 104 x 104 x 64 -> 104 x 104 x 64 0.797 BF 3 route 2 1/2 -> 104 x 104 x 32 4 conv 32 3 x 3/ 1 104 x 104 x 32 -> 104 x 104 x 32 0.199 BF 5 conv 32 3 x 3/ 1 104 x 104 x 32 -> 104 x 104 x 32 0.199 BF 6 route 5 4 -> 104 x 104 x 64 7 conv 64 1 x 1/ 1 104 x 104 x 64 -> 104 x 104 x 64 0.089 BF 8 route 2 7 -> 104 x 104 x 128 9 max 2x 2/ 2 104 x 104 x 128 -> 52 x 52 x 128 0.001 BF 10 conv 128 3 x 3/ 1 52 x 52 x 128 -> 52 x 52 x 128 0.797 BF 11 route 10 1/2 -> 52 x 52 x 64 12 conv 64 3 x 3/ 1 52 x 52 x 64 -> 52 x 52 x 64 0.199 BF 13 conv 64 3 x 3/ 1 52 x 52 x 64 -> 52 x 52 x 64 0.199 BF 14 route 13 12 -> 52 x 52 x 128 15 conv 128 1 x 1/ 1 52 x 52 x 128 -> 52 x 52 x 128 0.089 BF 16 route 10 15 -> 52 x 52 x 256 17 max 2x 2/ 2 52 x 52 x 256 -> 26 x 26 x 256 0.001 BF 18 conv 256 3 x 3/ 1 26 x 26 x 256 -> 26 x 26 x 256 0.797 BF 19 route 18 1/2 -> 26 x 26 x 128 20 conv 128 3 x 3/ 1 26 x 26 x 128 -> 26 x 26 x 128 0.199 BF 21 conv 128 3 x 3/ 1 26 x 26 x 128 -> 26 x 26 x 128 0.199 BF 22 route 21 20 -> 26 x 26 x 256 23 conv 256 1 x 1/ 1 26 x 26 x 256 -> 26 x 26 x 256 0.089 BF 24 route 18 23 -> 26 x 26 x 512 25 max 2x 2/ 2 26 x 26 x 512 -> 13 x 13 x 512 0.000 BF 26 conv 512 3 x 3/ 1 13 x 13 x 512 -> 13 x 13 x 512 0.797 BF 27 conv 256 1 x 1/ 1 13 x 13 x 512 -> 13 x 13 x 256 0.044 BF 28 conv 512 3 x 3/ 1 13 x 13 x 256 -> 13 x 13 x 512 0.399 BF 29 conv 18 1 x 1/ 1 13 x 13 x 512 -> 13 x 13 x 18 0.003 BF 30 yolo [yolo] params: iou loss: ciou (4), iou_norm: 0.07, obj_norm: 1.00, cls_norm: 1.00, delta_norm: 1.00, scale_x_y: 1.05 31 route 27 -> 13 x 13 x 256 32 conv 128 1 x 1/ 1 13 x 13 x 256 -> 13 x 13 x 128 0.011 BF 33 upsample 2x 13 x 13 x 128 -> 26 x 26 x 128 34 route 33 23 -> 26 x 26 x 384 35 conv 256 3 x 3/ 1 26 x 26 x 384 -> 26 x 26 x 256 1.196 BF 36 conv 18 1 x 1/ 1 26 x 26 x 256 -> 26 x 26 x 18 0.006 BF 37 yolo [yolo] params: iou loss: ciou (4), iou_norm: 0.07, obj_norm: 1.00, cls_norm: 1.00, delta_norm: 1.00, scale_x_y: 1.05 Total BFLOPS 6.787 avg_outputs = 299663 Allocate additional workspace_size = 12.46 MB Loading weights from backup/yolov4-tiny-my_final.weights...Done! Loaded 38 layers from weights-file Not compiled with OpenCV, saving to predictions.png instead
検出画像を次に示します。