1. 程式人生 > >利用Caffe建立自己的lmdb資料集

利用Caffe建立自己的lmdb資料集

用Caffe進行模型訓練時,除了用現有的公開資料集(如MNIST, CIFAR等),有時候我們還需要建立自己的資料集進行訓練。本篇部落格講的就是如何利用Caffe中的模組建立自己lmdb資料集。

資料集準備

我們需要自己準備好帶類別標籤的圖片資料,並將資料統一命名,這裡為了方便,我直接從CIFAR10訓練集中拿出5000張圖片用於製作驗證集,圖片為.png格式,並採用‘圖片編號_類別標籤.png’的命名方式(這個實現起來應該不難,這裡就不贅述了),儲存在一個資料夾下,部分例子如下:


train_valid

建立圖片名列表清單

這裡我們需要建立一個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文字:


train_valid_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路徑下看到類似下面的檔案:


train_train_valid_lmdb

為了保險起見,最好看一下data.mdb這個檔案的大小,當你的資料比較大的時候,這個檔案也因該很大。如果發現data.mdb很小,說明轉化的時候出現了問題,回去檢查一下。一般我們最後需要給lmdb資料新增可讀許可權,可以通過linux下sudo chmod 777 -R ./PATH 獲取所有許可權。否則有時候程式呼叫會出現類似沒有許可權的錯誤。