神经网络的矩阵结构要求是 BCHW, 而opencv读出来的图片结构是HWC,
其中B是图片个数, 也就是batch size
C是通道数
H是高
W是宽
还好是 bluishfish大神的指点. 不然又不知道要研究多久.
那么如果只处理一张图片的话, 那么 在神经网络中, B就是1, C是3,H是图片高度, W是图片宽度.
神经网络矩阵类型应该是下面这种.
[
#第1张图片
[
#第1个通道 R
[
#H高度 第一列
[
#宽度,第一行
[1,2,4,33,3232,....], # 第1行
[1,2,4,33,3232,....], # 第2行
[1,2,4,33,3232,....], # 第3行
]
],
#第2个通道 G,...
#第3个通道 B,...
],
#第2张图片...
]
这里应该可视化一下画个图啥的更直观. 但是俺不会画, 所以只好委屈各位看官了.
转换方法有3种:
第1种:
import argparse
import logging
import os
import sys
import numpy as np
import torch
import torch.nn as nn
from torch import optim
from tqdm import tqdm
import cv2
import torch
# 这是模拟一个Opencv读取出来的HWC格式的矩阵.内容是特殊的图片,
ter =[
[#第1行
[111,112,113],# 第一行第1个点 RGB
[121,122,123],# 第一行第2个点 RGB
[131,132,133],# 第一行第3个点 RGB
[141,142,143],# 第一行第4个点 RGB
[151,152,153] # 第一行第5个点 RGB
],
[#第2行
[211,212,213],#第二行第1个点 RGB
[221,222,223],#第二行第2个点 RGB
[231,232,233],#第二行第3个点 RGB
[241,242,243],#第二行第4个点 RGB
[251,252,253] #第二行第5个点 RGB
]
]
ter = np.array(ter) #.reshape(3,5)
x = torch.from_numpy(ter)
print(x)
x= x.transpose(1,2)
print(x)
输出如下
tensor([[[111, 112, 113],
[121, 122, 123],
[131, 132, 133],
[141, 142, 143],
[151, 152, 153]],
[[211, 212, 213],
[221, 222, 223],
[231, 232, 233],
[241, 242, 243],
[251, 252, 253]]], dtype=torch.int32)
tensor([[
[111, 121, 131, 141, 151], # R
[112, 122, 132, 142, 152], # G
[113, 123, 133, 143, 153]], # B
[[211, 221, 231, 241, 251], # R
[212, 222, 232, 242, 252], # G
[213, 223, 233, 243, 253] # B
]], dtype=torch.int32)
再转置一下 第1 和 第2 维
x= x.transpose(0,1)
print(x)
print(x.shape)
如下
tensor([[[111, 121, 131, 141, 151], # R通道 第1行
[211, 221, 231, 241, 251]],# R通道 第2行
[[112, 122, 132, 142, 152], # G通道 第1行
[212, 222, 232, 242, 252]],# G通道 第1行
[[113, 123, 133, 143, 153],# B通道 第1行
[213, 223, 233, 243, 253] # B通道 第2行
]], dtype=torch.int32)
torch.Size([3, 2, 5])
由此可见, 要transpose 转置两次才行.
#两次 transpose 才能从 HWC 转成CHW
x= x.transpose(1,2)
x= x.transpose(0,1)
第2种方法是
import argparse
import logging
import os
import sys
import numpy as np
import torch
import torch.nn as nn
from torch import optim
from tqdm import tqdm
import cv2
import torch
# 这是模拟一个Opencv读取出来的HWC格式的矩阵.内容是特殊的图片,
xx =[
[#第1行
[111,112,113],# 第一行第1个点 RGB
[121,122,123],# 第一行第2个点 RGB
[131,132,133],# 第一行第3个点 RGB
[141,142,143],# 第一行第4个点 RGB
[151,152,153] # 第一行第5个点 RGB
],
[#第2行
[211,212,213],#第二行第1个点 RGB
[221,222,223],#第二行第2个点 RGB
[231,232,233],#第二行第3个点 RGB
[241,242,243],#第二行第4个点 RGB
[251,252,253] #第二行第5个点 RGB
]
]
npxx = np.array(xx)
chwxx = np.array( [ npxx[...,0], npxx[...,1],npxx[...,2] ] ) # 把图片按照 RGB通道分隔成3个独立的图片,然后再合并起来.
print(chwxx)
print(chwxx.shape)
输出结果如下.
[[[111 121 131 141 151]
[211 221 231 241 251]]
[[112 122 132 142 152]
[212 222 232 242 252]]
[[113 123 133 143 153]
[213 223 233 243 253]]]
(3, 2, 5)
还有第3种方法, 使用np.transpose 的,我感觉更简单一些. 或许 torch.transpose 也支持下面这种写法吧.
# ------------np.ndarray转为torch.Tensor------------------------------------
# numpy image: H x W x C
# torch image: C x H x W
# np.transpose( xxx, (2, 0, 1)) # 将 H x W x C 转化为 C x H x W
tensor_skimage = torch.from_numpy(np.transpose(img_skimage, (2, 0, 1)))
tensor_cv = torch.from_numpy(np.transpose(img_cv, (2, 0, 1)))
tensor_pil = torch.from_numpy(np.transpose(img_pil_1, (2, 0, 1)))
参考自: https://blog.csdn.net/qq_32896115/article/details/90515180