一 、把20类改成1类
- cfg/voc.data文件中:
- names=data/pasacal.names。
- pasacal.names这一个文件要存在于darknet目录下的data文件夹里,没有的话可以自己在那个目录下创建一个pasacal.txt,加上内容之后,修改文件后缀名变成pasacal.names即可,当然名字和路径都可以自己定义。这个文件中的行数要和类数一致,每一行都是一个类别的名字。比如我的这一文件中就只有一行数据:“person”。这个文件在测试你训练的model的时候会用到,系统会在图片上画出bounding box,bounding box上面的文字,也就是这个框中物体的名字,应该就来自这个文件。
2、cfg/yolov2-voc.cfg文件中 :
【region】层中 classes 改成1。
【region】层上方第一个【convolution】层,其中的filters值要进行修改,改成(classes+ coords+ 1)* (NUM) ,我的情况中:(1+4+1)* 5=30,我把filters 的值改成了30。
修改filters的建议来源自(https://groups.google.com/forum/#!topic/darknet/B4rSpOo84yg),我修改了之后一切正常。
3、examples/yolo.c 文件中 :
- 位置大约第14行左右改成:char *voc_names={“n00000001”},原来里面有20类的名字,我改成了唯一1类的名字。
- 位置大约第328行左右,修改draw_detection这个函数最后一个参数:20改成1。这个函数用于把系统检测出的框给画出来,并把画完框的图片传回第一个参数im中,用于保存和显示。
- 位置大约第361行左右,demo函数中,倒数第三个参数我把20改成了1,虽然不知道有没有用,反正对结果没什么影响。
4、src/yolo_kernels.cu 文件中 :
- 位置第62行,draw_detection这个函数最后一个参数20改成1。
二、准备txt文档
三、修改路径
1、cfg/voc.data文件中:
- train = /home/yolo_v2_tinydarknet/darknet/infrared/infrared_train.txt //infrared_train.txt的完整路径
- valid = /home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt //infrared_val.txt的完整路径
- backup = /home/yolo_v2_tinydarknet/darknet/backup/ /* 这个路径是YOLO用于备份的,在训练过程中YOLO会不断地对产生的weights文件进行备份,darknet目录下就自带一个backup文件夹,这个路径指向那里。
2、examples/yolo.c 文件中:
- train_yolo函数中:
char *train_images =" /home/yolo_v2_tinydarknet/darknet/infrared/infrared_train.txt";//infrared_train.txt的完整路径
char *backup_directory = "/home/yolo_v2_tinydarknet/darknet/backup/";//可以修改为自己的路径
- validate_yolo函数中:
char *base = "/home/yolo_v2_tinydarknet/darknet/results/comp4_det_test_";//可以修改自己的路径,好像是用于保存测试结果
list *plist=get_paths("/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt");//infrared_val.txt的完整路径
- validate_yolo_recall函数中:
char *base = "/home/yolo_v2_tinydarknet/darknet/results/comp4_det_test_";//可以修改自己的路径
list *plist = get_paths("/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt");//infrared_val.txt的完整路径
3、src/detector.c 文件中:
位置第375行改成:list *plist = get_paths(“/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt”);//改成infrared_val.txt的完整路径
需要注意的是,这个文件里的validate_detector_recall函数是用来计算输出recall值的,后面会说
对了,可能你注意到,输入到系统的infrared_train.txt或者infrared_val.txt都只是图片的完整路径,你也知道,要进行训练的话,除了需要图片还需要标记信息,然而标记信息仅仅用我的脚本voc_label_change.py从xml转换成了YOLO可识别的txt格式,但是它们的完整路径并没有输入进系统,那么系统该怎么找到它们呢?
因为在训练集中,一个图片文件和这一图片文件对应标记文件,他们俩除了后缀名之外其余的名称是一样的,所以src/yolo.c中有以下语句:
find_replace(path, "dout", "labels", labelpath);
find_replace(labelpath, "JPEGImages", "labels", labelpath);
find_replace(labelpath, ".jpg", ".txt", labelpath);
find_replace(labelpath, ".JPEG", ".txt", labelpath);
函数会找到路径中的图片后缀名.jpg,自动替换成.txt。比如:
/home/yolo_v2_tinydarknet/darknet/infrared/image/dout/0000.jpg
自动替换后变成了
/home/yolo_v2_tinydarknet/darknet/infrared/image/dout/0000.txt
所以在使用voc_label_new.py转换生成txt格式的标记信息之后,只需要把这些txt格式的标记文件复制到图片所在的目录下即可。系统根据替换后的路径地址来读取对应标记文件。