zoukankan      html  css  js  c++  java
  • python 和 matlab的caffe读数据细节

    (1).prototxt中的输入表示一样,如

    dim: 10
    dim: 3
    dim: 227
    dim: 227

    (2)代码喂入数据不一样

    python:    

    input_blob = np.zeros((config.batchsize, 3, config.crop_h, config.crop_w), dtype=np.float32)

    #im.shape是3,h,w

    matlab:

    data=zeros(config.crop_h,config.crop_w,1,config.batchsize);

    (3)什么不变?什么在变?opencv库有哪些坑人之处

    首先,看看到底是row-major还是column-major?

    row-major:python 的numpy库, opencv c++

    column-major:matlab

    对接时,Python:越靠左,级别越大,就是Python的存储row-major本质,就是Python---->连续内存----->c++;而对于matlab,越靠右级别越大,就是matlab的存储本质column-major,即,matlab---->连续内存----->c++;这非常重要,尤其是输入图片不为方矩阵时,会导致非常严重结果,(网络太大也能收敛)。因为传给opencv c++时,c++重新将连续内容重组成图片。假设一个单通道图片本来是matlab的存法,大小是10*20,切成一条连续内存,column-major优先,切成10个像素10个像素的共20份串接起来放在内存中,c++从内存中拿出来,组装成20个像素一行,那么就会把图像的两列凑成一行,图像结构变形。特殊地,如果是方矩阵,则不会顾及这些,最多图像“被躺下”了,即旋转了90度,这其实对网络训练来说不要紧。

    关键是注意什么?

    关键是按照内存连续性来写入,知道对那个接数组(行,列,通道是否是按照opencv对图像排列的方式:先对第一个通道的第一行扫描,然后第二行扫描),比如一个大坑是:

    python的cv2.imread读出来numpy是:480*640*3,这还是matlab那种形式,不过存的时候按照Python的存法实际是,在连续内容中对图像块的解释是,先是第一个通道的第一行第一列,然后第二个通道的第一行第一列...

    只会出问题的。等一下opencv c++读入还是按自己那一套先行,后列,再通道。

    可能大家都懂了这个道理了,但还是很混沌,是吗?这样吧,写个教条:  工具(各种函数)---->根据下图arr.transpose或者permute成右图,举个例子用python的cv2.imread工具读(可以是Python其他的工具)

    虽然matlab的imread读入之后形式看起来也是(480,640,3),但是matlab是column-major的,因此,画出的图如下:

    注意:

    tranpose和permute是在改变内存的连续方式,reshape没有改变。另外,matlab还有rgb跟opencv通道上的bgr的不同,但目前觉得卷积都看起来一样,除非考虑pre-train得到的bgr均值要减。

  • 相关阅读:
    matlab之图像处理(2)
    FIR滤波器(1)- 基础知识
    图像融合
    IEEE Floating Point Standard (IEEE754浮点数表示法标准)
    ISE 中使用system generate
    System Generator入门
    System Generator入门笔记
    2019 Multi-University Training Contest 7 Kejin Player Final Exam
    Sequence POJ
    POJ
  • 原文地址:https://www.cnblogs.com/Wanggcong/p/6769318.html
Copyright © 2011-2022 走看看