陶杰,陳啟源,朱恒通
(蘇州農業職業技術學院,江蘇蘇州,215008)
太湖莼菜是多年生水生植物,為蘇州地方“水八仙”之一。口感鮮美,營養豐富,為珍貴蔬菜。莼菜在高溫期間生長快,進入盛采期。因其長在水中,覆蓋膠質,柔嫩易滑,需要采摘者技術熟練,眼明手快,蘇州東山當地有“捉莼菜”的說法[1]。采摘工人要經受高溫日曬、雙手終日泡在水中的辛苦。熟練采摘工缺乏,來不及采摘的莼菜只能老去不能食用。目前莼菜種植面積日益萎縮,迫切需要智能化采摘設備跟進。
本文以蘇州東湖莼菜廠的莼菜種植試驗槽作為載體,以試驗槽內5 月~9 月生長的莼菜作為識別對象,采用深度學習技術確定圖像檢測模型,實現莼菜智能化識別,設計適用的檢測定位裝置,為后期的莼菜采摘設備研制提供基礎實驗。
測試系統主要包括載有水下攝像頭的橫向行走機構、豎向調整機構,可以沿種植槽移動,并上下調整攝像頭位置。如圖1 所示,水下攝像頭通過10m 數據線連接到Andriod平板,實時識別檢測到莼菜的位置后,將圖片中最大目標的識別框坐標及寬、高參數,通過WiFi 發送到運動控制終端,運動控制終端驅動縱向、橫向步進電機,帶動縱向絲桿末端的攝像頭在一定行程內移動,使得檢測出的識別框位于圖片正中位置。

圖1 檢測系統組成示意圖
運動控制終端采用Arduino,連接串口轉WiFi 模ESP8266,步進驅動FYQM302,其中縱向電機采用型號FY42EC220 絲桿電機,步距角為1.8°,絲桿直徑8mm,導程4mm,保持力矩達到0.65Nm,絲桿行程400mm,并配置上限位開關KW12,作為絲桿零點位置。控制器接線如圖2 所示,圖中只標注了縱向電機驅動器的連線,橫向電機驅動器接線類似。串口TXD、RXD 分別連接ESP8266 的R、T 引腳[2],實現串口連接。D5 作為輸入引腳,連接行程開關一端,其另一端接地,由軟件初始化設置其內部為上拉電阻;D8、D9、D10 作為輸出引腳,分別接步進驅動器使能、方向、脈沖控制端。

圖2 運動控制終端控制器接線示意
運動控制終端,主要根據接收的WiFi 指令,完成兩類運動控制。一是根據識別框坐標,自動調整,使得最大識別對象移動至圖片中央位置;二是根據平板界面上的手動調整指令,橫向移動、縱向移動。為保證通信正確,制定較完整的上層協議。上層數據幀格式規定如圖3 所示。

圖3
其中,起始符、結束符分別為02H、03H,各占1 字節;控制碼對應各任務類型(如01H 表示自動運行情況、02H 表示手動橫向運行啟動、12H 表示手動橫向運行停止;03H 表示手動縱向運行啟動,13H 表示手動橫向運行停止);數據域D 占用兩個字節,在自動運行時,分別表示橫向、縱向移動距離,在手動運行時,數據域首字節以0x00 填充,末字節表示運動方向,0x00 為正向,0x01 為反向。和校驗CS 占1 字節,取其前3 字節之和的低字節值。
控制程序包括一個主控輪詢程序,和一個定時中斷子程序。控制器的主流程圖如圖4 所示,初始化時,兩個電機均反轉至限位開關觸發,判定零點,依此計算出最大行程,在后續電機運動子程序中判斷行程是否超限。設置串口的串口數據格式為8 位數據位、1 位停止位、1 位偶校驗位,波特率設為115200。通過串口類庫函數available(),判斷串口2 緩沖是否有新的接收數據。如有對接收數據,校驗合格后分析上層數據幀。根據指令碼分析電機是自動運行或手動運行,由自動運行子程序根據執行步數計算電機的當前起停狀況,手動運行子程序控制當前電機的起停狀況。

圖4 運動控制終端主流程圖
定時中斷子程序控制兩個電機的脈沖輸出狀況,采用第三方庫TimeAlarms 實現定時,由Alarm.timerRepeat()指令設定定時時間和中斷回調函數[3]。中斷子程序根據主程序中設定的情況,即時控制PWM和方向引腳上的電平狀態。
在蘇州東山莼菜基地,采用桑巴達 Y102 水下攝像頭收集種植槽內莼菜圖片1000 余張,種植槽水深0.75m,圖片采集位置位于水下0.1m 至0.6m,采集時間為夏季上午9:00 至下午16:00 光線較強時間段。圖片經過篩選,標注識別對象,選擇形態較好的、商品標準級別較高的、橫向或縱向尺寸大于圖片一半的莼菜進行標注識別對象,同一圖片中若有多個符合要求的識別對象,選擇尺寸最大的三個對象標注,多個標注可以部分重疊。并經過旋轉、對稱翻轉等方法進行數據加強,最后選取1500 張圖片,形成PaddlPaddle標準數據集。圖片及識別對象標注框如圖5所示。

圖5 莼菜水下圖像標注
由飛槳BML 全功能AI 開發平臺訓練,采用Python3.7,開發框架為paddlepaddle-v2.3.0,采用PPYOLO 算法,圖片尺寸Inputsize 為320×320[4]。在建議閾值0.7 時,訓練模型的評估指標F1-score 值識別準確率最大,F1-score=2*(P*R)/(P+R)。如圖6 所示,訓練模型的F1-score 值與閾值關系訓練后的mMAP 98.8%,精確率P=99.0%,召回率R=98.5%,滿足種植槽水下環境的一般檢測需要。

圖6 不同閾值下的F1-score 值
就莼菜采摘任務而言,莼菜不需要完全采干凈,適當保留嫩葉有助于莼菜生長,采摘過程中盡量不要采錯,以減少后期挑揀任務。所以提高閾值,模型中閾值可設置為0.9。
通過Paddle Lite 離線轉換工具,將Paddle 檢測模型優化為適合的Paddle Lite模型,Paddle Lite 是一種輕量級、靈活性強、易于擴展的高性能的深度學習預測框架,支持諸如 ARM 等多種終端,具有圖優化及預測加速能力[5]。本項目在paddle 提供的檢測案例程序更新檢測模型,實現檢測功能。為后續的案例模型替換方便,使用平臺提供的opt 工具,優化后的模型文件名設置為model.nb,與案例中原模型同名。
在Andriod Studio 中配置最新版本的NDK 和CMake,下 載Paddle Lite 預測庫 和模型案例,在Andriod Studio 中打開,編譯并安裝案例APP,測試案例的圖片識別和標注。成功后,進行檢測案例內容替換更改,主要是識別模型和參數更改;編寫需要新增的操控程序。
從github.com/PaddlePaddle/Paddle-Lite 平臺上下載檢測案例。在Andriod Studio 中打開,參照平 臺教程,根 據Android demo 示例的代碼結構提示,將優化后的檢測模型在原案例路徑下以相同名字替換,以及對應的識別模型標簽文件。本項目中訓練模型中檢測對象只有莼菜這一類,還需要更改輸出案例中的 tensor 個數、更新輸出 shape。
在識別函數Detector::Postprocess(std::vector
根據操控要求,更改主界面設計,增加手動、自動切換開關,以及手動控制的點動按鈕,包括上、下、左、右方向,編寫對應的切換狀態及點動狀態設置程序;另外需要根據增加檢測控制程序,實現根據操作狀態和檢測結果、發送對應的運動指令的功能,程序流程圖如圖7 所示。

圖7 平板主界面程序主流程圖
初始化加載界面,設置WiFi連接參數,連接水下攝像頭。自動狀態下通過攝像頭視頻進行圖像檢測后,如果圖片有超過1 個檢測結果,實時讀取目標框坐標的x、y、w、h 參數,通過w*h 計算,可以判斷選取出最大目標框作為運動控制目標,根據識別框參數,換算出識別框的中心位置坐標后,計算出目標框中心點坐標與圖片中心坐標的差值,即可計算距離中心點的橫向、縱向距離;通過WiFi 發送自動指令,輸出兩個方向的運動行程,運動控制終端調整。設計實時誤差值在10 個點像素內,即為到達目標點。如果控制終端上電機絲杠到行程極限,停止運行并發送報警。在手動狀態下,根據主界面上的四個點動按鈕的交互狀態,選擇步進電機的縱向、橫向點動方向,通過WiFi 發送點動控制指令,由運動控制終端默認點動行程距離運行。如電機絲桿達到行程極限,同樣會停止運行并發送報警。終端界面在接收到報警顯示自動、手動的報警信息。
經過Andriod 編程調試,先在平板上測試圖片檢測,并校驗電機運轉,調整限位開關位置,確保電機運行可靠,超過最大行程停止并報警。之后在種植槽上進行試驗,每次自動檢測后,手動復位電機絲桿。轉移裝置到新檢測位置后,再次自動測試。自動運行中,可以進行多次檢測目標,當檢測完成檢測框顯示居中后,可以手動巡視,出現新目標后,再次切換到自動狀態,由裝置自動進行新的居中運動。現場測試效果如圖8 所示。左圖是自動檢測定位前識別圖,右圖是攝像頭自動居中移位效果。

圖8 檢測定位對比效果圖
實際試驗過程中,絲桿運動帶來水流擾動,導致圖片采集有干擾,降低電機運轉速度,可以減少水流干擾,相對較好地完成預期目標,實現行程范圍內的攝像頭居中定位,為后續的采摘方案提供試驗參考基礎。由于系統尚未設計調速功能,只可以借助驅動器的細分開關,設置細分狀態手動調整運動速度。后續需要在控制界面增加速度調整交互功能,運動控制終端調速程序,并進一步深化研究,根據圖像拍攝及檢測狀況,實現自動調整速度的功能。