1 前言
?? 優(yōu)質(zhì)競賽項目系列,今天要分享的是
?? 基于生成對抗網(wǎng)絡的照片上色動態(tài)算法設計與實現(xiàn)
該項目較為新穎,適合作為競賽課題方向,學長非常推薦!
??學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點:4分
?? 更多資料, 項目分享:文章來源:http://www.zghlxwxcb.cn/news/detail-828593.html
https://gitee.com/dancheng-senior/postgraduate文章來源地址http://www.zghlxwxcb.cn/news/detail-828593.html
1 課題背景
隨著科技的發(fā)展,現(xiàn)在已經(jīng)沒有朋友會再去買膠卷拍照片了。不過對于很多70、80后來說,他們家中還保存著大量之前拍攝的膠卷和老照片。這些老照片是一個時代的記憶,記錄著我們生活中的點點滴滴。不過時代發(fā)展了,這些老照片的保存和瀏覽也應該與時俱進。在本期文章中,我們就介紹如何將這些老照片轉(zhuǎn)化為數(shù)字照片,更方便大家在電腦或者手機上瀏覽、保存和回憶。
本項目中我們利用生成對抗網(wǎng)絡-GAN和圖像動作驅(qū)動-First Order Motion Model來給老照片上色并使它動起來。
2 GAN(生成對抗網(wǎng)絡)
2.1 簡介
**GANs(Generative adversarial networks,對抗式生成網(wǎng)絡)**可以把這三個單詞拆分理解。
- Generative :生成式模型
- Adversarial :采取對抗的策略
- Networks :網(wǎng)絡(不一定是深度學習)
模型通過框架中(至少)兩個模塊:生成模型(Generative Model)和判別模型(Discriminative
Model)的互相博弈學習產(chǎn)生相當好的輸出。原始 GAN 理論中,并不要求 G 和 D
都是神經(jīng)網(wǎng)絡,只需要是能擬合相應生成和判別的函數(shù)即可。但實用中一般均使用深度神經(jīng)網(wǎng)絡作為 G 和 D 。
2.2 基本原理
這里介紹的是原生的GAN算法,雖然有一些不足,但提供了一種生成對抗性的新思路。放心,我這篇博文不會堆一大堆公式,只會提供一種理解思路。
理解GAN的兩大護法G和D,生成對抗網(wǎng)絡(GAN)由2個重要的部分構成:
- 生成器(Generator ):通過機器生成數(shù)據(jù)(大部分情況下是圖像),負責憑空捏造數(shù)據(jù)出來,目的是“騙過”判別器
- 判別器(Discriminator ):判斷這張圖像是真實的還是機器生成的,負責判斷數(shù)據(jù)是不是真數(shù)據(jù),目的是找出生成器做的“假數(shù)據(jù)”
這樣可以簡單的看作是兩個網(wǎng)絡的博弈過程。在最原始的GAN論文里面,G和D都是兩個多層感知機網(wǎng)絡。首先,注意一點,GAN操作的數(shù)據(jù)不一定非得是圖像數(shù)據(jù),不過為了更方便解釋,用圖像數(shù)據(jù)為例解釋以下GAN:
tensorflow實現(xiàn)
?
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 創(chuàng)建的目的是為了給黑白照片上色,但讓人驚艷的是它除了能處理圖片外,也可以處理視頻;
DeOldify 的核心網(wǎng)絡框架是 GAN ,對比以前上色技術有以下幾個特點:
- 1,老照片中的偽影在上色過程中會被消除;
- 2,老照片的人臉部位來說,處理后皮膚會變得更光滑;
- 3,呈現(xiàn)更詳細、真實的渲染效果;
實現(xiàn)過程
準備好權重文件
相關代碼
?
#部分代碼
def deoldify(self,img,render_factor=35):
"""
風格化
"""
# 轉(zhuǎn)換通道
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)
# 轉(zhuǎn)為numpy圖
print('deoldify 轉(zhuǎn)換成功')
return np.asarray(color_img)
?
實現(xiàn)效果:
4 First Order Motion Model
First Order Motion model的任務是image
animation,給定一張源圖片,給定一個驅(qū)動視頻,生成一段視頻,其中主角是源圖片,動作是驅(qū)動視頻中的動作,源圖像通常包含一個主體,驅(qū)動視頻包含一系列動作。
通俗來說,F(xiàn)irst Order
Motion能夠?qū)⒔o定的驅(qū)動視頻中的人物A的動作遷移至給定的源圖片中的人物B身上,生成全新的以人物B的臉演繹人物A的表情的視頻。
以人臉表情遷移為例,給定一個源人物,給定一個驅(qū)動視頻,可以生成一個視頻,其中主體是源人物,視頻中源人物的表情是由驅(qū)動視頻中的表情所確定的。通常情況下,我們需要對源人物進行人臉關鍵點標注、進行表情遷移的模型訓練。
基本框架
first-order 的算法框架如下圖所示,主要包括三個部分的網(wǎng)絡,keyporint detector
檢測圖像中的關鍵點,以及每個關鍵點對應的jaccobian矩陣;dense motion network 基于前面的結(jié)果生成最終的transform map
以及occulation map;使用transform map 和 occulation map 對編碼后的source feature
做變換和mask處理,再decoder 生成出最終的結(jié)果。
本項目相關代碼
?
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)
運行如下命令,實現(xiàn)表情動作遷移。其中,各參數(shù)的具體使用說明如下:
- driving_video: 驅(qū)動視頻,視頻中人物的表情動作作為待遷移的對象。本項目中驅(qū)動視頻路徑為 “work/driving_video.MOV”,大家可以上傳自己準備的視頻,更換
driving_video
參數(shù)對應的路徑; - source_image: 原始圖片,視頻中人物的表情動作將遷移到該原始圖片中的人物上。這里原始圖片路徑使用 “work/image.jpeg”,大家可以使用自己準備的圖片,更換
source_image
參數(shù)對應的路徑; - relative: 指示程序中使用視頻和圖片中人物關鍵點的相對坐標還是絕對坐標,建議使用相對坐標,若使用絕對坐標,會導致遷移后人物扭曲變形;
- adapt_scale: 根據(jù)關鍵點凸包自適應運動尺度;
- ratio: 針對多人臉,將框出來的人臉貼回原圖時的區(qū)域占寬高的比例,默認為0.4,范圍為【0.4,0.5】
命令運行成功后會在ouput文件夾生成名為result.mp4的視頻文件,該文件即為動作遷移后的視頻。
實現(xiàn)效果:
,若使用絕對坐標,會導致遷移后人物扭曲變形;
- adapt_scale: 根據(jù)關鍵點凸包自適應運動尺度;
- ratio: 針對多人臉,將框出來的人臉貼回原圖時的區(qū)域占寬高的比例,默認為0.4,范圍為【0.4,0.5】
命令運行成功后會在ouput文件夾生成名為result.mp4的視頻文件,該文件即為動作遷移后的視頻。
實現(xiàn)效果:
5 最后
?? 更多資料, 項目分享:
https://gitee.com/dancheng-senior/postgraduate
到了這里,關于互聯(lián)網(wǎng)加競賽 基于生成對抗網(wǎng)絡的照片上色動態(tài)算法設計與實現(xiàn) - 深度學習 opencv python的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!