最近用Caffe做风格化的东西,Train阶段完成了需要做一个Test。和其他的深度学习的Test不同的是,这里需要输出的是变换后的图片,而不是数据上的Loss的大小,或者分类的结果。于是涉及到Caffe的图片读取与输出的问题,以及hdf5文件到jpg的转换。这篇博文就介绍一下吧。
Caffe的图片读入,使用了ImageData
层,官方文档中介绍了是读入一个包括图片url地址的txt文档,然后作为data输入。需要注意的是单纯的图片地址url是不够的,需要在每个url之后加上相应的标签。如下图:
deploy.prototxt可以参考如下:
layer {
name: "style"
type: "ImageData"
top: "data"
top: "label"
transform_param {
scale: 1
}
image_data_param {
source:" ~/yourList.txt"
batch_size: 2
}
}
Caffe输出图片的方法,大部分都是按照git代码用pycaffe输出需要的layer的特征。这固然是好方法,但是这里说一个其他的方法,调用caffe的HDF5Output
层。官方文档介绍说,这个层只有一个参数控制输出的hdf5文件路径。可以参考如下:
layer {
name: "hdf5out"
bottom: "dataOut"
bottom: "label"
type: "HDF5Output"
hdf5_output_param {
file_name: "~/yourPath.h5"
}
include { phase: TEST }
}
至此,已经介绍了Caffe的图片输入和输出方法。
下面就是做一下hdf5文件到jpg图片格式的解析。搜资料说的是用hdf5View这个Java插件。也有说用python的h5py,我这里选的是Matlab,matlab官网介绍了常用的hdf5函数,主要用到的就是h5read
读hdf5文件,imwrite
来写入图片。
由于Matlab是操作矩阵,所以可能用到h5disp
来查看hdf5的shape。
下面附上我写的一个小脚本。
% output Path
path = '/yourpath/videosketch/';
tail = '.jpg';
% read hdf5 file
data =h5read('/h5filepath/outImg.h5','/data');
% convert single to uint8
data = uint8(data);
dataSize = size(data);
for i = 1:dataSize(4)
% convert BGR2RGB
p = data(:,:,1,i);
data(:,:,1,i) = data(:,:,3,i);
data(:,:,3,i) = p;
% imwrite(img,strcat(path,num2str(i),tail));
% transpose
data(:,:,1,i) = data(:,:,1,i).';
data(:,:,2,i) = data(:,:,2,i).';
data(:,:,3,i) = data(:,:,3,i).';
img = data(:,:,:,i);
imwrite(img,strcat(path,num2str(i),tail));
end
主要介绍了Caffe的图片读取与存储,以及用matlab进行hdf5到jpg的转化。