首页 > 技术文章 > Yolov2训练自己的数据

gaosheng12138 2018-06-12 10:48 原文

一 、把20类改成1类

  1. cfg/voc.data文件中:

  2. classes 改成1
    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格式的标记文件复制到图片所在的目录下即可。系统根据替换后的路径地址来读取对应标记文件。

 

推荐阅读