要想使用HDF5数据源
需要在layer.prototxt中引入一个layer
layer{
name:“data”
type:“HDF5Data”
top:data
top:label
hdf5_data_param{
source:“trainlist.txt”#通过Python制作得到的list文件,里面的内容为数据集的路径
batch_size:10
}
}
hdf5.txt文件内容:
多label的意思是说对于一张图片比如人脸图片,有很多个标签,如有左眼睛,右眼睛,鼻子和耳朵等
那么这时候输入我们在对数据源这个文件进行定义的时候就应该要明确有些什么label,分别在图片中的哪个位置
如给出三张人脸图片,分别命名为0.jpg,1.jpg,2.jpg
那么此时hdf5.txt文件中的内容就应该写成
##############################
0.jpg 11 78 62 71 84 65 26 51 46 89
1.jpg 13 25 62 53 53 65 26 32 42 13
##############################
图片 左眼的位置 右眼的位置 鼻子的位置 耳朵的位置 嘴巴的位置
此时对于每一行的坐标来说,每一列对应下来都应该是同一个标签,即同一样物品
与lmdb不同的是,hdf5通过Python将数据转换成为h5格式的数据源,以下是一个参考代码
import h5py
import os
import cv2
import numpy as np
import random
import math
import re
root_path = "home/ubuntu/caffe_case/HDF/image"#我们需要训练的图片所在的位置
with open("/home/ubuntu/caffe_case/hdf5.txt") as f:#刚刚进行编辑的hdf5文件
lines = f.readlines()
num=len(lines)#多少数据
random.shuffle(lines)#洗牌
imgAccu = 0
imgs = np.zeros([num,3,224,224])#造出来的hdf5的数据值中的每个数据的长和宽我希望是多大
label=np.zeros([num,10])#label数据,共有五个点,每个点有两个坐标,那么这就是十个坐标
for i in range(num):
line=lines[i]
segments=re.split('\s+',line)[:-1]
img=cv2.imread(os.path.join(root_path,segments[0]))#切分出图片的名称
img=cv2.resize(img,(224,224))#对图片进行resize操作
img=img.transpose(2,0,1)#caffe中支持的c*h*w opencv是h*w*c所以需要通过transpose来提前
img[i,:,:,:]=img.astype(np.float32)#将数据存入到对应的位置中
for j in range(10):
labels[i,j]=float(segments[j+1])*224/256#当把图片进行resize之后我们的原有的label就已经不再对应此时的数据了,那么此时我们应该要对label进行一些改变
batch_size=1#数据要存储成为.h5格式的数据,那么这时候考虑到计算机的性能问题,那么我们这时候就不能够将所有的数据放在同一个.h5格式的文件中,而是将他分成几份来存储
batchNum=int(math.ceil(1.0*num/batch_size))#有多少个.h5文件
imgsMean=np.mean(imgs,axis=0)#对数据进行mean值操作,数据-mean得到
if os.path.exists('trainlist.txt'):
os.remove('trainlist.txt')
if os.path.exists('testlist.txt'):
os.remove('testlist.txt')
comp_kwargs={'compression':'gzip','compression':1}
for i in range(batchNum):
start=i*batch_size
end=min((i+1)*batch_size,num)
if i<batchNum-1:
filename='/home/ubuntu/caffe_case/h5/train{0}.h5'.format(i)
else:
filename='/home/ubuntu/caffe_case/h5/test{0}.h5'.format(i-batchNum+1)
print filename
with h5py.File(filename,'w') as f:
f.creat_dataset('data',data.np.array(imgs[start:end]-imgMean)/255.0).astype(np.float32),**comp_kwargs)#写入数据并进行归一化操作,注意要使用的float32型
f.creat_dataset('label',data.np.array(imgs[start:end]).astype(np.float32),**comp_kwargs)
if i<batch_num-1:
with open('/home/ubuntu/caffe_case/h5/trainlist.txt') as f:
f.write(os.path.join(os.getcwd(),'train{0}.h5').format(i)+'\n')
else :
with open('/home/ubuntu/caffe_case/h5/testlist.txt') as f:
f.write(os.path.join(os.getcwd(),'test{0}.h5').format(i-batchNum+1)+'\n')#将生成的h5文件的路径写入到文本中
imgsMean = np.mean(imgsMean, axis=(1,2))
with open('mean.txt', 'w') as f:
f.write(str(imgsMean[0]) + '\n' + str(imgsMean[1]) + '\n' + str(imgsMean[2]))#写入平均值数据
#本代码原作者唐宇迪老师