百度AI攻略:健康飲食APP方案

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克)

 

總體效果很是不錯。

相關文章
相關標籤/搜索