【毕业设计】深度学习图像修复算法研究与实现 - python

news2024/11/18 18:42:05

文章目录

  • 1 前言
  • 2 什么是图像内容填充修复
  • 3 原理分析
    • 3.1 第一步:将图像理解为一个概率分布的样本
    • 3.2 补全图像
  • 3.3 快速生成假图像
    • 3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构
    • 3.5 使用G(z)生成伪图像
  • 4 在Tensorflow上构建DCGANs
  • 5 最后

1 前言

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩基于深度学习的图像修复 图像补全

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md

2 什么是图像内容填充修复

内容识别填充(译注: Content-aware fill ,是 photoshop 的一个功能)是一个强大的工具,设计师和摄影师可以用它来填充图片中不想要的部分或者缺失的部分。在填充图片的缺失或损坏的部分时,图像补全和修复是两种密切相关的技术。有很多方法可以实现内容识别填充,图像补全和修复。

  • 首先我们将图像理解为一个概率分布的样本。
  • 基于这种理解,学*如何生成伪图片。
  • 然后我们找到最适合填充回去的伪图片。

在这里插入图片描述

自动删除不需要的部分(海滩上的人)
在这里插入图片描述

最经典的人脸补充

补充前:

在这里插入图片描述

补充后:
在这里插入图片描述

3 原理分析

3.1 第一步:将图像理解为一个概率分布的样本

你是怎样补全缺失信息的呢?

在上面的例子中,想象你正在构造一个可以填充缺失部分的系统。你会怎么做呢?你觉得人类大脑是怎么做的呢?你使用了什么样的信息呢?

在博文中,我们会关注两种信息:

语境信息:你可以通过周围的像素来推测缺失像素的信息。

感知信息:你会用“正常”的部分来填充,比如你在现实生活中或其它图片上看到的样子。
两者都很重要。没有语境信息,你怎么知道填充哪一个进去?没有感知信息,通过同样的上下文可以生成无数种可能。有些机器学*系统看起来“正常”的图片,人类看起来可能不太正常。
如果有一种确切的、直观的算法,可以捕获前文图像补全步骤介绍中提到的两种属性,那就再好不过了。对于特定的情况,构造这样的算法是可行的。但是没有一般的方法。目前最好的解决方案是通过统计和机器学习来得到一个类似的技术。

在这里插入图片描述

从这个分布中采样,就可以得到一些数据。需要搞清楚的是PDF和样本之间的联系。

在这里插入图片描述

从正态分布中的采样

在这里插入图片描述
2维图像的PDF和采样。 PDF 用等高线图表示,样本点画在上面。

3.2 补全图像

首先考虑多变量正态分布, 以求得到一些启发。给定 x=1 , 那么 y 最可能的值是什么?我们可以固定x的值,然后找到使PDF最大的 y。
在这里插入图片描述
在多维正态分布中,给定x,得到最大可能的y

这个概念可以很自然地推广到图像概率分布。我们已知一些值,希望补全缺失值。这可以简单理解成一个最大化问题。我们搜索所有可能的缺失值,用于补全的图像就是可能性最大的值。
从正态分布的样本来看,只通过样本,我们就可以得出PDF。只需挑选你喜欢的 统计模型, 然后拟合数据即可。
然而,我们实际上并没有使用这种方法。对于简单分布来说,PDF很容易得出来。但是对于更复杂的图像分布来说,就十分困难,难以处理。之所以复杂,一部分原因是复杂的条件依赖:一个像素的值依赖于图像中其它像素的值。另外,最大化一个一般的PDF是一个非常困难和棘手的非凸优化问题。

3.3 快速生成假图像

在未知概率分布情况下,学习生成新样本

除了学如何计算PDF之外,统计学中另一个成熟的想法是学怎样用 生成模型 生成新的(随机)样本。生成模型一般很难训练和处理,但是后来深度学*社区在这个领域有了一个惊人的突破。Yann LeCun 在这篇 Quora 回答中对如何进行生成模型的训练进行了一番精彩的论述,并将它称为机器学习领域10年来最有意思的想法。

3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构

使用微步长卷积,对图像进行上采样

在这里插入图片描述
现在我们有了微步长卷积结构,可以得到G(z)的表达,以一个向量z∼pz 作为输入,输出一张 64x64x3 的RGB图像。

在这里插入图片描述

3.5 使用G(z)生成伪图像

基于DCGAN的人脸代数运算 DCGAN论文 。

在这里插入图片描述

4 在Tensorflow上构建DCGANs

部分代码:

def generator(self, z):
    self.z_, self.h0_w, self.h0_b = linear(z, self.gf_dim*8*4*4, 'g_h0_lin', with_w=True)

    self.h0 = tf.reshape(self.z_, [-1, 4, 4, self.gf_dim * 8])
    h0 = tf.nn.relu(self.g_bn0(self.h0))

    self.h1, self.h1_w, self.h1_b = conv2d_transpose(h0,
        [self.batch_size, 8, 8, self.gf_dim*4], name='g_h1', with_w=True)
    h1 = tf.nn.relu(self.g_bn1(self.h1))

    h2, self.h2_w, self.h2_b = conv2d_transpose(h1,
        [self.batch_size, 16, 16, self.gf_dim*2], name='g_h2', with_w=True)
    h2 = tf.nn.relu(self.g_bn2(h2))

    h3, self.h3_w, self.h3_b = conv2d_transpose(h2,
        [self.batch_size, 32, 32, self.gf_dim*1], name='g_h3', with_w=True)
    h3 = tf.nn.relu(self.g_bn3(h3))

    h4, self.h4_w, self.h4_b = conv2d_transpose(h3,
        [self.batch_size, 64, 64, 3], name='g_h4', with_w=True)

    return tf.nn.tanh(h4)

def discriminator(self, image, reuse=False):
    if reuse:
        tf.get_variable_scope().reuse_variables()

    h0 = lrelu(conv2d(image, self.df_dim, name='d_h0_conv'))
    h1 = lrelu(self.d_bn1(conv2d(h0, self.df_dim*2, name='d_h1_conv')))
    h2 = lrelu(self.d_bn2(conv2d(h1, self.df_dim*4, name='d_h2_conv')))
    h3 = lrelu(self.d_bn3(conv2d(h2, self.df_dim*8, name='d_h3_conv')))
    h4 = linear(tf.reshape(h3, [-1, 8192]), 1, 'd_h3_lin')

    return tf.nn.sigmoid(h4), h4

当我们初始化这个类的时候,将要用到这两个函数来构建模型。我们需要两个判别器,它们共享(复用)参数。一个用于来自数据分布的小批图像,另一个用于生成器生成的小批图像。

self.G = self.generator(self.z)
self.D, self.D_logits = self.discriminator(self.images)
self.D_, self.D_logits_ = self.discriminator(self.G, reuse=True)

接下来,我们定义损失函数。这里我们不用求和,而是用D的预测值和真实值之间的交叉熵(cross entropy),因为它更好用。判别器希望对所有“真”数据的预测都是1,对所有生成器生成的“伪”数据的预测都是0。生成器希望判别器对两者的预测都是1 。

self.d_loss_real = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits,
                                            tf.ones_like(self.D)))
self.d_loss_fake = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,
                                            tf.zeros_like(self.D_)))
self.g_loss = tf.reduce_mean(
    tf.nn.sigmoid_cross_entropy_with_logits(self.D_logits_,
                                            tf.ones_like(self.D_)))
self.d_loss = self.d_loss_real + self.d_loss_fake

下面我们遍历数据。每一次迭代,我们采样一个小批数据,然后使用优化器来更新网络。有趣的是,如果G只更新一次,鉴别器的损失不会变成0。另外,我认为最后调用 d_loss_fake 和 d_loss_real 进行了一些不必要的计算, 因为这些值在 d_optim 和 g_optim 中已经计算过了。 作为Tensorflow 的一个联系,你可以试着优化这一部分,并发送PR到原始的repo。

for epoch in xrange(config.epoch):
    ...
    for idx in xrange(0, batch_idxs):
        batch_images = ...

        batch_z = np.random.uniform(-1, 1, [config.batch_size, self.z_dim]) \
                    .astype(np.float32)

        # Update D network
        _, summary_str = self.sess.run([d_optim, self.d_sum],
            feed_dict={ self.images: batch_images, self.z: batch_z })


        # Update G network
        _, summary_str = self.sess.run([g_optim, self.g_sum],
            feed_dict={ self.z: batch_z })


        # Run g_optim twice to make sure that d_loss does not go to zero (different from paper)
        _, summary_str = self.sess.run([g_optim, self.g_sum],
            feed_dict={ self.z: batch_z })


        errD_fake = self.d_loss_fake.eval({self.z: batch_z})
        errD_real = self.d_loss_real.eval({self.images: batch_images})
        errG = self.g_loss.eval({self.z: batch_z})

5 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PC_OS中断/中断屏蔽字

文章目录程序中断🎃中断概念中断功能(作用)中断请求中断源中断分类外中断非屏蔽中断和可屏蔽中断陷入(内中断)硬件中断和软件中断关系整理🎈中断判优🎈中断优先级CPU响应中断的条件外中断实现思路🎈中断隐指令 及其工作①关中断②…

下一个倒下的是不是Genesis

今日,一个关于“Genesis今晚破产”的传言在各个社交平台传播,包括行业的KOL也在讨论这个事情,认为Genesis或存在偿付能力问题,该公司将于美国东部时间11月17日8:00am与债权人通话以解释情况。若消息属实,Ge…

【AGC】flutter之agconnect_crash在ios上崩溃

问题背景 flutter agconnect_crash-1.2.0300 运行在ios平台上,出现了如下这个崩溃 NSInvalidArgumentException: *** [NSJSONSerialization dataWithJSONObject:options:error:]: value parameter is nil 0 CoreFoundation 0x00000001830d005c 0x183037000 62678…

视频讲解vue2基础之渲染v-if/v-show/v-for/v-html

大家好,我是你们的老朋友lqj_本人,最近一周没有更新文章了,是因为最近学校有一些活动比赛,也有一部分原因就是我在录制一些关于前端方面的视频,涉及到的领域主要一前端,比如:H5开发,…

项目经理如何搞懂难缠的客户【静说】

作为乙方的项目经理,是否经常遇见难缠的客户,现环境下,大部分都是甲方强势,乙方弱势,双方处于一种不对等的基础上,项目经理如何生产,成功交付项目呢? 流程机制上如何应对&#xff1…

计算机毕业设计jsp教师课堂教学评价系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教师课堂教学评价系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql&#xff0c…

智慧公交解决方案-最新全套文件

智慧公交解决方案-最新全套文件一、建设背景二、思路架构三、建设方案3大能力:1、数据驱动的智慧公交全息感知能力2、精细化精准化的公交健康诊断能力3、高品质的公交运营组织能力6大系统:1、公交线网健康诊断系统2、职能部门指挥决策支持系统3、公共出行…

Spring读取.xml和通过Java类配置对比

Spring读取配置文件获取容器,通过容器获得javaBean演示 1.创建一个空项目 配置项目JDK 新建module 选择Maven项目 注意路径 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

C实现扫雷小游戏(简易版)

你知道&#xff0c;有些鸟儿是注定不会被关在牢笼里的&#xff0c;它们的每一片羽毛都闪耀着自由的光辉。——《肖申克的救赎》 目录 1、设计框架 2、设计流程 2.1菜单 2.2初始化雷阵 2.3生成雷 2.4玩家输入坐标 2.5显示有多少个雷 3、所有程序的源码 3.1game.h 3.2…

Slimming剪枝方法

本文参考&#xff1a;5-剪枝后模型参数赋值_哔哩哔哩_bilibiliz https://github.com/foolwood/pytorch-slimming 一、模型剪枝理论说明 论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming &#xff08;1&#xff09;卷积后得到多个特征图…

通过逻辑回归和感知器算法对乳腺癌数据集breastCancer和鸢尾花数据集iris进行线性分类

逻辑回归和感知器算法进行线性分类 代码使用了LogisticRegression和Perceptron两种分类方法 # 使用LogisticRegreeion分类器学习和测试 lr LogisticRegression() lr.fit(X_train_scaler, y_train) y_pred_lr lr.predict(X_test_scaler)#定义感知机 perceptron Perceptron(…

N3-PEG-ALD,Azide-PEG-Aldehyde,醛基-聚乙二醇-叠氮

1、名称 英文&#xff1a;N3-PEG-ALD&#xff0c;Azide-PEG-Aldehyde 中文&#xff1a;叠氮-聚乙二醇-醛基 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Aldehyde / Acetal PEG Azide PEG 4、分子量&#xff1a;可定制&#xff0c;5000 N3-PEG-ALD、10000 叠氮-PEG…

用html做一个漂亮的网站【茶文化12页】期末网页制作 HTML+CSS网页设计实例 企业文化网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——Spring Security

https://spring.io/projects/spring-security 认证判断用户有没有登录。 授权 是访问有没有访问的权限 Spring MVC 的核心组件是DispatcherServlet&#xff0c;所有的组件都是交给DispatcherServlet处理&#xff0c;然后将请求分发给控制器&#xff0c;具体由某个控制器控制请求…

如何在微信上制作小程序?【制作小程序的方式】

很多人想知道如何在微信上制作小程序&#xff0c;毕竟小程序现在已经成为了我们每天都会使用到的轻应用。在微信上制作小程序之前&#xff0c;要先了解自己想要做出什么的小程序&#xff0c;才能下手开展小程序制作。那么下面就介绍三种如何在微信上制作小程序的方式。 1、懂编…

彻底搞懂SwaggerKnife4j使用方法

&#xff08;一&#xff09;、准备 1、SpringBoot项目 说明&#xff1a;前后端分离前提下&#xff0c;前端是一个独立项目&#xff0c;因此该SpringBoot无需添加Thymeleaf依赖&#xff01; 2、vo类 Employee类&#xff1a; package com.soft.vo;import java.util.Date;publ…

Hadoop与Spark的使用,HBase分布式数据库安装及操作实验

docker pull harisekhon/hbase:1.3 docker run -d --name hbase001 -p 16010:16010 harisekhon/hbase:1.3 进入环境 docker exec -it hbase001 bash hbase shell 按照一个特定的值来查找 hbase(main):003:0> scan students,{FILTER>"ValueFilter(,binary:20202…

Matplotlib教程一

文章目录一.简介二.Mapltlib的简单使用2.1 Pylot的API2.2 Pylab模块2.3 matplotlib简单绘图三.Mapltlib进阶使用3.1 面向对象思想画图3.2 Figure类3.3 Axes类3.4 画布上创建多个子图3.5 图中添加网格3.6 设置图片轴线3.7 保存图片一.简介 matplotlib是最初由John D.Hunter于20…

Shell脚本编程(一) —— 变量定义(用户自定义变量、位置变量、预定义变量、环境变量)

目录 1、用户自定义变量 2、位置变量 3、预定义变量 4、环境变量&#xff08;一次性全局变量&#xff09; 5、永久全局变量&#xff08;重启以后依然存在的变量&#xff09; (1) 本地变量文件 (2) 全局变量文件 1、用户自定义变量 定义变量&#xff1a; 变量名value …

九、propTypes验证

目标 理解类型验证的必要性 灵活掌握类型验证的使用 知识点 在给react组件传属性的的时候&#xff0c;我们可以定义属性的类型&#xff0c;此时我们需要下载prop-types这个库。 安装prop-types npm install prop-types -S引入和使用 import PropTypes from prop-types;cla…