【人工智慧】自製萬能AI POS結帳機

作者:曾成訓(CH.Tseng)

現實生活中除了單純以「物品數量」結帳外,還有其他情況是以「秤重」來計算價格的,也就是「重量乘上單位價格」,這類的場景像是水果攤、糖果鋪、自助餐、中藥行、菜市場等,在實際消費上比前者更為普遍。

如果有一台 POS 機,能夠識別物品並自動切換以重量或數量的方式來結帳,該有多方便啊!下方我們就來實作一台自動 POS 機,能夠辨識商品並依據商品種類來決定所採用的計價方式,像是西瓜用公斤,木瓜用台斤,雞蛋則用顆數來計算等。

所需材料只要一片普通的樹莓派,不需要任何貴鬆鬆的硬體加速器,大約三千元就能完工,對於不需要列印發票或連接後台 POS 系統的小商家、攤販可說是相當方便!

功能需求

  1. 自動辨識商品
  2. 秤重功能

各個商品可設定自己的秤重單位及單位價格(如公斤、台斤、公克)

  1. 連續物品的結帳功能(一位顧客會購買多樣商品,因此需一樣樣依次辨識秤重後再一起結帳)
  2. 不同類商品但單位重量價格若相同,可放在一起同時結帳

使用零件

  • 樹莓派板子 x1 (約台幣 1,300~1,500)

(圖片來源:曾成訓提供)

其實使用樹莓派 3B+ 即可,辨識秤重約 3 秒可完成,但當然如果能使用 4 版當然會更好,使用者體驗會更佳!

  • 樹莓派 7” 官方螢幕(含觸控) x1 (約台幣 2,500~3,000)

(圖片來源:曾成訓提供)

您也可以使用其它種類的螢幕(只是後面我所附的 3D 列印外殼可能就不適用了),另外程式中的互動方式我是以觸控方式來設計,因此有觸控功能會比較方便。

  • HX711 模組+5 kg 壓力感測器 x1 (約台幣 190~300)

(圖片來源:曾成訓提供)

這類的壓力感測器是將應變片貼附在鋼或鋁的柱狀體上,主要是透過感應這個柱狀體上微小的變化來探知物體的重量:另外,HX711 為 24 位元的 A/D 轉換器,由於其感應的數值很小,需透過 HX711 模組來放大。

  • Web Camera x1 (約台幣 250~850)

(圖片來源:曾成訓提供)

相機部份這邊使用的是 C310(只要是標準的 USB WebCam 都可以使用),而由於 YOLO V3-Tiny 模型的圖片尺寸需求為 416×416,因此使用一般最便宜的 VGA 解析度即可。

 3D 列印外殼

外殼設計如下,分別為主體秤重盤,可一體化樹莓派和秤重模組等零件;這邊是以白色來列印,不過由於螢幕為黑色,因此模型顏色使用黑色其實會更適合。

(圖片來源:曾成訓提供)

(圖片來源:曾成訓提供)

組裝及接線

由於零件不多,因此組裝相當容易,基本上就是把秤重模組放入圓形凹槽、樹莓派含螢幕倒扣置於方形凹槽即可。

(圖片來源:Raspberry Pi Tutorials

HX711 模組與樹莓派的接法如下:

  • VCC 🡪 5V
  • GND 🡪 接地
  • DT 🡪 Pin 29(GPIO 5)
  • SCK 🡪 Pin 31(GPIO 6)

(圖片來源:曾成訓提供)

組裝後應該像這樣子:

(圖片來源:曾成訓提供)

程式設計

  • 使用者動作流程:同一位顧客的多個商品,可使用結帳按鈕來累積其金額:清空按鈕則可清除目前的購物車,開始下一位客人的結帳。

(圖片來源:曾成訓提供)

  • 秤重模組程式 :HX711 在網路上有現成的 python module 可直接使用,我參考的是這個,有稍加修改後再整合到程式中;這個程式每次執行時,會先偵測目前的重量,以其作為基準(代表重量為零),所以一開始執行程式時記得不要放任何東西在秤盤上。

程式及參數檔說明

程式在這邊,如果您使用的零件皆相同,基本上只要修改設定檔 pos.ini 的內容,並改成您自己訓練好的模型即可。

各項參數說明如下:

[products]
#格式為 Label ID: [品名, 單價(每重量單位或每個), 計價單位]
#計價單位 --> twkg:台斤, kg:公斤, gram:公克, one:一個
labels_tw = {"v1":["橘子", 42, "twkg"], "v2":["雞蛋", 10, "one"], "v3":["綠辣椒", 18, "twkg"], "v4":["玉米荀", 0.25, "gram"],\
    "v5":["小蕃茄", 12, "twkg"], "v6":["棗子", 30, "one"], "v7":["哈密瓜", 65, "kg"], "v8":["蘋果", 25, "one"], \
    "v20": ["紅蘿蔔", 8, "twkg"], "v22":["牛奶芭樂", 20, "one"], "v23":["帶殼玉米荀", 0.15, "gram"] }

[camera]
cam_id = 0
#(H, V) 是否水平或垂直翻轉畫面
flipFrame = (False,False)  
#是否將過程錄製成影片
record_video = True  
#影片檔名
video_out = output.avi   
#每秒幀數
frame_rate = 2   
[desktop]
#背景圖片的路徑檔名
bg = images/bg.jpg  
#(y,x) 購物車的顯示尺寸
cart_list_size = (350,250)  
#僅僅顯示用, 偵測種類
detection_txt = 蔬菜

[operation]
#TW, EN
lang = tw
#seconds 商品結帳的結果, 要顯示幾秒
wait_for_next = 3

[yoloModel]
# yolov3-tiny, yolov3 可選擇YOLO-Tiny或YOLOV3版本
modeltype = yolov3-tiny
objnames = model/obj.names
weights = model/yolov3-tiny_81000.weights
cfg = model/yolov3-tiny.cfg

[system]
#是否切換到全螢幕來執行
full_screen = True
name_win = AI_POS

小結

影片中,不同種類的物品可設定專屬的秤重單位(公斤、公克、台斤),或換成以數量計價;影片中商品的辨識時間約為 4 秒,如果想要更快的速度,可將樹莓派 3 替換成第四代,或者加上 NCS 加速棒甚至改用 Jetson Nano,相信能得到更好的辨識效率。

(本文經作者同意轉載自 CH.TSENG 部落格原文連結;責任編輯:賴佩萱)

曾 成訓

Author: 曾 成訓

人到中年就像沒對準的描圖紙,一點一點的錯開,我只能當個Maker來使它復位。

Share This Post On
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x