私的AI研究会 > RevYOLOv5_3

『ナンバープレート判別』「YOLO V5」3 == 編集中 ==

20110805_111736_001m.jpg

 物体検出の応用として車のナンバープレート識別を検討してみる

▲ 目 次
※ 最終更新:2024/05/23

Step 1: ナンバープレートの領域を判別

データセットの準備

vehicle_detection_m.jpg
  1. Vehicle Detection Computer Vision Project のページを開く
    ・「Download」ボタンを押す
    ・ダウンロードファイル「Vehicle Detection.v7i.yolov5pytorch.zip」を解凍する
    ・フォルダ名を変更「Vehicle Detection.v7i.yolov5pytorch」→「vd_dataset」

  2. 「vd_dataset/」フォルダ内の「data.yaml」をコピーしてファイル「vd_data.yaml」を作成
    ・データセットの配置場所は「yolov5/data/」フォルダとする
    train: data/vd_dataset/train/images
    val: data/vd_dataset/valid/images
    test: data/vd_dataset/test/images
    
    nc: 2
    names: ['licence', 'licenseplate']
    
    roboflow:
      workspace: image-processing-u647q
      project: vehicle-detection-639on
      version: 7
      license: CC BY 4.0
      url: https://universe.roboflow.com/image-processing-u647q/vehicle-detection-639on/dataset/7
  3. 「vd_dataset/」フォルダを「yolov5/data/」内にコピー(移動)する

学習の実行

  1. エポック数 100 で実行する
    ・実行ディレクトリは「workspace_pylearn/yolov5/」
    ・学習モデルはデフォールト設定「yolov7s」を使用する
    ・学習結果フォルダ名は「vd_yolov5s_ep100」とする
    (py_learn) python train.py --epochs 100 --data data/vd_dataset/vd_data.yaml --weights yolov5s.pt --name vd_yolov5s_ep100
    ・GPU を使用しない場合は以下のコマンドを実行する
    (py_learn) python train.py --epochs 100 --data data/vd_dataset/vd_data.yaml --weights yolov5s.pt --name vd_yolov5s_ep100 --device cpu
  2. 学習の終了
    (py_learn) python train.py --epochs 100 --data data/vd_dataset/vd_data.yaml --weights yolov5s.pt --name vd_yolov5s_ep100
            :
    
          Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
          99/99      4.17G    0.01894   0.006213   0.000583         12        640: 100%|██████████| 34/34 [00:02<00:00, 12.
                     Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 5/5 [00:00<0
                       all        136        155      0.544        0.5      0.468      0.242
    
    100 epochs completed in 0.107 hours.
    Optimizer stripped from runs\train\vd_yolov5s_ep100\weights\last.pt, 14.4MB
    Optimizer stripped from runs\train\vd_yolov5s_ep100\weights\best.pt, 14.4MB
    
    Validating runs\train\vd_yolov5s_ep100\weights\best.pt...
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
                     Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 5/5 [00:01<0
                       all        136        155      0.476       0.53      0.472       0.26
                   licence        136        132      0.681      0.712      0.635      0.333
              licenseplate        136         23       0.27      0.348       0.31      0.187
    Results saved to runs\train\vd_yolov5s_ep100
    ▼「train.py」実行ログ詳細

  3. メッセージ「Results saved to runs\train\vd_yolov5s_ep30」のファイルを確認
    ・学習結果モデルは「runs/train/vd_yolov5s_ep100/weights」評価指標は「runs/train/vd_yolov5s_ep100/」
    F1 curveP curvePR curveR curve

実行結果を使って推論

  1. ラベルファイルを作成する
    ・「vd_names_jp」日本語ファイル
    ナンバー
    ナンバープレート
    ・「vd_names」英語ファイル
    licence
    licenseplate
  2. 「detect2.py」で推論実行(静止画をフォルダごとまとめて)
    ・学習結果モデルを指定する
    (py_learn) python detect2.py --weights runs/train/vd_yolov5s_ep100/weights/best.pt --source ../number/test_data/
    ・実行ログ(結果は「runs/detect/exp*」*は順次更新)
    (py_learn) python detect2.py --weights runs/train/vd_yolov5s_ep100/weights/best.pt --source ../number/test_data/
    detect2: weights=['runs/train/vd_yolov5s_ep100/weights/best.pt'], source=../number/test_data/, data=data\coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_csv=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1
    YOLOv5  v7.0-294-gdb125a20 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
    Speed: 0.2ms pre-process, 5.4ms inference, 1.2ms NMS per image at shape (1, 3, 640, 640)
    Results saved to runs\detect\exp43
  3. 「detect3_yolov5.py」で推論実行(静止画)
    ・学習結果モデルを指定する
    (py_learn) python detect3_yolov5.py -m runs/train/vd_yolov5s_ep100/weights/best.pt -i ../number/test_data/japan69.jpg -l ./data/vd_dataset/vd_names_jp
    ・実行ログ
    (py_learn) python detect3_yolov5.py -m runs/train/vd_yolov5s_ep100/weights/best.pt -i ../number/test_data/japan69.jpg -l ./data/vd_dataset/vd_names_jp
     Starting..
    
    Object detection+ YoloV5 Ver. 0.08: Starting application...
       OpenCV virsion : 4.9.0
    
       - Image File   :  ../number/test_data/japan69.jpg
       - YOLO v5      :  ultralytics/yolov5
       - Pretrained   :  runs/train/vd_yolov5s_ep100/weights/best.pt
       - Confidence lv:  0.25
       - Label file   :  ./data/vd_dataset/vd_names_jp
       - Program Title:  y
       - Speed flag   :  y
       - Processed out:  non
       - Use device   :  cuda:0
       - Log Level    :  3
    
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
    Adding AutoShape...
    
    FPS average:       8.90
    
     Finished.
     

Step 2: ナンバープレートの情報を識別

データセットの準備

学習の実行

  1. エポック数 30/50/100 で実行する
    ・実行ディレクトリは「workspace_pylearn/yolov5/」
    ・学習モデルはデフォールト設定「yolov7s」を使用する
    ・学習結果フォルダ名は「nm_yolov5s_ep50」とする
    (py_learn) python train.py --data data/nm_dataset/nm_dataset.yaml --weights yolov5s.pt --epochs 30 --name nm_yolov5s_ep50
    (py_learn) python train.py --data data/nm_dataset/nm_dataset.yaml --weights yolov5s.pt --epochs 50 --name nm_yolov5s_ep50
    (py_learn) python train.py --data data/nm_dataset/nm_dataset.yaml --weights yolov5s.pt --epochs 100 --name nm_yolov5s_ep50

  2. 学習回数の違いによる結果を比較する
    学習回数3050100
    バッチ数16
    学習モデルyolov5s.pt
    データセットnm_dataset
    学習結果nm_yolov5s_ep30nm_yolov5s_ep50nm_yolov5s_ep100
    F1 curve
    P curve
    PR curve
    R curve
    混同行列
    Confusion Matrix
    評価指標
    学習時間23分20秒38分31秒1時間16分19秒

実行結果を使って推論

  1. 「detect3_yolov5.py」で推論実行
    ・学習結果モデルを指定(ログレベルを'0'として識別経過を表示)
    (py_learn) python detect3_yolov5.py -m ./runs/train/vd_yolov5s_ep100/weights/best.pt -ms ./runs/train/nm_yolov5s_ep50/weights/best.pt -l ./data/nm_dataset/vd_names_jp -i ../number/test_data/japan79.jpg --log 0
    ・実行ログ
    (py_learn) python detect3_yolov5.py -m ./runs/train/vd_yolov5s_ep100/weights/best.pt -ms ./runs/train/nm_yolov5s_ep50/weights/best.pt -l ./data/nm_dataset/vd_names_jp -i ../number/test_data/japan79.jpg --log 0
     Starting..
    
    Object detection+ YoloV5 Ver. 0.08: Starting application...
       OpenCV virsion : 4.9.0
    
       - Image File   :  ../number/test_data/japan79.jpg
       - YOLO v5      :  ultralytics/yolov5
       - Pretrained   :  ./runs/train/vd_yolov5s_ep100/weights/best.pt
       - Pretrained 2 :  ./runs/train/nm_yolov5s_ep50/weights/best.pt
       - Confidence lv:  0.25
       - Label file   :  ./data/nm_dataset/vd_names_jp
       - Program Title:  y
       - Speed flag   :  y
       - Processed out:  non
       - Use device   :  cuda:0
       - Log Level    :  0
    
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
    Adding AutoShape...
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7182733 parameters, 0 gradients, 16.3 GFLOPs
    Adding AutoShape...
    
    ** Bounding Box:
    [[     117.31      68.326       463.6      223.57     0.85471           0]
     [     185.14         145      247.09      238.57     0.98435          11]
     [     237.82      146.53      309.99      238.75     0.97927           6]
     [     334.89      149.99      398.25      241.71     0.97658           7]
     [     395.26       148.3      456.66      245.42     0.96122           6]
     [     311.43      83.831       349.9      137.64     0.90122           9]
     [      351.6      84.356         392      136.87     0.86674          11]
     [     350.22      85.405      391.93      136.08     0.47585           7]]
    
    (117, 68)-(463, 223)    ナンバー: 0.85
    (185, 144)-(247, 238)   9: 0.98
    (237, 146)-(309, 238)   4: 0.98
    (334, 149)-(398, 241)   5: 0.98
    (395, 148)-(456, 245)   4: 0.96
    (311, 83)-(349, 137)    7: 0.90
    (351, 84)-(392, 136)    9: 0.87
    (350, 85)-(391, 136)    5: 0.48
    
    FPS average:       6.90
    
     Finished.

  2. 「detect3_number.py」で推論実行
    ・学習結果モデルを指定(ログレベルを'0'として識別経過を表示)
    (py_learn) python detect3_number.py --log 0
    ・実行ログ
    (py_learn) python detect3_number.py --log 0
     Starting..
    
    Number plate detection YOLOv5 Ver. 0.08: Starting application...
       OpenCV virsion : 4.9.0
    
       - Image File   :  ../number/test_data/japan78.jpg
       - YOLO v5      :  ultralytics/yolov5
       - Pretrained   :  ./runs/train/vd_yolov5s_ep100/weights/best.pt
       - Pretrained 2 :  ./runs/train/nm_yolov5s_ep50/weights/best.pt
       - Confidence lv:  0.25
       - Label file   :  ./data/nm_dataset/vd_names_jp
       - Program Title:  y
       - Speed flag   :  y
       - Processed out:  non
       - Use device   :  cuda:0
       - Log Level    :  0
    
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
    Adding AutoShape...
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7182733 parameters, 0 gradients, 16.3 GFLOPs
    Adding AutoShape...
    
    ** プレートラベル:
    ['ナンバー', 'ナンバープレート', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'あ', 'い', 'う', 'え', 'か', 'き', 'く', 'け', 'こ', 'さ', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', '京都', 'なにわ', '大阪', '和泉', '堺', '奈良', '和歌山', '神戸', '徳島', '香川', '愛媛', '千葉']
    
    ** Bounding Box:
    [[     61.591      38.322      510.12      262.66      0.4888           0]
     [     352.12      59.349      392.61      129.97     0.98521           2]
     [     315.72      59.296      354.99      131.48     0.98443           3]
     [     391.33      60.289       431.3      129.43     0.98215           2]
     [      344.3      148.63      433.98      289.92      0.9785           7]
     [     426.44      146.62      513.85      303.11     0.96134          10]
     [     84.134      152.66      159.09      231.37     0.58646          22]
     [     1.3103      181.38      54.892      325.32     0.57503          60]
     [     156.16      49.026      321.75      166.41     0.35428          55]]
    
    Y** 最小値 を昇順にソートX:
    [[     61.591      38.322      510.12      262.66      0.4888           0]
     [     156.16      49.026      321.75      166.41     0.35428          55]
     [     315.72      59.296      354.99      131.48     0.98443           3]
     [     352.12      59.349      392.61      129.97     0.98521           2]
     [     391.33      60.289       431.3      129.43     0.98215           2]
     [     426.44      146.62      513.85      303.11     0.96134          10]
     [      344.3      148.63      433.98      289.92      0.9785           7]
     [     84.134      152.66      159.09      231.37     0.58646          22]
     [     1.3103      181.38      54.892      325.32     0.57503          60]]
    
    ** 上下を分割する場所:
    bbox = (61.59,38.32)-(510.12,262.66)  ylimit = 106.30  index = 5
    
    ** ナンバープレートの上部:
    [[     61.591      38.322      510.12      262.66      0.4888           0]
     [     156.16      49.026      321.75      166.41     0.35428          55]
     [     315.72      59.296      354.99      131.48     0.98443           3]
     [     352.12      59.349      392.61      129.97     0.98521           2]
     [     391.33      60.289       431.3      129.43     0.98215           2]]
    
    ** ナンバープレートの下部:
    [[     426.44      146.62      513.85      303.11     0.96134          10]
     [      344.3      148.63      433.98      289.92      0.9785           7]
     [     84.134      152.66      159.09      231.37     0.58646          22]
     [     1.3103      181.38      54.892      325.32     0.57503          60]]
    
    ** 上部 X最小値) を昇順にソート:
    [[     61.591      38.322      510.12      262.66      0.4888           0]
     [     156.16      49.026      321.75      166.41     0.35428          55]
     [     315.72      59.296      354.99      131.48     0.98443           3]
     [     352.12      59.349      392.61      129.97     0.98521           2]
     [     391.33      60.289       431.3      129.43     0.98215           2]]
    
    ** 下部 X最小値) を昇順にソート:
    [[     1.3103      181.38      54.892      325.32     0.57503          60]
     [     84.134      152.66      159.09      231.37     0.58646          22]
     [      344.3      148.63      433.98      289.92      0.9785           7]
     [     426.44      146.62      513.85      303.11     0.96134          10]]
    
    ** 上部下部を一つにする:
    [[     61.591      38.322      510.12      262.66      0.4888           0]
     [     156.16      49.026      321.75      166.41     0.35428          55]
     [     315.72      59.296      354.99      131.48     0.98443           3]
     [     352.12      59.349      392.61      129.97     0.98521           2]
     [     391.33      60.289       431.3      129.43     0.98215           2]
     [     1.3103      181.38      54.892      325.32     0.57503          60]
     [     84.134      152.66      159.09      231.37     0.58646          22]
     [      344.3      148.63      433.98      289.92      0.9785           7]
     [     426.44      146.62      513.85      303.11     0.96134          10]]
    
    ** ナンバープレート解析結果: なにわ100 す58
    
    FPS average:       7.80
    
     Finished.

  3. 「detect_number.py」で推論実行
    ・学習結果モデルを指定(ログレベルを'0'として識別経過を表示)
    (py_learn) python detect_number.py --log 0
    ・実行ログ
    (py_learn) python detect_number.py --log 0
     Starting..
    
    Number plate detection Ver. 0.09: Starting application...
       OpenCV virsion : 4.9.0
    
       - Image File   :  ../number/test_data/japan74.jpg
       - YOLO v5      :  ultralytics/yolov5
       - Pretrained   :  ./runs/train/vd_yolov5s_ep100/weights/best.pt
       - Pretrained 2 :  ./runs/train/nm_yolov5s_ep50/weights/best.pt
       - Confidence lv:  0.4
       - Label file   :  ./data/nm_dataset/names_jp
       - Program Title:  y
       - Speed flag   :  y
       - Processed out:  non
       - Use device   :  cuda:0
       - Log Level    :  0
    
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7015519 parameters, 0 gradients, 15.8 GFLOPs
    Adding AutoShape...
    
    ** プレートラベル:
    ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'あ', 'い', 'う', 'え', 'か', 'き', 'く', 'け', 'こ', 'さ', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ひ', 'ふ', 'ほ', 'ま', 'み', 'む', 'め', 'も', 'や', 'ゆ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'わ', 'を', '京都', 'なにわ', '大阪', '和泉', '堺', '奈良', '和歌山', '神戸', '徳島', '香川', '愛媛', '千葉']
    Using cache found in C:\Users\izuts/.cache\torch\hub\ultralytics_yolov5_master
    YOLOv5  2024-4-9 Python-3.11.8 torch-2.2.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4070 Ti, 12282MiB)
    
    Fusing layers...
    Model summary: 157 layers, 7182733 parameters, 0 gradients, 16.3 GFLOPs
    Adding AutoShape...
    
    ** プレートの Bounding Box:
    [[     168.33       60.04      414.33      173.39     0.85431           0]]
    
    ** プレート画像 Bounding Box:
    [[     174.72       13.63      194.84      47.704     0.98788           0]
     [     155.33      12.984      175.65       47.85     0.98763           0]
     [      136.1      12.444      156.45       47.14     0.98613           3]
     [     92.386      54.675      140.81         113     0.98496           0]
     [     56.594      53.658      97.797         113     0.98449           7]
     [      153.8      56.805      193.96         113     0.98116           4]
     [     193.16      57.049      234.76         113     0.98103           5]
     [     21.854      59.884       55.78      93.946     0.58157          30]
     [     57.435      5.9446      138.67      45.611     0.57542          53]
     [     193.21           0       243.2      11.105     0.41337           2]
     [     61.161      10.435      133.51      45.012     0.38094          54]]
    
    Y** 最小値 を昇順にソートX:
    [[     193.21           0       243.2      11.105     0.41337           2]
     [     57.435      5.9446      138.67      45.611     0.57542          53]
     [     61.161      10.435      133.51      45.012     0.38094          54]
     [      136.1      12.444      156.45       47.14     0.98613           3]
     [     155.33      12.984      175.65       47.85     0.98763           0]
     [     174.72       13.63      194.84      47.704     0.98788           0]
     [     56.594      53.658      97.797         113     0.98449           7]
     [     92.386      54.675      140.81         113     0.98496           0]
     [      153.8      56.805      193.96         113     0.98116           4]
     [     193.16      57.049      234.76         113     0.98103           5]
     [     21.854      59.884       55.78      93.946     0.58157          30]]
    
    ** 上下を分割する場所:
    bbox = (0.00,0.00)-(246.00,113.00)  ylimit = 34.24  index = 6
    
    ** ナンバープレートの上部:
    [[     193.21           0       243.2      11.105     0.41337           2]
     [     57.435      5.9446      138.67      45.611     0.57542          53]
     [     61.161      10.435      133.51      45.012     0.38094          54]
     [      136.1      12.444      156.45       47.14     0.98613           3]
     [     155.33      12.984      175.65       47.85     0.98763           0]
     [     174.72       13.63      194.84      47.704     0.98788           0]]
    
    ** ナンバープレートの下部:
    [[     56.594      53.658      97.797         113     0.98449           7]
     [     92.386      54.675      140.81         113     0.98496           0]
     [      153.8      56.805      193.96         113     0.98116           4]
     [     193.16      57.049      234.76         113     0.98103           5]
     [     21.854      59.884       55.78      93.946     0.58157          30]]
    
    ** 上部 X最小値) を昇順にソート:
    [[     57.435      5.9446      138.67      45.611     0.57542          53]
     [     61.161      10.435      133.51      45.012     0.38094          54]
     [      136.1      12.444      156.45       47.14     0.98613           3]
     [     155.33      12.984      175.65       47.85     0.98763           0]
     [     174.72       13.63      194.84      47.704     0.98788           0]
     [     193.21           0       243.2      11.105     0.41337           2]]
    
    ** 下部 X最小値) を昇順にソート:
    [[     21.854      59.884       55.78      93.946     0.58157          30]
     [     56.594      53.658      97.797         113     0.98449           7]
     [     92.386      54.675      140.81         113     0.98496           0]
     [      153.8      56.805      193.96         113     0.98116           4]
     [     193.16      57.049      234.76         113     0.98103           5]]
    
    ** 上部下部を一つにする:
    [[     57.435      5.9446      138.67      45.611     0.57542          53]
     [     61.161      10.435      133.51      45.012     0.38094          54]
     [      136.1      12.444      156.45       47.14     0.98613           3]
     [     155.33      12.984      175.65       47.85     0.98763           0]
     [     174.72       13.63      194.84      47.704     0.98788           0]
     [     193.21           0       243.2      11.105     0.41337           2]
     [     21.854      59.884       55.78      93.946     0.58157          30]
     [     56.594      53.658      97.797         113     0.98449           7]
     [     92.386      54.675      140.81         113     0.98496           0]
     [      153.8      56.805      193.96         113     0.98116           4]
     [     193.16      57.049      234.76         113     0.98103           5]]
    
    ** ナンバープレート解析結果: なにわ300 ぬ7045
    
    FPS average:       5.90
    
     Finished.

 

更新履歴

参考資料

  ・ハイパーパラメータ

  ・「roboflow」のMask Wearing Datasetを使用

  ・学習用データセット作成