1. 程式人生 > >深度學習AI美顏系列---AI濾鏡特效演算法

深度學習AI美顏系列---AI濾鏡特效演算法

濾鏡是影象美化中必不可少的步驟, 所謂濾鏡,最初是指安裝在相機鏡頭前過濾自然光的附加鏡頭,用來實現調色和新增效果。我們做的濾鏡演算法又叫做軟體濾鏡,是對大部分鏡頭濾鏡進行的模擬,當然,誤差也就再所難免,我們的宗旨只是無限逼近。也是這個原因,我們無法再現真實的拍攝場景,無法復原照片中未包含的資訊,進而也難以實現某些特殊濾鏡效果,諸如偏光鏡和紫外線濾色鏡(UV)的效果等等。

目前各種影象處理軟體無論是PC軟體還是手機app,都有著各種各樣的濾鏡特效,Instagram也正因為自己獨特的濾鏡風格,風靡一時;

針對傳統的濾鏡特效,我這裡將它分類為LUT濾鏡和幾何濾鏡兩種。

LUT濾鏡是指基於調色表和紋理組合的濾鏡特效;

幾何濾鏡是指一些基於空間位置變換得到的特效,比如哈哈鏡等;

隨著深度學習的興起,各種風格濾鏡層出不窮,給人們帶來了驚豔的效果,谷歌的HDRNET更是將AI應用到了照片智慧調色,今天我們不講HDRNET,我們以一種最簡單的方式,來講一下如何使用深度學習來做傳統的LUT濾鏡;

有人說LUT濾鏡已經很成熟了,用深度學習是多此一舉,這裡我們不探討意義,只探討方法論,實際上LUT可以實現的是一類特效而已,可以說只是深度學習中的一個子集;

我們以一個特殊的黑白濾鏡為例,先看下面幾張圖:


上面的三列圖分別為原圖+PS灰度+論文演算法的效果對比,我們可以看到一般的灰度化演算法(第二列所示)直接導致了一些影象資訊的消逝,至少我們無法分辨,而論文演算法的效果在一定程度上增強了不同資訊之間的對比度,讓我們依舊可以看到影象本身的內容;

這種演算法實際上就是對比度保留的去色演算法,相關論文如下:

上述論文都是使用傳統的影象演算法來實現對比度保留的灰度計算的,而且計算複雜,速度差異化也比較大,現在我們可以將這個演算法效果理解為一種特殊的黑白濾鏡,然後用深度學習的方法來實現這種效果:

我這裡使用最簡單的CNN網路,我們構建一個四層卷積層的網路,如下所示:


網路輸入為256X256大小三通道的彩色圖,輸出為256X256大小三通道彩色圖;使用Keras來實現該網路;該網路有四個卷積層,相關引數分別如下:第一層:kSize=9,Strides=1,Padding=same,輸出通道channels=32,啟用函式為relu;第二層:kSize=3,Strides=1,Padding=same,輸出通道channels=64,啟用函式為relu;
第三層:kSize=3,Strides=1,Padding=same,輸出通道channels=64,啟用函式為relu;第四層:kSize=3,Strides=1,Padding=same,輸出通道channels=3,無啟用函式;第四層卷積後,影象以256X256X3大小輸出;loss計算採用均方誤差,adm下降演算法,minbatch設定為32,迭代次數為500次;

資料來源:使用論文演算法處理原圖得到對應的效果圖,分別作為訓練的樣本;

程式碼如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.python.framework import ops
import math
import os
from keras import layers
from keras.layers import Dropout,Input, Add, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D, GlobalMaxPooling2D,Lambda,Convolution2D,Conv2DTranspose,UpSampling2D
from keras.models import Model, load_model,Sequential
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
from keras.optimizers import SGD
import pydot
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
from keras.initializers import glorot_uniform
from keras.utils import to_categorical
import scipy.misc
import h5py
import keras.backend as K
K.set_image_data_format('channels_last')
K.set_learning_phase(1)
K.set_image_dim_ordering('tf')
def input_data():  
      
    path_x = "data/train/X/" 
    path_y = "data/train/Y3/"
    train_num = sum([len(x) for _, _, x in os.walk(os.path.dirname(path_x))])  
    image_train = np.zeros((train_num,256,256,3)) 
    label_train = np.zeros((train_num,256,256,3)) 
    count = 0
    for i in range(train_num):
        img = image.load_img(path_x + str(i) + ".bmp", target_size = (256, 256))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis = 0)                   
        image_train[count] = x
        
        img = image.load_img(path_y + str(i) + ".bmp", target_size = (256, 256))
        x = image.img_to_array(img)
        x = np.expand_dims(x, axis = 0)                   
        label_train[count] = x
        count = count + 1
    return image_train, label_train
def FilterModel(input_shape = (256,256,3)):
    # Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)
    X = ZeroPadding2D((0,0))(X_input)
    # frist convolution layer
    X = Conv2D(32, (9, 9), strides = (1, 1),padding='same', name = 'conv1', kernel_initializer = glorot_uniform(seed=0))(X)
    #X = BatchNormalization(axis = 3, name = 'bn_conv1')(X)
    X = Activation('relu')(X)
    print("conv1--X:",str(X.shape))
    # second convolution layer
    X = Conv2D(64, (3, 3), strides = (1, 1),padding='same', name = 'conv2', kernel_initializer = glorot_uniform(seed=0))(X)
    #X = BatchNormalization(axis = 3, name = 'bn_conv2')(X)
    X = Activation('relu')(X)
    X_shortcut = X
    print("conv2--X:",str(X.shape))
    # third convolution layer
    X = Conv2D(128, (3, 3), strides = (1, 1),padding='same', name = 'conv3', kernel_initializer = glorot_uniform(seed=0))(X)
    #X = BatchNormalization(axis = 3, name = 'bn_conv3')(X)
    X = Activation('relu')(X)
    #five convolution layer
    output = Conv2D(3, (5, 5), strides = (1, 1),padding='same', name = 'conv5', kernel_initializer = glorot_uniform(seed=0))(X)
    print("conv5--X:",str(X.shape))   
    model = Model(inputs=X_input, outputs=output, name='FilterModel')
    return model
#訓練程式碼  
image_train, label_train = input_data()  
image_train = image_train.astype('float32')
label_train = label_train.astype('float32')
image_train /= 255
label_train /= 255
print("image_train:", str(image_train.shape))
print("label_train:", str(label_train.shape))
K.clear_session()
model = FilterModel((256,256,3))
model.compile(optimizer = "adam", loss = "mean_squared_error", metrics = ["accuracy"])
print("image_train:", str(image_train.shape))
print("label_train:", str(label_train.shape))
model.fit(image_train, label_train,epochs=500,batch_size=32)#訓練500次,資料量為500張,有點少,沒關係,只介紹方法與思路
model.save("model/filterModel.h5")
print("Model save done!")
#測試程式碼如下
import matplotlib
import scipy.misc
np.random.seed(1)  
from keras.models import load_model  
image = img.imread("data/t1.bmp")  
print("image: ", str(image.shape))
image_test = image[:,:,:]  
print("image_test shape:", str(image_test.shape))  
image = image_test.reshape(1,image_test.shape[0],image_test.shape[1],3)  
image = image / 255.  
# imaget = tf.image.convert_image_dtype(image, tf.float32)  
print("image shape: %", str(image.shape)) 
model = load_model('model/filterModel.h5')
res = model.predict(image)
print("res:",str(res.shape))
# image = res[0,...].eval()
amin, amax = res.min(),res.max()
image = (res - amin) / (amax - amin) * 255.0
image = image[0,...]
print(str(image.shape))
matplotlib.image.imsave('data/result5.png', np.uint8(image))

最後效果圖如下:


從效果上看,思路是沒有問題的,效果也基本達到了預期;

本文話題是AI美顏系列,因此這裡我用同樣的網路,訓練了一個阿寶色美顏濾鏡,我們以傳統阿寶色演算法處理10000樣本,得到對應的效果圖,以此作為訓練資料,當然,理論上可以使用專業的PS設計人員調色精修得到更好的阿寶色效果圖作為訓練樣本,這樣效果才更好,這裡為了說明方法,簡化如此,最後訓練模型的效果如下:


原圖                                               阿寶色效果圖

大家可以測試一些其他彩色濾鏡,當然,對於美顏這個話題,我們可以用這種思路去實現一些美顏特效濾鏡,比如美顏相機中的膚色調節濾鏡,膚色粉嫩濾鏡等等,相信深度學習不會讓你失望的!這裡的網路比較簡單,當然大家可以使用比較複雜的,以達到更好的效果!

本人QQ1358009172