把自己的数据制作成voc2007数据格式用于SSD训练

100 篇文章 8 订阅
44 篇文章 0 订阅

我们使用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      -- modification date
%         bytes     -- number of bytes allocated to the file
%         isdir       -- 1 if name is a directory and 0 if not
%         datenum -- modification date as a MATLAB serial date number
%%
n=1;
for i = 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()  


4.生成lmdb文件

首先进入caffe目录,可以看到/data/VOC0712/有create_list.sh,create_data.sh 和其他文件.我们运行这两个脚本文件就可以转换成mdb数据格式,用于模型训练.

我们制作自己的数据,就可以把该文件夹的create_list.sh和create_data.sh , labelmap_voc.prototxt复制放入自己的文件夹,我的文件夹是(lsq).

注意create_list.sh和create_data.sh中路径的修改,修改为自己的路径,把原来的labelmap_voc.prototxt的类别要改成自己的类别,要不会出错.改完之后运行文件就可以转换成mdb数据格式.

# Create the trainval.txt, test.txt, and test_name_size.txt in data/lsq/    
./data/lsq/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 original image:    
#   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb    
#   - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb    
# and make soft links at examples/VOC0712/    
./data/lsq/create_data.sh  

此时发现执行create_data.sh时还是出错了,报错为:AttributeError: 'module' object has no attribute 'LabelMap',原因是没有添加环境变量,
解决方式:其中$CAFFE_ROOT是本caffe的根目录,注意换成自己的.

echo "export PYTHONPATH=$home/lsq/caffe/python" >> ~/.profile      
source ~/.profile      
echo $PYTHONPATH #检查环境变量的值  

当看到生成lmdb文件就是制作成功了.

到这,数据制作完成.下一篇将如何使用自己制作的数据进行训练.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值