文章目錄python
1 目標檢測簡介 2 lmdb數據製做 2.1 VOC數據製做 2.2 lmdb文件生成
lmdb格式的數據是在使用caffe進行目標檢測或分類時,使用的一種數據格式。這裏我主要以目標檢測爲例講解lmdb格式數據的製做。git
【1】目標檢測主要有兩個任務:github
【2】目標檢測須要的數據:bash
caffe通常使用lmdb格式的數據,在製做數據以前,咱們須要對數據進行標註,可使用labelImg對圖像進行標註(https://github.com/tzutalin/labelImg),這裏就很少贅述數據標註的問題。總之,咱們獲得了圖像的標註Annotations數據。lmdb數據製做,首先須要將annotations數據和圖像數據製做爲VOC格式,而後將其生成LMDB文件便可。下邊是詳細的步驟:dom
這裏我以caffe環境的Mobilenet+YOLOv3模型的代碼爲例(https://github.com/eric612/MobileNet-YOLO),進行lmdb數據製做,而且也假設你已經對其配置編譯成功(如沒成功,能夠參考博文進行配置),因此咱們的根目錄爲:caffe-Mobilenet-YOLO-master,下邊爲詳細步驟:測試
【1】VOC格式目錄創建:ui
VOC格式目錄主要包含爲:
其中,Annotations裏存儲的是xml標註信息,JPEGImages存儲的是圖片,ImageSets則是訓練和測試的txt列表等信息,下邊咱們就要安裝如上的目錄進行創建咱們本身的數據目錄。spa
建立Annotations、JPEGImages、ImageSets/Main等文件,命令以下(也可直接界面操做哈):3d
注:建議新手按照個人名稱,對於後續文件修改容易!!!code
cd ~/ # 進入home目錄 cd Documents/ # 進入Documents目錄 cd caffe-Mobilenet-YOLO-master/ # 進入咱們的根目錄 cd data # 進入data目錄內 mkdir VOCdevkit # 建立存儲咱們本身的數據的文件夾 cd VOCdevkit mkdir MyDataSet # 建立存儲voc的目錄 cd MyDataSet # 建立VOC格式目錄 mkdir Annotations mkdir JPEGImages mkdir ImageSets cd ImageSets mkdir Main
好啦,咱們的文件夾就創建好了,以下圖所示:
【2】將全部xml文件考入至Annotations文件夾內
【3】將全部圖片考入至JPEGImages文件夾內
【4】劃分訓練接、驗證集合測試集,以下爲Python代碼,須要修改的地方註釋已標明:
import os import random # 標註文件的路徑,須要你本身修改 xmlfilepath=r'/home/Documents/caffe-Mobilenet-YOLO-master/data/VOCdevkit/MyDataSet/Annotations/' # 這裏是存儲數據的本目錄,須要改成你本身的目錄 saveBasePath=r"/home/Documents/caffe-Mobilenet-YOLO-master/data/VOCdevkit/" trainval_percent=0.8 # 表示訓練集和驗證集所佔比例,你須要本身修改,也可選擇不修改 train_percent=0.8 # 表示訓練集所佔訓練集驗證集的比例,你須要本身修改,也可選擇不修改 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) print("train and val size",tv) print("traub suze",tr) ftrainval = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/trainval.txt'), 'w') ftest = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/test.txt'), 'w') ftrain = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/train.txt'), 'w') fval = open(os.path.join(saveBasePath,'MyDataSet/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()
上述代碼修改以後,在根目錄caffe-Mobilenet-YOLO-master執行上述代碼便可,
在data/VOCdevkit/MyDataSet/ImageSets下生成trainval.txt、test.txt、train.txt、val.txt等所需的txt文件,以下圖所示:
這些TXT文件會包含圖片的名字,不帶路徑,以下圖所示:
【1】執行以下命令,將生成lmdb所需的腳本複製至data/VOCdevkit/MyDataSet文件夾內:
cp data/VOC0712/create_* data/MyDataSet/ # 把create_list.sh和create_data.sh複製到MyDataSet目錄 cp data/VOC0712/labelmap_voc.prototxt data/MyDataSet/ # 把labelmap_voc.prototxt複製到MyDataSet目錄
【2】修改create_list.sh文件:
1 第3行修改目錄路徑,截止到VOCdevkit便可
2 第13行修改成for name in MyDataSet(VOCdevkit下本身創建的文件夾名字)
3 第15-18行註釋掉
4 第41行get_image_size修改成本身的路徑(注意,這裏是build caffe_mobilenet_yolo以後纔會造成的):
#!/bin/bash # 若是嚴格安裝我上述的步驟,就能夠不用修改路徑位置。 # 須要修改的位置也使用註釋進行了標註和解釋 # 這裏須要更改,你數據的根目錄位置,須要修改的地方!!!! root_dir="/home/Documents/Caffe_Mobilenet_YOLO/data/VOCdevkit/" sub_dir=ImageSets/Main bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" for dataset in trainval test do dst_file=$bash_dir/$dataset.txt if [ -f $dst_file ] then rm -f $dst_file fi for name in MyDataSet # 若是你創建的不是MyDataSet,這裏須要修改成你本身的名字 do # 這裏須要修改,註釋掉便可 #if [[ $dataset == "test" && $name == "VOC2012" ]] #then # continue #fi echo "Create list for $name $dataset..." dataset_file=$root_dir/$name/$sub_dir/$dataset.txt img_file=$bash_dir/$dataset"_img.txt" cp $dataset_file $img_file sed -i "s/^/$name\/JPEGImages\//g" $img_file sed -i "s/$/.jpg/g" $img_file label_file=$bash_dir/$dataset"_label.txt" cp $dataset_file $label_file sed -i "s/^/$name\/Annotations\//g" $label_file sed -i "s/$/.xml/g" $label_file paste -d' ' $img_file $label_file >> $dst_file rm -f $label_file rm -f $img_file done # Generate image name and size infomation. if [ $dataset == "test" ] then home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
【3】creat_data.sh修改:
1 第2行修改成本身的路徑:root_dir="/home/Documents/caffe-MobileNet-YOLO-master/"
2 第7行修改成:data_root_dir="/home/Documents/caffe-MobileNet-YOLO-master/data/VOVdevkit/
3 第8行修改成:dataset_name="MyDataSet"
4 第9行修改成:mapfile="\(root_dir/data/VOCdevkit/\)dataset_name/labelmap_voc.prototxt"
5 第26行修改成\(root_dir/data/VOCdevkit/\)dataset_name/$subset.txt
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd ) # 修改成本身的路徑 root_dir="/home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/" cd $root_dir redo=1 # 這裏須要修改成本身的路徑 data_root_dir="/home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/data/VOCdevkit/" dataset_name="MyDataSet" # 修改成本身的名字 mapfile="$root_dir/data/VOCdevkit/$dataset_name/labelmap_voc.prototxt" # 修改成本身的路徑 anno_type="detection" db="lmdb" min_dim=0 max_dim=0 width=0 height=0 extra_cmd="--encode-type=jpg --encoded" if [ $redo ] then extra_cmd="$extra_cmd --redo" fi for subset in test trainval # subset.txt路徑須要修改 do python $root_dir/scripts/create_annoset.py --anno-type=$anno_type \ --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width \ --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/VOCdevkit/$dataset_name/$subset.txt \ $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
【3】修改labelmap_voc.prototxt文件:
除了第一個背景標籤部分不要修改,其餘改爲本身的標籤就行,多的刪掉,少了添加進入就行
【4】最後在caffe-MobileNet-YOLO-master/examples文件夾內新建一個MyDataSet文件夾(空的)
【5】運行create_list.sh腳本: ./data/VOCdevkit/MyDataSet/create_list.sh
,運行完後,會在本身建的VOCdevkit/MyDataSet/目錄內生成trainval.txt, test.txt, test_name_size.txt。
【6】運行create_data.sh腳本: ./data/VOCdevkit/MyDataSet/create_data.sh
運行此命令時,提示:bash:./data/VOCdevkit/MyDataSet/create_list.sh:Permission denied,沒有權限,須要執行以下命令賦予執行命令:
chmod u+x data/VOCdevkit/MyDataSet/create_data.sh
出現了錯誤:ValueError: need more than 2 values to unpack,
須要將create_annoset.py中第88行的seg去掉,由於咱們的Annotations只有兩個值,img_file和anno。
運行完後,會在會在本身建的VOCdevkit/MyDataSet目錄內生成lmdb文件夾:
lmdb對應訓練集和測試集的lmdb格式的文件夾:
*** 好啦,今天的教程就到這裏,若有疑問,可關注公衆號【計算機視覺聯盟】私信我或留言交流!!