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資料集了,吼吼!