Google Colaboratory環境で、YOLOv4-tinyを使って学習をさせます。

学習用データの構造

 YOLOの学習に必要なデータは次の通りです。

  1. obj.data 学習の設定ファイル、クラス数を定義
  2. classes= 3
    train = result/train.txt
    valid = result/test.txt
    names = result/obj.names
    backup = backup/
    
    • 上記の例ですと分類種別は2種類。
    • 学習用データはフォルダ「data」にある「train.txt」で定義。
    • 学習結果評価用データはフォルダ「data」にある「test.txt」で定義。
    • 分類の名前はフォルダ「data」にある「obj.names」で定義。
    • 学習中、学習後のweightを「backup」フォルダに保存します。
  3. data/train.txt,data/test.txt
  4. 一行ずつ学習用画像、学習結果評価用画像へのpathを示します。trainは学習用、testは学習結果評価用。

    data/obj/img1.jpg
    data/obj/img2.jpg
    data/obj/img3.jpg
    
  5. imgx.jpg,imagx.txt
  6. 「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
    
  7. obj.names
  8. クラスの名称を示すテキストファイル。次の例の場合、クラス0は猫、クラス1は犬。

    cat
    dog
    ・
    ・
    

CFGファイルの変更

  1. CFGファイルのダウンロード
  2.  googleドライブのdarknet-cfgフォルダの中にある「yolov4-tiny_obj.cfg」ファイルをダウンロードします。

  3. 2)yolov4-tiny_obj.cfgの編集
  4.  次の通り変更します。ファイル名を「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
    
    • 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を指定します。

    Out of Memory

    Out of Memoryが出る場合、GPUのメモリ不足となり、設定ファイルの変更が必要となります。設定ファイルで設定した、 subdivisions=16 を「32」や「64」へ変更し実行可能な設定へ変更が必要です。

    32の倍数での画像サイズの縮小でも学習時のメモリサイズを減らすことが出来ます。width=256、height=256 などへwidth, heightを変更。

  5. yolo3-tiny_obj2.cfgをgoogleドライブのdarknet-data1にアップロードします。

学習の実行

クラスを「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/
  1. 次のコマンドで学習を実行します。
  2. %%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」が作られてました。

  3. Google Colaboratoryの時間切れで、次のコマンドで再学習を実行します(途中から)。作成されたweightsファイルをパラメータで与えます。
  4. %%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. 試しに次のコマンドで1枚判定させてみます。
  2. %%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
    

    検出画像を次に示します。