惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
美团技术团队
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
L
LangChain Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
腾讯CDC
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
博客园 - 司徒正美
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
C
Check Point Blog
小众软件
小众软件
V
Visual Studio Blog
V
V2EX
F
Full Disclosure
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
人人都是产品经理
人人都是产品经理
量子位
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
博客园_首页
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
G
Google Developers Blog
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
爱范儿
爱范儿
Jina AI
Jina AI

编程与诗|飒白的个人博客|飒白的闲话仓库|一位主播和程序员的奇妙组合体

侯捷c++笔记:c++泛型与高级用法 侯捷c++笔记:c++面向对象的指针类 侯捷c++笔记:c++面向对象的无指针类 03《穷查理宝典》 查理·芒格丨读书笔记 02《穷爸爸富爸爸》 罗伯特·清崎丨读书笔记 01《影响力》罗伯特・西奥迪尼丨读书笔记 基于结构光投影三维重建:格雷码编码与解码 给CNN添加TVloss的随记 三维重建论文笔记 DeMoN:Depth and Motion Network for Learning Monocular Stereo 三维扫描系列 点云绪论 茫茫摄影路:好照片的基本三要素 pytorch学习日记:创建Tensor pytorch学习日记:张量数据类型 研究生涯005 利用蒙特卡洛方法实现21点问题的最优解 研究生涯004 基于深度学习的水质图像分类 研究生涯003 基于最近邻法手写数字识别设计 研究生涯002 汽车模糊推理系统实验 研究生涯001 浅析机器视觉在医疗影像处理中的应用 人工智能问答NO.8 决策树与随机森林
修改DCNN使其输入从无监督变为有监督模型
飒白 · 2021-01-06 · via 编程与诗|飒白的个人博客|飒白的闲话仓库|一位主播和程序员的奇妙组合体

本模型是基于DnCNN-keras进行的微小调整,主要是将其模型单输入无监督学习(输入纯净图片进行噪声添加并学习去噪),修改成输入纯净图片与真实的噪声图片进行监督学习,使其去噪能力更为专一与准确。

main.py

首先对迭代函数进行修改:

原代码:

def train_datagen(y_, batch_size=8):
    indices = list(range(y_.shape[0]))
    while(True):
        np.random.shuffle(indices)    
        for i in range(0, len(indices), batch_size):
            ge_batch_y = y_[indices[i:i+batch_size]]
            noise =  np.random.normal(0, args.sigma/255.0, ge_batch_y.shape)  
            ge_batch_x = ge_batch_y + noise 
            yield ge_batch_x, ge_batch_y

修改后:

def train_datagen(x_, y_, batch_size=8):#添加x_形参
    indices = list(range(y_.shape[0]))
    while (True):
        np.random.shuffle(indices)
        for i in range(0, len(indices), batch_size):
            ge_batch_x = x_[indices[i:i + batch_size]] # 添加对x的batch处理
            ge_batch_y = y_[indices[i:i + batch_size]]
            # noise =  np.random.normal(0, args.sigma/255.0, ge_batch_y.shape)    # noise
            # #noise =  K.random_normal(ge_batch_y.shape, mean=0, stddev=args.sigma/255.0)
            # ge_batch_x = ge_batch_y + noise  # input image = clean image + noise
            #将加噪声部分部分注释掉
            yield ge_batch_x, ge_batch_y 

对训练函数进行修改:

原函数:

ef train():

    data = load_train_data()
    data = data.reshape((data.shape[0],data.shape[1],data.shape[2],1))
    data = data.astype('float32')/255.0
    if args.pretrain:   model = load_model(args.pretrain, compile=False)
    else:   
        if args.model == 'DnCNN': model = models.DnCNN()
    model.compile(optimizer=Adam(), loss=['mse'])
    ckpt = ModelCheckpoint(save_dir+'/model_{epoch:02d}.h5', monitor='val_loss', 
                    verbose=0, period=args.save_every)
    csv_logger = CSVLogger(save_dir+'/log.csv', append=True, separator=',')
    lr = LearningRateScheduler(step_decay)
    history = model.fit_generator(train_datagen(data, batch_size=args.batch_size),
                    steps_per_epoch=len(data)//args.batch_size, epochs=args.epoch, verbose=1, 
                    callbacks=[ckpt, csv_logger, lr])

    return model

修改后:

def train():
    datax = load_train_data(args.train_datax)
    datax = datax.reshape((datax.shape[0], datax.shape[1], datax.shape[2], 1))
    datax = datax.astype('float32') / 255.0
    # 复制粘贴给标签腾地方
    datay = load_train_data(args.train_datay)
    datay = datay.reshape((datay.shape[0], datay.shape[1], datay.shape[2], 1))
    datay = datay.astype('float32') / 255.0

    if args.pretrain:
        model = load_model(args.pretrain, compile=False)
    else:
        if args.model == 'DnCNN': model = models.DnCNN()

    model.compile(optimizer=Adam(), loss=['mse'])
    ckpt = ModelCheckpoint(save_dir + '/model_{epoch:02d}.h5', monitor='val_loss',
                           verbose=0, period=args.save_every)
    csv_logger = CSVLogger(save_dir + '/log.csv', append=True, separator=',')
    lr = LearningRateScheduler(step_decay)
    history = model.fit_generator(train_datagen(datax, datay, batch_size=args.batch_size),
                                  steps_per_epoch=len(datax) // args.batch_size, epochs=args.epoch, verbose=1,
                                  callbacks=[ckpt, csv_logger, lr]) # 添加输入对应形参
    return model

修改测试函数:

原函数:

def test(model):

  # 略
    file_list = glob.glob('{}/*.png'.format(args.test_dir))
    for file in file_list:
        # read image
        img_clean = np.array(Image.open(file), dtype='float32') / 255.0
        img_test = img_clean + np.random.normal(0, args.sigma/255.0, img_clean.shape)
        img_test = img_test.astype('float32')
        # predict
  # 略
    pd.DataFrame({'name':np.array(name), 'psnr':np.array(psnr), 'ssim':np.array(ssim)}).to_csv(out_dir+'/metrics.csv', index=True)

修改后:

def test(model):

  # 略
    file_list = glob.glob('{}/*.png'.format(args.test_dir))
    for file in file_list:
        # read image
        img_clean = np.array(Image.open(file), dtype='float32') / 255.0
        # img_test = img_clean + np.random.normal(0, args.sigma / 255.0, img_clean.shape)
        # 将噪声注释掉
        img_test = img_clean.astype('float32')
        # predict
  # 略
    pd.DataFrame({'name':np.array(name), 'psnr':np.array(psnr), 'ssim':np.array(ssim)}).to_csv(out_dir+'/metrics.csv', index=True)

对应train函数,添加预设dir:

parser.add_argument('--train_datax', default='./data/npy_data/x.npy', type=str, help='path of train data')
parser.add_argument('--train_datay', default='./data/npy_data/y.npy', type=str, help='path of train data')

data.py

分别打包噪声图片和标签就好了。

还没有跑这个模型,如果失败了会过来继续修改文章。

如果成功了,那就当做一篇记录自己修改(学长帮助)模型的经验记录吧。