您的位置:首页 > 其它

SSD Faster-RCNN使用自己的数据fine-tune训练模型

2017-01-04 16:18 531 查看

前言

首先想要说一下,刚开始我是打算fine-tune一下SSD的,然后我只需要分类里面的6类即可,但是SSD给出的VOC数据集标签中是有21类的,并且各个类别之间还会有交叉,还会有的图片有我想要的类别也有没有我想要的类别,但我只想将拥有我想要的那6个类的.xml文件给挑选出来进行训练,所以就用到了如下的Linux脚本处理方法。后来,我发现在自己制作VOC格式数据的时候,也基本上会用到这些知识,所以就分享一下。当然,本人的Linux shell很渣,只是想给同样跟我一样是Linux小白的同学提供一点帮助。

1.查找所有.xml文件中有‘person’字符串的文件,然后将其文件名输出:

find -name "*.xml" -exec grep -l 'person' {} \; -fprint out.txt


其中需要注意的是,-name后面如果文件名中有正则表达式的部分,就需要加入”“,如果没有直接输入文件名即可,不用加入双引号。‘’

fprint 是将查找到的出书到后面的文件中,但是这个文件不会自己创建,必须得先有这个out.txt文件。

这个网址可以查找grep所有的选项:http://www.lampweb.org/linux/3/27.html

2.利用sed删除文件中每行最前面的”./”字符:

sed -i 's/^..//g' person-test.txt


-i 的意思是直接在原文件上修改,’s/’的意思是替换,

3.利用sed将文件中所有.xml字符替换成.jpg字符:

sed -i 's/\.xml/\.jpg/g' person-test.txt


4.使用python 利用得到的.txt文件,将文件中出现的文件名移动到指定文件夹:

import shutil
file = open(r'person-test.txt')
n=0
for out in file.readlines():
print out
shutil.move("/home/fx/code/caffe-ssd-lw/data/VOCdevkit/VOC2012/JPEGImages/"+out.strip(),"/home/fx/code/caffe-ssd-lw/data/VOCdevkit/VOC2012/PersonImages")


其中,shutil模块中,有我们想要用的.move方法。

其中需要注意的是,当这样拼接字符串”“+out时,字符串会自带一个“\n”这样就无法访问到我们想要的文件路径,但是我们加入字符串中的.strip()方法,这个方法就可以删除开始或者结尾的空白字符。

5.当得到这些文件后,我们将他合并到一起。合并有两种方式一种是粘贴到文件的后面,一种是同行合并:

直接将2.txt文件的全部内容粘贴到1.txt文件的全部内容之后:

cat 1.txt 2.txt > out.txt


将2.txt文件的全部内容按相同的行号粘贴到1.txt文件中:

paste -d ' ' 1.txt 2.txt > out.txt


其中,-d 的意思就是按 ” 内的字符分开,这里就打了一个空格,所以粘贴上去的时候就按这一个空格把内容分隔开了。

6.由于有的含有person,bus…这几类的文件中,有我们没有标记的标签,所以在制作数据的时候报错,再写一个小的python程序,把这些xml里包含未声明的标签的文件给去除掉:

import xml.etree.cElementTree as ET
import os
names = ['person','bicycle','car','bus','motorbike']
n=0
directory = open('out.txt')
delete = open('delete.txt','w')
for dir in directory.readlines():
tree = ET.ElementTree(file=dir.strip())
for elem in tree.iter(tag='name'):
if elem.text in names:
print "i get it"
else:
print "i didn't get it"extract
n+=1
delete.write(dir)
break

print n


再得到我们想要的delete.txt文件之后,我们再用一个命令即可得到去除的文件。

grep -v -f delete.txt trainval.txt > trainvla.txt


-v 就是将未匹配到的字符输出。这样就可以把两个文件中不同的东西输出了。

7.如何将一个文件中各行的内容打乱。

见该网址即可:http://www.programgo.com/article/522152370/

最后附上在github上问SSD作者如何利用自己数据fine-tune SSD模型,然后作者给出了如下回答:

You should create a labelmap file for your own data using : https://github.com/weiliu89/caffe/blob/ssd/tools/create_label_map.cpp

And currently it only support annotation whose format is same as VOC or COCO. If not, you should write your own function to read the annotation. You can refer to:https://github.com/weiliu89/caffe/blob/ssd/src/caffe/util/io.cpp#L251 (Parse VOC/ILSVRC detection annotation.)

I would also strongly suggest using this to debug before you train on your own data.:https://github.com/weiliu89/caffe/blob/ssd/examples/ssd.ipynb

参考网址:

同时删除两个文件中相同的部分:http://www.cnblogs.com/raceblog/archive/2011/03/24/shell-delete-comm.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: