yolo-v1 train和test自己的分类和数据

来源:互联网 发布:centos 超时时间 编辑:程序博客网 时间:2024/06/05 00:25

一.参考文档

https://github.com/Guanghan/darknet
github下面有详细的yolo版本1的详细训练过程。
这里只介绍我们自己的训练过程(只识别“人”这一个类)。

二.训练过程

1.下载数据集voc2007
shell终端

cd ~mkdir vocdatacd vocdatawget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tartar xvf VOCtrainval_06-Nov-2007.tartar 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×7activation=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
0 0
原创粉丝点击