日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RCNN系列实验的PASCAL VOC数据集格式设置

發布時間:2024/9/21 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RCNN系列实验的PASCAL VOC数据集格式设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在做RCNN系列的實驗時,往往需要把數據集的格式設置為和PASCAL VOC數據集一樣的格式,其實當然也可以修改讀取數據的代碼,只是這樣更為麻煩,自己的數據格式變了又得修改。?
首先以VOC2008為例,先看一下VOCdevkit的文件夾結構:

VOCdevkit中還有一個devkit_doc.pdf文件,關于PASCAL VOC數據集的所有信息都可以在里面找到。?
我們也按照這樣的樹形結構建好文件夾,把VOC2007和VOC2008換成自己數據集的名字(保留一個即可),local下面也建一個自己數據集的名字的文件夾。SegmentationObject和SegmentationClass就不需要了。?
我們檢測任務所用的數據集只需要JPEGImages、Annotations、ImageSets文件夾。前提是自己要有數據,即圖片和標注好的類別名與坐標。

JPEGImages

把自己所有類別的圖片放到JPEGImages文件夾下,圖片名按類似于000001.jpg、000002.jpg…的格式,不一定非要按數字順序,但是一定不要重名,最好歸一化一下圖片的尺寸。

Annotations

VOCcode中的代碼已經提供了寫注釋文件的東西,我的writexml是仿照VOCdevkit中的VOCwritexml來寫的。假設我的標注都寫到了txt文件里面,且txt文件與相應的圖片同名,形如:

第一行是類別名,第二行是目標的坐標(這里每張圖像只包含一個目標,多目標的標注是差不多的)。下面是寫Annotations的代碼

%writeanno.m path_image='JPEGImages/'; path_label='labels/';%txt文件存放路徑 files_all=dir(path_image);for i = 3:length(files_all)msg = textread(strcat(path_label, files_all(i).name(1:end-4),'.txt'),'%s');clear rec;path = ['./Annotations/' files_all(i).name(1:end-4) '.xml'];fid=fopen(path,'w');rec.annotation.folder = 'lml';%數據集名rec.annotation.filename = files_all(i).name(1:end-4);%圖片名rec.annotation.source.database = 'The lmls Database';%隨便寫rec.annotation.source.annotation = 'The lmls Database';%隨便寫rec.annotation.source.image = 'lml';%隨便寫rec.annotation.source.flickrid = '0';%隨便寫rec.annotation.owner.flickrid = 'I do not know';%隨便寫rec.annotation.owner.name = 'I do not know';%隨便寫img = imread(['./JPEGImages/' files_all(i).name]);rec.annotation.size.width = int2str(size(img,2));rec.annotation.size.height = int2str(size(img,1));rec.annotation.size.depth = int2str(size(img,3));rec.annotation.segmented = '0';%不用于分割rec.annotation.object.name = msg{1};%類別名rec.annotation.object.pose = 'Unspecified';%不指定姿態rec.annotation.object.truncated = '0';%沒有被刪節rec.annotation.object.difficult = '0';%不是難以識別的目標rec.annotation.object.bndbox.xmin = msg{2};%坐標x1rec.annotation.object.bndbox.ymin = msg{3};%坐標y1rec.annotation.object.bndbox.xmax = msg{4};%坐標x2rec.annotation.object.bndbox.ymax = msg{5};%坐標y2writexml(fid,rec,0);fclose(fid); end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
%writexml.m function xml = writexml(fid,rec,depth)fn=fieldnames(rec); for i=1:length(fn)f=rec.(fn{i});if ~isempty(f)if isstruct(f)for j=1:length(f) fprintf(fid,'%s',repmat(char(9),1,depth));a=repmat(char(9),1,depth);fprintf(fid,'<%s>\n',fn{i});writexml(fid,rec.(fn{i})(j),depth+1);fprintf(fid,'%s',repmat(char(9),1,depth));fprintf(fid,'</%s>\n',fn{i});endelseif ~iscell(f)f={f};end for j=1:length(f)fprintf(fid,'%s',repmat(char(9),1,depth));fprintf(fid,'<%s>',fn{i});if ischar(f{j})fprintf(fid,'%s',f{j});elseif isnumeric(f{j})&&numel(f{j})==1fprintf(fid,'%s',num2str(f{j}));elseerror('unsupported type');endfprintf(fid,'</%s>\n',fn{i});endendend end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

ImageSets

ImageSets里只需要用到Main文件夾,而在Main中,主要用到4個文件:?
- train.txt 是用來訓練的圖片文件的文件名列表?
- trianval.txt是用來訓練和驗證的圖片文件的文件名列表?
- val.txt是用來驗證的圖片文件的文件名列表?
- test.txt 是用來測試的圖片文件的文件名列表?
我們希望訓練集、驗證集、測試集的分別是隨機的,下面是實現隨機選取樣本集合與寫txt文件的代碼:

%writetxt.m file = dir('Annotations'); len = length(file)-2;num_trainval=sort(randperm(len, floor(9*len/10)));%trainval集占所有數據的9/10,可以根據需要設置 num_train=sort(num_trainval(randperm(length(num_trainval), floor(5*length(num_trainval)/6))));%train集占trainval集的5/6,可以根據需要設置 num_val=setdiff(num_trainval,num_train);%trainval集剩下的作為val集 num_test=setdiff(1:len,num_trainval);%所有數據中剩下的作為test集 path = 'ImageSets\Main\';fid=fopen(strcat(path, 'trainval.txt'),'a+'); for i=1:length(num_trainval)s = sprintf('%s',file(num_trainval(i)+2).name);fprintf(fid,[s(1:length(s)-4) '\n']); end fclose(fid);fid=fopen(strcat(path, 'train.txt'),'a+'); for i=1:length(num_train)s = sprintf('%s',file(num_train(i)+2).name);fprintf(fid,[s(1:length(s)-4) '\n']); end fclose(fid);fid=fopen(strcat(path, 'val.txt'),'a+'); for i=1:length(num_val)s = sprintf('%s',file(num_val(i)+2).name);fprintf(fid,[s(1:length(s)-4) '\n']); end fclose(fid);fid=fopen(strcat(path, 'test.txt'),'a+'); for i=1:length(num_test)s = sprintf('%s',file(num_test(i)+2).name);fprintf(fid,[s(1:length(s)-4) '\n']); end fclose(fid);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

最后,在訓練時要把VOCCode/VOCinit.m中的VOCopts.dataset即數據集名改為自己的數據集名字,VOCopts.classes即類別名改為自己的類別名字。?
此外多說一個RCNN系列實驗使用數據集的問題,有時候測試的AP值總顯示results為0,發現問題在imdb_eval_voc.m中,改了數據集名字后得不到它想要的年份信息,就不會算AP值,因此也做了一點修改:

代碼風格不好,請高手們盡情鄙視。

總結

以上是生活随笔為你收集整理的RCNN系列实验的PASCAL VOC数据集格式设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。