研究一下pytorch的 transpose

神经网络的矩阵结构要求是 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值