pytorch 圖像的卷積操作

目錄

1.卷積核基本參數說明

?2.卷積相關操作說明

3.卷積操作示例


?

? ? ?1.卷積核基本參數說明

?????????pytorch進行圖像卷積操作之前,需要把圖像素格式進行分離,比如一個圖像為rgb格式,把R,G,B取出來作為一個ndarray,前文講過,在pytorch中進行圖像轉Tensor,大小變換,相關處理的庫,基本都放在?from torchvision import transforms里面,對于把正常的圖像轉換為單獨的RGB的ndarray,并且歸一化,使用 transforms.ToTensor即可一次性完成轉換。在訓練圖像相關模型的時候,主要是訓練卷積核的參數,一般的3*3的卷積核結構如代碼所示:

import cv2
import osimport numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transforms
#定義卷積核心,bias為False則不要偏置參數
#輸入通道為3,輸出通道為1,卷積核大小為3*3,偏置為真
cov = nn.Conv2d(3,1,3,bias=True)
print(cov.state_dict())'''
OrderedDict([('weight', tensor([[[[ 0.1062,  0.0600, -0.0675],[-0.0303,  0.0045, -0.0276],[ 0.0114,  0.1434, -0.1323]],[[-0.0622, -0.0029, -0.0695],[-0.0282, -0.0664, -0.0157],[ 0.0037, -0.0900, -0.0588]],[[-0.1231, -0.1717,  0.1089],[ 0.0051,  0.1269, -0.0846],[-0.0662,  0.0817,  0.1689]]]])), ('bias', tensor([0.0631]))])進程已結束,退出代碼為 0
'''
?2.卷積相關操作說明

? ? ? ?用transforms.ToTensor把圖像分為RGB單獨通道且歸一化后,就可以對圖像進行卷積操作,示例代碼如圖:

import cv2
import os
import numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transformscov = nn.Conv2d(3,1,3,bias=True)
# print(cov.state_dict())
#初始化卷積核所以參數為0.5
for x in cov.parameters():nn.init.constant_(x,0.5)print(cov.state_dict())
d = torch.ones(3,6,6)
d = torch.unsqueeze(d,0)
print(d)
c = cov(d)
print(c)'''
OrderedDict([('weight', tensor([[[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]],[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]],[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]]]])), ('bias', tensor([0.5000]))])
tensor([[[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]]]])
tensor([[[[14., 14., 14., 14.],[14., 14., 14., 14.],[14., 14., 14., 14.],[14., 14., 14., 14.]]]], grad_fn=<ConvolutionBackward0>)
'''

? ? ? ? 從示例代碼可以看出,因為我們定義的3通道輸入的3*3卷積核心,就生成了3個3*3的核心,3個核心分比對3個通道進行卷積((對應位置直接相乘)然后求和加偏置),得出輸出,同理如果定義卷積核輸出為三,那么就會定義3*3=9個卷積核每三個卷積核分別對圖像進行卷積操作,得出三個輸出通道。

3.卷積操作示例

? ? ? ? 以一張圖像為例打開圖像,定義卷積核進行卷積操作:

import cv2
import os
import numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transformscov = nn.Conv2d(3,3,3,bias=True)
for x in cov.parameters():nn.init.constant_(x,0.05)
print(cov.state_dict())img = cv2.imread("E:/test/pythonProject/test.jpg")
img = cv2.resize(img,dsize=(320,240))
print('img.shape',img.shape)
trans = transforms.ToTensor()
timg = trans(img)
print('timg.shape',timg.shape)
cimg = cov(timg)
print('cimg.shape',cimg.shape)timg = timg.permute(1,2,0)
ta = timg.numpy()cimg = cimg.permute(1,2,0)
ca = cimg.data.numpy()cv2.imshow("test",img)
cv2.imshow("ta",ta)
cv2.imshow("cimg",ca)cv2.waitKey()'''
OrderedDict([('weight', tensor([[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]],[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]],[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]]])), ('bias', tensor([0.0500, 0.0500, 0.0500]))])
img.shape (240, 320, 3)
timg.shape torch.Size([3, 240, 320])
cimg.shape torch.Size([3, 238, 318])進程已結束,退出代碼為 0
'''

? ? ? ? 這里定義的卷積核輸入為3通道,輸出為3通道,這里三組卷積核,每組卷積核包含三個卷積核,三個卷積核分別對三個通道進行卷積,最后每組輸出一個通道,三組輸出三個通道圖像,因為卷積核參數一樣,所以最后卷積輸出的RGB值相等,輸出灰色圖像。

這里注意:

cimg = cimg.permute(1,2,0)

這個函數是進行維度調換,理解不了,可以先把他轉為numpy,再用cv2.merge((r,g,b))函數進行融合,cv2.split(imgt) 可以把圖像重新分為 r g b 的numpy.ndarray結構,如代碼所示:

t = cimg.data.numpy()r = t[0]
g = t[1]
b = t[2]imgt = cv2.merge((r,g,b))
r,g,b = cv2.split(imgt)
print(r.shape,g.shape,b.shape)cv2.imshow("imgt",imgt)
cv2.waitKey()'''
(238, 318) (238, 318) (238, 318)
'''

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 下 socket 編程介紹及 TCP 客戶端與服務端創建示例

目錄 socket 編程接口TCP 服務端TCP 客戶端更多內容 本文介紹了 Linux 下的 socket 編程&#xff0c;及總結了使用 socket 接口實現 TCP 服務端和客戶端的示例代碼。 socket 編程接口 socket() 函數&#xff1a;用于創建一個新的 socket 描述符&#xff1a; int socket(int …

Linux內核MMC框架

1.mmc的概念 1.MMC MultiMedia Card&#xff0c;多媒體存儲卡&#xff0c; 但后續泛指一個接口協定&#xff08;一種卡式&#xff09;&#xff0c;能符合這接口的內存器都可稱作mmc儲存體,工作電壓&#xff1a;高電壓為2.7&#xff5e;3.6 V&#xff0c;低電壓為1.65&#xf…

【微服務】微服務中常用認證加密方案總結

目錄 一、前言 二、登錄認證安全問題 3.1 認證方式選擇 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特點 3.1.2 md5原理 3.1.3 md5使用場景 3.2 AES加密算法 3.2.1 AES簡介 3.2.2 AES加解原理 3.2.3 AES算法優缺點 3.2.4 AES算法使用場景 3.3 RSA加密算法 3.3…

Flutter Dio進階:使用Flutter Dio攔截器實現高效的API請求管理和身份驗證刷新

Flutter筆記 使用Flutter Dio攔截器實現高效的API請求管理和身份驗證刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

金融業被網絡攻擊了怎么辦,如何治理和風險控制?

近年來&#xff0c;網絡罪犯的人數和復雜程度都在增加&#xff0c;網絡罪犯的目標鎖定變得更具策略性&#xff0c;更加專注于最大效率和獲利。隨著有關全球網絡犯罪的數據持續涌入&#xff0c;可以看出金融服務企業已然成為頭號鎖定目標。雖然金融服務企業在網絡安全人員、工具…

圖論例題解析

1.圖論基礎概念 概念 &#xff08;注意連通非連通情況&#xff0c;1節點&#xff09; 無向圖&#xff1a; 度是邊的兩倍&#xff08;沒有入度和出度的概念&#xff09; 1.完全圖&#xff1a; 假設一個圖有n個節點&#xff0c;那么任意兩個節點都有邊則為完全圖 2.連通圖&…

【MySQL】SQL 優化

MySQL - SQL 優化 1. 在 MySQL 中&#xff0c;如何定位慢查詢&#xff1f; 1.1 發現慢查詢 現象&#xff1a;頁面加載過慢、接口壓力測試響應時間過長&#xff08;超過 1s&#xff09; 可能出現慢查詢的場景&#xff1a; 聚合查詢多表查詢表數據過大查詢深度分頁查詢 1.2 通…

錯誤筆記:Anaconda 錯誤(閃退、無法安裝等) + Pycharm 錯誤(無法啟動)+ python 報錯

Anaconda 錯誤 1、導航器啟動中發生-- 閃退 方法一&#xff1a; Windows下&#xff1a; 1&#xff09;使用管理員運行&#xff1a;conda prompt 2&#xff09;執行命令 conda update anaconda-navigator 方法二&#xff1a; 重置Anaconda配置&#xff1a;anaconda-navigator…

C語言第三十四彈---動態內存管理(下)

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】 動態內存管理 1、動態內存經典筆試題分析 1.1、題目1 1.2、題目2 1.3、題目3 1.4、題目4 2、柔性數組 2.1、柔性數組的特點 2.2、柔性數組的使用 2.3、…

【c++】計算樹的深度和節點數

在C語言中&#xff0c;計算給定樹的層數&#xff08;深度&#xff09;和節點總數通常需要使用遞歸方法。首先&#xff0c;我們需要定義樹的節點結構。這里假設我們處理的是一棵二叉樹&#xff0c;每個節點有兩個子節點&#xff08;左子節點和右子節點&#xff09;。 下面是一個…

5.STL源碼解析-算法、仿函數、適配器

算法 STL算法總覽 仿函數與適配器 C標準模板庫&#xff08;STL&#xff09;是C程序員的得力工具&#xff0c;提供了許多強大而高效的數據結構和算法。在STL中&#xff0c;仿函數&#xff08;Functor&#xff09;和適配器&#xff08;Adapter&#xff09;是兩個重要的概念…

C語言文件操作(fputs() 和 puts() 有兩個小區別)

fputs() 和 puts() 有兩個小區別&#xff1a; 1.puts() 只能向標準輸出流輸出&#xff0c;而 fputs() 可以向任何流輸出。 2.使用 puts() 時&#xff0c;系統會在自動在其后添加換行符&#xff1b;而使用 fputs() 時&#xff0c;系統不會自動添加換行符。 那么這是不是意味著使…

【C++精簡版回顧】17.io流,流中提供的函數

1.流含義 2.流類 3.流對象 4.流對象的函數 舉例&#xff1a; 要求&#xff1a;數據結構中經常需要對齊輸出數據&#xff0c;應該怎么做&#xff1f; 1.頭文件 #include<iomanip> 2.創建表格頭 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 網站被黑

打開環境&#xff0c;什么都沒發現&#xff0c;使用蟻劍掃描一下&#xff0c;發現shell.php&#xff0c;打開 使用BP抓包&#xff0c;進行爆破 得到密碼&#xff1a;hack 進去得到flag

GEE高階應用python wxee——如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展分析

火災進展 wxee 是專為處理氣象數據而設計的,但它對遙感數據也很有用。在本示例中,我們將了解 wxee 如何利用來自 GOES-16 和 MODIS 的數據來可視化火災隨時間的進展情況。 安裝和設定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(project=x…

每日一類:QLabel深入解析

QLabel是Qt中用于顯示文本或圖像的控件&#xff0c;屬于Qt Widgets模塊。它是展示靜態內容的理想選擇&#xff0c;支持富文本格式&#xff0c;使得文本可以包含不同的字體、顏色和鏈接。QLabel也可以用來顯示圖像&#xff0c;包括動態圖像。此外&#xff0c;它還支持文本和圖像…

【Java面試題】SpringBoot與Spring的區別

主要區別體現幾個方面&#xff1a; 1.操作簡便性 SpringBoot提供極其快速和簡化的操作&#xff0c;使得Spring開發者能更快速上手。它通過提供spring的運行配置&#xff0c;以及為通用spring項目提供許多非功能性特性&#xff0c;進一步簡化了開發過程。 2.框架擴展性 Spri…

算法學習——差分

在了解差分之前&#xff0c;我們首先需要知道前綴和的概念。 前綴和簡單介紹&#xff1a; 對于一個數組A&#xff0c;要求出A[0]~A[i]的和&#xff0c;我們通常的做法是遍歷一邊&#xff0c;加起來。但是要求m組這樣的和&#xff0c;我們就要花費O(mn)的時間復雜度。顯然不合…

【考研數學】湯家鳳1800題什么水平?

我覺得湯家鳳基礎武忠祥強化這個組合非常的不錯 湯家鳳老師的講課風格 湯家鳳老師的基礎課程是大家公認的講的詳細&#xff0c;并且非常照顧基礎不好的學生&#xff0c;會把基礎知識點掰開揉碎的講給大家聽&#xff0c;在上課過程中&#xff0c;還會把知識點寫在A4紙上&#…

試了下新型的360AI搜索

360AI搜索 試了下&#xff0c;感覺還是挺不錯的。 比如問這個問題&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 對于ERROR 1698 (28000): Access denied for user rootlocalhost的問題&#xff0c;這通常是由于MySQL密碼為…