参考文章链接:
linux下配置运行YoloV4
准备Pascal VOC数据集
训练配置并开始训练
感谢大佬提供的训练方法!!!
Centos8
显卡 GeForce RTX 2080 8G显存
显卡驱动版本440.82
CUDA 10.2
Cudnn 7.6.2
OpenCV 3.4.1
Python 3.7
git clone https://github.com/AlexeyAB/darknet.git
make
make clean
,再make
./darknet
如果出现下面输出则为成功:
usage:./darknet<fuction>
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
如果没有使用OpenCV的话只会保存结果图片在/darknet-master目录下,使用的话会出现弹窗显示检测结果。
darknet-master
VOCdevkit
VOC2028
Annotations
JPEGImages
ImageSets
Main
注意Main文件夹在ImageSets文件夹内
python Main_devide.py ./VOCdevkit/VOC2028
import os
import random
import sys
if len(sys.argv) < 2:
print("no directory specified, please input target directory")
exit()
root_path = sys.argv[1]
xmlfilepath = root_path + '/Annotations'
txtsavepath = root_path + '/ImageSets/Main'
if not os.path.exists(root_path):
print("cannot find such directory: " + root_path)
exit()
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
trainval_percent = 0.9
train_percent = 0.8
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
print("train and val size:", tv)
print("train size:", tr)
ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
在ImageSets/Main文件夹下就会生成四个txt文件:test.txt、train.txt、trainval.txt、val.txt。
sets=[('2012', 'train'),('2012', 'val'),('2007', 'train'),('2007', 'val'),('2007', 'test')]
改为
sets=[('2028', 'train'),('2028', 'val'),('2028', 'test')]
修改第8行:
classes=["你自己要训练的类别","逗号隔开"]
修改最后两行:
os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
改为
os.system("cat 2028_train.txt 2028_val.txt > train.txt")
os.system("cat 2028_train.txt 2028_val.txt 2007_test.txt > train.all.txt")
运行voc_label.py文件:
python voc_label.py
运行后,在/darknet目录下会生成5个文件,分别是:2028_train.txt,2028_test.txt,2028_val.txt,train.all.txt,train.txt
将这5个txt文件复制到/darknet/VOCdevkit中
classes=20
train=/home/xxx/xxx/train.txt
valid=/home/xxx/xxx/2007_test.txt
names=data/voc.names
backup=backup
修改成:
classes=x #你的类别数
train=/home/xxx/xxx/darknet-master/VOCdevkit/train.txt
valid=/home/xxx/xxx/darknet-master/VOCdevkit/2028_test.txt
names=data/voc.names
backup=/home/xxx/xxx/darknet-master/backup #在darknet-master目录下创建backup文件夹
https://drive.google.com/file/d/1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp/view
将该文件放在/darknet-master目录下
./darknet detector train cfg/voc.data cfg/yolo-obj.cfg yolov4.conv.137
训练结束后,训练的模型会放在darknet-master/backup中。
PS:训练时碰到一个issue
mosaic=1 -compile Darknet with OpenCV for using mosaic=1
free():corrupted unsorted chunks段错误
此问题github作者已解决段错误(核心已转储)
./darknet detector test cfg/voc.data cfg/yolo-obj.cfg backup/yolo-obj_xxxx.weights
训练完模型后,在实际运用自己训练的模型时,希望能实现批量处理,并且将检测结果显示在图片上并将结果图片保存在指定文件夹中。
#include "darknet.h"
#include
#include
#include
#include
static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};
char *GetFilename(char *p)
{
static char name[20]={""};
char *q = strrchr(p,'/') + 1;
strncpy(name,q,3); #这里3是文件名长度,比如001.jpg,要修改成你自己的文件名长度,文件名不统一的话可以通过文件名修改软件修改成统一的,这一点是比较鸡肋,凑合用吧
return name;
}
搜索“save_image(im, “predictions”)”,大概在1600多行,将其替换为以下代码:
// save_image(im, "predictions");
char b[512];
sprintf(b,"output/%s", GetFilename(input));
save_image(im, b);
修改完后重新make。
运行以下代码(路径改为自己的):
import os
paths = "./test" # 测试图片的路径
f = open('test.txt', 'w') # 最后得到的图片路径txt文件
filenames = os.listdir(paths)
filenames.sort()
for filename in filenames:
out_path = "/home/yolov4/darknet-master/test/" + filename # 引号内为测试图片文件夹的绝对路径
print(out_path)
f.write(out_path + '\n')
f.close()
运行完后在darknet-master目录下会生成一个test.txt文件。
在darknet-master目录下创建一个output文件夹,运行以下命令:
./darknet detector test <data/voc.data> <cfg/yolo-voc.cfg> <yolo-voc.weights> -ext_output -dont_show < <data/train.txt> > <result.txt>
其中用“< >”尖括号框出来的地方需要修改:
data/voc.data:检测用模型的voc.data文件的地址。
cfg/yolo-voc.cfg:检测用模型的cfg文件的地址。
yolo-voc.weights:检测用模型的weights文件的地址。
data/train.txt :步骤2中准备的txt文件地址。ps:注意前后有’< ‘和’ >'
result.txt:输出文本格式的检测结果的文件名
我的运行命令如下:
./darknet detector test data/voc.data cfg/yolo-obj.cfg backup/yolo-obj_xxxx.weights -ext_output -dont_show test.txt result.txt
请见另一篇文章CentOS8编译OpenCV4.3.0 with ffmpeg(YoloV4处理视频并保存)
以上。