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