把所要进行回归的Caffe图像放在/home/pcb/caffe/examples/Caffe_DataMaker_hdh5文件夹的image文件夹中,然后有一个hdf5.txt,文档中的第一列为图像的名称,后面的是图像5个特征的位置(这里的5个特征只是举个栗子,或许有别的吧,只是这个txt怎么生成还不知道,如果图像多的话肯定要写程序的,后面会继续更新的!),具体如下图所示:
然后生成hdf5的python的程序如下所示:
# -*- coding: utf-8 -*-
'''
hdf5数据源
'''
import math
import numpy as np
import random
import re
import os
import h5py
import cv2
#图片路径
root_path = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/image'
with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/hdf5.txt','r') as f:
lins = f.readlines()
num = len(lins) #数据长度
random.shuffle(lins) #把数据洗牌
imgAccu = 0
#图片输入
# #制作Data,造一个224*224*3*图片个数的矩阵
imgs = np.zeros([num , 3 , 224 ,224])
# 制作label,造一个10(每个图像的标签数)×图片个数的矩阵
labels = np.zeros([num , 10])
for i in range(num):
line = lins[i]
#使用正则表达式把串给分割开来,取第一个图片的名字 \s就是一个回车或者空格
segment = re.split('\s+',line)
#找到图片
image = cv2.imread(os.path.join(root_path , segment[0]))
#把图片进行缩小 把图片缩小到224 输入的大小就是224x224的
image = cv2.resize(image , (224,224))
#普通图片输入是h w c 而caffe要求是c h w,所以要转回来
image = image.transpose(2 , 0 , 1)
#转类型,float32
#把数据都存在imge里面
imgs[i , : , : , :] = image.astype(np.float32)
#因为图片缩小了,所以要吧label也要缩小
for j in range(10):
labels[i , j] = float(segment[j + 1])*224/256
#每个hdf5文件里存放的个数,一般每个.h5里面放8000个
#这里就3个,每个.h5里面放一个
batchSize = 1
#取多少次
batchNum = int(math.ceil(1.0 * num/batchSize))
#减去均值操作,目的是以0为中心化
#在初始阶段减去均值后,最后预测的时候要加上
imgsMean = np.mean(imgs , axis = 0)
labelsMean = np.mean(labels , axis = 0)
labels = (labels - labelsMean)/10
#移除之前存在的文件
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_opts': 1}
for i in range(batchNum):
start = i * batchSize
end = min((i+1)*batchSize , num)
#前面的几个bacthsize做为一个训练数据
if i < batchNum - 1:
fileName = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/train{0}.h5'.format(i)
#后面的一个作为测试集
else:
fileName = '/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/test{0}.h5'.format(i - batchNum + 1)
#往h5文件里面添加进数据
with h5py.File(fileName , 'w') as f:
f.create_dataset('data' , data=np.array((imgs[start : end] - imgsMean)/255.0).astype(np.float32) , **comp_kwargs)
f.create_dataset('label' , data=np.array(labels[start : end]).astype(np.float32) , **comp_kwargs)
pass
if i < batchNum - 1:
with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/trainlist.txt' , 'a') as f:
f.write(("/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/train{0}.h5").format(i) + '\n')
else:
with open('/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/testlist.txt' , 'a') as f:
f.write(("/home/pcb/caffe/examples/Caffe_DataMaker_hdh5/h5/test{0}.h5").format(i - batchNum + 1) + '\n')
这样就会在Caffe_DataMaker_hdh5文件夹下h5生成以下几个文件:
trainlist.txt里面为train0.h5和train1.h5的路径,如下图所示:
testlist.txt里面为test0.h的路径,如下图所示:
然后把所要使用的hdf5数据层的source路径设为trainlist所在的路径即可。