QuickStart
所有文档

          图像识别

          QuickStart

          健身房APP结合菜品识别开发案例

          连锁健身品牌技术部门负责人马主管,负责开发健身房的APP。由于健身和减脂塑形讲究“三分练,七分吃”,该吃什么、吃多少是非常重要的,越来越多的会员通过APP中的饮食板块来指导每天的饮食。但目前饮食版块需要用户手动输入食物名称来计算卡路里,用户体验很差,有时候会员们并不能准确的输入食物名称,造成他们无法追踪每天从饮食中摄入的卡路里。

          于是马主管准备在APP中增加一个功能,用户随手拍摄食物照片,一键上传即可识别图片中菜品名称,从而获取菜品类别、营养成份及参考卡路里含量等信息,根据识别结果进一步提供饮食推荐、健康管理方案。当他着手做这件事时因缺少相关技术,使得项目进度缓慢。通过对市面上多家厂商能力的比较,马主管选择了百度图像识别中的菜品识别产品,实现了50000种以上菜品的识别,准确率在90%以上;且随着百度AI菜品数据库的持续更新,识别率不断提升,极大的降低了APP的开发成本,也为用户提供了便捷的操作方式及良好的用户体验。

          下面让我们一起来和马主管看一下如何接入百度图像识别的菜品识别服务吧

          实现步骤

          只需三步1小时内即可完成图像识别接口的调用。

          Step1:成为百度AI开放平台的开发者

          要调用百度AI开放平台的图像识别能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者,并新建一个图像识别应用。

          先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。

          图片

          我们有账号之后登录,并且点击此处创建一个应用如下图

          图片

          然后就能看到创建完的应用和 API KEY 以及 Secret KEY

          图片

          Step2:准备数据

          我们看看实际用户通过马主管的健身app随手拍摄的菜品照片有哪些:

          菜品1:

          菜品1

          菜品2:

          菜品2

          菜品3:

          菜品3

          Step3: 编写一个示例程序

          第一步API KEY 以及 Secret KEY,以及第二步的数据,我们就可以写一个示例代码调用百度AI开放平台的识别能力

          准备开发环境

          我们选择用python来快速搭建一个原型,关于如何安装python。可以参考下表列出的不同操作系统的安装方法进行安装。

          Python的官方下载地址:下载python

          Windows 快速测试包

          windows平台的用户如果对上述的python安装感到困难,可以下载我们的一键测试包,下载地址:windows测试包

          解压zip文件后,双击run.bat即可测试。

          编写代码

          新建一个 main.py

          粘贴以下内容,不要忘记替换你的 API_KEY 以及 SECRET_KEY

          # coding=utf-8
          
          import sys
          import json
          import base64
          
          
          # 保证兼容python2以及python3
          IS_PY3 = sys.version_info.major == 3
          if IS_PY3:
              from urllib.request import urlopen
              from urllib.request import Request
              from urllib.error import URLError
              from urllib.parse import urlencode
              from urllib.parse import quote_plus
          else:
              import urllib2
              from urllib import quote_plus
              from urllib2 import urlopen
              from urllib2 import Request
              from urllib2 import URLError
              from urllib import urlencode
          
          # 防止https证书校验不正确
          import ssl
          ssl._create_default_https_context = ssl._create_unverified_context
          
          API_KEY = 'VlCzAIKSYNgjfkhC8PRLPx0Z'
          
          SECRET_KEY = '0G9cNdtwmx0GxlaCMgjHtvGvWYlTLIMu'
          
          
          IMAGE_RECOGNIZE_URL = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish"
          
          
          """  TOKEN start """
          TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'
          
          
          """
              获取token
          """
          def fetch_token():
              params = {'grant_type': 'client_credentials',
                        'client_id': API_KEY,
                        'client_secret': SECRET_KEY}
              post_data = urlencode(params)
              if (IS_PY3):
                  post_data = post_data.encode('utf-8')
              req = Request(TOKEN_URL, post_data)
              try:
                  f = urlopen(req, timeout=5)
                  result_str = f.read()
              except URLError as err:
                  print(err)
              if (IS_PY3):
                  result_str = result_str.decode()
          
              result = json.loads(result_str)
          
              if ('access_token' in result.keys() and 'scope' in result.keys()):
                  if not 'brain_all_scope' in result['scope'].split(' '):
                      print ('please ensure has check the  ability')
                      exit()
                  return result['access_token']
              else:
                  print ('please overwrite the correct API_KEY and SECRET_KEY')
                  exit()
          
          """
              读取文件
          """
          def read_file(image_path):
              f = None
              try:
                  f = open(image_path, 'rb')
                  return f.read()
              except:
                  print('read image file fail')
                  return None
              finally:
                  if f:
                      f.close()
          
          """
              调用远程服务
          """
          def request(url, data):
              req = Request(url, data.encode('utf-8'))
              has_error = False
              try:
                  f = urlopen(req)
                  result_str = f.read()
                  if (IS_PY3):
                      result_str = result_str.decode()
                  return result_str
              except  URLError as err:
                  print(err)
          
          """
              调用菜品识别接口并打印结果
          """
          def print_result(filename, url):
              # 获取图片
              file_content = read_file(filename)
          
              response = request(url, urlencode(
                  {
                      'image': base64.b64encode(file_content),
                      'top_num': 1
                  }))
              result_json = json.loads(response)
          
              # 打印图片结果
              for data in result_json["result"]:
                  print(u"  菜品名称: " + data["name"])
                  if data[u'has_calorie']:
                      print(u"  菜品热量: " + data["calorie"])
          
          if __name__ == '__main__':
          
              # 获取access token
              token = fetch_token()
          
              # 拼接图像识别url
              url = IMAGE_RECOGNIZE_URL + "?access_token=" + token
          
              # 菜品图1
              print("菜品1")
              print_result("./food1.jpg", url)
          
              # 菜品图3
              print("菜品2")
              print_result("./food2.jpg", url)
          
              # 菜品图3
              print("菜品3")
              print_result("./food3.jpg", url)

          运行代码

          在命令行中运行python main.py

          结果

          若代码正确运行,命令行界面上会显示出运行结果:

          菜品1
            菜品名称: 白灼菜心
            菜品热量: 35
          菜品2
            菜品名称: 香酥鲫鱼
            菜品热量: 108
          菜品3
            菜品名称: 猪排
            菜品热量: 231

          百度的菜品识别不仅显示出了菜品名称,还将该菜品所含的热量提供给马主管的健身用户,为他们筛选菜品提供了很好的参考。

          菜品识别接口返回的数据还包括置信度,甚至还有百度百科数据链接等,服务接口的具体文档可以参考 图像识别REST API文档

          总结

          最终马主管很快就把百度的菜品识别能力集成到自己的健身app中,打造了一键识别菜品卡路里功能,该功能上线后受到健身瘦身会员的一致好评。这项功能不仅提供菜品名字、推荐热量,还有置信度、百度百科数据链接为他们筛选菜品提供了很好的参考,客户对菜品识别的效果非常满意。马主管在为客户提供良好的用户体验的同时,也大大降低了自己的开发成本。

          了解更多

          百度AI开放平台提供了丰富的图像识别服务,包括通用物体和场景识别、品牌logo识别、植物识别、动物识别、菜品识别、地标识别、果蔬识别、红酒识别、货币识别、图像主体检测等服务。

          图像识别REST API文档

          示例源代码

          您可以在我们的官方github上下载示例源码

          https://github.com/Baidu-AIP/QuickStart/tree/master/IMAGE_CLASSIFY

          产品特色

          图像识别服务可以精准识别超过十万种物体和场景,包含多项高精度的识图能力并提供相应的API服务,充分满足各类个人开发者和企业用户的业务需求。

          更多参考

          图像识别REST API文档

          下一篇
          API参考