1 前言
?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 基于生成對(duì)抗網(wǎng)絡(luò)的照片上色動(dòng)態(tài)算法設(shè)計(jì)與實(shí)現(xiàn)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-683733.html
1 課題背景
隨著科技的發(fā)展,現(xiàn)在已經(jīng)沒有朋友會(huì)再去買膠卷拍照片了。不過(guò)對(duì)于很多70、80后來(lái)說(shuō),他們家中還保存著大量之前拍攝的膠卷和老照片。這些老照片是一個(gè)時(shí)代的記憶,記錄著我們生活中的點(diǎn)點(diǎn)滴滴。不過(guò)時(shí)代發(fā)展了,這些老照片的保存和瀏覽也應(yīng)該與時(shí)俱進(jìn)。在本期文章中,我們就介紹如何將這些老照片轉(zhuǎn)化為數(shù)字照片,更方便大家在電腦或者手機(jī)上瀏覽、保存和回憶。
本項(xiàng)目中我們利用生成對(duì)抗網(wǎng)絡(luò)-GAN和圖像動(dòng)作驅(qū)動(dòng)-First Order Motion Model來(lái)給老照片上色并使它動(dòng)起來(lái)。
2 GAN(生成對(duì)抗網(wǎng)絡(luò))
2.1 簡(jiǎn)介
**GANs(Generative adversarial networks,對(duì)抗式生成網(wǎng)絡(luò))**可以把這三個(gè)單詞拆分理解。
- Generative:生成式模型
- Adversarial:采取對(duì)抗的策略
- Networks:網(wǎng)絡(luò)(不一定是深度學(xué)習(xí))
模型通過(guò)框架中(至少)兩個(gè)模塊:生成模型(Generative Model)和判別模型(Discriminative Model)的互相博弈學(xué)習(xí)產(chǎn)生相當(dāng)好的輸出。原始 GAN 理論中,并不要求 G 和 D 都是神經(jīng)網(wǎng)絡(luò),只需要是能擬合相應(yīng)生成和判別的函數(shù)即可。但實(shí)用中一般均使用深度神經(jīng)網(wǎng)絡(luò)作為 G 和 D 。
2.2 基本原理
這里介紹的是原生的GAN算法,雖然有一些不足,但提供了一種生成對(duì)抗性的新思路。放心,我這篇博文不會(huì)堆一大堆公式,只會(huì)提供一種理解思路。
理解GAN的兩大護(hù)法G和D,生成對(duì)抗網(wǎng)絡(luò)(GAN)由2個(gè)重要的部分構(gòu)成:
- 生成器(Generator):通過(guò)機(jī)器生成數(shù)據(jù)(大部分情況下是圖像),負(fù)責(zé)憑空捏造數(shù)據(jù)出來(lái),目的是“騙過(guò)”判別器
- 判別器(Discriminator):判斷這張圖像是真實(shí)的還是機(jī)器生成的,負(fù)責(zé)判斷數(shù)據(jù)是不是真數(shù)據(jù),目的是找出生成器做的“假數(shù)據(jù)”
這樣可以簡(jiǎn)單的看作是兩個(gè)網(wǎng)絡(luò)的博弈過(guò)程。在最原始的GAN論文里面,G和D都是兩個(gè)多層感知機(jī)網(wǎng)絡(luò)。首先,注意一點(diǎn),GAN操作的數(shù)據(jù)不一定非得是圖像數(shù)據(jù),不過(guò)為了更方便解釋,用圖像數(shù)據(jù)為例解釋以下GAN:
tensorflow實(shí)現(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 框架
本項(xiàng)目中用到的上色就用到了DeOldify 框架,DeOldify 創(chuàng)建的目的是為了給黑白照片上色,但讓人驚艷的是它除了能處理圖片外,也可以處理視頻;
DeOldify 的核心網(wǎng)絡(luò)框架是 GAN ,對(duì)比以前上色技術(shù)有以下幾個(gè)特點(diǎn):
- 1,老照片中的偽影在上色過(guò)程中會(huì)被消除;
- 2,老照片的人臉部位來(lái)說(shuō),處理后皮膚會(huì)變得更光滑;
- 3,呈現(xiàn)更詳細(xì)、真實(shí)的渲染效果;
實(shí)現(xiàn)過(guò)程
準(zhǔn)備好權(quán)重文件
相關(guān)代碼
#部分代碼
def deoldify(self,img,render_factor=35):
"""
風(fēng)格化
"""
# 轉(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)
實(shí)現(xiàn)效果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-683733.html


4 First Order Motion Model
First Order Motion model的任務(wù)是image animation,給定一張?jiān)磮D片,給定一個(gè)驅(qū)動(dòng)視頻,生成一段視頻,其中主角是源圖片,動(dòng)作是驅(qū)動(dòng)視頻中的動(dòng)作,源圖像通常包含一個(gè)主體,驅(qū)動(dòng)視頻包含一系列動(dòng)作。
通俗來(lái)說(shuō),F(xiàn)irst Order Motion能夠?qū)⒔o定的驅(qū)動(dòng)視頻中的人物A的動(dòng)作遷移至給定的源圖片中的人物B身上,生成全新的以人物B的臉演繹人物A的表情的視頻。
以人臉表情遷移為例,給定一個(gè)源人物,給定一個(gè)驅(qū)動(dòng)視頻,可以生成一個(gè)視頻,其中主體是源人物,視頻中源人物的表情是由驅(qū)動(dòng)視頻中的表情所確定的。通常情況下,我們需要對(duì)源人物進(jìn)行人臉關(guān)鍵點(diǎn)標(biāo)注、進(jìn)行表情遷移的模型訓(xùn)練。
基本框架
first-order 的算法框架如下圖所示,主要包括三個(gè)部分的網(wǎng)絡(luò),keyporint detector 檢測(cè)圖像中的關(guān)鍵點(diǎn),以及每個(gè)關(guān)鍵點(diǎn)對(duì)應(yīng)的jaccobian矩陣;dense motion network 基于前面的結(jié)果生成最終的transform map 以及occulation map;使用transform map 和 occulation map 對(duì)編碼后的source feature 做變換和mask處理,再decoder 生成出最終的結(jié)果。
本項(xiàng)目相關(guān)代碼
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()
# 預(yù)處理
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'
# 圖像動(dòng)起來(lái)
gan.FOM_video(driving_video, source_image,result_video)
運(yùn)行如下命令,實(shí)現(xiàn)表情動(dòng)作遷移。其中,各參數(shù)的具體使用說(shuō)明如下:
- driving_video: 驅(qū)動(dòng)視頻,視頻中人物的表情動(dòng)作作為待遷移的對(duì)象。本項(xiàng)目中驅(qū)動(dòng)視頻路徑為 “work/driving_video.MOV”,大家可以上傳自己準(zhǔn)備的視頻,更換
driving_video
參數(shù)對(duì)應(yīng)的路徑; - source_image: 原始圖片,視頻中人物的表情動(dòng)作將遷移到該原始圖片中的人物上。這里原始圖片路徑使用 “work/image.jpeg”,大家可以使用自己準(zhǔn)備的圖片,更換
source_image
參數(shù)對(duì)應(yīng)的路徑; - relative: 指示程序中使用視頻和圖片中人物關(guān)鍵點(diǎn)的相對(duì)坐標(biāo)還是絕對(duì)坐標(biāo),建議使用相對(duì)坐標(biāo),若使用絕對(duì)坐標(biāo),會(huì)導(dǎo)致遷移后人物扭曲變形;
- adapt_scale: 根據(jù)關(guān)鍵點(diǎn)凸包自適應(yīng)運(yùn)動(dòng)尺度;
- ratio: 針對(duì)多人臉,將框出來(lái)的人臉貼回原圖時(shí)的區(qū)域占寬高的比例,默認(rèn)為0.4,范圍為【0.4,0.5】
命令運(yùn)行成功后會(huì)在ouput文件夾生成名為result.mp4的視頻文件,該文件即為動(dòng)作遷移后的視頻。
實(shí)現(xiàn)效果:
,若使用絕對(duì)坐標(biāo),會(huì)導(dǎo)致遷移后人物扭曲變形;
- adapt_scale: 根據(jù)關(guān)鍵點(diǎn)凸包自適應(yīng)運(yùn)動(dòng)尺度;
- ratio: 針對(duì)多人臉,將框出來(lái)的人臉貼回原圖時(shí)的區(qū)域占寬高的比例,默認(rèn)為0.4,范圍為【0.4,0.5】
命令運(yùn)行成功后會(huì)在ouput文件夾生成名為result.mp4的視頻文件,該文件即為動(dòng)作遷移后的視頻。
實(shí)現(xiàn)效果:
5 最后
到了這里,關(guān)于計(jì)算機(jī)畢設(shè) 基于生成對(duì)抗網(wǎng)絡(luò)的照片上色動(dòng)態(tài)算法設(shè)計(jì)與實(shí)現(xiàn) - 深度學(xué)習(xí) opencv python的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!