YOLOV4
论文:《Yolov4: Optimal Speed and Accuracy of Object Detection》
项目代码:AlexeyAB/darknet
一、编译源码
GitHub上下载项目源码
Linux:根据自己需求修改Makefile,然后make就完事
Windows:使用CMake进行编译,可自行修改CMakeLists.txt,或者安装MinGW执行Makefile,毕竟Makefile相对比较好修改
编译后会生成darknet.exe
二、准备数据集
运行以下代码,会在当前目录新建train和val文件夹,数据集分割成训练集和验证集,分别放入两个文件夹中,并建立train.txt和val.txt文件
import os
import random
import shutil
image_Path=r'C:\Users\User\Desktop\marked\data' #数据集路径
val_num=20 #验证集数据量
folder_txt_dir = ["train","val"]
def Creating_folder(folder_txt_dir):
'创建train和val文件夹'
for foler in folder_txt_dir:
data_path =os.path.join(str(os.getcwd()),foler)
folder = os.path.exists(data_path)
if not folder:
os.makedirs(data_path)
print('创建train和val文件夹成功')
def Split_datasets(paths):
'索引所有图片'
images=[]
train_num_list=[]
val_num_list=[]
for path,folder,imgs in os.walk(paths):
for img in imgs:
if img.endswith(".jpg"):
images.append(os.path.join(path,img))
'分割数据集'
alist = random.sample(range(0,len(images)),val_num)
alist.sort(reverse=True)
for n in alist:
val_num_list.append(images[n])
images.pop(n)
train_num_list=images
'移动图片'
train_path=os.path.join(str(os.getcwd()),'train')
val_path=os.path.join(str(os.getcwd()),'val')
for train in train_num_list:
fpath,fname=os.path.split(train)
shutil.copy(train, os.path.join(train_path,fname))
for val in val_num_list:
fpath,fname=os.path.split(val)
shutil.copy(val, os.path.join(val_path,fname))
print('分割数据集成功')
def make_txt(folder_txt_dir):
'创建train.txt和val.txt'
for txt in folder_txt_dir:
data_path =os.path.join(str(os.getcwd()),txt)
image_list=os.listdir(txt)
with open(file=txt+'.txt',mode='a+') as f:
for name in image_list:
if name.endswith(".jpg"):
item=os.path.join(data_path,name)
f.write(item)
f.write("\n")
print('创建train.txt和val.txt成功')
if __name__ =='__main__':
Creating_folder(folder_txt_dir)
Split_datasets(image_Path)
make_txt(folder_txt_dir)
然后新建class.txt,写入物体类别(一行写一个)
标注数据集:
在Make Sense上进行标志数据集,点击Get Started,然后点击Click here to select them,选择分割好的train或者val文件夹,选中里面所有图片,然后点击Object Detection,点击Load labels from file,点击Click here to select them,选择刚才建立好的class.txt文件
标注图片时注意下对应标签,标注结束点击Actions,点击Export Annotations下载标志文件,将里面的图片.txt文件复制到train或者val文件夹下。
然后将category.txt改为category.names
可以得到如下目录结构
三、配置训练文件
主要是一个.data文件和.cfg文件
新建obj.data
写入obj.data时记得删掉#和后面的注释
classes=5 #种类数目
train=data/train.txt #train.txt文件路径
vaild=data/test.txt #test.txt文件路径
names=data/category.names #标签文件路径
backup=backup #训练好的权重文件将放在该路径下
新建yolo-obj.cfg
复制项目文件中yolov4.cfg内容
主要修改batch、subdivision、width、height、max_batches、steps以及每个yolo层中classes和前面一个卷积层中filters
具体修改可以参考这里:关于yolo配置文件以及训练时各参数的含义
四、训练模型
训练模型主要用到yolo-obj.cfg、obj.data、darknet.exe(可以拿出来放置在任意文件夹中使用)、pthreadVC2.dll(在darknet-master/build/darknet/x64路径下)、预训练模型yolov4.conv.137(下载地址)
在darknet.exe的目录路径终端下输入:darknet detector train obj.data路径 yolo-obj.cfg路径 yolov4.conv.137路径
正常训练下
五、使用训练好的模型预测图片
在darknet.exe的目录路径终端下输入:darknet detector test obj.data路径 yolo-obj.cfg路径 训练好的模型权重文件.weights的路径 预测图片路径
这里是由于我没有编译时没有选择OpenCV,预测效果相对较好的
也可以使用darknet-master\darknet_images.py进行预测(这里需要darknet.dll)。