讓人工智慧給你的顏值打個分
來自專欄踩坑晉陞之路
現在是人工智慧興起的時代,到處都在談人工智慧。今天就從人工智慧的角度給你的顏值打個分。
在這裡,我會把整個實現過程寫出來。
先介紹一下用到了哪些東西(用Python3實現)
- 百度的人臉識別api
- flask
- PIL
操作很簡單,主要是利用的百度的人臉識別庫,然後自己做了一個簡單的圖片上傳和圖片處理以及信息提取加工。
百度的人臉識別api申請的地址,需要有百度賬號:人臉檢測-人臉識別-百度AI-百度AI-AI開放平台
然後在控制台創建一個應用即可:
在應用列表中可以看到你創建的應用:
通過查看百度的人臉識別的文檔,我們就可以寫代碼了。
想要使用百度的api,申請只是第一步,後面還需要獲取access_token,文檔給出的方法如下:
官網給的方法相對比較繁瑣,我使用request改寫了一下如下(注意把url裡面的Key換成你申請的)。
def get_access_token(): url = https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&grant_type=client_credentials& client_id=【你申請的API Key】&client_secret=【你申請的Secret Key】 data = requests.get(url, headers).json() return data[access_token]
拿到這個key之後,就可以進行下一步的請求了,繼續看文檔:
文檔中說要使用post方法進行請求,請求的url給出了,url的參數是上面獲取到的access_token,請求的頭部要包含"Content-Type": "application/json"
下面是主體部分,也就是對上傳的圖片的要求,以及你想要獲取的內容的一下說明:
文檔說圖片的大小不能大於10M,上傳的類型包含三種,一種是URL。還有就是圖片通過Base64編碼後得到的編碼信息。其中face_field是你想要返回的內容等等,文檔裡面說的都很清楚,這裡不做過多介紹。
首先,我們不採用圖片url的方式,我們直接使用對圖片進行base64編碼的形式進行處理。編碼的過程如下:
with open(static/ + filename, rb) as f: base = base64.b64encode(f.read()) image = str(base, encoding=utf-8)
請求的參數構造如下:
params = { image: image, image_type: imageType, face_field: age,beauty,gender,face_type,face_shape,expression,landmark}
其中image是我們上面編碼過的結果,imageType是BASE64,face_field是我們想要它返回給我們的內容,包括年齡,顏值,性別,人物類型,臉型,表情,檢測的點。
然後通過返回給我們的數據,提取(完整代碼如下)相應的內容:
def get_content(filename): request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token="+get_access_token() with open(static/ + filename, rb) as f: base = base64.b64encode(f.read()) image = str(base, encoding=utf-8) params = { image: image, image_type: imageType, face_field: age,beauty,gender,face_type,face_shape,expression,landmark } info = requests.post(request_url, headers=headers, data=params).json() if info[error_msg] == SUCCESS: # 用於判斷是否檢測到人臉 face = info[result][face_num] # 年齡, 人臉, 性別 age = info[result][face_list][0][age] beauty = info[result][face_list][0][beauty] # male, female gender = info[result][face_list][0][gender][type] # none 不笑, smile 微笑, laugh 大笑 expression = info[result][face_list][0][expression][type] # square 正方形, triangle 三角形, oval 橢圓, heart 心形, round 圓形 face_shape = info[result][face_list][0][face_shape][type] fs = { square: 方型臉, triangle: 瓜子臉, oval: 圓型臉, heart: 瓜子臉, round: 圓型臉 } # human 真實人臉, cartoon 卡通人臉 face_type = info[result][face_list][0][face_type][type] landmark72 = info[result][face_list][0][landmark72] img = Image.open(static/ + filename) draw = ImageDraw.Draw(img) for idx in range(72): xy = landmark72[idx] draw.text((xy[x], xy[y]), o, (255, 255, 0)) ImageDraw.Draw(img) img.save(static/new_ + filename) if face is 1: data = { age: age, beauty: str(round(beauty, 3)) + (不要灰心, 換個姿勢再試試) if beauty < 60 else str(round(beauty, 3)) + (哇塞! 顏值很高啊), gender: 美女你好 if female in gender else 帥哥你好, expression: 面無表情(記得要常笑哦) if none in expression else 微笑 if smile in expression else 大笑(什麼事這麼開心), face_shape: fs[face_shape], face_type: 真實人物 if human in face_type else 卡通人物 } return data else: return 未識別出人臉, 上傳的圖片盡量不要有遮蓋住臉!!!
代碼中已經給了想要的注釋,其中沒給注釋的一部分是通過提取的72個關鍵點,然後通過循環,把這些坐標點通過ImageDraw畫到了圖片上面。下面是返回的info的數據:
下面是我們從中提取的信息:
這樣我們的基本工作就算完成了,但是這樣並不完善,我們打算把它做成Web的形式,這樣所有人就都可以用了,Web的話Python主流有Django、Flask、Tornado等,這裡我們選擇了Flask,主要是它輕量化也比較簡單。
主要通過flask_uploads庫實現文件上傳,該庫的具體用法,大家可以自行去了解。
首先接收上傳的圖片(通過UploadSet指定只接收Images類型),如果是GET類型,就返回上傳的html,如果是POST類型,並且包含photo,就接收上傳,通過securefilename,去檢查上傳圖片的安全性,然後再對上傳的圖片通過時間戳重命名,然後調用我們前面寫的get_content, 把圖片的地址傳給它,就可以進行處理了。
result.html的內容如下:
使用Jinja2模板,把前面提取到的內容傳給它,然後通過網頁的形式展示出來。
效果如下(主要打算在手機端運行,所以電腦端看起來可能有點怪異):
手機端的效果如下:我的微信公眾號:(一個簡單程序猿)可以在線體驗。歡迎你的關注,歡迎交流。
推薦閱讀:
※推出「e換電」智能換電系統,IMMOTOR能否構建換電生態圈?
※剖析pip ssh-decorate供應鏈攻擊
※中国古代科技发明大搜集
※鈺創科技盧超群:摩爾定律就算終結,但半導體技術還有30年榮景
※為何買空調越來越便宜,修空調越來越貴?