高芳征,湯文俊,陳光明,黃家才
(1. 南京工程學院自動化學院,南京市,211167; 2. 南京農業大學,南京市,210031;3. 江蘇省智能化農業裝備重點實驗室,南京市,210031)
隨著科技發展的不斷進步,機器人具備了高級認知水平,并在農產品生產的不同階段發揮重要作用,如在農作物生長階段的病蟲害識別與農藥噴灑、在成熟階段的果實識別與采摘等[1]。作為農業采摘機器人的重要組成部分,機器視覺系統的自主識別是實現采摘自動化的關鍵步驟,其檢測速度、準確率以及魯棒性是制約采摘機器人工作穩定性和效率的重要因素[2-3]。因此,開展農業采摘機器人在復雜環境下的快速識別算法研究,實現采摘目標的穩定、快速、準確檢測滿足農業生產需求,對農業現代化和自動化發展具有重要應用價值和現實意義[4]。
目前國內外在農產品檢測方面的研究已經取得一定的進展。Hamuda等[5]通過添加由卡爾曼濾波和匈牙利算法組成的目標跟蹤算法,擴展了基于顏色、空間和形狀分析的組合檢測算法,提高識別農作物的準確度。但其研究主要是面向無套種作物情況,圖像背景為相對簡單的土壤環境,使得該方法不適用于存在遮擋密集分布的農產品檢測。Linker等[6]提出了一種自然光照下的蘋果檢測方法,它利用顏色和平滑度檢測出一組概率較高的蘋果像素,形成一個“種子區域”,然后根據“種子面積”和蘋果模型之間的符合比來確定該區域是否包含一個蘋果。該方法雖然可以有效地檢測出包含蘋果的區域,但在蘋果分布密集、重疊較大的情況下會產生較大的誤差。特別需要指出的是,這些算法都是針對特定場景的基于傳統圖像處理的目標檢測方法研究,存在環境依賴性強、魯棒性差的缺點,無法滿足復雜場景下的農業采摘機器人工作需求。
另一方面,隨著深度學習算法的發展與成熟,基于深度學習的目標檢測方法已成為當下研究的熱點[7]。目前主流的深度學習目標檢測算法主要有兩種:一種是基于Regional proposal(區域建議)的Two-stage(雙階段)方法,它需要先產生目標候選框(即目標位置),然后對候選框做分類與回歸,其代表算法為包括Fast-RCNN[8]和Faster-RCNN[9]等的RCNN(Region-CNN,區域卷積神經網絡)系列算法。另一種是無區域建議的One-stage(單階段)方法,它主要通過使用一個CNN直接預測不同目標的類別與位置,其代表算法有YOLO系列算法[10]和SSD算法[11]。與Two-stage方法相比,One-stage在檢測速度優勢明顯。研究表明,畫面達到24幀每秒的速度,人眼可認為是連續的,而YOLO算法可實現每秒45幀以上的運算速度,滿足農業采摘機器人工作的實時性要求[12]。
因此研究基于YOLO的農產品識別算法對農業采摘機器人快速高效作業具有重要意義。
近年,針對光照波動、復雜背景、果實和枝葉重疊等不同環境下的蘋果檢測需求,Tian等[13]提出一種改進的YOLOv3模型并應用于實際環境的果園檢測。趙德安等[14]為提高蘋果采摘機器人的工作效率和環境適應性,使其能全天候不同光線環境下對遮擋、粘連和套袋等多種情況下的果實進行識別定位,提出了基于YOLOv3深度卷積神經網絡的蘋果定位方法,在保證效率與準確率的情況下實現復雜環境下蘋果的檢測。劉芳等[15]為實現溫室環境下農業采摘機器人對番茄果實的快速、精確識別,提出一種改進型多尺度YOLO算法(IMS-YOLO),對YOLO網絡模型進行篩選和改進,設計一種含有殘差模塊的darknet-20主干網絡,同時融合多尺度檢測模塊,構建一種復雜環境下番茄果實快速識別網絡模型,提升番茄果實檢測速度和精度。薛月菊等[16]針對果園場景下,由于光照的多樣性、背景的復雜性及芒果與樹葉顏色的高度相似性,特別是樹葉和枝干對果實遮擋及果實重疊等問題,提出果園場景下未成熟芒果的改進YOLOv2檢測方法,通過設計新的帶密集連接的Tiny-yolo網絡結構,實現網絡多層特征的復用和融合,提高檢測精度。
受上述文獻啟發,針對應用于西紅柿采摘機器人上的成熟果實識別算法需要滿足高準確性和強魯棒性這一實際需求,本文基于經典的YOLOv3目標檢測算法模型進行輕量化改進,并對激活函數、錨框的聚類、非極大值抑制和損失函數進行優化,在不影響檢測準確度的情況下,使神經網絡模型能夠更方便地部署到西紅柿采摘機器人的嵌入式控制器上。
在使用卷積神經網絡提取圖像特征時,增加網絡深度雖然在一定程度上會提高目標檢測準確度,但參數的增多也意味著檢測時間的增加。主流特征提取網絡有AlexNet[17]、VGGNet[18-19]和ResNet[20]等。在AlexNet網絡中,增加了Relu非線性激活函數,增強了模型的非線性表達能力,提出了通過數據增強來提高模型的泛化能力,還增加了Dropout層防止過擬合,證明了使用很小的卷積核(3×3)并增加網絡的深度可以有效提升模型的效果。3個3×3卷積層堆疊可以擁有與7×7卷積核同樣大小的感受野,但參數量卻小得多,大大縮短了計算時間,并且小的卷積層比大的有更多的非線性變換,使得卷積神經網絡對特征的學習能力更強。這些貢獻都為后來的VGGNet等特征提取網絡研究提供了借鑒。隨著網絡越深,獲取的信息越多,特征也越豐富,但實驗表明優化效果反而越差,這是由于網絡的加深會造成梯度爆炸和梯度消失的問題[21]。為了讓更深的網絡也能訓練出很好的效果,He等[22]提出一種新的網絡結構—ResNet,采用殘差學習的思想,在普通的卷積過程中加入了一個恒等映射,將輸入直接連接到后面的層,這種結構也被稱為shortcut(短接)或者skip connections(跳躍連接)。與VGG相比,其參數量少得多,因為ResNet采用平均池化層來代替VGG中的全連接層,其通過學習殘差映射,緩解了梯度消失的問題,且訓練效率更高。此后的圖像分類、檢測與分割等任務也大規模使用ResNet網絡作為特征提取網絡[23]。
YOLOv3的主干特征提取網絡Darknet53正是借鑒了ResNet網絡結構的思想,并且去掉了最后的平均池化層(Average pooling layer)、全連接層(Full connection layer)以及Softmax,僅使用一個1×1的卷積核來檢測目標特征。本文鑒于提取西紅柿成熟果實特征較為單一,為了簡化網絡結構,減少計算資源的占用,在Darknet-53 backbone(主干網絡)基礎上進行輕量化改進,在不影響特征提取準確性的前提下,提高檢測識別算法運行的效率。改進前與改進后的主干網絡對比如圖1所示。
(a) 改進前網絡結構 (b) 改進后網絡結構
基于輕量化改進后的特征提取主干網絡,通過上采樣構建特征金字塔,實現多尺度特征融合,得到三種不同尺度的特征圖,如圖2所示。輸入圖像尺寸為416×416,多尺度特征融合網絡的特征圖尺寸分別為52×52、26×26和13×13。輕量化網絡在模型大小和檢測速度上具有優勢,適合應用在計算性能有限的嵌入式設備上。
圖2 多尺度特征圖網絡結構
常用的ReLU激活函數是將所有的負值都設為0,而YOLOv3中采用的Leaky ReLU激活函數則是給所有負值都賦予一個非零斜率,對小于0的輸入部分的反應有所變化,減輕了ReLU的稀疏性,有效緩解ReLU導致神經元死亡的問題。Leaky ReLU激活函數的公式如式(1)所示。
(1)
式中:ai——斜率;
xi——輸入。
由于Leaky ReLU有了負數的輸出,導致其非線性程度不強,Mish激活函數公式如式(2)所示。
Mish=x×tanh(ln(1+ex))
(2)
Mish激活函數與Leaky ReLU激活函數的曲線對比如圖3所示。
(a) Leaky ReLU激活函數曲線圖
Mish激活函數是一種自正則的非單調神經激活函數。從圖3中可以看出,相比于Leaky ReLU激活函數,Mish激活函數平滑的曲線允許更好的信息深入神經網絡,從而得到更好的準確性和泛化性。
YOLOv3采用K-means聚類方法,基于VOC2012數據集的20類目標生成9個錨框(anchor boxes)來預測bounding box(預測框),準確率為67.2%。由于VOC數據集的檢測目標尺度差距過大,如果直接將上述九個錨框(用yolo-anchors來表示)用于西紅柿數據集的訓練,其中部分anchor的尺度并不合理。所以本文基于自己采集并標注的數據集來聚類用于西紅柿成熟果實檢測的錨框(用tomato-anchors來表示),目的是提高bounding box的檢出率。在本文標注好的數據集上使用K-means聚類可視化如圖4所示。
圖4 K-means聚類可視化圖
yolo-anchors的九個錨框的尺度分別為(10,13)、(16,30)、(33,23)、(30,61)、(62,45)、(59,119)、(116,90)、(156,198)和(373,326),在本文西紅柿果實數據集中經過聚類算法之后的九個錨框tomato-anchors,尺度分別為(53,55)、(87,85)、(97,136)、(115,108)、(122,75)、(137,136)、(169,161)、(203,210)和(283,290)。yolo-anchors和tomato-anchors的對比如圖5所示。
(a) yolo-anchors
從圖5中可以看出,tomato-anchors的尺度比yolo-anchors更接近于西紅柿果實的真實尺度。經過聚類之后,tomato-anchors的準確率為82.63%,相比于yolo-anchors的67.2%,提高了15.43%,即試驗結果證明了本文所提重新聚類錨框的方法的必要性和有效性。
YOLOv3中的IoU(Intersection over Union, 交并比)是衡量預測框和真實框的重合程度。計算IoU的目的主要用于NMS(非極大值抑制),因為預測框并非全部正確,因此需要將置信度大于設定閾值(一般為0.5)的預測框提取出來。IoU計算公式如式(3)所示。
(3)
式中:S∩——預測框與真實框的交集;
S∪——預測框與真實框的并集。
本文采用CIoU代替IoU,將目標與錨框之間的重疊率、尺度、距離以及懲罰項(預測框長寬比擬合目標框的長寬比)都考慮進去,使得目標框回歸變得更加穩定,不會出現訓練過程中發散的問題。CIoU的計算公式如式(4)所示。
(4)
式中:p2(b,bgt)——預測框和真實框的中心點的歐式距離;
b——bounding box(預測框);
bgt——ground truth(真實框);
c——能夠同時包含預測框和真實框的最小閉包區域的對角線距離。
α是權重函數,ν是度量寬高比的一致性,其計算公式如式(5)、式(6)所示。
(5)
(6)
式中:wgt——真實框的寬;
hgt——真實框的高;
w——預測框的寬;
h——預測框的高。
YOLOv3的loss(損失函數)計算公式如式(7)所示。損失函數由三部分組成,分別是邊界框損失lxy+lwh、類別損失lclasses以及置信度損失lconfidence,誤差計算均采用了均方差算法。
loss=lxy+lwh+lclasses+lconfidence
(7)
式中:λcoord——平衡各項損失的比重而設定的權重參數,為5;
λnoobj——平衡各項損失的比重而設定的權重參數,為0.5;
s——網格單元;
B——邊界框;
obj——含有目標;
noobj——不含目標;
真實框的中心坐標寬高;
預測框的中心坐標和寬高。
為了使損失函數的計算更加精確,本文改進類別損失函數,使用交叉熵算法來計算分類誤差,改進后的類別損失函數如式(8)所示。
(8)
將改進后的lclasses替換掉原來的類別損失函數,即可得到改進后的損失函數。
西紅柿成熟果實快速識別模型的訓練流程見圖6。
圖6 西紅柿果實快速識別模型訓練流程
原始西紅柿圖像經過數據預處理,包括不同程度的飽和度、曝光度和色調處理,不同程度的旋轉、翻轉和鏡像處理,目的是增加樣本的多樣性,最終生成訓練集和驗證集。之后將圖像喂給卷積神經網絡來提取特征,吐出西紅柿的目標檢測框,包含類別與置信度。通過不斷迭代訓練使損失函數最小,不斷優化參數,最終得到西紅柿成熟果實快速識別模型。具體算法流程如圖7所示。
圖7 訓練階段和檢測階段具體算法流程圖
本文的訓練平臺主要配置為:AMD R5 CPU@3.00GHz、4GB獨顯GTX1650 GPU和16GB的運行內存。所有程序由Python語言編寫,調用CUDA、CUDNN、OpenCV庫并在Win10系統下運行。訓練超參數設置如下:動量(Momentum)設置為0.9,權值衰減(Decay)設置為0.000 5,飽和度(Saturation)和曝光度(Exposure)都設置為1.5,初始學習率(Learning Rate)設置為0.001。
圖像采集通過奧比中光(ORBBEC)Astro Pro 3D結構光深度相機完成。該相機在1 m內的像素精度可達±3 mm,分辨率/幀率為640×480/30 fps。
本文的西紅柿成熟果實檢測在西紅柿采摘機器人平臺上進行。其上搭載了NVIDIA Jetson Nano嵌入式控制器,主要配置為:四核ARM A57 CPU@1.43 GHz和4GB顯存的128核Maxwell GPU@921 MHz。嵌入式控制器上安裝了Ubuntu Linux操作系統。
本文中數據集的來源主要有:農業園實地拍攝、網絡爬取和開源數據集。為增加樣本多樣性,降低模型過擬合的概率,采集的數據集樣本中包含西紅柿果實數量、密集程度以及遮擋程度不同的情況,還包含暗光、側光、順光和逆光的情況,共1 000幅圖像。在采集到足夠的樣本之后,需要對圖像做人工標注,使用開源圖像標注工具labelImg,采用PASCAL VOC的圖像數據標注格式,將西紅柿的最小外接矩形框作為ground truth,以獲取準確的數據參數,包括西紅柿目標框的標簽、左上角坐標、寬和高,每一幅圖像的數據參數保存在對應的XML文件中。西紅柿成熟果實數據集部分代表性樣本如圖8所示。
圖8 西紅柿成熟果實數據集部分代表性樣本
果園中的西紅柿在不同光照強度下的顏色差異較大,為了改善樣本分布不均衡的情況,采用不同的飽和度、曝光度和色調對圖像進行隨機處理來豐富數據集,還采用水平翻轉和正負15°旋轉,以及灰度處理、濾波處理、模糊處理等方法來擴充數據集,部分標志性樣本如圖9所示。最終將樣本圖像增加至2 000幅,其中訓練集80%,驗證集10%,測試集10%。
圖9 數據預處理后部分代表性樣本
為了驗證本文算法模型輕量化改進的有效性,計算輕量化改進前后模型各層網絡參數量,如表1和表2所示。其中n表示該層網絡模塊重復使用的次數,params表示該層網絡模塊的參數量,module表示該層網絡模塊的名稱。由表1和表2可知,改進前參數總量為32 124 643,輕量化改進之后參數總量為25 137 856,下降約21.75%,實現了對YOLOv3的輕量化改進,更適合在硬件條件和運算能力有限的嵌入式平臺使用。
表1 輕量化改進前模型的參數量Tab. 1 Parameter number of model before lightweight improvement
表2 輕量化改進后模型的參數量Tab. 2 Parameter number of model after lightweight improvement
本文使用開源人工神經網絡庫Keras進行深度學習模型的搭建、訓練與評估,訓練誤差曲線可以監測損失函數的變化趨勢,判斷模型訓練的程度。對訓練集和驗證集進行約100次迭代訓練后,使用可視化工具TensorBoard查看誤差曲線,如圖10所示。
圖10 訓練誤差曲線
圖10中橙色曲線代表訓練集的誤差曲線,藍色曲線代表驗證集的誤差曲線??梢钥闯?前5次迭代網絡快速收斂,10次迭代后損失函數趨于穩定,在訓練到12輪之后,loss降到了30以下,之后一直趨于平穩。
在訓練完成之后,需要對模型的性能進行評估。本文選用的模型性能評價指標主要包括準確率(Precision)、召回率(Recall)、F1評分、平均檢測精度mAP。
將置信度大于閾值的預測框定義為正樣本,反之則為負樣本。將正樣本中與ground truth的交并比(CIoU)大于閾值的樣本視為TP(True Positives),反之視為FP(False Positives),負樣本中存在實際為正樣本的視為FN(False Negatives)。準確率和召回率計算公式如式(9)、式(10)所示。
(9)
(10)
式中:P——準確率,分類器認為是正類并且確實是正類的部分占所有分類器認為是正類的比例;
R——召回率,分類器認為是正類并且確實是正類的部分占所有確實是正類的比例;
TP——分類器認為是正樣本而且確實是正樣本的例子;
FP——分類器認為是正樣本但實際上不是正樣本的例子;
FN——分類器認為是負樣本但實際上不是負樣本的例子。
F1是分類的一個衡量指標,用精確度和召回率的平均數來計算,公式如式(11)所示。
(11)
AP事實上指的是,利用不同的Precision和Recall點的組合,繪制出來的曲線與x軸圍成的面積。當取不同的置信度,可以獲得不同的Precision和Recall,當所取置信度足夠密集的時候,便可以通過上述面積來求AP值。mAP就是所有的類的AP值求平均,計算公式如式(12)所示。
(12)
將閾值(score_threshold)設為0.5,經過訓練之后,得到的P、R、F1、mAP曲線如圖11所示。從圖11中可以看出,訓練后得到西紅柿成熟果實識別模型的準確率為92.11%,召回率為86.21,F1評分為0.89,平均檢測精度為84.58%。
(a) Precision曲線
為驗證本文改進算法模型的有效性,采用YOLOv3、YOLOv4和YOLOv4-tiny算法模型在本文西紅柿成熟果實數據集上進行訓練并識別作為對比試驗,結果如表3所示。
表3 本文改進算法模型與其他經典算法模型的對比Tab. 3 Comparation of the improved model in this paper with other classical models
從表3可以看出,本文改進算法模型的P、R、F1和mAP均高于其他三種模型,雖然在fps指標上略低于YOLOv4-tiny,但也完全滿足實時性要求,能夠實現西紅柿成熟果實的快速識別,且YOLOv4-tiny的檢測準確度較低,所以本文改進算法模型的綜合表現優于其他三種模型。
為進一步驗證模型的有效性、魯棒性,實際情況中需要在不同條件下進行檢測識別,本文在不同密集程度下、不同光照條件下和不同遮擋程度下分別進行西紅柿成熟果實的檢測識別。
3.6.1 不同密集程度下的西紅柿識別效果
西紅柿生長姿態各異,且密集程度差距大,在西紅柿采摘機器人實際進行采摘的過程中,隨著相機距離西紅柿的距離變化,西紅柿的數目也隨之改變。當西紅柿數目較少、尺寸較大且較為稀疏時,作為識別對象較為清晰完整,識別難度低;但在西紅柿數量較多、尺寸較小且較為密集分布時,識別難度會增大。因此本文設置不同數量和密集程度的西紅柿果實檢測識別,分別在一幅圖像里識別2個、3個、4個及更多個西紅柿。最終識別效果如圖12所示。
從圖12中可以看出,在遮擋程度不嚴重的情況下,不管西紅柿是稀疏還是稠密的狀態,模型的檢測效果都很好,能夠準確地識別出圖像視野中西紅柿成熟果實的數量。
3.6.2 不同光照條件下的西紅柿識別效果
在西紅柿采摘機器人的實際工作中,光照條件并不像實驗室中一成不變,這對檢測識別算法模型的要求更高。為驗證模型對于不同光照條件下西紅柿成熟果實檢測識別的魯棒性,本文選取不同光照條件拍攝的西紅柿果實圖像測試,其中包括暗光、側光、逆光與順光的情況。最終識別效果如圖13所示。
圖13 不同光照條件下的西紅柿識別效果
從圖13中可以看出,西紅柿在側光的條件下,表面光照強度均勻,特征明顯,檢測難度較小;暗光和逆光時,西紅柿果實和枝葉的區分度明顯降低,給檢測識別帶來了很大的難度;順光時,表面光照較強,紋理特征不明顯,檢測難度增大。本文算法模型在不同光照環境下對西紅柿成熟果實的檢測識別均表現出良好的效果,即算法模型的魯棒性較強。
3.6.3 不同遮擋程度下的西紅柿識別效果
農業園中西紅柿存在著不同程度的遮擋問題,包括果實之間的遮擋和枝葉對果實的遮擋等,都會對西紅柿檢測識別產生一定影響。本文針對性的在測試集中加入西紅柿之間互相遮擋及西紅柿被枝葉遮擋情況下的圖像,最終識別效果如圖14所示。
圖14 不同遮擋程度下的西紅柿識別效果
從圖14中可以看出,在遮擋程度不是很嚴重的情況下,即西紅柿果實能夠有超過一半的部分出現在相機視野中,依然能夠將其檢測出來。
3.6.4 西紅柿成熟果實檢出率與檢準率
本文識別對象為西紅柿成熟果實,但實際場景中包含未成熟果實。為進一步驗證本文算法模型對未成熟和成熟西紅柿果實檢測的準確性和魯棒性,選取數據集中同時包含成熟和未成熟西紅柿果實的圖像,識別效果如圖15所示。
圖15 成熟和未成熟西紅柿果實識別效果
從圖15中可以看出,本文算法模型對成熟和未成熟的西紅柿果實具有較強的區分度。西紅柿成熟果實的實際檢出率和檢準率,結果如圖16所示。
(a) 驗證集中正確標注的西紅柿成熟果實樣本個數
從圖16中可以看出,驗證集中包含了203個正確標注的成熟西紅柿果實樣本,正確檢測175個,錯誤檢測15個。由此可以得到檢出率為93.6%,檢準率為92.1%,都超過了90%,基本滿足實際應用的需求。
1) 針對復雜環境下西紅柿采摘機器人識別算法的實際應用需求,本文基于經典的YOLOv3目標檢測算法進行模型輕量化改進,降低推理計算對硬件性能需求,便于嵌入式控制器硬件部署。同時也對激活函數、錨框的聚類、非極大值抑制和損失函數進行優化設計,提高了檢測識別算法的運行效率,實現了算法在不犧牲檢測精度前提下的網絡模型輕量化,減少計算量和功耗,提升系統穩定性,為西紅柿采摘機器人的產業化應用提供了方法與途徑。
2) 訓練后得到西紅柿成熟果實識別模型的準確率為92.11%,召回率為86.21,F1評分為0.89,平均檢測精度為84.58%。