几行代码实现老照片上色复原!

本文介绍了AI上色技术的基本原理,通过生成对抗网络(GAN)实现图像上色。文章以《你好李焕英》电影片段和五四运动图像复原为例,展示了技术如何将黑白图像转变为彩色,营造身临其境的感觉。AI上色过程中,生成器和鉴别器相互作用,不断优化图像色彩,直到达到逼真的效果。同时,文章提供了简单的在线AI上色工具和DeOldify开源项目的链接,供读者实践和进一步研究。

↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

 Datawhale干货 

作者:桔了个仔,南洋理工大学,Datawhale成员

身临其境的图像复原

之前看《你好李焕英》里,有一个表现手法非常让我印象深刻。就是一开始场景是黑白的,然后慢慢变成彩色的,从黑白到彩色的这个过程,让我有种「进入新的现实」的感觉。

近期有五四运动的图像复原,看到仿佛置身五四运动现场,尽管画面分辨率不高,色彩也不那么完美,但就是能给人一种身临其境的感觉,回到一百年前,与青年们一起救亡图存。

当时的青年尚能挺身而出,忧国忧民,我相信,现代的青年也能奋发图强,肩负起对于这个国家的历史责任,塑造起具有时代光芒的民族精神。

看了下,大家都对技术原理感兴趣啊,那我来用简单的语言讲讲吧。

技术原理

AI上色的原理是什么? 那我们就需要介绍一种深度学习网络架构了,它就是GAN(这里不是粗话)。GAN不是干饭人的干,而是生成对抗网络(英语:Generative Adversarial Network,简称GAN)。当然,太复杂的技术讲解可能会让读者迷惑,于是我找到一张很直白的原理图。

GAN网络分两部分,一个是生成器(Generator),一个是鉴别器(Discriminator)。生成器通过对图像上色,然后交给鉴别器。鉴别器判断这一个图片看起来真不真,如果觉得假,鉴别器会返回「修改意见」,让生成器重新试试,直到鉴别器觉得足够真了。如果你觉得还不好懂,我再打个比方,这就好像美术老师指导学生画画的过程,一开始学生画出来的不够好,老师指出,学生尝试改改,老师再检查,再给意见,直到老师满意。

这就是一张图的上色过程。而视频是一帧帧画面组成的,给视频上色可以理解为通过这个网络架构给视频里的每一帧上色。不过没有这么简单,毕竟视频一秒钟几十帧,一帧帧上色有点慢,而且每一帧之前可能会出现上色效果不一致。所以有的架构会针对细节调整。例如DeOldify采用了NoGAN(一种新型GAN训练模型),用来解决之前DeOldify模型中出现的一些关键问题。例如视频中闪烁的物体:

‍ ‍

使用NoGAN前,画面闪烁严重

使用NoGAN后闪烁减少‍ ‍

当然,实际还原的色彩其实和原本的色彩是不一样的,仅仅是能让其看起来自然。我做了个实验(AI上色工具稍后介绍到),能看到上色效果和原来的效果并不一样。我下载了这么一张向日葵的照片

我手动转成黑白的

这时候再让AI上色,咦,向日葵变成雏菊了。不过看起来竟然也有另一番美感。

一般来说,给人上色会更接近实际情况些。因为人的肤色比较有限,判别器里已经学习过人脸的颜色可能是哪些,转换成灰度图像后对应什么颜色值,所以AI不太可能会给黑白的人像涂成绿色脸。

动手实现

如果你是技术小白,你可以直接打开这个网址,你只需要上传一张图片就能自动上色。Image Colorizationdeepai.org 例如效果如下:

看起来效果很棒吧。如果你懂点技术但不懂机器学习,可以用DeepAI提供的API。例如python调用方法如下:

import requests
r = requests.post(
"https://api.deepai.org/api/colorizer",
data={
'image': 'YOUR_IMAGE_URL',
},
headers={'api-key': 'quickstart-QUdJIGlzIGNvbWluZy4uLi4K'}
)
print(r.json())


# Example posting a local image file:

import requests
r = requests.post(
"https://api.deepai.org/api/colorizer",
files={
'image': open('/path/to/your/file.jpg', 'rb'),
},
headers={'api-key': 'quickstart-QUdJIGlzIGNvbWluZy4uLi4K'}
)
print(r.json())

如果想继续深入研究,可以fork DeOldify的repo。附开源地址:

https://github.com/jantic/DeOldifygithub.com

整理不易,三连

基于深度学习老照片上色涉及到多个模型和算法,下面我简单介绍一下其中一种常用的方法,并提供一个对应的 Python 代码实现。 1. 数据准备 首先需要准备一些有标注的彩色照片和对应的黑白照片,作为训练集和测试集。可以从一些公开数据集中获取,如ImageNet,CIFAR等。 2. 模型搭建 接下来需要搭建一个卷积神经网络(CNN)模型,用于学习黑白照片和彩色照片之间的对应关系。这个模型需要包含一个编码器(Encoder)和一个解码器(Decoder),其中编码器用于将输入的黑白照片转换为一个中间表示,解码器用于将这个中间表示转换为彩色照片。 下面是一个简单的模型搭建代码示例: ```python from tensorflow.keras.layers import Conv2D, UpSampling2D, Input from tensorflow.keras.models import Model def build_model(): # 编码器 input_layer = Input(shape=(256, 256, 1)) x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer) x = Conv2D(64, (3, 3), activation='relu', padding='same', strides=2)(x) x = Conv2D(128, (3, 3), activation='relu', padding='same')(x) x = Conv2D(128, (3, 3), activation='relu', padding='same', strides=2)(x) x = Conv2D(256, (3, 3), activation='relu', padding='same')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same', strides=2)(x) x = Conv2D(512, (3, 3), activation='relu', padding='same')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same')(x) # 解码器 x = UpSampling2D((2, 2))(x) x = Conv2D(128, (3, 3), activation='relu', padding='same')(x) x = Conv2D(128, (3, 3), activation='relu', padding='same')(x) x = UpSampling2D((2, 2))(x) x = Conv2D(64, (3, 3), activation='relu', padding='same')(x) x = Conv2D(64, (3, 3), activation='relu', padding='same')(x) x = Conv2D(32, (3, 3), activation='relu', padding='same')(x) output_layer = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x) model = Model(input_layer, output_layer) model.compile(optimizer='adam', loss='mse') return model ``` 3. 模型训练 模型搭建好之后,需要使用训练集对其进行训练。训练的过程中可以使用一些数据增强的技术,如随机裁剪、旋转、翻转等,以增加模型的泛化能力。 下面是一个简单的模型训练代码示例: ```python import numpy as np from tensorflow.keras.preprocessing.image import ImageDataGenerator model = build_model() # 数据增强 datagen = ImageDataGenerator( rescale=1. / 255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') # 加载数据集 train_data = datagen.flow_from_directory( 'train/', target_size=(256, 256), batch_size=32, class_mode=None) # 训练模型 model.fit(train_data, epochs=50) ``` 4. 模型测试 模型训练好之后,可以使用测试集对其进行测试,并将黑白照片转换为彩色照片。 下面是一个简单的模型测试代码示例: ```python import cv2 # 加载模型 model = build_model() model.load_weights('model_weights.h5') # 读取黑白照片 img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, (256, 256)) img = np.expand_dims(img, axis=-1) # 预测彩色照片 pred = model.predict(np.array([img]))[0] pred = pred * 255 pred = pred.astype(np.uint8) # 保存彩色照片 cv2.imwrite('result.jpg', pred) ``` 以上是一个简单的基于深度学习老照片上色代码实现。由于涉及到多个模型和算法,实现起来比较复杂,需要一定的深度学习和编程知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值