天天看點

手把手教物體檢測——yolov3測試

目錄

訓練

下載下傳算法

下載下傳.weights結尾的預訓練模型,并将weight檔案轉為h5檔案

修改類别。

Labelme标注的資料集轉為yolov3訓練的資料集。

執行Kmeans.py檔案計算anchors。

修改train.py檔案。

測試

修改yolo.py

修改yolo_video.py

摘要

YOLOv3是YOLO (You Only Look Once)系列目标檢測算法中的第三版,相比之前的算法,尤其是針對小目标,精度有顯著提升。在Pascal Titan X上處理608x608圖像速度達到20FPS,在 COCO test-dev 上 [email protected] 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網絡)的結果相近,并且速度快4倍。

相比YOLOV2,YOLOV3的改進之處主要有兩點:

多尺度預測 (類FPN)

更好的基礎分類網絡(類ResNet)和分類器

關于YOLOV3 的了解可以參照這兩篇文章:

1、yolo系列之yolo v3【深度解析】

https://blog.csdn.net/leviopku/article/details/82660381
手把手教物體檢測——yolov3測試
2、目标檢測網絡之 YOLOv3 https://www.cnblogs.com/makefile/p/YOLOv3.html

本地環境:TensorFlow 1.15.3

                  Python 3.7

                  Keras 2.1.5

yolo v3 的算法版本比較多,我建議大家選用是qqwweee的keras版本,複現比較容易,代碼相對來說比較容易了解。

github位址:

https://github.com/qqwweee/keras-yolo3 下載下傳位址: https://pjreddie.com/media/files/yolov3.weights

建立weight檔案夾,将下載下傳的模型放進去。然後修改convert.py檔案

将config_path、weightsPath和output_path這個三個參數删除。如下圖:

手把手教物體檢測——yolov3測試
修改main函數中的路徑。

def _main(args):
 
            config_path = "yolov3.cfg"
 
            weights_path = "weight/yolov3.weights"
 
            assert config_path.endswith('.cfg'), '{} is not a .cfg file'.format(
 
           config_path)
 
              assert weights_path.endswith(
 
         '.weights'), '{} is not a .weights file'.format(weights_path)
 
            output_path = "weight/yolov3.h5"      

修改完成後點選運作。

手把手教物體檢測——yolov3測試

yolo預設使用的類别檔案是coco_classes.txt,是以我們需要将此檔案的類别修改為資料集的類别。本例使用的資料集有兩個類别,分别是aircraft和oiltank。

手把手教物體檢測——yolov3測試

增加labelme2txt.py檔案

from os import getcwd
 
import os
 
import json
 
import glob
 
wd = getcwd()
 
"labelme标注的json 資料集轉為keras 版yolov3的訓練集"
 
classes = ["aircraft","oiltank"]
 
 
 
image_ids = glob.glob(r"LabelmeData/*jpg")
 
print(image_ids)
 
list_file = open('train.txt', 'w')
 
 
 
def convert_annotation(image_id, list_file):
 
    jsonfile=open('%s.json' % (image_id))
 
    in_file = json.load(jsonfile)
    for i in range(0,len(in_file["shapes"])):
 
        object=in_file["shapes"][i]
 
        cls=object["label"]
 
        points=object["points"]
 
        xmin=int(points[0][0])
 
        ymin=int(points[0][1])
 
        xmax=int(points[1][0])
 
        ymax=int(points[1][1])
 
        if cls not in classes:
 
            print("cls not in classes")
 
            continue
 
        cls_id = classes.index(cls)
 
        b = (xmin, ymin, xmax, ymax)
 
        list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))
 
    jsonfile.close()
 
for image_id in image_ids:
 
    list_file.write('%s.jpg' % (image_id.split('.')[0]))
 
    convert_annotation(image_id.split('.')[0], list_file)
 
    list_file.write('\n')
 
list_file.close()      

生成的train.txt内容如下:

手把手教物體檢測——yolov3測試

每張圖檔是x1,y1,x2,y2 class 組成的字元串。

打開Kmeans.py檔案,修改self.filename = "train.txt",然後運作,計算的結果會直接覆寫到yolo_anchors.txt

annotation_path = 'train.txt'
 
classes_path = 'model_data/coco_classes.txt'
 
anchors_path = 'model_data/yolo_anchors.txt'      
model = create_model(input_shape, anchors, num_classes,
 
                            freeze_body=2, weights_path='weight/yolov3.h5')      
這幾個檔案的路徑按照上面檔案的存放位置和名稱修改。      
注意57行和76行的batch_size按照電腦的配置去修改。      

完成上面的步驟就可以開始訓練了,點選run,開始訓練。

手把手教物體檢測——yolov3測試

 mode_path 修改為最終模型的路徑:

"model_path": 'logs/000/trained_weights_final.h5',      

删除以下參數

parser.add_argument(
    '--model', type=str,
    help='path to model weight file, default ' + YOLO.get_defaults("model_path")
)
 
parser.add_argument(
    '--anchors', type=str,
    help='path to anchor definitions, default ' + YOLO.get_defaults("anchors_path")
)
 
parser.add_argument(
    '--classes', type=str,
    help='path to class definitions, default ' + YOLO.get_defaults("classes_path")
)
 
parser.add_argument(
    '--gpu_num', type=int,
    help='Number of GPU to use, default ' + str(YOLO.get_defaults("gpu_num"))
)1.      

将image參數改為true

parser.add_argument(

   '--image', default=True, action="store_true",

   help='Image detection mode, will ignore all positional arguments'

)

修改detect_img的img路徑

def detect_img(yolo):

   while True:

       img ="D:\keras-yolo3-master\LabelmeData/aircraft_4.jpg"

測試結果

手把手教物體檢測——yolov3測試

本文執行個體:

https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12621202

​​