目录
数据准备
划分数据集
xml2yolo
生成train/valid.txt
YOLOv4配置
cfg文件修改
data文件修改
names文件修改
模型训练
模型测试
本文代码基于:https://github.com/ultralytics/yolov3
YOLOv4理论部分我的另一篇博客请参考:YOLOv4真的来了!!论文翻译
数据准备
首先介绍数据集,来源于AI研习设的一个比赛,见链接:https://god.yanxishe.com/32。
之前我已经用该数据集训练过YOLOv3,感觉效果不是非常好,这次直接把之前训练YOLOv3的数据集放在YOLOv4_path/data/目录下即可。
不过,,这样看的可能会一脸懵逼,还是介绍下数据集的准备过程吧。。
划分数据集
首先clone git 到本地,解压,得到YOLOv4的文件目录如图:
然后将下载下来的数据集放到data/下,文件夹命名为原始数据集。data/原始数据集/下如图所示,分别有train文件夹(训练数据集),labels文件夹(标签集),test文件夹(测试数据,用于测试提交。)
先划分数据集,将train数据集划分为train/valid数据集,运行 1.split_data.py 如下代码:
import os
import glob
import json
import shutil
import numpy as np
import xml.etree.ElementTree as ET
img_train = './images/train/'
img_val = './images/valid/'
label_train = './labels/train/'
label_val = './labels/valid/'
allimgs = glob.glob('原始数据集/train/' + "/*.jpg")
allimgs = np.sort(allimgs)
np.random.seed(100)
np.random.shuffle(allimgs)
train_ratio = 0.9
train_num = int(len(allimgs) * train_ratio)
# 得到训练和验证数据集列表
img_list_train = allimgs[:train_num]
img_list_val = allimgs[train_num:]
# 创建文件夹
if os.path.exists(img_train):
shutil.rmtree(img_train)
os.mkdir(img_train)
else:
os.mkdir(img_train)
if os.path.exists(img_val):
shutil.rmtree(img_val)
os.mkdir(img_val)
else:
os.mkdir(img_val)
if os.path.exists(label_train):
shutil.rmtree(label_train)
os.mkdir(label_train)
else:
os.mkdir(label_train)
if os.path.exists(label_val):
shutil.rmtree(label_val)
os.mkdir(label_val)
else:
os.mkdir(label_val)
# 移动val数据到指定位置
for i in img_list_val:
img_id = i.split('.')[0].split('/')[2]
print(img_id)
# jpg
shutil.copy(i, img_val + img_id + '.jpg')
# xml
shutil.copy('原始数据集/label/' + 'new_' + img_id + '.xml', label_