python和matlab读数据的差别_python 和 matlab的caffe读数据细节

本文探讨了Python和MATLAB在读取数据时的区别,特别是针对prototxt输入表示和数据喂入过程。指出Python采用row-major而MATLAB采用column-major的内存布局,导致在处理非方形图像时可能会出现图像结构变形的问题。重点强调了理解内存连续性和OpenCV的图像排列方式的重要性,并给出了避免问题的教条。同时,提到了MATLAB的imread与OpenCV的cv2.imread在通道顺序上的差异。
摘要由CSDN通过智能技术生成

(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均值要减。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值