DIY 一台萬能的AI POS結帳機

現實生活中除了單純以物品數量來結帳,還有更多的情況是以秤重來計算價格,也就是重量乘上單位價格,例如水果攤、糖果鋪、自助餐、中藥行、菜市場….等等,而且在生活消費上這類以重量計價的case比起單純計數還要更為普遍。

「自助餐 秤重」的圖片搜尋結果

因此如果有一台POS機,能夠識別物品並自動切換以重量或數量的方式來結帳,那有多方便啊!下方我們就來實作一台自動POS機,能夠辨識商品並依據商品種類來自動決定採用的計價方式,例如西瓜用公斤,木瓜用台斤,雞蛋則用顆數來計算等等。只要一片普通的樹莓派,不需要任何貴鬆鬆的硬體加速器,所以大約三張千元台幣就能做出這台實用的自動結帳機,對於不需列印發票或連接後台POS系統的小商家、攤販相當方便哦。

功能需求

  1. 自動辨識商品
  2. 秤重功能
  3. 各個商品可設定自己的秤重單位及單位價格。(如公斤、台斤、公克)
  4. 連續物品的結帳功能(一位顧客會購買多樣商品,因此,須一樣樣的依次辨識秤重後再一起結帳)
  5. 不同類商品但單位重量價格若相同,亦可放在一起同時結帳。

使用零件

  1. 樹莓派板子 x1 ….. 約NTD $1,300~$1,500
「樹莓派3B+」的圖片搜尋結果

樹莓派3B+即可,辨識秤重約3秒便可完成。

當然若能使用4版當然會更好,使用者體驗會更佳。

  1. 樹莓派7”官方螢幕(含觸控) x1 ….. 約NTD $2,500~$3,000

您也可以使用其它種類的螢幕,只是後面我所附的3D列印外殼可能就不適用了。

另外,程式中的互動方式我是以觸控方式來設計,因此有觸控功能會比較方便。

  1. HX711模組+5kg壓力感測器 x1 ….. 約NTD $190~$300
【睿康創意】HX711模組+5kg壓力感測器套裝 稱重感測器 電子秤模組

這類的壓力感測器是將應變片貼附在鋼或鋁的柱狀體上,透過感應這柱狀體微小的變化來探知物體的重量。

HX711為24位元的A/D轉換器,由於感應的數值很小,因此,需透過HX711模組來放大。

  1. Web Camera x1 ….. 約 NTD $250~$850
羅技 HD 網路攝影機 C310 HD視訊通話 線上通訊 高品質視訊通話 - 限時優惠好康折扣

相機部份我使用的是C310,只要是標準的USB WebCam應該都可以。

因為YOLOV3-Tiny模型的圖片需求尺寸為416×416,因此一般最便宜的VGA解析度的即可。

使用3D列印外殼

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

3D模型下載

case: https://github.com/ch-tseng/weight_pos_v1/raw/master/3d_print/POS_case.stl

dish: https://github.com/ch-tseng/weight_pos_v1/raw/master/3d_print/POS_dish.stl

組裝及接線

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

HX711模組與樹莓的接法如下:(圖片來源: https://tutorials-raspberrypi.com/digital-raspberry-pi-scale-weight-sensor-hx711/)

        VCC        🡪 5V

        GND 🡪 接地

DT  🡪 Pin 29 (GPIO 5)

        SCK 🡪 Pin 31 (GPIO 6)

Raspberry Pi HX711 Steckplatine

組裝後應該像這樣子:

D:\temp\IMG_7767.jpg

程式設計

  1. 使用者動作流程:

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

  1. 秤重模組程式 :HX711網路上有現成的python module可直接使用,我參考的是https://github.com/tatobari/hx711py 稍加修改後整合到程式中。該程式在每次執行時,會先偵測目前重量作為base代表重量為零,故一開始執行程式時勿放置東西於秤盤上。

程式及參數檔說明

程式放置於https://github.com/ch-tseng/weight_pos_v1.git,如果您使用的零件皆相同,棊本上只要修改設定檔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,便能得到更好的辨識效率。