Caffe 圖片數據轉化爲 lmdb 格式以及均值文件的計算

在 Caffe 中經常使用的數據類型是 lmdb 或 leveldb,而我們平時所用的圖片格式爲 jpg, png, tif 等,於是就產生了一個問題,如何從原始圖片文件轉換成 Caffe 中能夠運行的 db(leveldb/lmdb)文件?

在 Caffe 中,作者提供了一個用於將圖片文件轉換爲 db 文件的可執行程序:convert_imageset,其調用格式如下所示:

 convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

需要帶四個參數:
[FLAGS]:圖片參數組,包括是否打亂圖片順序,resize圖片大小等;
ROOTFOLDER/:圖片存放的絕對路徑,從linux系統根目錄開始;
LISTFILE:圖片文件列表清單,一般爲一個 txt 文件,一行一張圖片;
DB_NAME:最終生成的db文件存放目錄。

首先需要創建一個圖片列表清單,保存爲 txt。本文以自己的數據爲例進行講解。類別標籤從0開始,網上的資料基本上是對 Caffe 中示例源碼的修改,這裏給出一個標籤定製的 python 版本,簡單易懂:

#!/usr/bin/env python
# coding:utf-8

import os

# 獲取圖片數據所在路徑
def get_data_path():
    return os.path.join('..', 'deepLearningHF', 'train')

# 添加標籤,並歸整路徑格式
def labeled_pic():
    f_train_write = open('train.txt', 'w')
    train_path = get_data_path()
    label_index = 0
    for file_dir in os.listdir(train_path):
        pic_label = str(label_index)
        pic_path = os.path.join(train_path, file_dir)
        for pic_name in os.listdir(pic_path):
            full_write_path = os.path.join(file_dir, pic_name)
            f_train_write.write(full_write_path + ' ' + pic_label + '\n')
        label_index += 1
    f_train_write.close()
    print('標籤添加完畢!')

if __name__ == '__main__':
    labeled_pic()

以訓練數據爲例,得到的列表清單如下所示:
這裏寫圖片描述
根據網上的多個資料顯示,便籤最好從0開始,不然會報錯。

然後使用上文中提到的轉換文件,將其整理成 bash 腳本如下:
這裏寫圖片描述
設置參數-shuffle,打亂圖片順序。設置參數 -resize_height 和 -resize_width 將所有圖片尺寸都變爲256*256,後面爲圖片保存的絕對路徑,最後爲轉換成的db文件的路徑。

需要注意的是,上述代碼中有一行用於刪除已生成的lmdb(上圖中紅框圈出),此行最好寫上,不然會報錯。

程序執行成功顯示如下:
這裏寫圖片描述

到此,已成功將圖片數據轉化爲 lmdb 格式。下面講講如何計算自己數據的均值文件,同樣的,Caffe 提供了計算圖像數據均值的可執行文件:compute_image_mean。
這裏寫圖片描述
執行該bash腳本後,在當前目錄下可見已生成 PT_mean.binaryproto 文件。到此,均值文件也便計算成功。
更多關於 Caffe 的知識點,敬請期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章