当前位置: 首页 > 資訊 >

DAY16:Pytorch transforms(上)

torchvision.transforms

transforms可以用來改變樣本的多樣性,例如:旋轉、平移等等,訓練圖像辨識時,一定會用到的工具,現在來跟大家介紹他有哪些用法!我拿還未處理過的資料來當示範。這裡我把圖片都轉換成400*400的大小。

    from torchvision import transforms
    from PIL import Image

    def img_loader(img_path):
        image = Image.open(img_path)
        img = image.resize((400, 400),Image.ANTIALIAS)
        return img.convert('RGB')

  • 中心裁剪:transforms.CenterCrop
    • 中心裁剪是從中心算你給他的size多大,他就裁多大。我們設置剪下200*200的圖片大小。下面是比較圖。
      • 參數size:你要裁剪的大小。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform = transforms.Compose([transforms.CenterCrop(size=((200,200)))])
      img = tranform(img)
      img.show()    
      
    • 若裁剪的比原圖還大時,多出來的部分會用黑色填補。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform = transforms.Compose([transforms.CenterCrop(size=((750,500)))])
      img = tranform(img)
      img.show() 
      

  • 隨機裁剪:transforms.RandomCrop

    • 將圖檔隨機裁剪你設定的size。

      • size:要剪裁下來的大小。
      • padding:將原圖先填補你給的值的像素,會在隨機裁剪前填補。
      • pad_if_need:當圖片小於設置的size時,是否填補。
      • fill:填補的顏色,預設黑色,例如可改為紅色(255,0,0)。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform =         transforms.Compose([transforms.RandomCrop(size=((200,200)),padding=100)])
      img = tranform(img)
      img.show()
      

      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform =         transforms.Compose([transforms.RandomCrop(size=((200,200)),padding=100,fill = (255,0,0))])
      img = tranform(img)
      img.show()
      


  • 隨機長寬比裁剪:transforms.RandomResizedCrop
    • 隨機大小及隨機長寬比裁剪原始圖片,最後再resize到設定好的size。

      • size:要剪裁的圖片大小。
      • scale:例如scale=(0.2, 1.0),則會隨機從0.2到1.0中,選一個倍數裁剪,如0.2則裁剪原圖的0.2倍。
      • ratio:長寬比區間,隨機選取。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform = transforms.Compose([transforms.RandomResizedCrop(size = (200,200),scale=(0.2, 1.0), ratio=(0.5, 1.1))])
      img = tranform(img)
      img.show()
      


  • 水平翻轉:transforms.RandomHorizontalFlip
    • 依照P的機率,資料集的P倍圖片會被水平翻轉。

      • p:為水平翻轉的機率,若為1則所有圖片都被水平翻轉。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      img.show()
      tranform = transforms.Compose([transforms.RandomVerticalFlip(p = 0.9)])
      img = tranform(img)
      img.show()
      


  • 垂直翻轉:RandomHorizontalFlip

    • 依照P的機率,資料集的P倍圖片會被垂直翻轉。

      • p:為垂直翻轉的機率,若為1則所有圖片都被垂直翻轉。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      tranform = transforms.Compose([transforms.RandomHorizontalFlip(p = 0.9)])
      img = tranform(img)
      img.show()
      


  • 隨機旋轉:RandomRotation

    • 依照設置的degrees,隨機旋轉圖片。

      • degrees:若設為d值,則在(-d,d)之間旋轉;若設為(a,b),則在a到b之間旋轉。
      • center:旋轉中心的座標。預設為中心點。(0,0)為左上角。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      tranform = transforms.Compose([transforms.RandomRotation(degrees = 30,center=(0,0))])
      img = tranform(img)
      img.show()
      


  • 填補:Pad

    • 依照設置的值為像素,由外而內填補。
      • padding:將原圖填補你給的值的像素。
      • fill:填補的顏色,預設黑色,例如可改為紅色(255,0,0)。
      img = img_loader(r"C:\Users\Frank\PycharmProjects\practice\mountain\train\5_拓.jpg")
      tranform = transforms.Compose([transforms.Pad(padding = 30,fill=(255,200,0))])
      img = tranform(img)
      img.show()
      

今日小結

  • 還沒有介紹完,目前都是剪裁跟旋轉的部分,後面還有會調整圖片的函數。
  • 做這些轉換可以增加圖片的多樣性,提高模型的泛化程度。