纪录一下我小学期2天花了20小时写的菜品识别java程序。
1.2. 百度智能云简介
1.2.1 百度图像识别服务
百度图像识别服务,基于深度学习及大规模图像训练,准确识别图片中的物体类别、位置、置信度等综合信息。
1.2.2 菜品识别
支持识别5万种菜品,适用于识别只含有单个菜品的图片,接口返回菜品的名称、置信度、卡路里、百科信息等综合信息。支持自建菜品图库,适用于识别含有多个菜品的图片,接口返回菜品的名称、位置、相关性等综合信息。
1.2.3 菜品识别应用场景
根据拍摄照片,识别图片中菜品名称,获取菜品参考卡路里含量和百科信息,可结合识别结果进一步提供饮食推荐、健康管理方案等相关功能,增强用户体验,广泛应用于餐饮娱乐类和健康管理类APP中。根据拍摄照片,识别图片中菜品名称和位置,提高结算效率,减少人工录入成本,广泛应用于餐饮行业的智能结算中。
1.2.4 菜品识别接口介绍
接口能力:该请求用于菜品识别。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的菜品名称、卡路里信息、置信度。
请求格式:POST方式调用(Content-Type为application/x-www-form-urlencoded,然后通过urlencode格式化请求体)
返回格式:JSON格式
请求限制: 请求图片需经过base64编码:图片的base64编码指将一副图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。(图片的base64编码是不包含图片头的,如(data:image/jpg;base64), 请求格式支持:PNG、JPG、JPEG、BMP、GIF**,base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,长宽比3:1以内)
1.2.5 接口请求参数说明
参数 |
是否必选 |
类型 |
可选值范围 |
说明 |
image |
是 |
string |
- |
Base64编码字符串,以图片文件形式请求时必填。(支持图片格式:jpg,bmp,png,jpeg),图片大小不超过4M。最短边至少15px,最长边最大4096px。注意:图片需要base64编码、去掉编码头后再进行urlencode。 |
top_num |
否 |
unit32 |
- |
返回结果top n,默认5. |
filter_threshold |
是 |
float |
- |
默认0.95,可以通过该参数调节识别效果,降低非菜识别率. |
baike_num |
否 |
integer |
0 |
返回百科信息的结果数,默认不返回 |
1.2.6 接口返回参数说明
字段 |
是否必选 |
类型 |
说明 |
log_id |
是 |
uint64 |
唯一的log id,用于问题定位 |
result_num |
否 |
unit32 |
返回结果数目,及result数组中的元素个数 |
result |
否 |
array() |
菜品识别结果数组 |
+name |
否 |
string |
菜名,示例:鱼香肉丝 |
+calorie |
否 |
float |
卡路里,每100g的卡路里含量 |
+probability |
否 |
float |
识别结果中每一行的置信度值,0-1 |
+baike_info |
object |
否 |
对应识别结果的百科词条名称 |
++baike_url |
string |
否 |
对应识别结果百度百科页面链接 |
++image_url |
string |
否 |
对应识别结果百科图片链接 |
++description |
string |
否 |
对应识别结果百科内容描述 |
2 需求分析
2.1 程序简介
2.1.1 程序类型
本程序是用java编写的调用百度智能云平台图像识别接口的菜品识别软件。
2.1.2 程序使用方式
1.运行程序进入主页面,点击菜单栏的图像识别
图1-1 程序主界面
2.菜单栏展开
图1-2 主界面菜单栏
3.菜品图片识别
4.点击菜单栏的识别历史纪录,查看数据库中数据
图1-7 历史纪录显示
2.2 需求分析
2.2.1 程序数据流图
(1)图像识别功能实现数据流图2-1。
图2-1 图像识别功能实现数据流图
(2)程序操作流程图2-2。
图2-2 程序操作流程图据流图
2.2.2 程序功能需求
(1)图像识别
识别出用户提供的图片的菜名、卡路里、置信度、百科信息描述。
(2)历史纪录查询
显示识别过图像相关信息的历史纪录。
(3)数据库菜品信息检索
输入菜名查询出所查菜的相关信息。
3 程序设计
3.1 总体设计
程序分为3个大模块,分别是图像识别模块,历史纪录查询模块,数据库菜品信息检索,下图3-1是菜品识别程序的程序与模块的关系:
图3-1 菜品识别程序结构图
3.2 图像识别模块设计
设定返回菜品数据为两条,选择第一条的菜名、卡路里、置信度、百科信息和第二条的菜名。
左边4行2列的网格布局用来显示四条文本信息,右边的画布用来显示加载后的图像和百科信息。最底下为1行4列的网格布局,显示、退出按钮和拖拽提示标签和实现接受拖拽图片后显示图片路径的文本框。
点击显示会调用文件选择器。通过点击显示或者直接拖拽图片到文本框都可以通过获得图片的路径来获得图片的信息。
将图片信息通过图像识别接口用POST方式上传到百度智能云平台的图像识别服务得到JSON格式的字符串。将JSON格式的字符串利用阿里的fastjson库转换字符串,获得想要格式的信息存到控件中。
3.3 历史纪录模块设计
历史纪录模块界面的主容器采用3行1列的网格布局,第一行显示历史纪录标签,第二行用JtextArea控件来存放从数据库获取的指定列的信息,第三行添加显示和退出按钮。
3.4 数据库菜品信息检索模块
通过输入菜品名称对指定列在数据库中查询符和的行,并用JtextArea存放菜品的百科信息。
4 菜品识别程序实现
4.1 程序开发环境介绍
本程序使用的是Eclipse201906版本开发,语言使用的是Java,JDK版本为11。在Windows10平台上完成开发与测试。
4.2 图像识别模块实现
5 软件测试
5.1 图像识别测试
5.1.1 文件选择测试
点击图像识别页面的显示调用文件选择器:
图5-1 文件选择测试
5.1.2 图像拖拽测试
拖拽图像进文本框加载图像,并在文本框显示图像路径信息:
图5-2 拖拽加载图片测试
5.1.3 图像识别结果测试
拖拽图片至文本框或者点击显示调用文件选择器加载图片,上传图片信息,将返回结果显示在空间中
图5-3 图像识别结果测试
5.2 历史纪录显示测试
点击显示从数据中获取菜品识别的历史纪录
图5-4 历史纪录显示测试
5.3数据库菜品信息查询测试
输入菜品名称,点击查询,返回菜品相关信息。
图5-5 数据库菜品信息查询测试
参考文献
[1] 慕课教育研发中心.Java从入门到项目实践[M].北京:清华大学出版社,2018.
[2] 百度工程师.百度智能云文档-菜品识别[EB/OL]
.https://cloud.baidu.com/doc/IMAGERECOGNITION/s/Ajwvy2g51/,2019-06-28.
[3]liuyz60.JAVA图形界面,怎么让背景图片正好充满JFrame?[EB/OL]
. https://zhidao.baidu.com/question/1925865716690279987.html,2017-11-27.
[4]蒋固金.JAVA拖拽选择文件[EB/OL]
. https://blog.csdn.net/jianggujin/article/details/50569827,2016-01-23.
[5]阿朱__.从本地读取json文件 用alibaba--fastjson解析 jar包[EB/OL]
. https://blog.csdn.net/qq_41371858/article/details/84940854,2018-12-10.
[6]紫霜落枫.Java如何做出好看的本地文件选择器[EB/OL]
. https://zhidao.baidu.com/question/425294497293157012.html,2017-12-16.
[7]披Zhe羊皮De狼.Java中改变应用程序界面外观[EB/OL]. https://blog.csdn.net/u010995220/article/details/49847307,2015-11-15.
资源链接:https://download.csdn.net/my/uploads/1/1(待审核后更新)