zoukankan      html  css  js  c++  java
  • YOLO3训练widerface数据集

    因为YOLO3速度精度都很棒,所以想训练一下人脸模型,废话不多,进入正题

    1写所有的配置文件

    1.1 YOLO3-face.cfg

    个人感觉YOLO的配置文件骑士和caffe差不多

    在cfg/YOLO3.cfg的文件上改,生成自己的cfg/yolo3-face.cfg

     1 [net]
     2 # Testing
     3 # batch=1
     4 # subdivisions=1
     5 # Training
     6 batch=64
     7 subdivisions=16
     8 width=416
     9 height=416
    10 channels=3
    11 momentum=0.9
    12 decay=0.0005
    13 angle=0
    14 saturation = 1.5
    15 exposure = 1.5
    16 hue=.1

    其中:

    batch=64                          每batch个样本更新一次参数。

    subdivisions=16               如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。

    训练的话把上面注释掉,测试就把训练部分的注释掉

    学习率啥的就不改了,自己看着学吧

    到配置文件底部更改最后的conv层参数

     1 [convolutional]
     2 batch_normalize=1
     3 filters=128
     4 size=1
     5 stride=1
     6 pad=1
     7 activation=leaky
     8 
     9 [convolutional]
    10 batch_normalize=1
    11 size=3
    12 stride=1
    13 pad=1
    14 filters=256
    15 activation=leaky
    16 
    17 [convolutional]
    18 size=1
    19 stride=1
    20 pad=1
    21 filters=18
    22 activation=linear
    23 
    24 [yolo]
    25 mask = 0,1,2
    26 anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
    27 classes=1
    28 num=9
    29 jitter=.3
    30 ignore_thresh = .5
    31 truth_thresh = 1
    32 random=1

    多截取了一点,只要改最后一部分就可以,(友情提醒,YOLO里面这个模块有三处,都改,估计为了收敛用的辅助)

    filter=3*(4+1+classes)

    classes=1

    这里我的是人脸检测,so classes=1

    下面的anchors懒得改了,理论上像我检测的人脸一般都是偏正方形,像(16,30)这种是没什么必要的

    1.2 widerface.data

    在cfg/voc.data基础上改

    1 classes= 1
    2 train  = /home/liuzg/yolo/darknet3/darknet/Pkj_face_scripts/train.txt
    3 valid  = /home/liuzg/yolo/darknet3/darknet/Pkj_face_scripts/test.txt
    4 names = data/widerface.names
    5 backup = backup

    train和valid就是yolo需要的训练集和交叉训练集所需要的目录,后面讲生成方法

    1.3 widerface.names

    data/widerface.names 照抄coco.names格式,我这里检测人脸,整个文件只有一行face

    2 数据集处理方法

    记住你的唯一核心目的就是要生成上面1.2里面那两个txt文件,下面讲的所有方法都是辅助,你拿什么生成那两个文件和YOLO训练没有半毛钱关系

    1 下载widerface数据集

    2 转化成VOC格式

    我是按这位老兄的脚本搞得,新手拿这个上路其实还是有点坑的,先拿这个讲

    https://blog.csdn.net/minstyrain/article/details/77986262

    为什么讲他坑呢,因为他脚本里面第122行(可能我自己改过了,反正附近吧)

    1 filename=filename.replace("/","_")  

    他把文件路径名里面的路径给换了,后来也知道他为什么要换了,但是会有其他坑,所以记住核心目的就行,脚本不行,后面配合部分人工简单操作凑合过吧,go on

    运行脚本后你得到了一个类似于VOC格式的数据集

    3 接下来看官网 https://pjreddie.com/darknet/yolo/

    官网大神已经给你写好脚本了,把VOC格式转化成YOLO格式

    wget https://pjreddie.com/media/files/voc_label.py

    python voc_label.py

    当然我前面说了我们的是类VOC格式,所以还是要改滴,讲不清,直接贴代码吧,反正也就是各种路径找不到的问题,还有上面转VOC格式的时候,

    那老哥好像还把一部分不好的数据给删了,所以并不是所有widerface数据都在VOC格式里面

     1 import xml.etree.ElementTree as ET
     2 import pickle
     3 import os
     4 import re
     5 from os import listdir, getcwd
     6 from os.path import join
     7 
     8 sets=[('trainval'), ('test')]
     9 
    10 classes = ["face"]
    11 
    12 
    13 def convert(size, box):
    14     dw = 1./(size[0])
    15     dh = 1./(size[1])
    16     x = (box[0] + box[1])/2.0 - 1
    17     y = (box[2] + box[3])/2.0 - 1
    18     w = box[1] - box[0]
    19     h = box[3] - box[2]
    20     x = x*dw
    21     w = w*dw
    22     y = y*dh
    23     h = h*dh
    24     return (x,y,w,h)
    25 
    26 def convert_annotation(image_id):
    27     image_id_chage=image_id.replace('/','_')    
    28     dirname=image_id[:image_id.find('/')]
    29     if not os.path.exists('wider-faces/labels/%s/'%(dirname)):
    30         os.makedirs('wider-faces/labels/%s/'%(dirname))
    31     in_file = open('wider-faces/Annotations/%s.xml'%(image_id_chage))
    32     out_file = open('wider-faces/labels/%s.txt'%(image_id), 'w')
    33     tree=ET.parse(in_file)
    34     root = tree.getroot()
    35     size = root.find('size')
    36     w = int(size.find('width').text)
    37     h = int(size.find('height').text)
    38 
    39     for obj in root.iter('object'):
    40         difficult = obj.find('difficult').text
    41         cls = obj.find('name').text
    42         if cls not in classes or int(difficult)==1:
    43             continue
    44         cls_id = classes.index(cls)
    45         xmlbox = obj.find('bndbox')
    46         b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
    47         bb = convert((w,h), b)
    48         out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '
    ')
    49 
    50 wd = getcwd()
    51 
    52 for image_set in sets:
    53     if not os.path.exists('wider-faces/labels/'):
    54         os.makedirs('wider-faces/labels/')
    55     image_ids = open('wider-faces/ImageSets/Main/%s.txt'%(image_set)).read().strip().split()
    56     list_file = open('%s.txt'%(image_set), 'w')
    57     for image_id in image_ids:
    58         if not os.path.exists('wider-faces/Annotations/%s.xml'%(image_id)):
    59             continue
    60         image_id=image_id[:image_id.find(re.findall("d",image_id)[0],4)-1]+'/'+image_id[image_id.find(re.findall("d",image_id)[0],4):]
    61         list_file.write('%s/wider-faces/WIDER_%s/images/%s.jpg
    '%(wd, image_set, image_id))
    62         convert_annotation(image_id)
    63     list_file.close()
    64 
    65 os.system("cat trainval.txt > train.txt")
    66 os.system("cat trainval.txt test.txt > train.all.txt")

    估计我的要直接用也难,讲一下要改的地方吧

    官网大神分三类,训练集,交叉集,测试集,我这里只有训练集trainval,交叉集test,不要问我为什么名字不对应,我自己也被搞了半天,烦死了

    convert_annatation函数就是把VOC的标记坐标格式转成YOLO认识的格式,中间我多了一个image_id_change就是因为上面那老哥把"/"换成"_"了,各种路径找不到

    最后呢还需要一点人工操作

    把widerface/labels复制拷贝到WINDER_trainval和WINDER_test下面,ok,到此为止,假设你一切顺利的话就可以训练了

    3 官网下个预训练模型,把上面配置文件1.2里面的两个路径改成你自己的,训练吧,小伙子




  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/8726943.html
Copyright © 2011-2022 走看看