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

1写所有的配置文件

1.1 YOLO3-face.cfg

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

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

 [net]
# Testing
# batch=
# subdivisions=
# Training
batch=
subdivisions=
width=
height=
channels=
momentum=0.9
decay=0.0005
angle=
saturation = 1.5
exposure = 1.5
hue=.

其中:

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

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

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

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

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

 [convolutional]
batch_normalize=
filters=
size=
stride=
pad=
activation=leaky [convolutional]
batch_normalize=
size=
stride=
pad=
filters=
activation=leaky [convolutional]
size=
stride=
pad=
filters=
activation=linear [yolo]
mask = ,,
anchors = ,, ,, ,, ,, ,, ,, ,, ,, ,
classes=
num=
jitter=.
ignore_thresh = .
truth_thresh =
random=

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

filter=3*(4+1+classes)

classes=1

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

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

1.2 widerface.data

在cfg/voc.data基础上改

 classes=
train = /home/liuzg/yolo/darknet3/darknet/Pkj_face_scripts/train.txt
valid = /home/liuzg/yolo/darknet3/darknet/Pkj_face_scripts/test.txt
names = data/widerface.names
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行(可能我自己改过了,反正附近吧)

 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格式里面

 import xml.etree.ElementTree as ET
import pickle
import os
import re
from os import listdir, getcwd
from os.path import join sets=[('trainval'), ('test')] classes = ["face"] def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h) def convert_annotation(image_id):
image_id_chage=image_id.replace('/','_')
dirname=image_id[:image_id.find('/')]
if not os.path.exists('wider-faces/labels/%s/'%(dirname)):
os.makedirs('wider-faces/labels/%s/'%(dirname))
in_file = open('wider-faces/Annotations/%s.xml'%(image_id_chage))
out_file = open('wider-faces/labels/%s.txt'%(image_id), 'w')
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text) for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') wd = getcwd() for image_set in sets:
if not os.path.exists('wider-faces/labels/'):
os.makedirs('wider-faces/labels/')
image_ids = open('wider-faces/ImageSets/Main/%s.txt'%(image_set)).read().strip().split()
list_file = open('%s.txt'%(image_set), 'w')
for image_id in image_ids:
if not os.path.exists('wider-faces/Annotations/%s.xml'%(image_id)):
continue
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):]
list_file.write('%s/wider-faces/WIDER_%s/images/%s.jpg\n'%(wd, image_set, image_id))
convert_annotation(image_id)
list_file.close() os.system("cat trainval.txt > train.txt")
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里面的两个路径改成你自己的,训练吧,小伙子



YOLO3训练widerface数据集的更多相关文章

  1. Fast RCNN 训练自己数据集 (1编译配置)

    FastRCNN 训练自己数据集 (1编译配置) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ https:/ ...

  2. 使用caffe训练mnist数据集 - caffe教程实战(一)

    个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231 ...

  3. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  4. 使用py-faster-rcnn训练VOC2007数据集时遇到问题

    使用py-faster-rcnn训练VOC2007数据集时遇到如下问题: 1. KeyError: 'chair' File "/home/sai/py-faster-rcnn/tools/ ...

  5. YOLOV4在linux下训练自己数据集(亲测成功)

    最近推出了yolo-v4我也准备试着跑跑实验看看效果,看看大神的最新操作 这里不做打标签工作和配置cuda工作,需要的可以分别百度搜索   VOC格式数据集制作,cuda和cudnn配置 我们直接利用 ...

  6. Scaled-YOLOv4 快速开始,训练自定义数据集

    代码: https://github.com/ikuokuo/start-scaled-yolov4 Scaled-YOLOv4 代码: https://github.com/WongKinYiu/S ...

  7. win10 下的YOLOv3 训练 wider_face 数据集检测人脸

    1.数据集下载 (1)wider_face 数据集网址为 http://shuoyang1213.me/WIDERFACE/index.html 下载以上几项文件(这里推荐 google Drive ...

  8. Fast RCNN 训练自己数据集 (2修改数据读取接口)

    Fast RCNN训练自己的数据集 (2修改读写接口) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ http ...

  9. 【Mxnet】----1、使用mxnet训练mnist数据集

    使用自己准备的mnist数据集,将0-9的bmp图像分别放到0-9文件夹下,然后用mxnet训练. 1.制作rec数据集 (1).制作list

随机推荐

  1. Flask,ORM及模板引擎Jinja2

    跨域:http://blog.csdn.net/yannanxiu/article/details/53036508 下载flask_cors包 pip install flask-cors 使用fl ...

  2. 远程服务器上的weblogic项目管理(四)filelock not found错误解决方法

    重启weblogic时如果有残余进程没有kill,启动时便可能会造成filelock not found,文件锁未找到错误,解决方法如下: 删掉Domain下的*.lok文件:(如果不熟悉文件路径推荐 ...

  3. Android实现下拉导航选择菜单效果

    本文介绍在Android中如何实现下拉导航选择菜单效果.   关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目中,这样可以很方便的选择更多的菜单.我们可以让我们的应用顶部有左 ...

  4. python cookbook第三版学习笔记四:文本以及字符串令牌解析

    文本处理: 假设你存在一个目录,下面存在各种形式的文件,有txt,csv等等.如果你只想找到其中一种或多种格式的文件并打开该如何办呢.首先肯定是要找到满足条件的文件,然后进行路径合并在一一打开. pa ...

  5. 流畅python学习笔记:第十四章:迭代器和生成器

    迭代器和生成器是python中的重要特性,本章作者花了很大的篇幅来介绍迭代器和生成器的用法. 首先来看一个单词序列的例子: import re re_word=re.compile(r'\w+') c ...

  6. 【shell】获取第10+个位置参数

    转载自:http://www.cnblogs.com/sheldonxu/archive/2012/06/25/2560770.html 在Shell脚本中,可以用$n的方式获取第n个参数,例如,一个 ...

  7. history显示历史操作记录,并显示操作时间

    在查看历史的操作记录有两种方式1.在用户的目录下的.bash_history文件中[root@node1 ~]# vi ~/.bash_history rebootvi /etc/sysconfig/ ...

  8. ansible2

    一.ansible模块(yum.pip.service.conr.user.group) 你是否知道ansible一共有多少模块呢?可以用以下命令查看: [root@localhost ~]# ans ...

  9. openstack多region介绍与实践

    版权声明:本文为原创文章,转载请注明出处. 概念介绍 所谓openstack多region,就是多套openstack共享一个keystone和horizon.每个区域一套openstack环境,可以 ...

  10. SQLSERVER安装记录

    很多人都喜欢重装编程环境,VS,SQL是最常见的 尤其是SQL,在删除所有的SQL相关的组件之后(360),记得再次打开控制面板,查看是否有漏掉的,本人就有一个SQLXML没有删除掉 在删除之后,清理 ...