1.需求及方案:python
隨着生活水平的提升,人們都但願能健康飲食,這就須要對食材有更加深刻的瞭解。百度AI果蔬類食材識別,根據拍攝照片,識別圖片中果蔬名稱。本文結合百度AI果蔬類食材識別與百度百科,食物卡路里信息整合,爲用戶提供養分價值、搭配禁忌等方面信息,讓你們能夠更加健康的飲食。json
2.平臺接入app
食材識別接入網址:https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index測試
具體接入方式比較簡單,能夠參考個人另外一個帖子,這裏就不重複了:編碼
http://ai.baidu.com/forum/topic/show/943327url
3.食材識別調用攻略(Python3)rest
3.1首先認證受權:code
在開始調用任何API以前須要先進行認證受權,具體的說明請參考:orm
http://ai.baidu.com/docs#/Auth/topxml
具體Python3代碼以下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
3.2 接口調用:
詳細說明請參考:https://ai.baidu.com/docs#/ImageClassify-API/f0fe4219
說明的比較清晰,這裏就不重複了。
你們須要注意的是:
API訪問URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/classify/ingredient
圖片格式:Base64編碼字符串,以圖片文件形式請求時必填。(支持圖片格式:jpg,bmp,png),圖片大小不超過4M。最短邊至少15px,最長邊最大4096px。 注意:圖片的base64編碼是不包含圖片頭的
Python3調用代碼以下:
#食材識別
#filename:圖片名(本地存儲包括路徑)
def landmark(filename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/classify/ingredient"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
landmark=''
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
words_result=data['result']
landmark=words_result['landmark']
print ('食材:',landmark)
return landmark
4.應用方案:
4.1 總體方案:
首先調用食材識別API對食材圖片進行識別。
而後經過百度百科對食材的具體狀況進行搜索,並蒐集食物卡路里信息,將結果展現給客戶。總體方案以下圖所示:
4.2 核心代碼:
API調用:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
def ingredient(filename):
request_url = " https://aip.baidubce.com/rest/2.0/image-classify/v1/classify/ingredient"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
ingredient=''
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
words_result=data['result'][0]
ingredient=words_result['name']
print (ingredient)
return ingredient
獲取相關信息及整合:
from bs4 import BeautifulSoup
#經過百度百科獲取食材的詳細說明
def get_baike_summary(itemname):
url='https://baike.baidu.com/item/'+urllib.parse.quote(itemname)
# 構建請求對象
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
# 發送請求
response = urllib.request.urlopen(request)
# 讀取文件
content = response.read().decode('utf8')
# 先構建一個soup對象
soup = BeautifulSoup(content, "lxml")
#獲取描述
summary = soup.find("div", attrs={"class": "lemma-summary"}).get_text()
print (summary)
#經過獲取食物卡路里信息
def get_food_cal(itemname):
url='https://food.hiyd.com/food/search?kw='+urllib.parse.quote(itemname)
# 構建請求對象
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
# 發送請求
response = urllib.request.urlopen(request)
# 讀取文件
content = response.read().decode('utf8')
# 先構建一個soup對象
soup = BeautifulSoup(content, "lxml")
#獲取描述
summary = soup.find_all("div", attrs={"class": "cont"})
i=0
#只顯示前5種
for info in summary:
if i<5:
print (info.get_text())
i=i+1
def get_ingredient_more(filename):
result=ingredient(filename)
if result!='非果蔬食材':
get_baike_summary(result)
get_food_cal(result)
get_ingredient_more('ingredient3.jpg')
4.3 效果測試
如下是幾個測試食材圖片及返回結果。
圖片:
返回結果:
西芹
西芹,傘形科植物,它既不是根菜,也不屬於粘滑食物,它養分豐富,富含蛋白質、碳水化合物、礦物質及多種維生素等養分物質, 西芹從國外引入,已普遍栽培並深受百姓喜好的,葉柄寬厚,單株葉片數多,重量大,可達1Kg以上。西芹和本芹(中國芹菜)具備相同的養分價值。
西芹, 又叫西洋芹菜、美芹
熱量:12 大卡(100克可食部分)
腰果拌西芹
熱量:127 大卡(100克)
白果炒西芹
熱量:125 大卡(100克)
Waitrose 西芹
熱量:11 大卡(100克)
西芹炒白果
熱量:75 大卡(100克)
圖片2:
返回結果:
芒果
芒果是杧果
[1]
(中國植物誌)的通俗名(拉丁學名:Mangifera indica L.),芒果是一種原產印度的漆樹科常綠大喬木,葉革質,互生;花小,雜性,黃色或淡黃色,成頂生的圓錐花序。核果大,壓扁,長5-10釐米,寬3-4.5釐米,成熟時黃色,味甜,果核堅硬。芒果爲著名熱帶水果之一,芒果果實含有糖、蛋白質、粗纖維,芒果所含有的維生素A的前體胡蘿蔔素成分特別高,是全部水果中少見的。其次維生素C含量也不低。礦物質、蛋白質、脂肪、糖類等,也是其主要養分成分。可制果汁、果醬、罐頭、醃漬、酸辣泡菜及芒果奶粉、蜜餞等。(概述圖片參考資料來源
[1]
)
芒果, 又叫庵羅果、檬果、蜜望子、香蓋
熱量:32 大卡(100克可食部分)
芒果王 芒果乾
熱量:367 大卡(100克)
芒果幫 芒果乾
熱量:365 大卡(100克)
安可 芒果乾
熱量:396 大卡(100克)
CEBU 芒果乾
熱量:381 大卡(100克)
總體效果很是不錯。