前幾天,女友拉著我和她玩兒抖音,,就是這個人像動漫化
的操作,頓時覺得很好玩兒,。我心想:python既然這么強(qiáng)大,,是不是也可以使用python程序來實(shí)現(xiàn)這樣一個操作呢?
哈哈,!我自己當(dāng)然是沒有這個本事編寫這樣一個牛逼的程序出來,,但是百度可以呀,并且還很好用,。百度AI開放平臺給我們提供了完整的接口,,甚至貼心的將代碼都給我們寫好了。這些接口還支持很多主流語言都呢,,像Java,、Python、PHP,、C#等,,我們做的就是直接調(diào)用它即可。效果怎么樣呢,?我們先來看看下方的對比圖吧,。
效果展示
原圖和動漫圖:
原圖和戴口罩的動漫圖:
那么這樣的動漫圖,究竟是怎么做出來的呢,?今天我就帶著大家一一探究一下,。
原理分析
這里首先給大家提供下面的一個網(wǎng)址,這就是百度AI開放平臺關(guān)于人像動漫化
特效的網(wǎng)頁。http:///64FNvD
在這里我們可以上傳自己的圖片(如圖所示),,進(jìn)行人像動漫畫的操作,。
但是呢?這個并不是今天的重點(diǎn),,如果說我想要為動漫圖片帶口罩,,你就沒轍了吧。
在該頁面有一個重要的東西:軟件操作人像動漫化的接口(如圖所示),。從左邊可以看到,,這是一個Post請求,發(fā)送該請求的網(wǎng)址并不全,,需要你提供自己的access_token,。同時呢,發(fā)送Post請求不僅需要攜帶Headers,,還需要攜帶一個Params參數(shù),,其中Headers是固定的,image參數(shù)是圖片的Base64編碼格式,。該P(yáng)ost請求的返回值Response是一個字典,,我們這里先記住就行了。
除了上面所敘述的,,這個網(wǎng)址顯示的頁面中還有一個很重要的東西:人像動漫畫接口的API文檔(如圖所示),,該文檔可以幫助我們怎么寫代碼,百度夠貼心吧,。
API文檔網(wǎng)址
:http:///64FNZ9
從圖中可以看到,,這個API文檔中不僅有人像動漫畫的操作,還有黑白圖像上色,、圖像修復(fù)等一系列操作,,都是很好玩的。希望大家學(xué)習(xí)了本文以后,,能夠下去玩玩其他的操作,。
通過上述的原理分析
:實(shí)現(xiàn)人像動漫畫操作,最終就轉(zhuǎn)化為發(fā)送一個Post請求,。而發(fā)送Post請求呢,,我們就需要獲取我們的access_token參數(shù)。
access_token參數(shù)的獲取
獲取access_token
參數(shù),,需要使用百度的鑒權(quán)認(rèn)證機(jī)制
,。下面就是鑒權(quán)認(rèn)證機(jī)制的網(wǎng)址,在該網(wǎng)頁上,,詳細(xì)介紹了我們怎么獲取自己的access_token參數(shù),。
鑒權(quán)認(rèn)證機(jī)制網(wǎng)址
:http:///6rUoTr
仔細(xì)查看本頁面上的文檔,,我們可以很容易的發(fā)現(xiàn):獲取access_token參數(shù),就是是發(fā)送一次Post請求,,該請求的返回值是一個字典
,,里面有我們想要獲取的access_token參數(shù)。
https://aip./oauth/2.0/token?grant_type=client_credentials&client_id=【官網(wǎng)獲取的AK】&client_secret=【官網(wǎng)獲取的SK】
上面是這個Post請求的網(wǎng)址,,但是可以看到這個網(wǎng)址也是不全
的,,它還需要我們在官網(wǎng)中獲取到自己的【官網(wǎng)獲取的AK】和【官網(wǎng)獲取的SK】,其中AK指的是API Key,,SK指的是Secret Key,。
通過上述的分析
:為了獲取access_token參數(shù),也是發(fā)送一個Post請求,,而發(fā)送Post請求,,就需要我們找到自己的API Key和Secret Key。
尋找API Key和Secret Key
首先登陸百度智能云的網(wǎng)址,。這個網(wǎng)址需要我們掃碼登陸,,我們按照提示進(jìn)行登陸即可。
百度智能云
:https://login.bce.baidu.com/
當(dāng)出現(xiàn)下面這個頁面,,我們完成圖中的操作,。
當(dāng)出現(xiàn)如下頁面,我們點(diǎn)擊應(yīng)用列表,。
可以看到,這里已經(jīng)有我創(chuàng)建好的兩個應(yīng)用,。如果你是第一次創(chuàng)建,,你這里什么也沒有,直接點(diǎn)擊創(chuàng)建應(yīng)用,。記住:這里就有我們想要的API Key和Secret Key。
當(dāng)出現(xiàn)如下界面,,完成如下的操作,。
創(chuàng)建成功后,直接查看應(yīng)用列表即可,,最終頁面如下,。
點(diǎn)擊展開后,我們可以查看某個API的使用次數(shù),。因?yàn)橛行〢PI接口并不是一直免費(fèi)的,,有效次數(shù)使用完了以后,需要付費(fèi)使用啦,。下圖也可以看到人像動漫畫操作大致也就500次的免費(fèi)使用次數(shù),。
代碼展示
1)單純的人像動漫化,不為人像戴口罩
import requests, base64
# 這個函數(shù)的操作是為了獲取access_token參數(shù)
def get_access_token():
url = 'https://aip./oauth/2.0/token'
data = {
'grant_type': 'client_credentials', # 固定值
'client_id': '3j8EWb6rgg..SPY2X693LBy', # 在開放平臺注冊后所建應(yīng)用的API Key
'client_secret': 'Px9KZuU0Gl...jTKktoCopnIWEiF57gf' # 所建應(yīng)用的Secret Key
}
res = requests.post(url, data=data)
res = res.json()
#print(res)
access_token = res['access_token']
return access_token
# 下面的代碼就是API文檔中的代碼,直接搬過來使用即可,。
request_url = 'https://aip./rest/2.0/image-process/v1/selfie_anime'
f = open('zhao.jpg', 'rb') # 二進(jìn)制方式打開圖片文件
img = base64.b64encode(f.read()) # 圖像轉(zhuǎn)為base64的格式,,這是百度API文檔中要求的
params = {'image':img}
access_token = '24.11731cd1f0...9f9b3a930f917f3681b.2592000.1596894747.282335-21221990'
request_url = request_url + '?access_token=' + get_access_token()
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
res = response.json()
# 前面我們講述了這個請求返回的是一個字典,其中一個鍵就是image,,代表的是處理后的圖像信息,。
# 將這個圖像信息寫入,得到最終的效果圖,。
if res:
f = open('kouzhao4.jpg', 'wb')
after_img = res['image']
after_img = base64.b64decode(after_img)
f.write(after_img)
f.close()
2)人像動漫化,,并為人像戴口罩
import requests, base64
# 這個函數(shù)的操作是為了獲取access_token參數(shù)
def get_access_token():
url = 'https://aip./oauth/2.0/token'
data = {
'grant_type': 'client_credentials', # 固定值
'client_id': '3j8EWb6rgg...SPY2X693LBy', # 在開放平臺注冊后所建應(yīng)用的API Key
'client_secret': 'Px9KZuU0Gl...jTKktoCopnIWEiF57gf' # 所建應(yīng)用的Secret Key
}
res = requests.post(url, data=data)
res = res.json()
#print(res)
access_token = res['access_token']
return access_token
request_url = 'https://aip./rest/2.0/image-process/v1/selfie_anime'
# 二進(jìn)制方式打開圖片文件
f = open('zhao.jpg', 'rb')
img = base64.b64encode(f.read())
# 注意:這里就是多了type參數(shù)和mask_id參數(shù),都是在源文檔中可以查看的參數(shù),。
# type的值為anime或者anime_mask,。前者生成二次元動漫圖,后者生成戴口罩的二次元動漫人像,。
# 1~8之間的整數(shù),,用于指定所使用的口罩的編碼。大家可以自行下去嘗試,。
params = {'image':img,'type':'anime_mask','mask_id':'2'}
access_token = '24.11731cd1f0...9f9b3a930f917f3681b.2592000.1596894747.282335-21221990'
request_url = request_url + '?access_token=' + get_access_token()
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
res = response.json()
# print(res)
if res:
f = open('kouzhao5.jpg', 'wb')
after_img = res['image']
after_img = base64.b64decode(after_img)
f.write(after_img)
f.close()
??