将数据集做成VOC2007格式用于Faster-RCNN训练

[置顶] 将数据集做成VOC2007格式用于Faster-RCNN训练

29068人阅读 评论(336) 收藏 举报
本文章已收录于:
分类:
作者同类文章X

    目录(?)[+]

    1. 文件夹名
    2. 图片命名
    3. 画目标包围框
    4. 做xml
    5. 保存xml到Annotations
    6. 将训练图片放到JPEGImages
    7. ImageSetsMain里的四个txt文件


    0.文件夹名

    首先,确定你的数据集所放的文件夹名字,例如我的叫logos。

    (或者和voc2007一样的名字:VOC2007)

    1.图片命名

    虽然说图片名对训练没什么影响,但建议还是按VOC2007那样,如“000005.jpg”这种形式。至于图片格式,代码里是写的jpg。
    批量修改图片名字为VOC2007格式可以参考以下Matlab代码:
    [plain] view plaincopy
    print?在CODE上查看代码片派生到我的代码片
    1. %%  
    2. %图片保存路径为:  
    3. %E:\image\car  
    4. %E:\image\person  
    5. %car和person是保存车和行人的文件夹  
    6. %这些文件夹还可以有多个,  
    7. %放在image文件夹里就行  
    8. %该代码的作用是将图片名字改成000123.jpg这种形式  
    9. %%  
    10. clc;  
    11. clear;  
    12.   
    13. maindir='E:\image\';  
    14. name_long=5; %图片名字的长度,如000123.jpg为6,最多9位,可修改  
    15. num_begin=1; %图像命名开始的数字如000123.jpg开始的话就是123  
    16.   
    17. subdir = dir(maindir);  
    18. n=1;  
    19.   
    20. for i = 1:length(subdir)  
    21.   if ~strcmp(subdir(i).name ,'.') && ~strcmp(subdir(i).name,'..')  
    22.      subsubdir = dir(strcat(maindir,subdir(i).name));  
    23.     for j=1:length(subsubdir)  
    24.          if ~strcmp(subsubdir(j).name ,'.') && ~strcmp(subsubdir(j).name,'..')  
    25.             img=imread([maindir,subdir(i).name,'\',subsubdir(j).name]);  
    26.             imshow(img);  
    27.             str=num2str(num_begin,'%09d');  
    28.             newname=strcat(str,'.jpg');  
    29.             newname=newname(end-(name_long+3):end);  
    30.             system(['rename ' [maindir,subdir(i).name,'\',subsubdir(j).name] ' ' newname]);  
    31.             num_begin=num_begin+1;  
    32.             fprintf('当前处理文件夹%s',subdir(i).name);  
    33.             fprintf('已经处理%d张图片\n',n);  
    34.             n=n+1;  
    35.            pause(0.1);%可以将暂停去掉  
    36.          end  
    37.     end  
    38.   end  
    39. end  
    %%
    %图片保存路径为:
    %E:\image\car
    %E:\image\person
    %car和person是保存车和行人的文件夹
    %这些文件夹还可以有多个,
    %放在image文件夹里就行
    %该代码的作用是将图片名字改成000123.jpg这种形式
    %%
    clc;
    clear;maindir='E:\image\';
    name_long=5; %图片名字的长度,如000123.jpg为6,最多9位,可修改
    num_begin=1; %图像命名开始的数字如000123.jpg开始的话就是123subdir = dir(maindir);
    n=1;for i = 1:length(subdir)if ~strcmp(subdir(i).name ,'.') && ~strcmp(subdir(i).name,'..')subsubdir = dir(strcat(maindir,subdir(i).name));for j=1:length(subsubdir)if ~strcmp(subsubdir(j).name ,'.') && ~strcmp(subsubdir(j).name,'..')img=imread([maindir,subdir(i).name,'\',subsubdir(j).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,'\',subsubdir(j).name] ' ' newname]);num_begin=num_begin+1;fprintf('当前处理文件夹%s',subdir(i).name);fprintf('已经处理%d张图片\n',n);n=n+1;pause(0.1);%可以将暂停去掉endendend
    end
    图片名如果比较特殊或者像1(1).jpg等这类可能无法重命名,可以使用imwrite,如:

    [html] view plaincopy
    print?在CODE上查看代码片派生到我的代码片
    1. imwrite(img,strcat(save_path,newname));%改名后保存到另一文件夹,原图片不变  
    imwrite(img,strcat(save_path,newname));%改名后保存到另一文件夹,原图片不变
    也可以使用Total Commander来批量重命名,非常方便,推荐使用这个工具。
    下载地址:Total Commander破解版

    2.画目标包围框

    将图片中所框的目标信息保存起来,我的是保存到txt里,如下:
    [plain] view plaincopy
    print?在CODE上查看代码片派生到我的代码片
    1. 000002.jpg car 44 28 132 121  
    2. 000003.jpg car 54 19 243 178  
    3. 000004.jpg car 168 6 298 164  
    000002.jpg car 44 28 132 121
    000003.jpg car 54 19 243 178
    000004.jpg car 168 6 298 164
    前面是图片名,中间是目标类别,最后是目标的包围框坐标(左上角和右下角坐标)。

    打框的代码(c++)我封装成了dll,下载地址:图像标注VS2013项目 (我的环境是win7vs2013旗舰版,win8 win10好像不能运行)


    或者下这个EXE版本的(win7下用cmd运行,win8 win10可能运行不了):图像标注EXE

    2016-10-18:
    上面标注的代码使用的是别人封装的opencv动态库,现在修改为opencv2.4.10,64位,vs2013,按网上教程配置好opencv,资源地址:
    图像标注EXE-2016-10-18

    上面的代码好像忘写操作说明了,这里写一下:
    (1)图片显示出来后,输入法切换到英文;
    (2)在目标的左上角按下鼠标左键,拉一个包围框到目标右下角,然后键盘输入标签(一个字符)
    (3)继续(2)操作,直到框完该张图片上的目标;
    (4)按n进入下一张,esc退出。
    注意:标签只能输入一个字符,你可以在生成的txt文件中替换成你实际的标签。

    3.做xml

    将第2步得到的txt转成xml。 如果每张图片有一个或多个包围框,可参考代码:VOC2007xml(这份代码生成的xml训练Matlab版本的FRCNN可能会出错,最好用下面修改过的)
    这份代码生成的xml第一行含有版本和编码信息:<?xml version="1.0" encoding="utf-8"?>,并且含有空格,用来训练Faster RCNN可能会有问题,如下:

    (左边是VOC2007数据集中的xml,右边是上面代码生成的xml(第一行我删掉了),用Notepad打开就可以看到)

    VOC2007中的xml前面是tab字符(左边那些箭头),上面代码生成的xml是空格(那些小黄点),所以,必须将空格转换成tab,下载修改过的代码:VOC2007xml_new
    (下载VOC2007xml_new就可以了,不用下载VOC2007xml,不过如果xml用作其他用途还是可以的)
    最终,得到的xml就和VOC一样。

    2016-11-24:
    上面做xml的代码请下载修改过的代码!!!因为第一份代码带有<?xml version="1.0" encoding="utf-8"?>以及空格,训练会出错的!!!本来想把第一份代码删掉的,但是csdn好像没法删资源啊!!!
    代码是Matlab(2014b)写的,没怎么优化,当时想的就是功能能实现就行。
    另外,如果同一幅图上有多个目标,保存在txt文件中的包围框信息需要连续存放。

    4.保存xml到Annotations

    新建一个文件夹,名字为Annotations,将xml文件全部放到该文件夹里。

    5.将训练图片放到JPEGImages

    新建一个文件夹,名字为JPEGImages,将所有的训练图片放到该文件夹里。

    6.ImageSets\Main里的四个txt文件

    新建文件夹,命名为ImageSets,在ImageSets里再新建文件夹,命名为Main。
    我们可以通过xml名字(或图片名),生成四个txt文件,即:

    txt文件中的内容为:
    [plain] view plaincopy
    print?在CODE上查看代码片派生到我的代码片
    1. 000005  
    2. 000027  
    3. 000028  
    4. 000033  
    5. 000042  
    6. 000045  
    7. 000048  
    8. 000058  
    000005
    000027
    000028
    000033
    000042
    000045
    000048
    000058

    即图片名字(无后缀),test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集.VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。可参考以下代码:
    [html] view plaincopy
    print?在CODE上查看代码片派生到我的代码片
    1. %%  
    2. %该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt  
    3. %trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;  
    4. %上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些  
    5. %%  
    6. %注意修改下面四个值  
    7. xmlfilepath='E:\Annotations';  
    8. txtsavepath='E:\ImageSets\Main\';  
    9. trainval_percent=0.5;%trainval占整个数据集的百分比,剩下部分就是test所占百分比  
    10. train_percent=0.5;%train占trainval的百分比,剩下部分就是val所占百分比  
    11.   
    12.   
    13. %%  
    14. xmlfile=dir(xmlfilepath);  
    15. numOfxml=length(xmlfile)-2;%减去.和..  总的数据集大小  
    16.   
    17.   
    18. trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));  
    19. test=sort(setdiff(1:numOfxml,trainval));  
    20.   
    21.   
    22. trainvalsize=length(trainval);%trainval的大小  
    23. train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));  
    24. val=sort(setdiff(trainval,train));  
    25.   
    26.   
    27. ftrainval=fopen([txtsavepath 'trainval.txt'],'w');  
    28. ftest=fopen([txtsavepath 'test.txt'],'w');  
    29. ftrain=fopen([txtsavepath 'train.txt'],'w');  
    30. fval=fopen([txtsavepath 'val.txt'],'w');  
    31.   
    32.   
    33. for i=1:numOfxml  
    34.     if ismember(i,trainval)  
    35.         fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));  
    36.         if ismember(i,train)  
    37.             fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));  
    38.         else  
    39.             fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));  
    40.         end  
    41.     else  
    42.         fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));  
    43.     end  
    44. end  
    45. fclose(ftrainval);  
    46. fclose(ftrain);  
    47. fclose(fval);  
    48. fclose(ftest);  
    %%
    %该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
    %trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;
    %上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
    %%
    %注意修改下面四个值
    xmlfilepath='E:\Annotations';
    txtsavepath='E:\ImageSets\Main\';
    trainval_percent=0.5;%trainval占整个数据集的百分比,剩下部分就是test所占百分比
    train_percent=0.5;%train占trainval的百分比,剩下部分就是val所占百分比%%
    xmlfile=dir(xmlfilepath);
    numOfxml=length(xmlfile)-2;%减去.和..  总的数据集大小trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
    test=sort(setdiff(1:numOfxml,trainval));trainvalsize=length(trainval);%trainval的大小
    train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
    val=sort(setdiff(trainval,train));ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
    ftest=fopen([txtsavepath 'test.txt'],'w');
    ftrain=fopen([txtsavepath 'train.txt'],'w');
    fval=fopen([txtsavepath 'val.txt'],'w');for i=1:numOfxmlif ismember(i,trainval)fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));if ismember(i,train)fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));elsefprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));endelsefprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));end
    end
    fclose(ftrainval);
    fclose(ftrain);
    fclose(fval);
    fclose(ftest);
    

    这四个txt放在ImageSets\Main中。

    这样,数据集就基本做好了。然后新建文件夹,名字为logos(第0步确定的名字),将上面三个文件夹放到这里,即logos文件夹里有三个文件夹:


    将logos文件夹拷贝到datasets\VOCdevkit2007里就可以了。
    (或者替换voc2007数据集中的Annotations、ImageSets和JPEGImages,免去一些训练的修改)

    Matlab版本faster-rcnn训练过程看http://blog.csdn.net/sinat_30071459/article/details/50546891;
    python版本faster-rcnn训练过程看http://blog.csdn.net/sinat_30071459/article/details/51332084。

    
    上面说到的代码(图像批量重命名、制作XML,制作TXT)已打包可下载:制作VOC2007数据集用到的代码 
    以及画包围框的代码:图像标注
    注意:如果你的下载积分不够,请留邮箱我发给你。
    (2016-10-07前评论留邮箱的应该都发了,可以找他们转发一下)
    42
    0

    我的同类文章

    http://blog.csdn.net
    • Windows下配置R-FCN2016-07-11
    • Faster-RCNN+ZF用自己的数据集训练模型(Python版本)2016-05-06
    • 关于 epoch、 iteration和batchsize2016-02-23
    • Faster-RCNN+ZF用自己的数据集训练模型(Matlab版本)2016-01-20
    • Linux下python matplotlib.pyplot在图像上显示中文的问题2016-06-16
    • Windows下用VS2013加载caffemodel做图像分类2016-11-25
    • 梯度下降和随机梯度下降为什么能下降?2016-02-22

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510305.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    快速排序的实现--代码

    #include<stdio.h>int a[10000]; void QickSort(int a[],int l,int r) {int temp;int il,jr;if(l<r){tempa[l];//存val的值while(i!j){while(j>i&&a[j]>temp) --j;// 从右往左找出该数比val值小的数if(i<j){a[i]a[j];//放在val的左 边i;//i右移动}wh…

    SSD框架训练自己的数据集

    SSD框架训练自己的数据集 SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证。本文介绍如何使用SSD实现对自己数据集的训练和验证过程&#xff0c;内容包括&#xff1a; 1 数据集的标注2 数据集的转换3 使用SSD如何训练4 使用SSD如何测试1 数据集的标注 …

    归并排序的实现-代码

    #include<stdio.h> void merge_sort(int *a,int *b,int x,int y) { if(y-x>1) { int mx(y-x)/2;//中间点的坐标 int px,qm,ix; merge_sort(a,b,x,m); merge_sort(a,b,m,y); while(p<m||q<y) { if(q>y||(p<m&&a[p]<a[q])) b[i]…

    SSD+caffe︱Single Shot MultiBox Detector 目标检测+fine-tuning(二)

    承接上一篇SSD介绍&#xff1a;SSDcaffe︱Single Shot MultiBox Detector 目标检测&#xff08;一&#xff09; 如果自己要训练SSD模型呢&#xff0c;关键的就是LMDB格式生成&#xff0c;从官方教程weiliu89/caffe来看&#xff0c;寥寥几行code&#xff0c;但是前面的数据整理…

    把图片存成视频 python

    tips: 1.保存的图片大小一定要一样 2.图像做好是标准的视频格式大小 3.图片要和视频size一样大小 代码如下 # -*- coding:utf8 -*- import os import cv2 import numpy as np import cv2.cv as cv path /home/m/mycode/cv filelist os.listdir(path) total_num len(f…

    sdut 双向队列(STL)

    deque<ll>q;//定义一个双向队列q&#xff0c;类型为long long q.push_front(a);//将a从队首插入队列 q.push_back(a);//将a从队尾插入队列 q.pop_front();//队首弹掉一个元素 q.pop_back();//队尾弹出一个元素 aq.front();//返回队首元素 aq.back();//返回队尾元素 aq.si…

    给文件重命名

    # -*- coding:utf8 -*-import osclass BatchRename():批量重命名文件夹中的图片文件def __init__(self):self.path home/l/imagedef rename(self):filelist os.listdir(self.path)total_num len(filelist)i 0for item in filelist:if item.endswith(.jpg):src os.path.joi…

    pip install scikit-image on windows 失败 解决方案

    到官网下载包 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-image 我们下载 scikit_image‑0.13.0‑cp35‑cp35m‑win_amd64.whl 也可到我的CNDS下载 安装时会出现一下错误 scikit_image-0.13.0-cp34-none-win_amd64.whl is not a supported wheel on this platform…

    sdut 数据结构实验之排序三:bucket sort

    一开始这种做法超时&#xff1a; #include<stdio.h>int b[5000000],a[5000000],n,ans; void merge_sort(int *a,int *b,int x,int y) {if(y-x>1){int mx(y-x)/2;//中间点的坐标int px,qm,ix;merge_sort(a,b,x,m);merge_sort(a,b,m,y);while(p<m||q<y){if(q>…

    Caffe训练源码基本流程

    苏的专栏 致力于学习计算机视觉、模式识别、机器学习、深度学习相关技术&#xff1a;&#xff1a;&#xff1a;&#xff1a;希望结识更多同道中人。 QQ&#xff1a;2816568984 微信&#xff1a;Suc1011 目录视图 摘要视图 订阅 【活动】2017 CSDN博客专栏评选 【评论送书】…

    fatal error: GL/glew.h: 没有那个文件或目录

    搜索libglew的版本 #apt-cache search glew libglew-dbg - OpenGL Extension Wrangler (debugging symbols) libglew-dev - OpenGL Extension Wrangler - development environment libglew1.13 - OpenGL Extension Wrangler - runtime environment libglewmx-dbg - OpenGL E…

    运行cudasift

    文件中有cmakelist.txt 运行命令 cmake . 就会生成makefile type: make 出现错误&#xff1a; /usr/bin/ld: 找不到 -lopencv_dep_cudart 在cmake 时候用一下指令&#xff1a; cmake -D CUDA_USE_STATIC_CUDA_RUNTIMEOFF . make的时候可能会出现以下错误 make[2]: …

    电脑DNS修复

    首先在dos窗口下输入以下命令&#xff1a; ipconfig/displaydns 可以看到当前的缓存的所有DNS记录&#xff1a; 然后&#xff1a; ipconfig/flushdns 刷新当前的DNS

    数据结构实验之排序七:选课名单(卡内存的一道题。。坑)

    RE。。。 带更正 #include<iostream> #include<algorithm> using namespace std; #include<cstdio> #include<cstring> struct people {char name[100];int sum_class;int cl[2005]; }a[40000],b[40000]; int cmp(people a,people b) {char t[100],l[…

    /usr/bin/ld: 找不到 -lopencv_dep_cudart

    make出现/usr/bin/ld: 找不到 -lopencv_dep_cudart错误时候 我们在cmake时候加上参数 cmake -D CUDA_USE_STATIC_CUDA_RUNTIMEOFF .

    ubuntu16.04下安装opencv3.2版本

    1、下载OpenCV的源码 OpenCV官网上有linux版本的源码包可以下载&#xff0c;不过最好是从git上下载&#xff0c;这样可以保证下载得到的是最新的代码&#xff1a;1 wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.2.0.zip 2 unzip opencv.zip 2、编译安装…

    数据结构实验之栈六:下一较大值(二)

    #include <bits/stdc.h> #include <iostream> using namespace std; struct node {int data;int next;//记录下一个元素死亡值int pos;//用来记录每个元素的位置*/ } a[100001],val[100000]; int main() {int t;while(~scanf("%d",&t)){int l0;while…

    双系统安装ubuntu后没有windows启动项

    打开terminal&#xff0c;sudo update-grub 如果看到windows的选项的话&#xff0c;下次重启就有了

    ubunut安装分区建议

    如果50g安装ubuntu 分为4个区 / :根目录区相当于windows 的C盘 我建议分20G swap:交换空间我建议分2G boot:我建议分200M home:把剩下的都分给home目录。

    strchr函数的用法

    【FROM MSDN && 百科】 原型&#xff1a; char *strchr(const char *s,char c); #include<string.h> 查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针&#xff0c;如果s中不存在c则返回NULL。 //#define FIRST_DEMO #define SECOND_DEMO #ifdef F…