yolo-v1 train和test自己的分类和数据
一.参考文档
https://github.com/Guanghan/darknet
github下面有详细的yolo版本1的详细训练过程。
这里只介绍我们自己的训练过程(只识别“人”这一个类)。
二.训练过程
1.下载数据集voc2007
shell终端
cd ~
mkdir vocdata
cd vocdata
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
2.将下好的数据集转为yolo可训练的标签
在darknet/scripts/voc_label.py文件拷贝到~/vocdata目录下,修改voc_label.py
将第7行下面的几行进行修改
sets=[ ('2007', 'train'), ('2007', 'val')]
classes = ["person"]
执行voc_label.py即可
可以得到2007_train.txt和2007_train.txt
将2007_train.txt拷贝到/darknet/scripts/目录下
3.修改部分源代码
src/yolo.c
#define CLASSNUM 1 //添加定义
image voc_labels[CLASSNUM]; //修改
将void test_yolo(char *cfgfile, char *weightfile, char *filename, float thresh)函数里面的调用的
draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, voc_labels, CLASSNUM); //最后一个参数修成CLASSNUM
修改void run_yolo(int argc, char **argv)函数
for(i = 0; i < CLASSNUM; ++i){ //修改成CLASSNUM
将开头的char *voc_names[] = {"person"}; //删除其余的类名,只留下person类
将void train_yolo(char *cfgfile, char *weightfile)函数中的开头两句的语句进行修改
char *train_images = "/home/user/darknet/scripts/train.txt"; //注意要使用绝对路径
char *backup_directory = "/home/user/darknet/backup"; //绝对路径,还要确保backup文件的存在
src/yolo_kernels.cu
#define CLASS_NUM 1 //添加定义
修改void *detect_in_thread(void *ptr)里面的语句
draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, CLASS_NUM); //修改最后一个参数
cfg/yolo.cfg
[connected]
output= 539 //最后一层的全连接层,output=(5×2+CLASSNUM)×7×7
activation=linear
[detection]
classes=1 //类数
4.开始训练
下载extraction.conv.weights 我们在这上面进行微调
shell终端
./darknet yolo train cfg/yolo.cfg extraction.conv.weights
5.测试
一共训练迭代40000步,服务器一共跑了3天多
shell终端
./darknet yolo demo_vid cfg/yolo.cfg backup/yolo_final.weights ~/video/123.avi