1. 程式人生 > >處理生成VOC的資料格式的test.txt train.txt trainval.txt val.txt 和SSD的imdb資料格式以及ssd的訓練

處理生成VOC的資料格式的test.txt train.txt trainval.txt val.txt 和SSD的imdb資料格式以及ssd的訓練

VOC的資料格式就是在VOC資料夾下:準備三個資料夾

1、

Annotations裡面放標註好的xml檔案使用的這個工具,

參考http://blog.csdn.net/jesse_mx/article/details/53606897。可以直接看部落格最後面,下載最新版,下載解壓直接用,下載網址:http://tzutalin.github.io/labelImg/(不知道怎麼回事,就正常打開了一次,就打不開了,閃退)

然後還是變成部落格裡面的方法。

先按照部落格論文下載annocoda 網址https://www.continuum.io/downloads#windows    下載安裝以後   

啟動執行annocoda Prompt

在這個環境下,進入labelImg.py的目錄下執行python labelImg.py可以開啟。
如果想要校正之前已經標註好的檔案,先用Ctrl+R載入已經標註好的xml檔案。然後在Open Dir開啟原始圖片的目錄,修改以後儲存就可以了。

部落格裡面說路徑不要帶中文,在ubuntu系統下確實是不能用中文,結果發現在windows下以上的方法可以帶中文。

2、

ImageSets  下的Main資料夾裡面放 test.txt train.txt trainval.txt val.txt這四個txt檔案裡面是幾種資料集的圖片編號

-train.txt 是用來訓練的圖片檔案的檔名列表 
- val.txt是用來驗證的圖片檔案的檔名列表 

- trianval.txt是用來訓練和驗證的圖片檔案的檔名列表

- test.txt 是用來測試的圖片檔案的檔名列表 

這四個檔案的生成需要用matlab指令碼,具體想生成什麼樣的,可以改程式碼。

函式:

function [test_index, trainval_index, train_index,val_index] = getdataset(imagepath)
%imagepath = 'data/stairs';
images_name = dir(imagepath);
len = length(images_name);
for i = 3:len
    name(i-2,1) = {images_name(i).name(1:end-4)};
end image_orign = name; len2 = len-2;
index = randperm(len2);  %生成隨機的下標
test_num = len2/2;%測試樣本數目
trainval_num = len2 - test_num;
train_num = trainval_num/2;%訓練樣本數目
val_num = trainval_num - train_num;%驗證集數目 test_index = image_orign(index(1:test_num),:); %將隨機選取後的數列的一半給test,一半給trainval
trainval_index = image_orign(index(test_num+1:end),:);
train_index = image_orign(index(test_num+1:test_num+train_num),:);%將trainval的一半給train,一半給val
val_index = image_orign(index(test_num+train_num+1:end),:); 生成資料集test.txt train.txt trainval.txt val.txt %將資料集劃分為四部分,分別是訓練集、測試集、驗證集、訓練-驗證集。
[test_index, trainval_index, train_index,val_index] = getdataset('E:\data\Annotations');%讀取所有的資料檔案 path = 'E:\data\6_20_訓練總資料集\ImageSets\Main\';%劃分後的資料集儲存路徑
name1 = [path,'test.txt'];
name2 = [path,'trainval.txt'];
name3 = [path,'train.txt'];
name4 = [path,'val.txt']; fid1 = fopen(name1,'w');
fid2 = fopen(name2,'w');
fid3 = fopen(name3,'w');
fid4 = fopen(name4,'w'); for i = 1:length(test_index)
    fprintf(fid1,'%s\n',test_index{i});
end for i = 1:length(trainval_index)
    fprintf(fid2,'%s\n',trainval_index{i});
end for i = 1:length(train_index)
    fprintf(fid3,'%s\n',train_index{i});
end for i = 1:length(val_index)
    fprintf(fid4,'%s\n',val_index{i});
end fclose all; %將新標註的檔案(“新加類別原始檔案”)作為訓練集
path_label_new='E:\資料集重新標註\新加類別原始檔案';%新標記的標籤
path_data_merge = 'E:\資料集重新標註\data_更新\';
label_files_all=dir(path_label_new);
for i = 3:length(label_files_all)
    label_i_dir = strcat(path_label_new,'\',label_files_all(i).name,'\001');
    label_i_files = dir(label_i_dir);
    for j = 3:length(label_i_files)
        train_index_j = label_i_files(j).name(1:end-4);
        trainval_index_j = label_i_files(j).name(1:end-4);
        name2 = [path_data_merge,label_files_all(i).name,'_trainval.txt'];
        name3 = [path_data_merge,label_files_all(i).name,'_train.txt'];
        fid2 = fopen(name2,'a+');
        fid3 = fopen(name3,'a+');
        fprintf(fid2,'%s\n',train_index_j);
        fprintf(fid3,'%s\n',trainval_index_j);
        fclose all;
    end
end
fprintf('done!\n');

JPEGImages 下放沒處理的原始圖片。

準備好Annotations ImageSets ImageSets這三個資料夾以後, 用VOC裡面自帶的指令碼來生成lmdb格式的資料。

把/data/VOC0712(沒有這個資料夾的返回下載caffe那裡,執行git checkout ssd)目錄下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 這三個檔案拷貝到/mydataset下

然後把準備好的資料也拷貝到這個資料夾下。

執行以下兩條命令

./data/mydataset/create_list.sh

./data/mydataset/create_data.sh

生成最終的imdb格式資料

對這三個檔案進行說明一下:labelmap_voc.prototxt開啟是進行設定標籤的,要檢測識別的內容設定。

create_list.sh生成訓練資料的list

root_dir=$HOME/data/VOCdevkit/ 改成你資料的存放路徑根目錄的上一層 sub_dir=ImageSets/Main為根目錄下的副目錄路徑 $bash_dir/../../這裡也要根據自己的路徑改好 就是哪裡報錯找不到然後定位改那裡。 把下面這一段
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
rm -f $dst_file
fi
for name in VOC2007 VOC2012
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
fi
echo "Create list for $name $dataset..."
改成你需要的資料夾部分
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
rm -f $dst_file
fi
name=mydata
echo "Create list for $name $dataset..."
或者直接刪掉下面這些程式碼,還有最後的那個done
fi
for name in VOC2007 VOC2012
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
fi
然後執行create_list.sh 生成test.txt test_name_size.txt trainval.txt test.txt和trainval.txt的內容是,轉成一張圖片的名稱+圖片對應.xml的格式
遇到的問題: E0824 18:30:38.277745  2376 io.cpp:187] Could not open or find file /home/ssd/caffe/data/idcard/mydata/JPEGImages/496id E0824 18:30:38.278219  2376 io.cpp:187] Could not open or find file /home/ssd/caffe/data/idcard/mydata/Annotations/496id

出現這個問題的原因是:

/ImageSets/Main/下的訓練檔案 test.txt,trainval.txt(我在windows下用程式生成的)的分行符是windows格式的換行(0d0a)(\r\n),而create_list.sh則按unix格式換行(0a)(\n)來處理的,導致生成的臨時檔案(caffe/data/VOC0712/test.txt,val.txt)的換行都是錯的。

解決方法:在ubuntu環境下再把Main下的幾個檔案內容複製一遍到新檔案裡。



create_data.sh 的作用是生成imdb格式的資料

需要修改的地方還是路徑

root_dir=$cur_dir/../.. data_root_dir這是存放上一步生成的test.txt test_name_size.txt trainval.txt的目錄 dataset_name=mydataset是資料集的名字。 然後生成lmdb的檔案。 這樣自己的資料就算生成了

下一步修改ssd_pascal.py進行訓練。 需要修改的地方就是訓練和測試資料imdb的路徑 train_data = test_data = job_dir=儲存訓練過程中的日誌檔案的路徑 等等路徑吧,需要改的都改一下。 有些引數也需要改: num_classes 檢測類別 gpus是gpu編號 batch_size accum_batch_size 改小一點,我改成8 'stepvalue'等引數根據自己情況設定一下。 num_test_image測試圖片數量 560行建議把caffe的bin檔案改成絕對路徑 執行ssd_pascal.py 報錯: from: can't read /var/mail/__future__
from: can't read /var/mail/caffe.model_libs
from: can't read /var/mail/google.protobuf 解決: 指令碼前面加上:#!/usr/bin/env python