1. 程式人生 > >把自己的資料製作成voc2007資料格式用於SSD訓練

把自己的資料製作成voc2007資料格式用於SSD訓練

我們使用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檔案就是製作成功了.

到這,資料製作完成.下一篇將如何使用自己製作的資料進行訓練.