用Caffe進行模型訓練時,除了用現有的公開數據集(如MNIST, CIFAR等),有時候我們還需要創建自己的數據集進行訓練。本篇博客講的就是如何利用Caffe中的模塊創建自己lmdb數據集。
數據集準備
我們需要自己準備好帶類別標籤的圖片數據,並將數據統一命名,這裏爲了方便,我直接從CIFAR10訓練集中拿出5000張圖片用於製作驗證集,圖片爲.png格式,並採用‘圖片編號_類別標籤.png’的命名方式(這個實現起來應該不難,這裏就不贅述了),保存在一個文件夾下,部分例子如下:
創建圖片名列表清單
這裏我們需要創建一個txt文本用來存放所有圖片的信息,文本中每行存放一個樣本,內容包括圖片名和類別標籤信息,中間用空格分開。這個實現方法很多,這裏我給出一個用python實現的方法:
import os
def create_image_list(file_path,txtpath):
"""
Create a list of all images and save to a '.txt' file, each image is
named as'num_label.png'. For example: 1001_2.png
Inputs:
file_path: path of image file
txtpath: '.txt' file used to save all images' names and labels
Return: none
"""
# remove the old list file
if os.path.isfile(txtpath):
os.remove(txtpath)
# get the name list of all images
image_name_list = os.listdir(file_path)
# save the names and labels of all images to the '.txt' file named 'txtname'
with open(txtpath,'a') as f:
print 'saving to '+txtpath+'...'
for image_name in image_name_list:
image_label = image_name.split('_')[1].split('.')[0]
image_data = image_name+' '+image_label
f.write(image_data+'\n')
print 'done.'
注意:代碼中輸入參數的路徑都是絕對路徑,當然如果感覺用絕對路徑麻煩也該以稍微改動一下變成相對路徑。
自己寫代碼調用上面這個函數,就可以生成下面的txt文本:
生成lmdb文件
這裏我們用到的是Caffe下自帶的convert_imageset可執行文件,如果你已經成功編譯Caffe,這個文件應該在caffe-master/build/tools/下。要用這個可執行文件,我們需要提供三個路徑,分別是原始圖片數據存放路徑、圖片列表清單路徑(就是之前生成的txt文本路徑)和生成的lmdb文件存放路徑,這裏給出我之前轉化數據集時用的腳本:
#!/bin/bash
# convert images to lmdb
DATA=/home/meringue/DataBase/cifar-10-batches-py
IMGDIRNAME=train_valid
IMGLIST=img_name_list/train_valid.txt
LMDBNAME=train_valid_lmdb
rm -rf $DATA/$LMDBNAME
echo 'converting images...'
/home/meringue/Softwares/caffe-master/build/tools/convert_imageset --shuffle=true \
$DATA/$IMGDIRNAME/ $DATA/$IMGLIST $DATA/$LMDBNAME
上面代碼中的參數shuffle=true表示打亂數據,還有很多其他參數設置可以在caffe-master/tools/convert_imageset.cpp中查看。
轉化速度很快,運行結束後,我們可以在程序中指定的lmdb路徑下看到類似下面的文件:
爲了保險起見,最好看一下data.mdb這個文件的大小,當你的數據比較大的時候,這個文件也因該很大。如果發現data.mdb很小,說明轉化的時候出現了問題,回去檢查一下。一般我們最後需要給lmdb數據添加可讀權限,可以通過linux下sudo chmod 777 -R ./PATH 獲取所有權限。否則有時候程序調用會出現類似沒有權限的錯誤。