最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年12月26日 14:34:00   作者:Oldpan  
這篇文章主要介紹了Pytorch中Tensor與各種圖像格式的相互轉(zhuǎn)化詳解,文中通過示例代碼介紹的非常詳細,對大家的學(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://m.fzitv.net/article/177288.htm

格式轉(zhuǎn)換

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

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

注意,之后的講解圖片格式皆為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讀取出來的略差一些(詳細過程之后發(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按照多個字符對字符串進行分割的方法

    python按照多個字符對字符串進行分割的方法

    這篇文章主要介紹了python按照多個字符對字符串進行分割的方法,涉及Python中正則表達式匹配的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • maven沖突問題解決

    maven沖突問題解決

    這篇文章主要介紹了maven沖突問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用Python進行同期群分析(Cohort?Analysis)

    使用Python進行同期群分析(Cohort?Analysis)

    同期群(Cohort)的字面意思(有共同特點或舉止類同的)一群人,比如不同性別,不同年齡。這篇文章主要介紹了用Python語言來進行同期群分析,感興趣的同學(xué)可以閱讀參考一下本文
    2023-03-03
  • Python使用設(shè)計模式中的責(zé)任鏈模式與迭代器模式的示例

    Python使用設(shè)計模式中的責(zé)任鏈模式與迭代器模式的示例

    這篇文章主要介紹了Python使用設(shè)計模式中的責(zé)任鏈模式與迭代器模式的示例,責(zé)任鏈模式與迭代器模式都可以被看作為行為型的設(shè)計模式,需要的朋友可以參考下
    2016-03-03
  • python神經(jīng)網(wǎng)絡(luò)編程之手寫數(shù)字識別

    python神經(jīng)網(wǎng)絡(luò)編程之手寫數(shù)字識別

    這篇文章主要介紹了python神經(jīng)網(wǎng)絡(luò)編程之手寫數(shù)字識別,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python神經(jīng)網(wǎng)絡(luò)編程的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Django框架使用內(nèi)置方法實現(xiàn)登錄功能詳解

    Django框架使用內(nèi)置方法實現(xiàn)登錄功能詳解

    這篇文章主要介紹了Django框架使用內(nèi)置方法實現(xiàn)登錄功能,結(jié)合實例形式詳細分析了Django框架內(nèi)置方法實現(xiàn)登錄功能的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-06-06
  • 如何一分鐘內(nèi)找出pandas DataFrame某列中的nan值

    如何一分鐘內(nèi)找出pandas DataFrame某列中的nan值

    這篇文章主要介紹了如何一分鐘內(nèi)找出pandas DataFrame某列中的nan值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • python下MySQLdb用法實例分析

    python下MySQLdb用法實例分析

    這篇文章主要介紹了python下MySQLdb用法,實例分析了Python中MySQLdb的安裝及使用技巧,包括增刪改查及亂碼處理的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 教你怎么用Python實現(xiàn)GIF動圖的提取及合成

    教你怎么用Python實現(xiàn)GIF動圖的提取及合成

    今天教大家一個Python有趣好玩的小功能:將多張圖片轉(zhuǎn)為GIF,同時也可以將一個GIF動圖提取出里面的圖片,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python測試框架unittest和pytest區(qū)別

    python測試框架unittest和pytest區(qū)別

    這篇文章主要介紹了python測試框架unittest和pytest區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用python進行自動化測試,感興趣的朋友可以了解下
    2021-04-04

最新評論

巩义市| 大足县| 沙田区| 余江县| 红安县| 大港区| 鸡泽县| 渭源县| 呼伦贝尔市| 安溪县| 嘉鱼县| 将乐县| 双江| 巴青县| 内黄县| 呼伦贝尔市| 桐城市| 亚东县| 安龙县| 梅河口市| 西安市| 阜南县| 贵港市| 潢川县| 云阳县| 东兴市| 靖边县| 高台县| 门源| 清水河县| 桂平市| 年辖:市辖区| 西吉县| 菏泽市| 锦州市| 清河县| 会泽县| 嘉黎县| 象州县| 栾城县| 仪征市|