• 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里面的两个路径改成你自己的,训练吧,小伙子




  • 相关阅读:
    040 Android TCP协议的Socket通信
    039 Android SQLite数据库(了解)
    Navicat 连接Sqlite数据库的方法和步骤
    038 Android File文件存储功能
    037 Android SharedPreferences应用实例(记录App的使用次数)
    036 Android SharedPreferences(数据存储,需掌握)
    035 Android 广播(BroadCastReceiver)
    SharePoint2013打印列表项对象
    SharePoint2013所有列表绑定到DropDownList1中
    通过主机标头实现多个SharePoint Web应用程序共用一个端口(
  • 原文地址:https://www.cnblogs.com/pkjplayer/p/8726943.html
Copyright © 2020-2023  润新知