1. 程式人生 > >caffe lmdb資料集的準備:從原始圖片到生成lmdb檔案

caffe lmdb資料集的準備:從原始圖片到生成lmdb檔案

        最近在學習SSD模型,執行官方demo,總是報錯:Data layer prefetch queue empty,網上查各種原因都沒有一個很好的解決方案,自己也快崩潰。即使把batch size設為1,也沒有用。

       自己尋思著是不是生成的資料集有問題,採用網上的指令碼(https://www.cnblogs.com/zhonghuasong/p/7469750.html)去讀取SSD官網上方法生成的VOC0712資料集,發現無法讀取資料。為了方便大家,這裡我也貼出來,檔名read_lmdb.py:

#coding: utf-8

import caffe
from caffe.proto import caffe_pb2

import lmdb
import cv2
import numpy as np

lmdb_env = lmdb.open('./lmdb_test', readonly=True) 
lmdb_txn = lmdb_env.begin() 
lmdb_cursor = lmdb_txn.cursor() 
datum = caffe_pb2.Datum() 

for key, value in lmdb_cursor:
	datum.ParseFromString(value) 
    	
	label = datum.label
	data = caffe.io.datum_to_array(datum)
	print(data.shape)
	print(datum.channels)
	image = data.transpose(1, 2, 0)
	cv2.imshow('cv2.png', image)
	cv2.waitKey(0)

cv2.destroyAllWindows()
lmdb_evn.close()

但是我用這個指令碼去讀取之前下載過的mnist的lmdb檔案,確是能夠讀取的,更讓我懷疑是不是資料集有問題,於是打算自己先製作mnist的 lmdb檔案。

      首先得準備mnsit的原始圖片,由於官網給出的mnist資料集是壓縮檔案格式,我們需要通過指令碼將起解壓為圖片跟對應的label,這裡我把自己從網上copy的code修改後的程式碼放在這裡(假定檔名為down_convert.py):

#coding: utf-8
from tensorflow.examples.tutorials.mnist import input_data
import scipy.misc
import os

# 讀取MNIST資料集。如果不存在會事先下載。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 我們把原始圖片儲存在MNIST_data/raw/資料夾下
# 如果沒有這個資料夾會自動建立
save_dir = 'MNIST_data/train/'
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)


# write the training images and labels to file
train = open('MNIST_data/train.txt','w')
for i in range(mnist.train.images.shape[0]):
    # 請注意,mnist.train.images[i, :]就表示第i張圖片(序號從0開始)
    image_array = mnist.train.images[i, :]
    # TensorFlow中的MNIST圖片是一個784維的向量,我們重新把它還原為28x28維的影象。
    image_array = image_array.reshape(28, 28)
    # 儲存檔案的格式為 mnist_train_0.jpg, mnist_train_1.jpg, ... ,mnist_train_19.jpg
    filename = save_dir + 'mnist_train_%05d.jpg' % i
    # 將image_array儲存為圖片
    # 先用scipy.misc.toimage轉換為影象,再呼叫save直接儲存。
    scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)

    label = mnist.train.labels[i]
    label = [index for index in range(len(label)) if label[index]>0][0]
    line = "%s %s\n" %(filename[11:], str(label))
    train.write(line)

train.close()


save_dir = 'MNIST_data/test/'
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)
# write the test images and labels to file
test = open('MNIST_data/test.txt','w')
for i in range(mnist.test.images.shape[0]):
    image_array = mnist.test.images[i, :]
    image_array = image_array.reshape(28, 28)
    filename = save_dir + 'mnist_test_%05d.jpg' % i
    scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)

    label_vec = mnist.test.labels[i]
    label = [index for index in range(len(label_vec)) if label_vec[index]>0][0]
    line = "%s %s\n" %(filename[11:], str(label))
    test.write(line)

test.close()

print('Please check: %s ' % save_dir)

使用方法是,先建立資料夾MNIST_data, 然後從官網下載好的t10k-images-idx3-ubyte.gz  train-images-idx3-ubyte.gz, t10k-labels-idx1-ubyte.gz  train-labels-idx1-ubyte.gz四個壓縮檔案放到MNIST_data資料夾下,將down_convert.py放到MNIST_data 同一個目錄下,然後執行python down_convert.py (注意,這個指令碼需要安裝tensorflow,因為資料集呼叫了tensorflow的方法,pip install tensorflow)。執行完後,在MNIST_data目錄下生成資料夾train和test,還有對應的label檔案train.txt和test.txt。train和test目錄下就是所有的mnist資料集的圖片啦!有了這四個檔案,我們就可以利用caffe自帶的工具caffe/build/tools/convert_imageset, 將相應的資料集轉換為lmdb檔案,比如轉換training dataset,我們進入到MNIST_data資料夾下執行:

$caffe_root/build/tools/convert_imageset -backend lmdb  ./   train.txt   lmdb_train

就會在當前目錄下生成lmdb_train資料夾,裡面的檔案分別為data.mdb 和lock.mdb,test資料集的轉換同理,這樣我們就大功告成啦!

最後,我們可以採用之前讀取lmdb檔案的python指令碼read_lmdb.py再去讀取我們生成的lmdb檔案,就可以成功啦!

下一步就是生成自己的VOC資料集了,吼吼!