紀錄一下我小學期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(待審核后更新)
