作者:曾成訓(CH.Tseng)
現實生活中除了單純以「物品數量」結帳外,還有其他情況是以「秤重」來計算價格的,也就是「重量乘上單位價格」,這類的場景像是水果攤、糖果鋪、自助餐、中藥行、菜市場等,在實際消費上比前者更為普遍。
如果有一台 POS 機,能夠識別物品並自動切換以重量或數量的方式來結帳,該有多方便啊!下方我們就來實作一台自動 POS 機,能夠辨識商品並依據商品種類來決定所採用的計價方式,像是西瓜用公斤,木瓜用台斤,雞蛋則用顆數來計算等。
所需材料只要一片普通的樹莓派,不需要任何貴鬆鬆的硬體加速器,大約三千元就能完工,對於不需要列印發票或連接後台 POS 系統的小商家、攤販可說是相當方便!
功能需求
- 自動辨識商品
- 秤重功能
各個商品可設定自己的秤重單位及單位價格(如公斤、台斤、公克)
- 連續物品的結帳功能(一位顧客會購買多樣商品,因此需一樣樣依次辨識秤重後再一起結帳)
- 不同類商品但單位重量價格若相同,可放在一起同時結帳
使用零件
- 樹莓派板子 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 部落格、原文連結;責任編輯:賴佩萱)
- 【模型訓練】訓練馬賽克消除器 - 2020/04/27
- 【AI模型訓練】真假分不清!訓練假臉產生器 - 2020/04/13
- 【AI防疫DIY】臉部辨識+口罩偵測+紅外線測溫 - 2020/03/23
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!