【百战GAN】如何使用GAN拯救你的低分辨率老照片
大家好,歡迎來到專欄《百戰GAN》,在這個專欄里,我們會進行算法的核心思想講解,代碼的詳解,模型的訓練和測試等內容。
作者&編輯 | 言有三
本文資源與生成結果展示
本文篇幅:5200字
背景要求:會使用Python和Pytorch
附帶資料:項目推薦,版本包括Pytorch+Tensorflow
同步平臺:有三AI知識星球(一周內)
1 項目背景
了解GAN的同學都知道,GAN擅長于捕捉概率分布,因此非常適合圖像生成類任務。我們在圖片視頻拍攝以及傳輸過程中,經常會進行圖像的壓縮,導致圖像分辨率過低,另外早些年的設備拍攝出來的照片也存在分辨率過低的問題,比如10年前的320*240分辨率。要解決此問題,需要使用到圖像超分辯技術。
本次我們使用GAN來完成圖像超分辯任務,需要做的準備工作包括:
(1) Linux系統或者windows系統,使用Linux效率更高。
(2)?安裝好的Pytorch,需要GPU進行訓練。
2 原理簡介
圖像超分辯任務輸入是一張低分辨率的圖像,輸出是一張對它進行分辨率增大的圖片,下面是一個常用的框架示意圖[1]:
該框架首先對輸入圖使用插值方法進行上采樣,然后使用卷積層對輸入進行學習,這種框架的劣勢是計算代價比較大,因為整個網絡是對高分辨率圖操作。
隨后研究者提出在網絡的后端進行分辨率放大,通過擴充通道數,然后將其重新分布來獲得高分辨率圖,這套操作被稱為(PixShuffle)[2],這樣整個網絡大部分計算量是對低分辨率圖操作,如下圖:
以上構成了圖像超分辨的基本思路,之后研究者將GAN帶入超分辯框架[3],實際上就是增加了對抗損失,同時使用了我們常說的感知損失替代了重建用的MSE損失。
關于各類超分辨率框架的具體原理,大家可以移步有三AI知識星球,或者自行學習。由于我們這是實戰專欄,不對原理做完整的介紹。
3 模型訓練
大多數超分重建任務的數據集都是通過從高分辨率圖像進行下采樣獲得,論文中往往選擇ImageNet數據集,由于我們這里打算專門對人臉進行清晰度恢復,因此選擇了一個常用的高清人臉數據集,CelebA-HQ,它發布于 2019 年,包含30000張不同屬性的高清人臉圖,其中圖像大小均為1024×1024,預覽如下。
接下來我們對代碼進行解讀:
3.1 數據預處理
圖像超分辨數據集往往都是從高分辨率圖進行采樣得到低分辨率圖,然后組成訓練用的圖像對,下面是對訓練集和驗證集中數據處理的核心代碼:
## 訓練集高分辨率圖預處理函數
def train_hr_transform(crop_size):
??? return Compose([
??????? RandomCrop(crop_size),
??????? ToTensor(),
])
## 訓練集低分辨率圖預處理函數
def train_lr_transform(crop_size, upscale_factor):
??? return Compose([
??????? ToPILImage(),
??????? Resize(crop_size // upscale_factor, interpolation=Image.BICUBIC),
??????? ToTensor()
??? ])
## 訓練數據集類
class TrainDatasetFromFolder(Dataset):
??? def __init__(self, dataset_dir, crop_size, upscale_factor):
??????? super(TrainDatasetFromFolder, self).__init__()
??????? self.image_filenames = [join(dataset_dir, x) for x in listdir(dataset_dir) if is_image_file(x)] ##獲得所有圖像
crop_size = calculate_valid_crop_size(crop_size, upscale_factor)##獲得裁剪尺寸
??????? self.hr_transform = train_hr_transform(crop_size) ##高分辨率圖預處理函數
??????? self.lr_transform = train_lr_transform(crop_size, upscale_factor) ##低分辨率圖預處理函數
##數據集迭代指針
??? def __getitem__(self, index):
??????? hr_image = self.hr_transform(Image.open(self.image_filenames[index])) ##隨機裁剪獲得高分辨率圖
??????? lr_image = self.lr_transform(hr_image) ##獲得低分辨率圖
??????? return lr_image, hr_image
??? def __len__(self):
??????? return len(self.image_filenames)
## 驗證數據集類
class ValDatasetFromFolder(Dataset):
??? def __init__(self, dataset_dir, upscale_factor):
??????? super(ValDatasetFromFolder, self).__init__()
??????? self.upscale_factor = upscale_factor
??????? self.image_filenames = [join(dataset_dir, x) for x in listdir(dataset_dir) if is_image_file(x)]
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【百战GAN】如何使用GAN拯救你的低分辨率老照片的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【百战GAN】GAN也可以拿来做图像分割
- 下一篇: 【杂谈】有三AI秋季划增加生成对抗网络小
