最近按照博主分享的流程操作,将自己遇到的难题记录下来,附上原博文链接:https://blog.csdn.net/jx232515/article/details/78680724
使用SSD训练自己的数据集,就要制作成voc2007的数据格式,然后才能转化数据格式进行训练.
第一步:首先了解VOC2007数据集的内容
1)JPEGImages文件夹
文件夹里包含了训练图片和测试图片,混放在一起
2)Annatations文件夹
文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片
3)ImageSets文件夹
Action存放的是人的动作,我们暂时不用
Layout存放的人体部位的数据。我们暂时不用
Main存放的是图像物体识别的数据,分为20类,Main里面有test.txt, train.txt, val.txt,trainval.txt.这四个文件我们后面会生成
Segmentation存放的是可用于分割的数据,做检测识别也是用不到的.
4)其他的文件夹不解释了.
如果你下载了VOC2007数据集,那么把它解压,把各个文件夹里面的东西删除,保留文件夹名字。如果没下载,那么就仿照他的文件夹格式,自己建好空文件夹就行。
第二步:处理JPEGSImages文件夹(不重命名也可以).
1)把你的图片放到JPEGSImages里面,在VOC2007里面,人家的图片文件名都是000001.jpg类似这样的,我们也统一格式,把我们的图片名字重命名成这样的.这里提醒下,若是使用软件或者其他代码重命名,一定注意jpg和xml文件一一对应,若有的程序是随机重命名,就要小心jpg和xml文件不对应.
%%
clc;
clear;
maindir='H:\medical_data\voctest\JPEGImage\';
name_long=6;%图片名字的长度,如000001.jpg为6,最多9位,可修改
num_begin=1;%图像命名开始的数字如000123.jpg开始的话就是123
subdir= dir(maindir);
%%
% dir得到的为结构体数组每个元素都是如下形式的结构体:
% name -- filename
% date -- modificationdate
% bytes --number of bytes allocated to the file
% isdir -- 1 if name is a directory and0 if not
% datenum --modification date as a MATLAB serial date number
%%
n=1;
fori = 1:length(subdir)
if ~strcmp(subdir(i).name ,'.') &&~strcmp(subdir(i).name,'..')
img=imread([maindir,subdir(i).name]);
imshow(img);
str=num2str(num_begin,'%09d');
newname=strcat(str,'.jpg');
newname=newname(end-(name_long+3):end);
system(['rename '[maindir,subdir(i).name] ' ' newname]);
num_begin=num_begin+1;
fprintf('已经处理%d张图片\n',n);
n=n+1;
pause(0.1);%可以把暂停去掉
end
end
3.生成Annatations
网上很多教程,但是我觉得都很麻烦,直到我遇到了一位大神做的软件,手动标注,会自动生成图片信息的xml文件
1)在这里下载:https://github.com/tzutalin/labelImg,使用很简单
2)保存的路径就是我们的Annatations文件夹,
3)一张张的慢慢画框.做标签.
4.第四步:生成ImageSets文件夹中的Main文件夹中的四个文件. test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集.VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%,下面的代码生成这四个文件,百分比可以自己调整.
import os import random trainval_percent = 0.7 train_percent = 0.5 xmlfilepath = 'Annotations' txtsavepath = 'ImageSets\Main' total_xml = os.listdir(xmlfilepath) num=len(total_xml) list=range(num) tv=int(num*trainval_percent) tr=int(tv*train_percent) trainval= random.sample(list,tv) train=random.sample(trainval,tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w') ftest = open('ImageSets/Main/test.txt', 'w') ftrain = open('ImageSets/Main/train.txt', 'w') fval = open('ImageSets/Main/val.txt', 'w') for i in list: name=total_xml[i][:-4]+'\n' if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close() ftest .close() </span>
4.生成lmdb文件
首先进入caffe目录,可以看到/data/VOC0712/有create_list.sh,create_data.sh和其他文件.我们运行这两个脚本文件就可以转换成lmdb数据格式,用于模型训练.
我们制作自己的数据,就可以把该文件夹的create_list.sh和create_data.sh, labelmap_voc.prototxt复制放入自己的文件夹,我的文件夹是(zyt).
注意create_list.sh和create_data.sh中路径的修改,修改为自己的路径,把原来的labelmap_voc.prototxt的类别要改成自己的类别,
将该文件中的类别修改成和自己的数据集相匹配,注意需要保留一个label0, background类别,要不会出错。
(1)create_list.sh修改如下:
root_dir=$HOME/data/VOCdevkit/(本人仿照VOC2007和VOC2012,也将制作的数据集zyt文件夹存放于HOME/data/VOCdevkit目录下,若数据集不是该路径,此行代码要进行修改)
sub_dir=ImageSets/Main
bash_dir="$(cd"$(dirname "${BASH_SOURCE[0]}")" && pwd)"
fordataset in trainval test
do
dst_file=$bash_dir/$dataset.txt
if[ -f $dst_file ]
then
rm-f $dst_file
fi
forname in zyt# VOC2012
do
if[[ $dataset == "test" && $name == "VOC2012"]]
then
continue
(2)create_data.sh修改如下:
cur_dir=$(cd$( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..
cd$root_dir
redo=1
data_root_dir="$HOME/data/VOCdevkit"
dataset_name="zyt"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0
extra_cmd="--encode-type=jpg--encoded"(若数据集图片格式为png,则讲jpg改为png)
改完之后进入home/caffessd/caffe目录下,用命令运行分别以下两个文件就可以转换成lmdb数据格式.
#Create the trainval.txt, test.txt, and test_name_size.txt incaffessd/caffe/data/zyt/
./data/zyt/create_list.sh
#You can modify the parameters in create_data.sh if needed.
#It will create lmdb files for trainval and test with encoded originalimage:
# -$HOME/data/VOCdevkit/zyt/lmdb/zyt_trainval_lmdb (lmdb和zyt_trainval_lmdb这两个文件夹是生成的 )
# -$HOME/data/VOCdevkit/zyt/lmdb/zyt_test_lmdb (lmdb和zyt_test_lmdb这两个文件夹是生成的 )
#and make soft links at caffessd/caffe/examples/zyt/ (此examples目录下的zyt文件夹是生成的 )
./data/zyt/create_data.sh
此时发现执行create_data.sh时还是出错了,报错为:AttributeError:'module' object has no attribute'LabelMap',原因是没有添加环境变量,
解决方式:其中$CAFFE_ROOT是本caffe的根目录,注意换成自己的.
echo"export PYTHONPATH=$home/zyt/caffe/python">> ~/.profile
source ~/.profile
echo $PYTHONPATH #检查环境变量的值
当看到生成lmdb文件就是制作成功了.
至此,数据制作完成.下一步即可考虑如何使用自己制作的数据进行训练.