caffe学习笔记6--多labelHDF5制作

本文详细介绍如何使用HDF5作为Caffe的数据源,包括如何配置layer.prototxt文件,以及如何通过Python将图片数据转换为HDF5格式。同时,提供了具体的代码示例,解释了如何处理多标签数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要想使用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]))#写入平均值数据
        #本代码原作者唐宇迪老师
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值