大神看一下我的手机是不是翻新机6plus

& YOLOv2如何fine-tuning?
作者:木凌
时间:2016年11月。
博客连接:
在上一篇用YOLOv2模型训练VOC数据集中,我们尝试用YOLOv2来训练voc数据集,但我想训练自己的数据集,那么YOLOv2如何做fine-tuning呢?我们一步一步来做~
1 准备数据
1.1 建立层次结构
首先在darknet/data文件夹下创建一个文件夹fddb2016,文件层次如下
--fddb2016
--Annotations
2002_07_19_big_img_130.xml
2002_07_25_big_img_84.xml
2002_08_01_big_img_1445.xml
2002_08_08_big_img_277.xml
2002_08_16_big_img_637.xml
2002_08_25_big_img_199.xml
2003_01_01_big_img_698.xml
--ImageSets
trainval.txt
--JPEGImages
2002_07_19_big_img_130.jpg
2002_07_25_big_img_84.jpg
2002_08_01_big_img_1445.jpg
2002_08_08_big_img_277.jpg
2002_08_16_big_img_637.jpg
2002_08_25_big_img_199.jpg
2003_01_01_big_img_698.jpg
trainval.txt中存放的是图片的名称,我们来看一下
2002_08_11_big_img_591
2002_08_26_big_img_265
2002_07_19_big_img_423
2002_08_24_big_img_490
2002_08_31_big_img_17676
2002_07_31_big_img_228
1.2 xml2txt
因为yolo读取的是txt文档,所以我们要将xml的benchmark修改为txt格式,程序如下所示:
import xml.etree.ElementTree as ET
import pickle
from os import listdir, getcwd
from os.path import join
import cv2
#sets=[('fddb2016', 'train'), ('fddb2016', 'val')]
#classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
classes = ["face"]
def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
w = box[1] - box[0]
h = box[3] - box[2]
return (x,y,w,h)
def convert_annotation(w, h, image_id):
in_file = open('fddb2016/Annotations/%s.xml' % image_id)
out_file = open('fddb2016/labels/%s.txt'% image_id, 'w')
print in_file
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
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:
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()
if not os.path.exists('fddb2016/labels/'):
os.makedirs('fddb2016/labels/')
image_ids = open('fddb2016/ImageSets/Main/trainval.txt').read().strip().split()
list_file = open('fddb2016_train.txt', 'w')
for image_id in image_ids:
list_file.write('%s/fddb2016/JPEGImages/%s.jpg\n'% (wd, image_id))
image = cv2.imread('%s/fddb2016/JPEGImages/%s.jpg'%(wd, image_id))
h, w, c = image.shape
convert_annotation(w, h, image_id)
list_file.close()
2 Fine tuning
2.1 修改.cfg文件
如果你想用22层模型的就修改cfg/yolo-voc.cfg,你想用9层的模型就修改cfg/tiny-yolo-voc.cfg,两者修改方式一样,我们以yolo-voc.cfg为例:
复制cfg文件
$cp cfg/yolo-voc.cfg cfg/yolo-fddb.cfg
打开yolo-fddb.cfg文件,并作如下修改
a. 将learning_rate=0.0001改为learning_rate=0.00005
b. 将max_batches = 45000改为max_batches = 200000
c. 将classes=20改为classes=1
d. 将最后一层[convolutional]层的filters=125改为filters=30,filters的计算公式如下,请根据你自己数据的类别数量修改
filters=num*(classes+coords+1)=5*(1+4+1)=30
最后结果如下:
subdivisions=8
height=416
channels=3
momentum=0.9
decay=0.0005
saturation = 1.5
exposure = 1.5
learning_rate=0.0005
max_batches = 200000
policy=steps
steps=100,
scales=10,.1,.1
[convolutional]
filters=30
activation=linear
anchors = 1.08,1.19,
3.42,4.41,
6.63,11.38,
9.42,5.11,
16.62,10.52
bias_match=1
object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1
absolute=1
thresh = .6
2.2 修改voc.names文件
复制voc.names文件
$cp data/voc.names data/fddb.names
修改fddb.names文件,结果如下
2.3 修改voc.data文件
复制voc.data文件
$cp cfg/voc.data cfg/fddb.data
修改voc.data文件,结果如下
classes= 1
= /home/usrname/darknet-v2/data/fddb2016_train.txt
= /home/pjreddie/data/voc/2007_test.txt
names = data/fddb.names
backup = /home/guoyana/my_files/local_install/darknet-v2/backup
3 开始训练
YOLOv2已经支持多gpu了,利用voc数据集得到的权重来训练(最好下载作者官网给的权重,这里我用的是上一篇博客里的权重),运行以下命令即可开始
./darknet detector train ./cfg/fddb.data ./cfg/yolo-fddb.cfg backup/yolo-voc_6000.weights -gpus 0,1,2,3
作者:u 发表于 18:28:58 原文链接
阅读:362 评论:0 查看评论
最新发表文章&>&&>&&>&&>&darknet.conv.weights
darknet.conv.weights
上传大小:24.03MB
训练tiny-yolo的预训练模型
综合评分:4.5(2位用户评分)
所需积分:0
下载次数:69
审核通过送C币
创建者:nigelyq
创建者:huangyueranbbc
课程推荐相关知识库
上传者其他资源上传者专辑
课程资源热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
darknet.conv.weights
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:YOLO系列(8)
本文转载自:
http://blog.csdn.net/ch_liu23/article/details/
&最近在用yolo来做视频中的人员检测,选择YOLO是从速度考虑,当然也可以用ssd。YOLO相关可看主页,有相关代码和使用方法。由于之前做自己的数据训练过程中出现各种问题,参照了各种博客才跑通,现在记录下以防后面忘记,也方便自己总结一下。
&&&&& YOLO本身使用的是VOC的数据集,所以可以按照VOC数据集的来构建自己的数据集。
1.构建VOC数据集
1.准备数据
首先准备好自己的数据集,最好固定格式,此处以VOC为例,采用jpg格式的图像,在名字上最好使用像VOC一样类&#.jpg、000002.jpg这样。可参照下面示例代码
读取某文件夹下的所有图像然后统一命名,用了opencv所以顺便还可以改格式。
准备好了自己的图像后,需要按VOC数据集的结构放置图像文件。VOC的结构如下
&&&&& 这里面用到的文件夹是Annotation、ImageSets和JPEGImages。其中文件夹Annotation中主要存放xml文件,每一个xml对应一张图像,并且每个xml中存放的是标记的各个目标的位置和类别信息,命名通常与对应的原始图像一样;而ImageSets我们只需要用到Main文件夹,这里面存放的是一些文本文件,通常为train.txt、test.txt等,该文本文件里面的内容是需要用来训练或测试的图像的名字(无后缀无路径);JPEGImages文件夹中放我们已按统一规则命名好的原始图像。
&&&&& 因此,首先
&&&&& 1.新建文件夹VOC2007(通常命名为这个,也可以用其他命名,但一定是名字+年份,例如MYDATA2016,无论叫什么后面都需要改相关代码匹配这里,本例中以VOC2007为例)
&&&&& 2.在VOC2007文件夹下新建三个文件夹Annotation、ImageSets和JPEGImages,并把准备好的自己的原始图像放在JPEGImages文件夹下
&&&&& 3.在ImageSets文件夹中,新建三个空文件夹Layout、Main、Segmentation,然后把写了训练或测试的图像的名字的文本拷到Main文件夹下,按目的命名,我这里所有图像用来训练,故而Main文件夹下只有train.txt文件。上面说的小代码运行后会生成该文件,把它拷进去即可。
2.标记图像目标区域
&&&&&& 因为做的是目标检测,所以接下来需要标记原始图像中的目标区域。相关方法和工具有很多,这里需用,相关用法也有说明,基本就是框住目标区域然后双击类别,标记完整张图像后点击保存即可。操作界面如下:
通常save之后会将标记的信息保存在xml文件,其名字通常与对应的原始图像一样。最后生成的画风是这样的
其中每个xml文件是这样的画风
注意filename中文件的文件名名没有后缀,因此需要统一加上后缀。只需一段命令即可
在对应目录下执行即可,这样就可以把后缀添上。这样就做按照VOC做好了我们的数据集,接下来就是放到算法中去训练跑起来。
2.用YOLOv2训练
1.生成相关文件
&&& 按darknet的说明编译好后,接下来在darknet-master/scripts文件夹中新建文件夹VOCdevkit,然后将整个VOC2007文件夹都拷到VOCdevkit文件夹下。
&&& 然后,需要利用scripts文件夹中的voc_label.py文件生成一系列训练文件和label,具体操作如下:
&&& 首先需要修改voc_label.py中的代码,这里主要修改数据集名,以及类别信息,我的是VOC2007,并且所有样本用来训练,没有val或test,并且只检测人,故只有一类目标,因此按如下设置
[python]&&
修改好后在该目录下运行命令:python voc_label.py,之后则在文件夹scripts\VOCdevkit\VOC2007下生成了文件夹lable,该文件夹下的画风是这样的
这里包含了类别和对应归一化后的位置(i guess,如有错请指正)。同时在scripts\下应该也生成了train_2007.txt这个文件,里面包含了所有训练样本的绝对路径。
2.配置文件修改
&&&&& 做好了上述准备,就可以根据不同的网络设置(cfg文件)来训练了。在文件夹cfg中有很多cfg文件,应该跟caffe中的prototxt文件是一个意思。这里以tiny-yolo-voc.cfg为例,该网络是yolo-voc的简版,相对速度会快些。主要修改参数如下
另外也可根据需要修改learning_rate、max_batches等参数。这里歪个楼吐槽一下其他网络配置,一开始是想用tiny.cfg来训练的官网作者说它够小也够快,但是它的网络配置最后几层是这样的画风:
这里没有类别数,完全不知道怎么修改,强行把最后一层卷积层卷积核个数修改又跑不通会出错,如有大神知道还望赐教。
&&&&& Back to the point。修改好了cfg文件之后,就需要修改两个文件,首先是data文件下的voc.names。打开voc.names文件可以看到有20类的名称,本例中只有一类,检测人,因此将原来所有内容清空,仅写上person并保存。名字仍然用这个名字,如果喜欢用其他名字则请按一开始制作自己数据集的时候的名字来修改。
&&&&& 接着需要修改cfg文件夹中的voc.data文件。也是按自己需求修改,我的修改之后是这样的画风:
修改后按原名保存最好,接下来就可以训练了。
ps:yolo v1中这些细节是直接在源代码的yolo.c中修改的,源代码如下
比如这里的类别,训练样本的路径文件和模型保存路径均在此指定,修改后从新编译。而yolov2似乎摈弃了这种做法,所以训练的命令也与v1版本的不一样。
3.运行训练
&&&&& 上面完成了就可以命令训练了,可以在官网上找到一些预训练的模型作为参数初始值,也可以直接训练,训练命令为
如果用官网的预训练模型darknet.conv.weights做初始化,则训练命令为
不过我没试成功,加上这个模型直接就除了final,不知道啥情况。当然也可以用自己训练的模型做参数初始化,万一训练的时候被人终端了,可以再用训练好的模型接上去接着训练。
&&&&& 训练过程中会根据迭代次数保存训练的权重模型,然后就可以拿来了,测试的命令同理:
./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg results/tiny-yolo-voc_6000.weights data/images.jpg&&&&& 这样就完成了整个流程,目前测试感觉同种网络v2版本似乎比v1版本慢很多,莫非是为了精度的提高牺牲了部分速度。然而我需要的是速度,这个就尴尬了。
&&&&& 初学yolo,如有问题欢迎加我q讨论交流.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2341次
排名:千里之外
转载:38篇

我要回帖

 

随机推荐