武 星 齊澤宇 王龍軍 楊俊杰 夏 雪
(1.南京航空航天大學機電學院, 南京 210016; 2.中國農業科學院農業信息研究所, 北京 100081)
目前,我國農業生產不斷向規模化、集約化、精準化方向發展,對具有智能化、自動化的農業智能裝備的需求也快速增加[1]。蘋果是我國產量最大的水果,由于果園環境復雜,目前仍依靠人工采摘[2-3]。因此,在農業勞動力緊缺、采摘成本不斷增加的情況下,以蘋果采摘機器人代替人工采摘具有重要的現實意義和廣闊的應用前景[4]。
快速準確的蘋果檢測是蘋果采摘機器人自動采摘的關鍵。復雜果樹背景下的蘋果快速準確檢測受諸多因素影響:果實之間相互重疊遮擋,樹葉也會對果實產生遮擋;現場的光照環境非常復雜;蘋果采摘機器人本身的計算資源有限,復雜算法運行效率不高。這些為蘋果快速準確檢測帶來諸多困難。
蘋果檢測本質上屬于目標檢測。目前,目標檢測方法主要分為傳統方法和深度學習方法。傳統方法受光照變化和復雜背景的影響較大,在此方面已有一些針對不同應用場景的改進方法[5-8]。文獻[9]研究了基于區域增長和顏色特征的圖像分割方法,提出一種基于支持向量機的蘋果識別分類算法。文獻[10]在不同光線和陰影的影響下,采用R-G色差分量和改進型Otsu法進行圖像分割,求取目標質心,并使用同面積的圓形進行擬合,較好地實現了對成熟蘋果的識別。文獻[11]通過顏色和紋理檢測可能屬于蘋果的像素,由這些像素組成種子區域,然后與理想的特征模型進行比較,從而判斷該區域是否包含蘋果。
近年來,以圖像特征自學習為優勢的深度學習方法開始運用于蘋果檢測。文獻[12]針對4種水果提出了一種改進的SSD(Single shot multibox detector)水果檢測模型,采用ResNet-101模型替換SSD模型中的VGG16輸入模型。文獻[13]借鑒DenseNet網絡的思想對YOLOv3網絡進行改進,對遮擋、重疊情況及不同生長階段的蘋果進行有效檢測。文獻[14]改進設計了基于ResNet-44的R-FCN(Region-based fully convolutional networks)網絡,能夠識別疏果前的蘋果目標。雖然上述方法都具有一定的魯棒性和泛化性,但是實驗平臺均為高性能計算機,缺乏考慮采摘機器人有限計算資源的影響。
YOLO[15](You only look once)網絡是一種通用的one-stage目標檢測算法,通過單個卷積神經網絡處理圖像可直接計算出多種目標的分類結果與位置坐標。然而,蘋果采摘機器人只需檢測單種目標(蘋果),該網絡結構過于龐大,計算復雜度高,檢測效率不足,無法滿足采摘實時應用。因此,本文在YOLOv3網絡的基礎上提出一種輕量化卷積神經網絡改進設計方法,采用深度可分離卷積[16]替換普通卷積,定義一種融合均方誤差損失和交叉熵損失的多目標損失函數,在網絡訓練時采用一種基于隨機梯度下降(Stochastic gradient descent,SGD)和自適應矩估計(Adaptive moment estimation,Adam)的多階段學習優化技術,并在工作站和嵌入式開發板上分別進行實驗,對改進后的模型和方法進行檢測速度和準確率的驗證。
YOLOv3網絡的整體結構如圖1所示,使用Darknet-53網絡來提取特征,Darknet-53網絡的主體結構如圖1藍色虛線框內所示,該網絡借鑒了殘差網絡[17]的結構,在一些網絡層之間加了跳躍連接,由此構建了殘差單元,使得網絡結構可以更深。網絡結構中的基本單元如圖1紅色虛線框內所示,由卷積層、批歸一化層(Batch normalization,BN)[18]和Leaky ReLU激活函數組成;由2個這樣的基本單元和跳躍連接組成圖1綠色實線框內所示的殘差單元,再分別由1、2、8、8、4個殘差單元組成5個殘差塊,最終組成網絡的主體結構。
為了改善網絡對小尺寸物體檢測性能差的問題,YOLOv3使用13×13、26×26、52×52這3個不同尺度的特征圖來進行目標檢測,并將低分辨率的特征圖上采樣后與高分辨率的特征圖進行拼接,如圖1藍色實線框內所示。
1.2.1網絡結構簡化
YOLOv3使用的基礎網絡為Darknet-53。然而,在蘋果檢測這一個單類別檢測任務中,并不需要如此復雜的網絡。并且,神經網絡本身具有較高的冗余性,因此可以對網絡結構進行簡化以減少計算量。本文仿照Darknet-53網絡的結構設計了一個新的基礎網絡,該網絡由5個相同結構的殘差塊串聯組成,每個殘差塊包含2個殘差單元和一個步長為2的卷積,減少了網絡的層數和計算量。
由于本文設計的網絡應用于蘋果采摘機器人上,實現蘋果的識別定位,所以可以不對采摘機器人工作空間之外的蘋果進行檢測。本文使用的蘋果采摘機器人的工作空間是半徑為0.85 m的球體。在網絡輸入為416像素×416像素的條件下,52×52特征圖中單個網格的尺寸為8像素×8像素。該尺寸轉換到本文使用的1 280像素×780像素圖像分辨率下,單個網格的尺寸約為24.6像素×24.6像素。根據相機內參的標定結果,在機器人工作空間內,該網格所對應的最大物體的二維投影尺寸約為22.5 mm×22.4 mm,遠小于正常蘋果的二維投影尺寸。因此無需在該尺度上進行蘋果檢測,只需要使用13×13和26×26這2個尺度的特征圖進行蘋果檢測,從而刪除生成52×52尺寸特征圖的相關網絡結構,減少計算量。
1.2.2使用深度可分離卷積
使用深度可分離卷積替換原網絡中所有3×3的普通卷積。深度可分離卷積的整個工作流程如圖2所示,包括深度卷積和逐點卷積2部分,輸入樣本的尺寸為H(行數)×W(列數)×N(通道數)。首先,深度卷積對輸入向量的每個通道使用一個單獨的k×k×1的卷積核進行卷積運算,經過N個深度卷積運算得到N個尺寸為H×W的向量。其次,逐點卷積完成對上一環節輸出向量的通道數調整,使用1×1×N的卷積核進行卷積運算將其壓縮為H×W×1的向量,經過M個逐點卷積運算得到M個尺寸為H×W的向量。最終組成H×W×M的輸出結果。
深度可分離卷積相對于常規卷積的優點是可以顯著減少參數量。例如,對于一個N通道的輸入向量,若想用k×k的常規卷積核去得到一個M通道的輸出向量,需要的參數量為
a=k2NM
(1)
如果使用深度可分離卷積完成同樣的工作,需要的參數量為
b=k2N+NM
(2)
兩種情況下參數量的比值為
(3)
由此可見,當輸出向量的通道數很大時,2種卷積參數量的比值近似與卷積核尺寸的平方成反比。當卷積核尺寸為3×3時,使用深度可分離卷積最多可以將參數量減少到原來的1/9。
改進后的Light-YOLOv3網絡結構如圖3a所示。網絡輸入是416像素×416像素×3通道,輸出是13×13和26×26兩種尺寸的特征圖。殘差塊結構如圖3b所示,包含1個步長為2的卷積單元和2個殘差單元。殘差單元結構如圖3c所示。文獻[19]實驗結果表明:當預激活結構采用BN層+激活層+卷積層的排列順序時,包含該預激活結構的殘差單元神經網絡具有更好的收斂性、精度和泛化能力。因此,本文設計的網絡中也采用BN層、激活層、卷積層的排列順序。卷積單元具體結構如圖3d所示,由3部分組成,每個部分均包含1個BN層、Leaky ReLU激活函數和卷積層,卷積核的尺寸分別是1×1、3×3和1×1,同樣采用BN層+激活層+卷積層的排列順序,當卷積單元用于下采樣時,第1個卷積的步長為2。
損失函數L由4部分組成,分別是邊界框定位損失值Lxy、邊界框尺寸損失Lwh、置信度損失Lconf和類別損失Lcls,即
L=Lxy+Lwh+Lconf+Lcls
(4)
其中邊界框定位損失Lxy使用均方誤差損失函數表示為
(5)
式中S2——輸入圖像被劃分網格數
B——單個網格預測邊界框數,取值為3
(xi,yi)——預測邊界框中心點坐標
邊界框尺寸損失Lwh使用均方誤差損失函數表示為
(6)
式中wi、hi——預測邊界框寬度、高度
置信度損失Lconf使用交叉熵損失函數表示為

(7)
式中λobj——權重系數,取值為1
λnobj——權重系數,取值為100,這樣使得不包含目標的邊界框產生更大的損失值,表明此時的模型誤差較大

Ci、i——預測目標、實際目標的置信度
類別損失Lcls使用交叉熵損失函數表示為

(8)
式中c——檢測到的目標所屬類別
pi(c)——第i個網格檢測到某個目標時,該目標屬于類別c的預測概率
式(4)是單個尺度上的損失函數。本文改進的網絡在兩個尺度上進行檢測,所以最終的損失函數值Lsum是在2個檢測尺度上分別計算損失函數值相加得到的,即
Lsum=L13×13+L26×26
(9)
式中L13×13——針對13×13特征圖計算的損失函數值
L26×26——針對26×26特征圖計算的損失函數值

圖5 數據增強后的圖像Fig.5 Images after data augmentation
目前網絡上有大量蘋果相關的圖像,本文使用Python語言開發了圖像爬蟲對這些圖像進行批量下載,減小了數據采集的成本,提高了數據采集的效率。
圖像的主要來源為百度、Bing和谷歌等網站,按照關鍵字“蘋果”和“蘋果樹”分別保存一定數量的圖像,然后進行人工篩選并去除重復圖像,最終獲得815幅圖像,其中只包含單個蘋果的圖像262幅,包含復雜光照下的蘋果圖像141幅,存在樹葉遮擋的蘋果圖像150幅,多個且不重疊蘋果圖像69幅,多個且存在重疊蘋果圖像415幅,未成熟蘋果圖像47幅。然后使用標注工具按PASCAL VOC數據集的標注格式對圖像進行標注,生成XML類型的標注文件。
訓練深度神經網絡需要大量的數據,過小的數據集會導致神經網絡過擬合,本文對采集到的數據集使用數據增強技術,增加數據集中的數據量,由此可以提高模型的泛化能力,提升模型的魯棒性。
使用翻轉、縮放、旋轉、裁剪、平移、添加噪聲和色彩抖動(包括對圖像亮度、飽和度和對比度進行調整)7種方法的隨機組合對采集到的圖像進行數據增強,原始圖像和增強后圖像分別如圖4和圖5所示,并對每幅圖像對應的標注文件進行同步變換。

圖4 原始圖像Fig.4 Original image
每幅圖像生成20幅數據增強圖像,最終有2幅圖像數據增強失敗,得到有效圖像17 113幅。按照8∶1∶1的比例劃分訓練集13 690幅、驗證集1 712幅與測試集1 711幅。
為了加快訓練時網絡的收斂速度以及防止梯度爆炸,對標注數據進行歸一化處理,處理流程如圖6所示。

圖6 歸一化流程圖Fig.6 Normalized flowchart
將結果保存到txt格式的文件中,數據格式為class_idxywh,其中class_id表示類別編號,在本文使用的訓練集中class_id為0表示類別為蘋果;x、y、w和h分別表示歸一化后的目標物體邊界框的中心點坐標、寬度和高度。
使用Pytorch框架搭建網絡,并在工作站上進行訓練。工作站的配置為i7-9800X@3.80 GHz×16、內存32 GB和顯存11 GB的GeForce RTX 2080 Ti,使用的系統為Ubuntu16.04,安裝了CUDA和cuDNN庫,Python版本為3.6,Pytorch版本為1.3。
訓練前還需要在數據集上使用K-means算法進行聚類,得到預設的6個模板框尺寸,在本文制作的數據集上得到的結果為(77,77)、(131,127)、(194,189)、(261,254)、(395,395)、(693,667)。
訓練時實際的批尺寸為4,每迭代2次更新一次權值,等效的批尺寸為8,總共訓練50代,每代保存一次模型權重文件,每代迭代3 423次,共迭代171 125次,耗時7.5 h。
訓練時使用SGD和Adam 2種優化算法。經過實驗發現,單獨使用SGD優化算法時,學習率偏大會導致算法難以收斂,學習率偏小又會導致算法收斂很慢;而單獨使用Adam優化算法時,最后訓練的結果會比單獨使用SGD時差[20],但優點是具有自適應學習率,算法收斂快。所以本文將訓練過程分為2個階段。第1階段為前30代,使用的優化算法為Adam,使用默認的初始化參數;第2階段為后20代,使用的優化算法為SGD,參考經驗值并結合多次實驗的結果,設置初始學習率為0.000 1,動量參數為0.9,每經過一代學習率減小為原來的0.9。訓練時第2階段的學習率變化曲線如圖7所示。

圖7 第2階段學習率變化曲線Fig.7 Learning rate curve at the second stage
訓練過程中每代完成后在驗證集上對模型進行評估,計算F1值、mAP、準確率P和召回率R這4個指標,將這些數據保存至日志文件中,并使用Tensorboard軟件對訓練過程進行實時的監控。對于二分類問題,可以根據樣本S的真實類別和模型預測類別的組合將樣本S劃分為4種類型:預測為正的正樣本(True positive,TP),數量為TP;預測為負的正樣本(False negative,FN),數量為FN;預測為正的負樣本(False positive,FP),數量為FP;預測為負的負樣本(True negative,TN),數量為TN[21]。
準確率P表示預測為正的所有樣本中真正為正的樣本所占的比例,計算公式為
(10)
召回率R表示真正為正的樣本中被預測為正的樣本所占的比例,計算公式為
(11)
F1值(F1)可以綜合考慮準確率和召回率,是基于準確率和召回率的調和平均,定義為
(12)
在目標檢測中每個類別都可以根據準確率P和召回率R繪制P-R曲線,AP值就是P-R曲線與坐標軸之間的面積,而mAP就是所有類別AP值的平均值。

圖8 損失值變化曲線Fig.8 Loss value curve
訓練完成后,從日志文件中讀取每一次迭代的損失值并繪制曲線,結果如圖8所示。由圖8可以看出,前30 000次迭代損失值迅速減小直至穩定,后面的訓練過程中損失值在小范圍內振蕩。
根據日志中記錄的數據繪制訓練過程中F1值、mAP、準確率和召回率的變化曲線,如圖9所示。由圖9可知,在前30代的訓練過程中,各項指標變化幅度較大,但是總體趨勢是增長的;在后20代的訓練過程中,各項指標逐漸趨于穩定,在小范圍內振蕩。
F1值最大是94.4%,對應第27代;mAP最大值為96.2%,對應第47代;準確率最大值為95.4%,對應第27代;召回率最大值為97.4%,對應第47代。

圖9 訓練過程中各項指標變化曲線Fig.9 Curves of various indicators during training
本文主要考慮F1值和mAP這2個指標對訓練結果進行評估,最終選取第50代保存的模型權重文件作為最終的訓練結果,具有較高的F1值和mAP,同時具有較高的準確率與召回率。
3.3.1工作站上對比實驗
針對本文所提出的YOLOv3網絡結構改進措施,分別進行單項改進措施的驗證實驗。將僅使用深度可分離卷積的改進網絡記為網絡A,僅使用同構殘差塊串聯的特征提取網絡并簡化特征圖尺度的改進網絡記為網絡B,使用相同的數據集與訓練參數對YOLOv3網絡、網絡A和網絡B進行訓練,在測試集上分別進行檢測,測試集中共包含1 711幅圖像。對比每種網絡的檢測時間與各項性能指標,檢測時間如表1所示,F1值、mAP、準確率和召回率如表2所示。

表1 網絡檢測時間對比Tab.1 Comparison of network detection time

表2 網絡性能指標對比Tab.2 Comparison of network performance indicators %
由表1和表2可知,相對于傳統的YOLOv3網絡,本文改進的網絡A和網絡B檢測時間有較明顯下降,準確率也稍有提高,實驗數據驗證了前文方法分析的正確性。在網絡A中,使用深度可分離卷積替換普通卷積,減少了參與計算的卷積參數量,從而提高了網絡的檢測速度。在網絡B中,針對單一目標檢測的應用,使用同構殘差塊串聯的特征提取網絡,刪除了生成52×52的特征圖的相關網絡結構,減少了參與計算的網絡分支,從而提高了網絡的檢測速度。并且,由于網絡結構的簡化,一定程度上避免了復雜網絡在訓練階段對樣本數據的過擬合,提高了網絡的泛化能力。因此,網絡對驗證集樣本的檢測準確率也稍有提高。
同時采用這2種措施改進YOLOv3網絡的結構組成,得到結構精簡的Light-YOLOv3網絡。YOLOv3網絡與Light-YOLOv3網絡訓練得到的模型權重文件容量、參數量和理論計算量如表3所示,其中FLOPs表示浮點運算次數。

表3 網絡模型權重對比Tab.3 Comparison of network model weight
由表3可知,Light-YOLOv3網絡相比于YOLOv3網絡,網絡權重文件容量減小了62.78%,參數量減少了63.09%,理論計算量減小了53.66%。
在工作站平臺上,使用2種網絡對整個測試集(包含1 711幅圖像)分別進行檢測,對比2種網絡的檢測時間與各項性能指標,檢測時間如表4示,F1值、mAP、準確率和召回率如表5所示。

表4 工作站檢測時間對比Tab.4 Comparison of detection time on workstation

表5 工作站網絡性能對比Tab.5 Comparison of network performance on workstation %
由表4和表5可知,Light-YOLOv3網絡相比較于YOLOv3網絡,各項性能指標均有提高,同時檢測速度更快。Light-YOLOv3網絡F1值提高了3.01個百分點,mAP提高了1.93個百分點,準確率提高了4.48個百分點,召回率提高了1.41個百分點,單幅圖像的平均檢測時間減少了24.67%,檢測速度提高了32.74%。
檢測效果對比如圖10所示。可以看到Light-YOLOv3網絡具有更好的檢測效果,能夠檢測圖10中藍色圓圈所包含的被遮擋的蘋果。

圖10 網絡檢測效果對比Fig.10 Comparison of network detection effect
3.3.2嵌入式開發板上對比實驗
最后在Nvidia TX2嵌入式開發板上進行實驗,使用的系統為Ubuntu 18.04,安裝了CUDA和cuDNN庫,Python版本為3.6,Pytorch版本為1.3,并使用TensorRT庫實現神經網絡推理加速。
在Nvidia TX2上,使用2種網絡對整個測試集(包含1 711幅圖像)分別進行檢測,對比2種網絡的檢測時間,結果如表6所示。

表6 嵌入式開發板檢測時間對比Tab.6 Comparison of detection time of embedded system
由表6可知,Light-YOLOv3網絡在嵌入式開發板上運行時單幅圖像平均檢測時間為131.67 ms,相比YOLOv3網絡減少了29.42%,在嵌入式開發板上檢測速度可以達到7.59 f/s,提高了41.60%。
(1)在分析YOLOv3網絡結構的基礎上,設計了由5個相同結構的殘差塊串聯組成的特征提取網絡,在2個尺度上進行蘋果檢測,并采用深度可分離卷積替換普通卷積,采用均方誤差損失和交叉熵損失組成的復合損失函數,減少了參數量和降低了計算量。
(2)采集數據對網絡進行訓練,將訓練過程分為2個階段,分別使用SGD和Adam優化算法,加快了模型收斂,并獲得較好的訓練結果。分別在工作站和嵌入式開發板上進行實驗,結果表明,改進后參數量減少了63.09%;在工作站上單幅圖像的平均檢測時間為8.55 ms,在嵌入式開發板上的平均檢測時間為131.67 ms,比改進前分別減少了24.67%和29.42%;在工作站上的檢測速度為116.96 f/s,在嵌入式處理器上的檢測速度為7.59 f/s,比改進前分別提高了32.74%和41.60%;在測試集上的mAP為94.69%,F1值為94.57%,比改進前分別提高了1.93個百分點和3.01個百分點。