part1:制作lmdb文件
通过python脚本制作成ldmb文件
原料:图片,label,train.txt(图片路径+label)
# -*- coding: UTF-8 -*-
__author__ = 'xuy'
import commands
import os
import re
import caffe
caffe_root='/home/xuy/caffe/'
'''
我在txt文件里面已经写好了train,val的路径,train/0/***.jpg or val/***.jpg
'''
my_project_path='/home/xuy/桌面/code/python/caffe_code/kaggle_dogcat_classification/'
images_train_path=my_project_path+'dataset/train/'
# print images_train_path
txt_train_path=my_project_path+'mytrain.txt'
def create_lmdb(caffe_root, images_path, txt_save_path,lmdb_save_path):
#convert_imageset工具路径,这个工具是caffe系统自带的,
# 因此路径是caffe_root,利用命令,将txt文件中的照片文件名转化为mdb格式
convert_imageset_path = caffe_root + 'build/tools/convert_imageset'
cmd = """%s --shuffle --resize_height=32 --resize_width=32 %s %s %s"""#对于这4个%s进行说明:第一个:convert_imageset(caffe_home里面自带的工具,需要指明该工具的路径),第二个:图片的来源,这里是至train和val文件夹下面的路径,第三个:生成的train.txt以及val.txt这两个文件,第四个:lmdb保存路径
status, output = commands.getstatusoutput(cmd % (convert_imageset_path, images_path,
txt_save_path, lmdb_save_path))
print output
if(status == 0):
print "lmbd文件生成成功"
lmdb_train_path=my_project_path+'img_train.lmdb'
create_lmdb(caffe_root,my_project_path,txt_train_path,lmdb_train_path)#生成train.lmdb,第二个参数:由于train.txt文件当中已经有了dataset/train这个路径,因此第二个参数仅仅需要加上my_project这个前缀路径即可
part2:读取lmdb文件:
# -*- coding:utf-8 -*-
__author__ = 'xuy'
"""
用来读取lmdb文件,python read_lmdb mnist_train_lmdb/ (最后的参数是lmdb文件的文件夹)
"""
import numpy as np
import lmdb
import sys
import caffe
from caffe.proto import caffe_pb2
def lmdb_process(db_path):
env=lmdb.open(db_path)
datum=caffe_pb2.Datum()
item_id=0
with env.begin() as txn:
cursor=txn.cursor()
for key ,value in cursor:
print key#读取图片的路径
# print value#乱码,需要datum.ParseFromString(value)转换一下
datum.ParseFromString(value)#转化成像素点
label=datum.label#读取图像的label
print label
img=caffe.io.datum_to_array(datum)#将像素点转化为array的形式
print datum
item_id+=1
# print item_id
if __name__=='__main__':
db_path='/home/xuy/桌面/code/python/caffe_code/kaggle_dogcat_classification/img_train.lmdb/'
lmdb_process(db_path)