基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

news2024/11/27 16:32:00

文章目录

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

1 前言

🔥 优质竞赛项目系列,今天要分享的是

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

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

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

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

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

在这里插入图片描述

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的视频文件,该文件即为动作迁移后的视频。

实现效果:

在这里插入图片描述

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

Docker安装matomo

Docker安装matomo 文章目录 Docker安装matomo1.安装Docker2.matomo安装 1.安装Docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2.matomo安装 #拉取matomo镜像 docker pull matomo#启动matomo容器 docker run -d --name matomo -p 8093:80 -v /do…

喜讯!苏州箱讯获评苏州市软件和信息服务业 “头雁”培育企业

近日,由中国电子信息产业发展研究院、中国工业经济联合会、国家智能制造专家委员会、国家产业基础专家委员会、江苏省工业和信息化厅、江苏省国有资产监督管理委员会、苏州市人民政府共同主办的2023第三届中控中国大会在苏州太湖国际会议中心举办。 本届大会以“生态…

erp 技术的发展趋势和方向有哪些?

近日,亿欧智库重磅发布了《2022中国制造业ERP研究报告》。亿欧通过桌面研究及行业专家访谈,对ERP在制造业领域的应用情况进行分析,洞察ERP针对制造业不同场景的服务模式,研讨制造业ERP的未来发展趋势,旨在帮助制造业企…

OPCUA 行业配套标准:机器人

OPC UA 定义了对象,对象类型,结构化组织能力和定义对象之间关系的能力,利用这些基础和衍生类型及对象,用户还可以搭建出更复杂的类型,关系和对象。 如果不同的厂商或者用户定义的信息模型不同,将会影响系统…

springboot+vue基于JAVA的企业内部人员绩效量化管理系统的设计与实现【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

时间复杂度的计算技巧-算法模型中的时间复杂度如何计算,有哪些技巧呢

大家好,我是微学AI,今天给大家介绍一下时间复杂度的计算技巧-算法模型中的时间复杂度如何计算,有哪些技巧呢,算法的时间复杂度是评估算法性能和效率的一种方式,它表示算法需要执行多少次基本操作才能完成其任务&#x…

【数据库】关系数据库管理系统 (RDBMS) 中事务处理的四个特性ACID

给自己一个目标,然后坚持一段时间,总会有收获和感悟! 数据库事务是指一组数据库操作(例如插入、更新、删除等),被视为一个单独的逻辑操作单元,并且要么全部执行成功,要么全部不执行&…

Eolink Apikit 如何对所有 API 异常请求实时监控 ?

API 监控适合业务在互联网上,并且用户来自多个不同的地区,且对API的要求较高的场合,用于解决以下的问题: 发现由于网络中断或者是API响应异常等导致的服务不可用 及时对异常的API进行告警 记录监控的日志,方便排查 …

基于Jaccard相似度的推荐算法---示例

目录 数据展示推荐算法的分类基于相似度基于流行度/上下文/社交网络 Jaccard相似度分析数据的特点可以考虑的方法计算方法优缺点计算用户之间的Jaccard相似度获取与给定最相似的10个用户对1713353的用户推荐10本书 数据展示 import pandas as pd import numpy as np# 读取CSV文…

vue+elementUI 设置el-descriptions固定长度并对齐

问题描述 对于elementUI组件&#xff0c;el-descriptions 在以类似列表的形式排列的时候&#xff0c;上下无法对齐的问题。 问题解决 在el-descriptions 标签中&#xff0c;添加属性&#xff1a; :contentStyle"content_style" 控制其内容栏长度 <el-descripti…

Visual Components Robotics OLP解决方案 北京衡祖

Visual Components 引入了“Visual Components Robotics OLP”的重大升级&#xff0c;合并了制造模拟和机器人离线编程。该解决方案利用 Delfoi Robotics 的技术&#xff0c;提高生产率、减少停机时间并减少浪费。 一、探索下一代离线机器人编程软件 自 1999 年以来&#xff0…

强大的pdf编辑软件:Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款强大的PDF编辑和管理软件&#xff0c;它提供了广泛的功能&#xff0c;使用户能够轻松创建、编辑、转换和共享PDF文档。通过直观的界面和先进的工具&#xff0c;用户可以快速进行文本编辑、图像调整、页面管理等操作&#xff0c;同时支持OCR技术&#…

MobPush自定义智能标签,赋能精细化运营

随着用户兴趣爱好日益多元化&#xff0c;如何精准把握用户喜好&#xff0c;向用户定制推送用户所喜好的内容&#xff0c;成为APP能否提升用户粘性和活跃度&#xff0c;形成竞争力的关键。 因此&#xff0c;MobPush此前全面上新了”智能标签“功能&#xff0c;成为无数APP运营者…

图形化ping工具gping

一、介绍 gping能够以折线图的方式&#xff0c;实时展示 ping 的结果&#xff0c;支持 Windows、Linux 和 macOS 操作系统。并且支持多个目标同时Ping同时展示折线图方便对比。下面扩展一下ICMP及ICMP隧道。 ICMP消息结构&#xff1a; ICMP消息是由一个类型字段、一个代码字段、…

数据结构——顺序表(SeqList)

目录 1. 顺序表介绍 2. 顺序表工程 2.1 顺序表定义 2.1.1 静态顺序表 2.1.2 动态顺序表 2.2顺序表接口 2.2.1 顺序表初始化 2.2.2 顺序表打印 2.2.3 顺序表销毁 2.2.4 顺序表数据插入 2.2.4.1 容量检查 2.2.4.2 顺序表尾插 2.2.4.3 顺序表头插 2.2.4.4 顺序表随机…

Vue Vuex的使用和原理 专门解决共享数据的问题

Vuex专门解决共享数据的问题 多组件共享时使用&#xff0c;如用户ID各组件需要根据ID发送请求获取数据&#xff0c;任意组件可以进行增删改&#xff0c;相当于全局变量 Vuex 工作流程 如果确定值参数可以不经过Actions 直接走 安装Vuex vue2使用 vuex3 vue3使用 vuex4 npm i…

服务Service

一、服务概述 Service(服务)是Android四大组件之一&#xff0c;是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互&#xff0c;一般由Activity启动&#xff0c;但是并不依赖于Activity。当Activity的生命周期结束时&#xff0c;Serv…

UNI-APP_ios自动适应底部安全区背景,修改安全区背景

自动适应&#xff08;推荐&#xff09; 将所有 iPhone X&#xff08;刘海屏) 底部安全区域背景颜色 自动适应&#xff0c;当前页面什么颜色会自动调整。 1.打开 manifest.json &#xff0c;打开源码视图 2.找到 app-plus 配置项&#xff0c;添加以下代码 "safearea&quo…

vue的message提示信息修改提示框所在页面位置高度

vue的message提示信息修改提示框所在页面位置高度&#xff0c;可以使用message的offset属性通过数值来改变提示框位置&#xff01; html部分代码 <div><el-button type"primary" click"showMessage" style"margin-left:40%;margin-top:1%&q…

Python多线程和代理请求示例

这是一个python多线程调用和代理提交的示例 可以用于负载均衡测试和高并发测试 import hashlib import json import random import sys import threading import time import requests as requests from requests.packages.urllib3.exceptions import InsecureRequestWarningr…