自编码AE 实现图片去马赛克(完整代码奉献) pytorch

前言:博主闲来无事,写了个AE网络来实现任意图片的去马赛克(前提是训练样本是哪方面的马赛克图~~,博主是针对打码人脸的去码)。样本分为没打码人脸8000张和经打码处理的对应8000张(取自celeba人脸数据集)。预处理阶段:人脸resize到256x256,打码。为读入数据,把文件夹里的图片名读取出并保存到了label.txt文件。主程序分4块:网络定义文件net.py,  读数据dataset.py,  训练train.py,   测试test.py 。并在每段代码上,我认为初学者易犯错的地方做了详解。

这是一个练手的网络,仅供初学者参考交流,博主希望能通过此代码在以下几点对初学者有所帮助

  1. 如何把本地文件传入网络:通过from torch.utils.data import Dataset,DataLoader,具体见dataset.py
  2. 对于待读入的图没有现成的标签时,如何制作标签文件:见ToTxt.py
  3. 编程起于清晰的思路,只有熟知一步步怎么做才能把一件事完成,才会写出完整的代码。如要实现人脸去码,那么我的思路就是:把打码图传入,先编码再解码,把解码的结果与对应的未打码的图求loss(用的均值平方差),这样就能够引导解码出的图向未打码前的样子不断靠拢。最后,把没训练过的新的打码的图传入AE网络,则编码出的图就会是该图打码前的样子
  4. 编程过程,一定要时刻警惕矩阵维度的转变(通道数),tensor与numpy的转化,HWC—>CHW, CHW—>NCHW, BGR—>RGB等细节问题。一不留神就会出bug,也是初学者最易犯的错误。
  5. 我的思考:AE网络的好处是易训练,稳定性好,但是学到的是两张对应图片上的像素间点对点的对应关系,从loss函数也能看出,这样就无法学到每张图内部的像素点与像素点间的相对空间关系(分布)。而gan网络恰好是学的分布关系。可知AE与GAN是优势互补的。所以,我说到这里,大家也能想到了,做图像修复的话,把二者结合使用是非常不错的方法,我相信会有明显的提升。实际我也在做了,也是博主研究生课题的一环,等过一段时间出了结果后续我再总结一下。

一. 代码

1.全代码名称展示

2.主程序

(1)dataset.py

'自制作样本标签txt以读取'
import torch
import os
import numpy as np
import cv2
from torch.utils.data import Dataset,DataLoader

class GetData(Dataset):
    def __init__(self,path1,path2):
        super(GetData,self).__init__()
        self.path1 = path1
        self.path2 = path2
        self.dataset1 = []
        self.dataset2 = []
        self.dataset1.extend(open(os.path.join(self.path1,'label.txt')).readlines())
        self.dataset2.extend(open(os.path.join(self.path2,'label.txt')).readlines())

    def __getitem__(self, index): #index不是待赋参量,而是对应批次batch_size
        str1 = self.dataset1[index].strip() #如dataset[0]是第一批次
        str2 = self.dataset2[index].strip()
        imgpath1 = os.path.join(self.path1,str1)
        imgpath2 = os.path.join(self.path2,str2)
        im1 = cv2.imread(imgpath1)
        im2 = cv2.imread(imgpath2)
        '对imgdata不要用transpose,会导致cv2.imshow()时出现显示错误!!!'
        imgdata1 = torch.Tensor((im1 / 255. - 0.5))
        imgdata2 = torch.Tensor((im2 / 255. - 0.5))
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值