目錄
訓練
下載下傳算法
下載下傳.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 。 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這個三個參數删除。如下圖:
修改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"
修改完成後點選運作。
yolo預設使用的類别檔案是coco_classes.txt,是以我們需要将此檔案的類别修改為資料集的類别。本例使用的資料集有兩個類别,分别是aircraft和oiltank。
增加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内容如下:
每張圖檔是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,開始訓練。
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"
測試結果
本文執行個體:
https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12621202