1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【深度學(xué)習(xí)】實(shí)戰(zhàn)|13個(gè)Pytorch 圖像增強(qiáng)方法總結(jié)(附代碼)

        共 9132字,需瀏覽 19分鐘

         ·

        2023-08-22 18:12

        作者丨結(jié)發(fā)授長生@知乎

        鏈接丨https://zhuanlan.zhihu.com/p/559887437


        使用數(shù)據(jù)增強(qiáng)技術(shù)可以增加數(shù)據(jù)集中圖像的多樣性,從而提高模型的性能和泛化能力。主要的圖像增強(qiáng)技術(shù)包括:

        • 調(diào)整大小
        • 灰度變換
        • 標(biāo)準(zhǔn)化
        • 隨機(jī)旋轉(zhuǎn)
        • 中心裁剪
        • 隨機(jī)裁剪
        • 高斯模糊
        • 亮度、對比度調(diào)節(jié)
        • 水平翻轉(zhuǎn)
        • 垂直翻轉(zhuǎn)
        • 高斯噪聲
        • 隨機(jī)塊
        • 中心區(qū)域

        調(diào)整大小

        在開始圖像大小的調(diào)整之前我們需要導(dǎo)入數(shù)據(jù)(圖像以眼底圖像為例)。

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T

        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/000001.tif'))
        torch.manual_seed(0) # 設(shè)置 CPU 生成隨機(jī)數(shù)的 種子 ,方便下次復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果
        print(np.asarray(orig_img).shape) #(800, 800, 3)

        #圖像大小的調(diào)整
        resized_imgs = [T.Resize(size=size)(orig_img) for size in [128,256]]
        # plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('resize:128*128')
        ax2.imshow(resized_imgs[0])

        ax3 = plt.subplot(133)
        ax3.set_title('resize:256*256')
        ax3.imshow(resized_imgs[1])

        plt.show()
        fed0b8c02249c1ac4430f4bffd1b453a.webp

        灰度變換

        此操作將RGB圖像轉(zhuǎn)化為灰度圖像。

              gray_img = T.Grayscale()(orig_img)
        # plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(122)
        ax2.set_title('gray')
        ax2.imshow(gray_img,cmap='gray')
        a69444e5f56820efa23e37b514de8f17.webp

        標(biāo)準(zhǔn)化

        標(biāo)準(zhǔn)化可以加快基于神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的模型的計(jì)算速度,加快學(xué)習(xí)速度。

        • 從每個(gè)輸入通道中減去通道平均值
        • 將其除以通道標(biāo)準(zhǔn)差。
              normalized_img = T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(T.ToTensor()(orig_img))
        normalized_img = [T.ToPILImage()(normalized_img)]
        # plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(122)
        ax2.set_title('normalize')
        ax2.imshow(normalized_img[0])

        plt.show()
        dd6e8a66dffde7d4ab26b9aada9c18ab.webp

        隨機(jī)旋轉(zhuǎn)

        設(shè)計(jì)角度旋轉(zhuǎn)圖像

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        rotated_imgs = [T.RandomRotation(degrees=90)(orig_img)]
        print(rotated_imgs)
        plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(122)
        ax2.set_title('90°')
        ax2.imshow(np.array(rotated_imgs[0]))
        4c84084580a89acc92c0379cd59015c4.webp

        中心剪切

        剪切圖像的中心區(qū)域

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        center_crops = [T.CenterCrop(size=size)(orig_img) for size in (128,64)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('128*128°')
        ax2.imshow(np.array(center_crops[0]))

        ax3 = plt.subplot(133)
        ax3.set_title('64*64')
        ax3.imshow(np.array(center_crops[1]))

        plt.show()
        a9b79a5c1e75facedaafa04b1aa264e3.webp

        隨機(jī)裁剪

        隨機(jī)剪切圖像的某一部分

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        random_crops = [T.RandomCrop(size=size)(orig_img) for size in (400,300)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('400*400')
        ax2.imshow(np.array(random_crops[0]))

        ax3 = plt.subplot(133)
        ax3.set_title('300*300')
        ax3.imshow(np.array(random_crops[1]))

        plt.show()
        614d4f1731d65c2eff2a350fcb3bbd03.webp

        高斯模糊

        使用高斯核對圖像進(jìn)行模糊變換

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        blurred_imgs = [T.GaussianBlur(kernel_size=(3, 3), sigma=sigma)(orig_img) for sigma in (3,7)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('sigma=3')
        ax2.imshow(np.array(blurred_imgs[0]))

        ax3 = plt.subplot(133)
        ax3.set_title('sigma=7')
        ax3.imshow(np.array(blurred_imgs[1]))

        plt.show()
        a0990ac2e1c81cbe8cd757801cf4cda2.webp

        亮度、對比度和飽和度調(diào)節(jié)

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))
        # random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]
        colorjitter_img = [T.ColorJitter(brightness=(2,2), contrast=(0.5,0.5), saturation=(0.5,0.5))(orig_img)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)
        ax2 = plt.subplot(122)
        ax2.set_title('colorjitter_img')
        ax2.imshow(np.array(colorjitter_img[0]))
        plt.show()
        ba0306e5acfebde5a7ed65940f22a61e.webp

        水平翻轉(zhuǎn)

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        HorizontalFlip_img = [T.RandomHorizontalFlip(p=1)(orig_img)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(122)
        ax2.set_title('colorjitter_img')
        ax2.imshow(np.array(HorizontalFlip_img[0]))


        plt.show()
        dee53d4c8750ca5bcda81bcdb7d529f3.webp

        垂直翻轉(zhuǎn)

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))

        VerticalFlip_img = [T.RandomVerticalFlip(p=1)(orig_img)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(121)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(122)
        ax2.set_title('VerticalFlip')
        ax2.imshow(np.array(VerticalFlip_img[0]))

        # ax3 = plt.subplot(133)
        # ax3.set_title('sigma=7')
        # ax3.imshow(np.array(blurred_imgs[1]))

        plt.show()
        0b74dbbcb9cefc560b226f46b571182e.webp

        高斯噪聲

        向圖像中加入高斯噪聲。通過設(shè)置噪聲因子,噪聲因子越高,圖像的噪聲越大。

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))


        def add_noise(inputs, noise_factor=0.3):
        noisy = inputs + torch.randn_like(inputs) * noise_factor
        noisy = torch.clip(noisy, 0., 1.)
        return noisy


        noise_imgs = [add_noise(T.ToTensor()(orig_img), noise_factor) for noise_factor in (0.3, 0.6)]
        noise_imgs = [T.ToPILImage()(noise_img) for noise_img in noise_imgs]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('noise_factor=0.3')
        ax2.imshow(np.array(noise_imgs[0]))

        ax3 = plt.subplot(133)
        ax3.set_title('noise_factor=0.6')
        ax3.imshow(np.array(noise_imgs[1]))

        plt.show()
        22d7c9da033110d386731a7ab5f6ac5c.webp

        隨機(jī)塊

        正方形補(bǔ)丁隨機(jī)應(yīng)用在圖像中。這些補(bǔ)丁的數(shù)量越多,神經(jīng)網(wǎng)絡(luò)解決問題的難度就越大。

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))


        def add_random_boxes(img,n_k,size=64):
        h,w = size,size
        img = np.asarray(img).copy()
        img_size = img.shape[1]
        boxes = []
        for k in range(n_k):
        y,x = np.random.randint(0,img_size-w,(2,))
        img[y:y+h,x:x+w] = 0
        boxes.append((x,y,h,w))
        img = Image.fromarray(img.astype('uint8'), 'RGB')
        return img

        blocks_imgs = [add_random_boxes(orig_img,n_k=10)]

        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('10 black boxes')
        ax2.imshow(np.array(blocks_imgs[0]))


        plt.show()
        4ddcda74d7bd3404aac73457bd7698f4.webp

        中心區(qū)域

        和隨機(jī)塊類似,只不過在圖像的中心加入補(bǔ)丁

              from PIL import Image
        from pathlib import Path
        import matplotlib.pyplot as plt
        import numpy as np
        import sys
        import torch
        import numpy as np
        import torchvision.transforms as T


        plt.rcParams["savefig.bbox"] = 'tight'
        orig_img = Image.open(Path('image/2.png'))


        def add_central_region(img, size=32):
        h, w = size, size
        img = np.asarray(img).copy()
        img_size = img.shape[1]
        img[int(img_size / 2 - h):int(img_size / 2 + h), int(img_size / 2 - w):int(img_size / 2 + w)] = 0
        img = Image.fromarray(img.astype('uint8'), 'RGB')
        return img


        central_imgs = [add_central_region(orig_img, size=128)]


        plt.figure('resize:128*128')
        ax1 = plt.subplot(131)
        ax1.set_title('original')
        ax1.imshow(orig_img)

        ax2 = plt.subplot(132)
        ax2.set_title('')
        ax2.imshow(np.array(central_imgs[0]))
        #
        # ax3 = plt.subplot(133)
        # ax3.set_title('20 black boxes')
        # ax3.imshow(np.array(blocks_imgs[1]))

        plt.show()
        be018ae5cf7cec702ddeb9fcc80a8092.webp 文僅 做學(xué) 術(shù)分享,如有侵權(quán),請聯(lián)系 刪文。


            
              
                    
                      
                        
                          
                                
                                                    往期
                                                    精彩
                                                    回顧
                                                  
                                                



        瀏覽 107
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄片网页版 | 黄色视频在线观看视频 | 国产99久精在线观看V18 操你啦在线 | 国内一级黄色 | 久久久噜噜噜久久人人看 | 法国空姐3伦理 | 豆花在线成人网站 | 亚洲伦理一区二区在线在线观看 | 我被下药做得好爽 | 亚洲琪琪 |