大数据毕设选题 - 生成对抗网络的照片上色动态算法设计与实现(深度学习 opencv python)

news2025/7/6 20:59:11

文章目录

  • 1 前言
  • 1 课题背景
  • 2 GAN(生成对抗网络)
    • 2.1 简介
    • 2.2 基本原理
  • 3 DeOldify 框架
  • 4 First Order Motion Model


1 前言

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

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

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

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

🚩 基于生成对抗网络的照片上色动态算法设计与实现

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

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

🧿 选题指导, 项目分享:

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

在这里插入图片描述

1 课题背景

随着科技的发展,现在已经没有朋友会再去买胶卷拍照片了。不过对于很多70、80后来说,他们家中还保存着大量之前拍摄的胶卷和老照片。这些老照片是一个时代的记忆,记录着我们生活中的点点滴滴。不过时代发展了,这些老照片的保存和浏览也应该与时俱进。在本期文章中,我们就介绍如何将这些老照片转化为数字照片,更方便大家在电脑或者手机上浏览、保存和回忆。

本项目中我们利用生成对抗网络-GAN和图像动作驱动-First Order Motion Model来给老照片上色并使它动起来。

2 GAN(生成对抗网络)

2.1 简介

**GANs(Generative adversarial networks,对抗式生成网络)**可以把这三个单词拆分理解。

  • Generative:生成式模型
  • Adversarial:采取对抗的策略
  • Networks:网络(不一定是深度学习)

模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。

在这里插入图片描述

2.2 基本原理

这里介绍的是原生的GAN算法,虽然有一些不足,但提供了一种生成对抗性的新思路。放心,我这篇博文不会堆一大堆公式,只会提供一种理解思路。

理解GAN的两大护法G和D,生成对抗网络(GAN)由2个重要的部分构成:

  • 生成器(Generator):通过机器生成数据(大部分情况下是图像),负责凭空捏造数据出来,目的是“骗过”判别器
  • 判别器(Discriminator):判断这张图像是真实的还是机器生成的,负责判断数据是不是真数据,目的是找出生成器做的“假数据”

在这里插入图片描述

这样可以简单的看作是两个网络的博弈过程。在最原始的GAN论文里面,G和D都是两个多层感知机网络。首先,注意一点,GAN操作的数据不一定非得是图像数据,不过为了更方便解释,用图像数据为例解释以下GAN:

在这里插入图片描述

tensorflow实现

import tensorflow as tf


def load_dataset(mnist_size, mnist_batch_size, cifar_size, cifar_batch_size,):
  """ load mnist and cifar10 dataset to shuffle.

  Args:
    mnist_size: mnist dataset size.
    mnist_batch_size: every train dataset of mnist.
    cifar_size: cifar10 dataset size.
    cifar_batch_size: every train dataset of cifar10.

  Returns:
    mnist dataset, cifar10 dataset

  """
  # load mnist data
  (mnist_train_images, mnist_train_labels), (_, _) = tf.keras.datasets.mnist.load_data()

  # load cifar10 data
  (cifar_train_images, cifar_train_labels), (_, _) = tf.keras.datasets.cifar10.load_data()

  mnist_train_images = mnist_train_images.reshape(mnist_train_images.shape[0], 28, 28, 1).astype('float32')
  mnist_train_images = (mnist_train_images - 127.5) / 127.5  # Normalize the images to [-1, 1]

  cifar_train_images = cifar_train_images.reshape(cifar_train_images.shape[0], 32, 32, 3).astype('float32')
  cifar_train_images = (cifar_train_images - 127.5) / 127.5  # Normalize the images to [-1, 1]

  # Batch and shuffle the data
  mnist_train_dataset = tf.data.Dataset.from_tensor_slices(mnist_train_images)
  mnist_train_dataset = mnist_train_dataset.shuffle(mnist_size).batch(mnist_batch_size)

  cifar_train_dataset = tf.data.Dataset.from_tensor_slices(cifar_train_images)
  cifar_train_dataset = cifar_train_dataset.shuffle(cifar_size).batch(cifar_batch_size)

  return mnist_train_dataset, cifar_train_dataset

3 DeOldify 框架

本项目中用到的上色就用到了DeOldify 框架,DeOldify 创建的目的是为了给黑白照片上色,但让人惊艳的是它除了能处理图片外,也可以处理视频;

DeOldify 的核心网络框架是 GAN ,对比以前上色技术有以下几个特点:

  • 1,老照片中的伪影在上色过程中会被消除;
  • 2,老照片的人脸部位来说,处理后皮肤会变得更光滑;
  • 3,呈现更详细、真实的渲染效果;

实现过程

准备好权重文件

在这里插入图片描述

相关代码

#部分代码
def deoldify(self,img,render_factor=35):
        """
        风格化
        """
        # 转换通道
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        pil_img = Image.fromarray(img)
        # 渲染彩图
        color_img = self.deoldify_model.filter(
            pil_img, pil_img, render_factor=render_factor,post_process=True
        )
        color_img = np.asarray(color_img)
        color_img = cv2.cvtColor(color_img, cv2.COLOR_RGB2BGR)
        # 转为numpy图
        print('deoldify 转换成功')
        return np.asarray(color_img)

实现效果:

4 First Order Motion Model

First Order Motion model的任务是image animation,给定一张源图片,给定一个驱动视频,生成一段视频,其中主角是源图片,动作是驱动视频中的动作,源图像通常包含一个主体,驱动视频包含一系列动作。

通俗来说,First Order Motion能够将给定的驱动视频中的人物A的动作迁移至给定的源图片中的人物B身上,生成全新的以人物B的脸演绎人物A的表情的视频。

以人脸表情迁移为例,给定一个源人物,给定一个驱动视频,可以生成一个视频,其中主体是源人物,视频中源人物的表情是由驱动视频中的表情所确定的。通常情况下,我们需要对源人物进行人脸关键点标注、进行表情迁移的模型训练。

基本框架

first-order 的算法框架如下图所示,主要包括三个部分的网络,keyporint detector 检测图像中的关键点,以及每个关键点对应的jaccobian矩阵;dense motion network 基于前面的结果生成最终的transform map 以及occulation map;使用transform map 和 occulation map 对编码后的source feature 做变换和mask处理,再decoder 生成出最终的结果。

在这里插入图片描述

本项目相关代码

    def FOM_video(self,driving_video,source_image,result_video):

        # 读取图片
        source_image = imageio.imread(source_image)
        # 读取视频
        reader = imageio.get_reader(driving_video)
        fps = reader.get_meta_data()['fps']
        driving_video = []
        try:
            for im in reader:
                driving_video.append(im)
        except RuntimeError:
            pass
        reader.close()
        # 预处理
        source_image = resize(source_image, (255, 255))[..., :3]
        driving_video = [resize(frame, (255, 255))[..., :3] for frame in driving_video]
        
        # 推理
        predictions = self.make_animation(source_image, driving_video, self.fom_generator, self.fom_kp_detector, relative=True, adapt_movement_scale=True, cpu=True)
        # 保存
        imageio.mimsave(result_video, [img_as_ubyte(frame) for frame in predictions], fps=fps)
        
driving_video = './images/test2.mp4'
source_image = './images/out2.jpg'
result_video = './putput/result.mp4'
# 图像动起来
gan.FOM_video(driving_video, source_image,result_video)

运行如下命令,实现表情动作迁移。其中,各参数的具体使用说明如下:

  • driving_video: 驱动视频,视频中人物的表情动作作为待迁移的对象。本项目中驱动视频路径为 “work/driving_video.MOV”,大家可以上传自己准备的视频,更换 driving_video 参数对应的路径;
  • source_image: 原始图片,视频中人物的表情动作将迁移到该原始图片中的人物上。这里原始图片路径使用 “work/image.jpeg”,大家可以使用自己准备的图片,更换 source_image 参数对应的路径;
  • relative: 指示程序中使用视频和图片中人物关键点的相对坐标还是绝对坐标,建议使用相对坐标,若使用绝对坐标,会导致迁移后人物扭曲变形;
  • adapt_scale: 根据关键点凸包自适应运动尺度;
  • ratio: 针对多人脸,将框出来的人脸贴回原图时的区域占宽高的比例,默认为0.4,范围为【0.4,0.5】

命令运行成功后会在ouput文件夹生成名为result.mp4的视频文件,该文件即为动作迁移后的视频。

实现效果:

,若使用绝对坐标,会导致迁移后人物扭曲变形;

  • adapt_scale: 根据关键点凸包自适应运动尺度;
  • ratio: 针对多人脸,将框出来的人脸贴回原图时的区域占宽高的比例,默认为0.4,范围为【0.4,0.5】

命令运行成功后会在ouput文件夹生成名为result.mp4的视频文件,该文件即为动作迁移后的视频。

实现效果:

在这里插入图片描述

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

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

相关文章

Linux项目后端部署及JDKTomcatMySQL安装

前言 上一篇文章简单的分享了在VMware上安装linux系统,本篇文章将要分享的内容是使用linux系统完成项目的部署 一、前置准备工作 在Windows系统中,我们要在开发环境下才能进行项目的开发。那么在linux系统中也是,在安装完linux系统后&#xf…

NoSuchMethodError的常见原因和通用解决方式

目录 环境信息 问题描述 错误分析 解决方法 常见原因 1.第三方包,作用域不对导致应用没导入该包 2.编译时和运行时使用的版本不一样 3.JDK版本不一样 4.多个同路径、同名的类 1.代码复制场景 2.代码移动场景 排查步骤 附录 Maven仲裁机制: …

为啥这么人选择iPhone

01.听音乐(10元/月) 歌曲很全 多个终端支持 果子自带的Music app 在那个设备都可以使用, 包括MacBook Pro,iPhone,iPad,iwatch等 02.周边配件方便购买 03.遇到问题好解决 04.使用稳定,不会有广告&#x…

MySQL海量数据优化(理论+实战) 吊打面试官

一、准备表数据 咱们建一张用户表,表中的字段有用户ID、用户名、地址、记录创建时间,如图所示 ​OK,接下来准备写一个存储过程插入一百万条数据 CREATE TABLE t_user (id int NOT NULL,user_name varchar(32) CHARACTER SET utf8 COLLATE ut…

[附源码]Python计算机毕业设计防疫物资捐赠系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Vue组件化编程开发

目录 一.模块 二.组件 &#xff08;快捷键< 回车 生成单组件模板&#xff09; 三.非单文件组件 四.单文件组件: 首先理解模块和组件的基本概念: 一.模块 1.理解:向外提供特定功能的js程序&#xff0c;一般就是一个js文件 2.为什么: js文件很多很复杂 3.作用:复用js, 简…

Mybatis-Plus+SpringBoot结合运用

目录 前言 一、创建Maven项目导入相关的依赖 二、在resources添加日志和连接数据库 1.日志文件(log4j.properties) 2.连接数据库&#xff08;application.properties&#xff09; 三、编写pojo &#xff08;注解编写get/set/tostring&#xff09; 四、UserMapper编写继承…

Fragment的生命周期

文章目录Fragment的生命周期Fragment的状态和回调运行状态暂停状态停止状态销毁状态回调方法附加的回调方法onAttach()onCreateView()onActivityCreated()onDestroyView()onDetach()Fragment完整的生命周期图Fragment的生命周期 和Activity一样,Fragment也有自己的生命周期,并…

c++实现图书管理系统v1.0

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系统要求功能1.首页2.退出系统3.添加图书4.删除书籍5.查找书籍6.修改书籍信息7.显示所有图书8.查看书籍是否在书架上总代码收获系统要求 用c实现一个可以增删改查的…

商城项目环境准备 — docker安装kinaba和配置ik中文分词器

一、拉取kinaba镜像 docker pull kinaba:7.12.1二、启动kinaba容器 docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTShttp://es:9200 \ --networkes-net \ -p 5601:5601 \ kibana:7.12.1三、访问 输入http://ip:5601 ip&#xff1a;服务器端口 四、安装ik分词器 …

研究光度立体法阶段性小结和优化(可20ms获取4个2500*2000灰度图的Normal Map)。...

这个东西是我接触的第一个非2D方面的算法&#xff0c;到目前为止其实也没有完全搞定&#xff0c;不过可能短时间内也无法突破。先把能搞定的搞定吧。 这个东西也有一大堆参考资料&#xff0c;不过呢&#xff0c;搜来搜去其实也就那些同样的东西&#xff0c;个人觉得就属这个文章…

Java自幂数计算及其算法改进

文章目录1. 自幂数2.自幂数的个数3. 常规自幂数计算方法4.算法代码改进1. 自幂数 如果在一个固定的进制中&#xff0c;一个n位自然数等于自身各个数位上数字的n次幂之和&#xff0c;则称此数为自幂数。 例如&#xff1a;在十进制中&#xff0c;153是一个三位数&#xff0c;各个…

计算机网络4小时速成:网络层,虚电路和数据包服务,ipv4,ABC类地址,地址解析协议ARP,子网掩码,ICMP忘记控制报文协议,路由选择协议,路由器

计算机网络4小时速成&#xff1a;网络层&#xff0c;虚电路和数据包服务&#xff0c;ipv4,ABC类地址&#xff0c;地址解析协议ARP&#xff0c;子网掩码&#xff0c;ICMP忘记控制报文协议&#xff0c;路由选择协议&#xff0c;路由器 2022找工作是学历、能力和运气的超强结合体…

新闻管理系统(SpringBoot+Vue)

商丘工学院新闻网 1、前言 sqgxy-xxydz-news是在大四参加的web大赛的一个项目&#xff0c;与我的队友协同开发&#xff0c;在此过程中收获颇多。 2、介绍 商丘工学院新闻官网&#xff08;信息与电子工程学院&#xff09;包括前台新闻展示系统及后台管理系统&#xff0c;基于Sp…

九种常见UML图

我常用的UML图是 类图、用例图、序列图、状态图这4种。 1、类图 类图是面向对象系统建模最常见的图&#xff0c;是定义其他图的基础 类图主要用用来显示系统中的类&#xff0c;接口以及它们之间的静态结构和关系的一种静态模型 类图显示 集合的类、接口、关联、协作和约束&…

Shiro笔记03-与Spring Boot整合

框架整合 创建模块 创建一个Maven工程 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

生还是不生? SpringBoot3 版本有起飞前兆,最小依赖Java17!

一直以来&#xff0c;Java8都是Java社区心头的痛。因为它代表着以稳定性为主的企业管理层&#xff0c;与拥抱变化为主的底层码农层之间的、爱的魔力拉锯战。 不生&#xff01;少生&#xff01;成为各大厂心照不宣的选择。 现在&#xff0c;这种平衡或将打破。因为Java届的霸主…

Python3编程基础-变量与计算器

变量与计算器 简单计算器 下面来做一个简单计算器&#xff0c;完成普通计算器功能。 打开IDlE&#xff0c;输入以下脚本进行计算。 >>> 34 7 >>> 6-(8*2) -10 >>> (5*234)*(45) 396 >>> 每一行都是一个Python语句&#xff0c;如果可能的…

Java并发-为什么主线程结束了,程序却没有关闭呢?

守护线程与用户线程的定义及区别 Java 中的线程分为两类&#xff0c;分别为 daemon 线程&#xff08;守护线程&#xff09;和 user 线程&#xff08;用户线程&#xff09;。 在 JVM 启动时会调用 main 函数&#xff0c; main 函数所在的线程就是一个用户线程&#xff0c;其实…

TCP协议灵魂之问

先亮出这篇文章的思维导图: TCP 作为传输层的协议&#xff0c;是一个软件工程师素养的体现&#xff0c;也是面试中经常被问到的知识点。在此&#xff0c;我将 TCP 核心的一些问题梳理了一下&#xff0c;希望能帮到各位。 001. 能不能说一说 TCP 和 UDP 的区别&#xff1f; 首…