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数据集了,吼吼!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值