1. 程式人生 > >全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

在是人工智慧興起的時代,到處都在談人工智慧。今天就從人工智慧的角度給你的顏值打個分。

在這裡,我會把整個實現過程寫出來。

先介紹一下用到了哪些東西(用Python3實現)

  • 百度的人臉識別api
  • Flask
  • PIL
  • requests

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

  •  

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

操作很簡單,主要是利用的百度的人臉識別庫,然後自己做了一個簡單的圖片上傳和圖片處理以及資訊提取加工。

百度的人臉識別api申請的地址,需要有百度賬號: 傳送門

然後在控制檯建立一個應用即可:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

建立應用

在應用列表中可以看到你建立的應用:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

應用列表

通過檢視百度的人臉識別的文件,我們就可以寫程式碼了。

想要使用百度的api,申請只是第一步,後面還需要獲取access_token,文件給出的方法如下:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

 

用方法

官網給的方法相對比較繁瑣,我使用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之後,就可以進行下一步的請求了,繼續看文件:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

請求文件

文件中說要使用post方法進行請求,請求的url給出了,url的引數是上面獲取到的access_token,請求的頭部要包含”Content-Type”: “application/json”

下面是主體部分,也就是對上傳的圖片的要求,以及你想要獲取的內容的一下說明:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

請求引數

文件說圖片的大小不能大於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的資料:

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

info

下面是我們從中提取的資訊:

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

提取的內容

這樣我們的基本工作就算完成了,但是這樣並不完善,我們打算把它做成Web的形式,這樣所有人就都可以用了,Web的話Python主流有Django、Flask、Tornado等,這裡我們選擇了Flask,主要是它輕量化也比較簡單。

主要通過flask_uploads庫實現檔案上傳,該庫的具體用法,大家可以自行去了解。

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

檔案上傳

首先接收上傳的圖片(通過UploadSet指定只接收Images型別),如果是GET型別,就返回上傳的html,如果是POST型別,並且包含photo,就接收上傳,通過securefilename,去檢查上傳圖片的安全性,然後再對上傳的圖片通過時間戳重新命名,然後呼叫我們前面寫的get_content, 把圖片的地址傳給它,就可以進行處理了。

result.html的內容如下:

<!DOCTYPE html><html lang="en"><head>
 <meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1" />
 <title>人臉識別</title></head><body style="background: beige">
 <div align="center">
 <form method="post" enctype="multipart/form-data">
 <input type="file" name="photo">
 <input type="submit" value="提交">
 </form>
 </div>
 {% if '未識別' not in content and content%} <div align="center" style="padding-top: 30px">
 <p><img src="{{ file_url }}" width="150"> {% if new_url %}<img src="{{ new_url }}" width="150">{% endif %}</p>
 <table border="0" align="center" cellpadding="5" cellspacing="0">
 <tr>
 <td align="right">年齡: </td>
 <td align="left" style="color:red;">{{ content['age'] }}</td>
 </tr>
 <tr>
 <td align="right">顏值: </td>
 <td align="left" style="color:red;">{{ content['beauty'] }}</td>
 </tr>
 <tr>
 <td align="right">性別: </td>
 <td align="left" style="color:red;">{{ content['gender'] }}</td>
 </tr>
 <tr>
 <td align="right">表情: </td>
 <td align="left" style="color:red;">{{ content['expression'] }}</td>
 </tr>
 <tr>
 <td align="right">臉型: </td>
 <td align="left" style="color:red;">{{ content['face_shape'] }}</td>
 </tr>
 <tr>
 <td align="right">人物型別: </td>
 <td align="left" style="color:red;">{{ content['face_type'] }}</td>
 </tr>
 </table>
 </div>
 {% else %} <h1 align="center" style="color: red">{{ content }}</h1>
 {% endif %}</body></html>

使用Jinja2模板(前端設計的有點簡陋,大家將就的看),把前面提取到的內容傳給它,然後通過網頁的形式展示出來。

效果如下(主要打算在手機端執行,所以電腦端看起來可能有點怪異):

 

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

 

手機端的效果如下

全國最佳python趣味性專案,讓人工智慧給你的顏值打個分!

 

用著百度的東西,又把李彥巨集拉出來可能有點不太厚道,不過AI給它的顏值評的分還算可以。是親生的。