欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch中Tensor與各種圖像格式的相互轉(zhuǎn)化詳解

 更新時間:2019年12月26日 14:34:00   作者:Oldpan  
這篇文章主要介紹了Pytorch中Tensor與各種圖像格式的相互轉(zhuǎn)化詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在pytorch中經(jīng)常會遇到圖像格式的轉(zhuǎn)化,例如將PIL庫讀取出來的圖片轉(zhuǎn)化為Tensor,亦或者將Tensor轉(zhuǎn)化為numpy格式的圖片。而且使用不同圖像處理庫讀取出來的圖片格式也不相同,因此,如何在pytorch中正確轉(zhuǎn)化各種圖片格式(PIL、numpy、Tensor)是一個在調(diào)試中比較重要的問題。

本文主要說明在pytorch中如何正確將圖片格式在各種圖像庫讀取格式以及tensor向量之間轉(zhuǎn)化的問題。以下代碼經(jīng)過測試都可以在Pytorch-0.4.0或0.3.0版本直接使用。

對python不同的圖像庫讀取格式有疑問可以看這里:http://www.dbjr.com.cn/article/177288.htm

格式轉(zhuǎn)換

我們一般在pytorch或者python中處理的圖像無非這幾種格式:

  • PIL:使用python自帶圖像處理庫讀取出來的圖片格式
  • numpy:使用python-opencv庫讀取出來的圖片格式
  • tensor:pytorch中訓(xùn)練時所采取的向量格式(當(dāng)然也可以說圖片)

注意,之后的講解圖片格式皆為RGB三通道,24-bit真彩色,也就是我們平常使用的圖片形式。

PIL與Tensor

PIL與Tensor的轉(zhuǎn)換相對容易些,因為pytorch已經(jīng)提供了相關(guān)的代碼,我們只需要搭配使用即可:

所有代碼都已經(jīng)引用了(之后的代碼省略引用部分):

import torch
from PIL import Image
import matplotlib.pyplot as plt

# loader使用torchvision中自帶的transforms函數(shù)
loader = transforms.Compose([
  transforms.ToTensor()]) 

unloader = transforms.ToPILImage()

1 PIL讀取圖片轉(zhuǎn)化為Tensor

# 輸入圖片地址
# 返回tensor變量
def image_loader(image_name):
  image = Image.open(image_name).convert('RGB')
  image = loader(image).unsqueeze(0)
  return image.to(device, torch.float)

2 將PIL圖片轉(zhuǎn)化為Tensor

# 輸入PIL格式圖片
# 返回tensor變量
def PIL_to_tensor(image):
  image = loader(image).unsqueeze(0)
  return image.to(device, torch.float)

3 Tensor轉(zhuǎn)化為PIL圖片

# 輸入tensor變量
# 輸出PIL格式圖片
def tensor_to_PIL(tensor):
  image = tensor.cpu().clone()
  image = image.squeeze(0)
  image = unloader(image)
  return image

4 直接展示tensor格式圖片

def imshow(tensor, title=None):
  image = tensor.cpu().clone() # we clone the tensor to not do changes on it
  image = image.squeeze(0) # remove the fake batch dimension
  image = unloader(image)
  plt.imshow(image)
  if title is not None:
    plt.title(title)
  plt.pause(0.001) # pause a bit so that plots are updated

5 直接保存tensor格式圖片

def save_image(tensor, **para):
  dir = 'results'
  image = tensor.cpu().clone() # we clone the tensor to not do changes on it
  image = image.squeeze(0) # remove the fake batch dimension
  image = unloader(image)
  if not osp.exists(dir):
    os.makedirs(dir)
  image.save('results_{}/s{}-c{}-l{}-e{}-sl{:4f}-cl{:4f}.jpg'
        .format(num, para['style_weight'], para['content_weight'], para['lr'], para['epoch'],
            para['style_loss'], para['content_loss']))

numpy與Tensor

numpy格式是使用cv2,也就是python-opencv庫讀取出來的圖片格式,需要注意的是用python-opencv讀取出來的圖片和使用PIL讀取出來的圖片數(shù)據(jù)略微不同,經(jīng)測試用python-opencv讀取出來的圖片在訓(xùn)練時的效果比使用PIL讀取出來的略差一些(詳細(xì)過程之后發(fā)布)。

之后所有代碼引用:

import cv2
import torch
import matplotlib.pyplot as plt

numpy轉(zhuǎn)化為tensor

def toTensor(img):
  assert type(img) == np.ndarray,'the img type is {}, but ndarry expected'.format(type(img))
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  img = torch.from_numpy(img.transpose((2, 0, 1)))
  return img.float().div(255).unsqueeze(0) # 255也可以改為256

tensor轉(zhuǎn)化為numpy

def tensor_to_np(tensor):
  img = tensor.mul(255).byte()
  img = img.cpu().numpy().squeeze(0).transpose((1, 2, 0))
  return img

展示numpy格式圖片

def show_from_cv(img, title=None):
  img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  plt.figure()
  plt.imshow(img)
  if title is not None:
    plt.title(title)
  plt.pause(0.001)

展示tensor格式圖片

def show_from_tensor(tensor, title=None):
  img = tensor.clone()
  img = tensor_to_np(img)
  plt.figure()
  plt.imshow(img)
  if title is not None:
    plt.title(title)
  plt.pause(0.001)

注意

上面介紹的都是一張圖片的轉(zhuǎn)化,如果是n張圖片一起的話,只需要修改一下相應(yīng)代碼即可。

舉個例子,將之前說過的修改略微修改一下即可:

# 將 N x H x W X C 的numpy格式圖片轉(zhuǎn)化為相應(yīng)的tensor格式
def toTensor(img):
  img = torch.from_numpy(img.transpose((0, 3, 1, 2)))
  return img.float().div(255).unsqueeze(0)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python?pandas的八個生命周期總結(jié)

    Python?pandas的八個生命周期總結(jié)

    這篇文章主要從八個pandas的數(shù)據(jù)處理生命周期,整理匯總出pandas框架在整個數(shù)據(jù)處理過程中都是如何處理數(shù)據(jù)的,感興趣的小伙伴可以了解一下
    2022-10-10
  • Python urllib3軟件包的使用說明

    Python urllib3軟件包的使用說明

    這篇文章主要介紹了Python urllib3軟件包的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • python jieba分詞并統(tǒng)計詞頻后輸出結(jié)果到Excel和txt文檔方法

    python jieba分詞并統(tǒng)計詞頻后輸出結(jié)果到Excel和txt文檔方法

    本篇文章主要介紹了python jieba分詞并統(tǒng)計詞頻后輸出結(jié)果到Excel和txt文檔方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 對Python 簡單串口收發(fā)GUI界面的實例詳解

    對Python 簡單串口收發(fā)GUI界面的實例詳解

    今天小編就為大家分享一篇對Python 簡單串口收發(fā)GUI界面的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python 如何在 Matplotlib 中繪制垂直線

    python 如何在 Matplotlib 中繪制垂直線

    這篇文章主要介紹了python 如何在 Matplotlib 中繪制垂直線,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 零基礎(chǔ)寫python爬蟲之HTTP異常處理

    零基礎(chǔ)寫python爬蟲之HTTP異常處理

    我們在使用爬蟲來抓取網(wǎng)頁內(nèi)容的時候,HTTP異常是必須要注意的一項,所以本文,我們來詳細(xì)探尋一下HTTP異常處理的相關(guān)內(nèi)容,通過一些具體的實例來分析一下,非常的簡單,但是卻很實用。
    2014-11-11
  • Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn)

    Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn)

    這篇文章主要介紹了Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python3.4學(xué)習(xí)筆記之列表、數(shù)組操作示例

    Python3.4學(xué)習(xí)筆記之列表、數(shù)組操作示例

    這篇文章主要介紹了Python3.4列表、數(shù)組操作,結(jié)合實例形式分析了Python3.4列表的創(chuàng)建、元素追加、刪除、排序等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • python 時間的訪問和轉(zhuǎn)換 time示例小結(jié)

    python 時間的訪問和轉(zhuǎn)換 time示例小結(jié)

    Python 的 time 模塊提供了各種與時間處理相關(guān)的功能,包括獲取當(dāng)前時間、操作日期/時間以及執(zhí)行與時間相關(guān)的各種其它功能,這篇文章主要介紹了python 時間的訪問和轉(zhuǎn)換 time,需要的朋友可以參考下
    2024-05-05
  • Python3獲取cookie常用三種方案

    Python3獲取cookie常用三種方案

    這篇文章主要介紹了Python3獲取cookie常用三種方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論