網(wǎng)站首頁(yè) 編程語言 正文
tensor計(jì)算三通道均值
今天用pytorch處理圖像時(shí),涉及到了計(jì)算均值的問題,整理一下解決思路。
第一種思路
tensor轉(zhuǎn)換為numpy再進(jìn)行處理
import torch
import cv2
img = cv2.imread("image path")
tensor_img = torch.from_numpy((img[:, :, ::-1] / 255.0)[None, ...].transpose(0, 3, 1, 2)).cuda()
?
...
?
numpy_img = (tensor_img.detach().cpu().numpy().transpose(2, 3, 1, 0).squeeze() * 255)[:, :, ::-1]
?
ave_color = np.mean(numpy_img , axis=(0, 1))
如果圖像里有0值,不想計(jì)入運(yùn)算:
numpy_img[numpy_img == 0] = np.nan
ave_color = np.nanmean(numpy_img, axis=(0, 1))
由于tensor和numpy來回轉(zhuǎn)換會(huì)消耗資源、性能。
又查了一番,直接在tensor中計(jì)算(非零均值計(jì)算)
reshape_tensor_img = tensor_img.view(tensor_img.size(0), tensor_img.size(1), -1)
ave_color = reshape_tensor_img.mean(2)
?
# mean value without 0
non_zero_img = reshape_tensor_img[reshape_tensor_img.nonzero(as_tuple=True)]
ave_color = non_zero_img.view(reshape_tensor_img.size(0), reshape_tensor_img.size(1), -1).mean(2)
計(jì)算完均值,想要加法運(yùn)算的時(shí)候也會(huì)碰上一點(diǎn)維度上的麻煩,需要維度轉(zhuǎn)換一下。
reshape_ave_color = ave_color.view(ave_color.size(0), ave_color.size(1), 1, 1)
add_img = tensor_img + reshape_ave_color
Pytorch tensor的運(yùn)算
tensor操作
1. 新建
A、torch.Tensor(shape)/torch.FloatTensor(shape):隨機(jī)初始化一個(gè)維度為shape的張量。
B、torch.randn(shape):用均值為0,方差為1的高斯分布初始化一個(gè)shape的張量。
C、torch.rand(shape):在區(qū)間[0,1]上均勻分布,初始化一個(gè)shape的張量。
2、Tensor的變換
A、view / reshape
兩個(gè)用法差不多,都是用來改變一個(gè)張量的數(shù)據(jù)分布。
注:(2,-1)中的-1會(huì)自動(dòng)計(jì)算剩下的維度。
B、squeeze / unsqueeze
第一個(gè)是用來壓縮維度為1的張量,如(6,1,32,32).squeeze()之后就變?yōu)?6,32,32);第二個(gè)是用來增加一個(gè)維度。具體看實(shí)例如下:
注:squeeze中不帶參數(shù),是將所有維度為1的地方去掉,帶參數(shù)是去指定維度為1的地方,若指定的維度不為1,則不變。
注:在指定的維度上插入一個(gè)大小為1的新維度。
C、expand / repeat
這兩個(gè)都是進(jìn)行數(shù)據(jù)的擴(kuò)充操作,第一個(gè)是擴(kuò)充到指定的維度大小,第二個(gè)函數(shù)的參數(shù)維度上擴(kuò)充的倍數(shù)。一般結(jié)合上面2.B中的函數(shù)使用。
D、 t / transpose / permute
這三個(gè)函數(shù)用來數(shù)據(jù)維度之間的調(diào)整,第一個(gè)只能用于2D。
E、broadcasting機(jī)制
相當(dāng)于自動(dòng)完成了unsqueeze+expand的操作,但是相比節(jié)省內(nèi)存空間。
通過broadcasting機(jī)制,張量可以直接和標(biāo)量進(jìn)行相加。
原文鏈接:https://blog.csdn.net/infinite_jason/article/details/115242839
相關(guān)推薦
- 2021-10-22 C#?基于NAudio實(shí)現(xiàn)對(duì)Wav音頻文件剪切(限PCM格式)_C#教程
- 2022-01-17 如何實(shí)現(xiàn) input 和 textarea 自動(dòng)聚焦
- 2022-09-23 Pandas時(shí)間類型轉(zhuǎn)換與處理的實(shí)現(xiàn)示例_python
- 2022-05-06 C語言基礎(chǔ)知識(shí)點(diǎn)指針的使用_C 語言
- 2023-06-19 CentOS7使用yum安裝Golang的超詳細(xì)步驟_Golang
- 2022-06-16 C語言詳解鏈?zhǔn)疥?duì)列與循環(huán)隊(duì)列的實(shí)現(xiàn)_C 語言
- 2022-05-09 Python數(shù)據(jù)結(jié)構(gòu)與算法的雙端隊(duì)列詳解_python
- 2022-05-24 Python?3.x踩坑實(shí)戰(zhàn)匯總_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支