QuickStart
健身房APP结合菜品识别开发案例
连锁健身品牌技术部门负责人马主管,负责开发健身房的APP。由于健身和减脂塑形讲究“三分练,七分吃”,该吃什么、吃多少是非常重要的,越来越多的会员通过APP中的饮食板块来指导每天的饮食。但目前饮食版块需要用户手动输入食物名称来计算卡路里,用户体验很差,有时候会员们并不能准确的输入食物名称,造成他们无法追踪每天从饮食中摄入的卡路里。
于是马主管准备在APP中增加一个功能,用户随手拍摄食物照片,一键上传即可识别图片中菜品名称,从而获取菜品类别、营养成份及参考卡路里含量等信息,根据识别结果进一步提供饮食推荐、健康管理方案。当他着手做这件事时因缺少相关技术,使得项目进度缓慢。通过对市面上多家厂商能力的比较,马主管选择了百度图像识别中的菜品识别产品,实现了50000种以上菜品的识别,准确率在90%以上;且随着百度AI菜品数据库的持续更新,识别率不断提升,极大的降低了APP的开发成本,也为用户提供了便捷的操作方式及良好的用户体验。
下面让我们一起来和马主管看一下如何接入百度图像识别的菜品识别服务吧
实现步骤
只需三步,1小时内即可完成图像识别接口的调用。
Step1:成为百度AI开放平台的开发者
要调用百度AI开放平台的图像识别能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者,并新建一个图像识别应用。
先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。
我们有账号之后登录,并且点击此处创建一个应用,如下图
然后就能看到创建完的应用和 API KEY 以及 Secret KEY了
Step2:准备数据
我们看看实际用户通过马主管的健身app随手拍摄的菜品照片有哪些:
菜品1:
菜品2:
菜品3:
Step3: 编写一个示例程序
有第一步的API KEY 以及 Secret KEY,以及第二步的数据,我们就可以写一个示例代码调用百度AI开放平台的识别能力
准备开发环境
我们选择用python来快速搭建一个原型,关于如何安装python。可以参考下表列出的不同操作系统的安装方法进行安装。
Python的官方下载地址:下载python
Windows 快速测试包
windows平台的用户如果对上述的python安装感到困难,可以下载我们的一键测试包,下载地址:windows测试包。
解压zip文件后,双击run.bat即可测试。
编写代码
新建一个 main.py
粘贴以下内容,不要忘记替换你的 API_KEY 以及 SECRET_KEY:
1# coding=utf-8
2
3import sys
4import json
5import base64
6
7
8# 保证兼容python2以及python3
9IS_PY3 = sys.version_info.major == 3
10if IS_PY3:
11 from urllib.request import urlopen
12 from urllib.request import Request
13 from urllib.error import URLError
14 from urllib.parse import urlencode
15 from urllib.parse import quote_plus
16else:
17 import urllib2
18 from urllib import quote_plus
19 from urllib2 import urlopen
20 from urllib2 import Request
21 from urllib2 import URLError
22 from urllib import urlencode
23
24# 防止https证书校验不正确
25import ssl
26ssl._create_default_https_context = ssl._create_unverified_context
27
28API_KEY = 'AK'
29
30SECRET_KEY = 'SK'
31
32
33IMAGE_RECOGNIZE_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish"
34
35
36""" TOKEN start """
37TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'
38
39
40"""
41 获取token
42"""
43def fetch_token():
44 params = {'grant_type': 'client_credentials',
45 'client_id': API_KEY,
46 'client_secret': SECRET_KEY}
47 post_data = urlencode(params)
48 if (IS_PY3):
49 post_data = post_data.encode('utf-8')
50 req = Request(TOKEN_URL, post_data)
51 try:
52 f = urlopen(req, timeout=5)
53 result_str = f.read()
54 except URLError as err:
55 print(err)
56 if (IS_PY3):
57 result_str = result_str.decode()
58
59 result = json.loads(result_str)
60
61 if ('access_token' in result.keys() and 'scope' in result.keys()):
62 if not 'brain_all_scope' in result['scope'].split(' '):
63 print ('please ensure has check the ability')
64 exit()
65 return result['access_token']
66 else:
67 print ('please overwrite the correct API_KEY and SECRET_KEY')
68 exit()
69
70"""
71 读取文件
72"""
73def read_file(image_path):
74 f = None
75 try:
76 f = open(image_path, 'rb')
77 return f.read()
78 except:
79 print('read image file fail')
80 return None
81 finally:
82 if f:
83 f.close()
84
85"""
86 调用远程服务
87"""
88def request(url, data):
89 req = Request(url, data.encode('utf-8'))
90 has_error = False
91 try:
92 f = urlopen(req)
93 result_str = f.read()
94 if (IS_PY3):
95 result_str = result_str.decode()
96 return result_str
97 except URLError as err:
98 print(err)
99
100"""
101 调用菜品识别接口并打印结果
102"""
103def print_result(filename, url):
104 # 获取图片
105 file_content = read_file(filename)
106
107 response = request(url, urlencode(
108 {
109 'image': base64.b64encode(file_content),
110 'top_num': 1
111 }))
112 result_json = json.loads(response)
113
114 # 打印图片结果
115 for data in result_json["result"]:
116 print(u" 菜品名称: " + data["name"])
117 if data[u'has_calorie']:
118 print(u" 菜品热量: " + data["calorie"])
119
120if __name__ == '__main__':
121
122 # 获取access token
123 token = fetch_token()
124
125 # 拼接图像识别url
126 url = IMAGE_RECOGNIZE_URL + "?access_token=" + token
127
128 # 菜品图1
129 print("菜品1")
130 print_result("./food1.jpg", url)
131
132 # 菜品图3
133 print("菜品2")
134 print_result("./food2.jpg", url)
135
136 # 菜品图3
137 print("菜品3")
138 print_result("./food3.jpg", url)
运行代码
在命令行中运行python main.py
结果
若代码正确运行,命令行界面上会显示出运行结果:
1菜品1
2 菜品名称: 白灼菜心
3 菜品热量: 35
4菜品2
5 菜品名称: 香酥鲫鱼
6 菜品热量: 108
7菜品3
8 菜品名称: 猪排
9 菜品热量: 231
百度的菜品识别不仅显示出了菜品名称,还将该菜品所含的热量提供给马主管的健身用户,为他们筛选菜品提供了很好的参考。
菜品识别接口返回的数据还包括置信度,甚至还有百度百科数据链接等,服务接口的具体文档可以参考 图像识别REST API文档
总结
最终马主管很快就把百度的菜品识别能力集成到自己的健身app中,打造了一键识别菜品卡路里功能,该功能上线后受到健身瘦身会员的一致好评。这项功能不仅提供菜品名字、推荐热量,还有置信度、百度百科数据链接为他们筛选菜品提供了很好的参考,客户对菜品识别的效果非常满意。马主管在为客户提供良好的用户体验的同时,也大大降低了自己的开发成本。
了解更多
百度AI开放平台提供了丰富的图像识别服务,包括通用物体和场景识别、品牌logo识别、植物识别、动物识别、菜品识别、地标识别、果蔬识别、红酒识别、货币识别、图像主体检测等服务。
示例源代码
您可以在我们的官方github上下载示例源码
产品特色
图像识别服务可以精准识别超过十万种物体和场景,包含多项高精度的识图能力并提供相应的API服务,充分满足各类个人开发者和企业用户的业务需求。