Convert .hdf5 to .jpg with Matlab

Convert .hdf5 to .jpg with Matlab


  • 背景
  • 方法
  • 小结

背景

最近用Caffe做风格化的东西,Train阶段完成了需要做一个Test。和其他的深度学习的Test不同的是,这里需要输出的是变换后的图片,而不是数据上的Loss的大小,或者分类的结果。于是涉及到Caffe的图片读取与输出的问题,以及hdf5文件到jpg的转换。这篇博文就介绍一下吧。


方法

Caffe的图片读入,使用了ImageData层,官方文档中介绍了是读入一个包括图片url地址的txt文档,然后作为data输入。需要注意的是单纯的图片地址url是不够的,需要在每个url之后加上相应的标签。如下图:
Convert .hdf5 to .jpg with Matlab_第1张图片
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

  1. matlab里面的data的维度要对应好,Caffe输出的hdf5默认是BGR格式的,imwrite会按照RGB来存储,所以要调整。
  2. single类型与uint8类型的转换,hdf5数据默认是single类型,是单精度64位的,与一般图片uint8直接需要类型转换,否则最直观的就是图片全白。
  3. 注意是否需要转置。

小结

主要介绍了Caffe的图片读取与存储,以及用matlab进行hdf5到jpg的转化。

你可能感兴趣的:(MachineLearning,通信技术&Matlab,matlab,数据,caffe图片,hdf5)