任克勤,陶青川
(四川大學(xué)電子信息學(xué)院,成都 610065)
試管是一種重要的通用醫(yī)療器具,新冠疫情帶來的大批量檢測(cè)需求,對(duì)試管批量檢測(cè)自動(dòng)化提出了要求,部分檢測(cè)任務(wù)如計(jì)數(shù)、分類等機(jī)械、枯燥,耗費(fèi)人工且易出錯(cuò),計(jì)算機(jī)視覺的快速發(fā)展使得基于機(jī)器視覺的檢測(cè)方法替代人工成為可能。試管批處理的第一步是從試管架上識(shí)別單根試管,然后再進(jìn)行后續(xù)檢測(cè)項(xiàng)目。傳統(tǒng)方法主要通過濾波失真矯正、邊緣檢測(cè)、模板匹配等來識(shí)別試管,其抗干擾能力和泛化能力都較弱?;诰矸e神經(jīng)網(wǎng)絡(luò)的目標(biāo)識(shí)別算法通過對(duì)數(shù)據(jù)集的學(xué)習(xí)可以很好地提取目標(biāo)的特征,但現(xiàn)有的目標(biāo)識(shí)別算法存在模型大、檢測(cè)速度慢,實(shí)際部署需要GPU 導(dǎo)致硬件成本高的問題,需要做輕量化改進(jìn),減少模型大小,以適應(yīng)在嵌入式設(shè)備上運(yùn)行。
當(dāng)前的目標(biāo)檢測(cè)任務(wù)主要基于卷積神經(jīng)網(wǎng)絡(luò)CNN,卷積神經(jīng)網(wǎng)絡(luò)被證明能夠很好地提取圖像的特征,目標(biāo)檢測(cè)算法也主要分為一階段和二階段目標(biāo)檢測(cè)器兩種。一階段目標(biāo)檢測(cè)器直接在圖中找出要檢測(cè)的目標(biāo)的定位和類別,如YOLO 系列、RetinaNet、SSD 等。二階段目標(biāo)檢測(cè)器的第一階段先選出候選框,第二階段進(jìn)行分類,識(shí)別候選框中的目標(biāo)類別,如RCNN、SPPNet、Faster RCNN 等。一階段目標(biāo)檢測(cè)器將圖片直接網(wǎng)格化,物體中心所在的網(wǎng)格負(fù)責(zé)對(duì)該物體進(jìn)行檢測(cè),因此檢測(cè)速度快。二階段目標(biāo)檢測(cè)器需要在圖片上進(jìn)行搜索,然后再進(jìn)行分類和回歸,檢測(cè)精度高,不容易出現(xiàn)漏檢,但檢測(cè)速度不及一階段的目標(biāo)檢測(cè)器,同時(shí)還面臨著正負(fù)樣本失衡的問題。一般在算法的選擇上,速度仍然是個(gè)硬指標(biāo),一階段目標(biāo)檢測(cè)器在添加FPN、注意力等機(jī)制的改進(jìn)下,其檢測(cè)精度也能與二階段檢測(cè)器相媲美,同時(shí)一階段目標(biāo)檢測(cè)器的模型通常更小,適于嵌入式硬件環(huán)境中使用。
一個(gè)一階段的目標(biāo)檢測(cè)網(wǎng)絡(luò)由三個(gè)組件構(gòu)成,如圖1所示:backbone、neck和head,backbone 是一個(gè)卷積神經(jīng)網(wǎng)絡(luò),對(duì)輸入的圖片提取特征;neck 通常使用SSD 或者FPN 等方法對(duì)特征圖進(jìn)行混合或者組合,形成一些更為復(fù)雜的特征;head 用于對(duì)圖像特征進(jìn)行預(yù)測(cè),生成邊界框并預(yù)測(cè)類別。
圖1 YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)
YOLOv5 中 的backbone 主 要 包 含F(xiàn)ocus、CBL、C3 和SPP 等層。Focus 是將圖片先切片再按照通道維度進(jìn)行拼接,最后通過卷積運(yùn)算,將圖片的長(zhǎng)和寬均變?yōu)樵瓉淼囊话?,通道?shù)變?yōu)樵瓉淼?倍;CBL操作其實(shí)由三個(gè)操作組合而成:Conv、BN 和SiLU 激活函數(shù);C3 層包含了若干個(gè)殘差結(jié)構(gòu),解決網(wǎng)絡(luò)梯度信息重復(fù)的問題,既減少了參數(shù)量又加強(qiáng)了網(wǎng)絡(luò)的特征融合能力;SPP是一個(gè)空間金字塔池化操作,輸出特征圖具備滿足特定數(shù)目的通道,避免了RCNN對(duì)候選框進(jìn)行裁剪和縮放帶來的信息丟失和扭曲。YOLOv5 的neck 與YOLOv4類似,采用了FPN+PAN 的結(jié)構(gòu),將高層特征通過上采樣與低層特征相融合,既保留了高分辨率下具有較高空間信息的特征又保留了低分辨率下具有豐富語義信息的特征。YOLOv5的檢測(cè)層提供了兩種優(yōu)化方式:Adam 和SGD,默認(rèn)使用Adam 優(yōu)化。YOLOv5 定義的損失包含三個(gè)部分,分別是CIoU 損失、交叉熵?fù)p失和分類損失,它們之和作為反向傳播的損失。
數(shù)據(jù)增強(qiáng)方法同YOLOv4 一樣,采用了Mosaic方法,將多張圖像進(jìn)行隨機(jī)縮放、裁剪、排列之后進(jìn)行拼接,豐富了檢測(cè)目標(biāo)的背景,以便網(wǎng)絡(luò)能從一張?jiān)鰪?qiáng)后的圖像中學(xué)習(xí)到更多的特征。
YOLOv5 在公開數(shù)據(jù)集上有著一流的表現(xiàn),模型的特征提取和預(yù)測(cè)能力都得到了認(rèn)可,但其最小的模型文件都是十幾兆級(jí)別的大小,參數(shù)量依然很大,難以直接在嵌入式設(shè)備上運(yùn)行,因此,需要對(duì)其進(jìn)行輕量化改進(jìn)。
本文使用ShuffleNetV2構(gòu)建YOLOV5s 的主干網(wǎng)絡(luò),替換原有的DarkNet53網(wǎng)絡(luò),同時(shí)減少原YOLOv5 中檢測(cè)頭的通道數(shù)量、減少參數(shù)量、加快檢測(cè)速度;并在主干網(wǎng)的最后一層添加SA注意力機(jī)制,將SA 機(jī)制中通道注意力的全局平均池化改為最大池化,以便更好地保留最明顯的目標(biāo)特征。
ShuffleNetV2 降低了深度網(wǎng)絡(luò)的計(jì)算量。作者通過大量實(shí)驗(yàn)和論證,提出了影響高效網(wǎng)絡(luò)架構(gòu)的4個(gè)發(fā)現(xiàn),分別是“同等網(wǎng)絡(luò)深度減少內(nèi)存訪問代價(jià)”、“過量使用組卷積會(huì)增加內(nèi)存訪問代價(jià)”、“網(wǎng)絡(luò)碎片化會(huì)降低并行度”、“元素級(jí)操作的開銷不可忽視”,并根據(jù)這4 個(gè)發(fā)現(xiàn)提出了ShuffleNetV2 網(wǎng)絡(luò),其主要有三個(gè)亮點(diǎn)。一是使用channel shuffle:具體做法是先將輸入特征圖在通道維度分成兩個(gè)分支,將兩個(gè)分支分別進(jìn)行卷積運(yùn)算,之后再做拼接,輸出通道數(shù)與輸入通道數(shù)相同,最后進(jìn)行channel shuffle,使各分支間的信息得以交流。這樣做既可以降低分組卷積的運(yùn)算量,又避免了單純使用可以降低分組帶來的各組只學(xué)習(xí)到組內(nèi)特征的局限;二是將shuffleNetV1中1*1 的組卷積改為普通卷積,因?yàn)橹暗腸hannel split 就相當(dāng)于做了分組,并且減少使用組卷積也降低了計(jì)算量;三是將一個(gè)分支上的普通卷積改為深度可分離卷積,大幅減少計(jì)算量。
圖2 ShuffleNetV2的stage模塊
深度可分離卷積,如圖3 所示,最早在Xception和MobileNet中開始使用,它將普通卷積分為一個(gè)深度可分離卷積和一個(gè)1*1的點(diǎn)卷積,對(duì)于一個(gè)輸入通道數(shù)為,輸出通道數(shù)為,特征圖大小為D,卷積核大小為D的標(biāo)準(zhǔn)卷積,計(jì)算開銷為:
圖3 深度可分離卷積
標(biāo)準(zhǔn)卷積操作具有基于卷積核過濾特征并組合特征以產(chǎn)生新表示的效果,深度可分離卷積將過濾和組合操作分別由一個(gè)深度卷積和點(diǎn)卷積完成,深度卷積對(duì)每個(gè)輸入通道使用單個(gè)過濾器,跟著一個(gè)點(diǎn)卷積,使用一個(gè)1*1 卷積構(gòu)建深度層輸出的線性組合,在每一層后面都使用了BN 和ReLU 激活。對(duì)每個(gè)通道都使用單個(gè)過濾器的深度卷積可以寫做:
深度卷積過濾了通道,后續(xù)再跟一個(gè)1*1卷積將深度卷積的輸出線性組合,從而生成新的特征,加上該1*1卷積之后,深度可分離卷積的計(jì)算開銷為:
由此減少計(jì)算量:
本文使用ShuffleNetV2 來構(gòu)建主干網(wǎng)絡(luò),一方面其使用的深度可分離卷積相較于普通卷積的參數(shù)量減少,同時(shí)其網(wǎng)絡(luò)的層數(shù)也少于YOLOv5 原網(wǎng)絡(luò)使用的Darknet53,這樣減少的參數(shù)量就很可觀,模型大小也被大幅壓縮了。
原YOLOv5的檢測(cè)頭中輸出通道數(shù)量分別為256、512 和1024,考慮到試管類別少、特征簡(jiǎn)單,原網(wǎng)絡(luò)的檢測(cè)頭輸出通道數(shù)量有著大量冗余特征,于是減少通道數(shù)量。經(jīng)過實(shí)驗(yàn)測(cè)試,三個(gè)檢測(cè)頭都輸出256個(gè)通道時(shí),能在大幅減少參數(shù)量的同時(shí)起到較好的檢測(cè)效果。
注意力機(jī)制可以理解為對(duì)輸入的不同區(qū)域賦予不同的權(quán)重,進(jìn)而有側(cè)重地進(jìn)行特征選擇或者區(qū)域選擇,同時(shí)減少計(jì)算量。Hu 等提出了通道注意力機(jī)制,將輸入映射之后通過一個(gè)Squeeze 操作,該操作跨空間維度聚合特征圖來生成一個(gè)通道描述符,再將該描述符通過一個(gè)Excitation 操作,用自門控機(jī)制產(chǎn)生每個(gè)通道調(diào)制權(quán)重的集合,最后將這些權(quán)重應(yīng)用到映射得到的特征圖上生成SE 模塊的輸出。Woo 等將通道注意力串聯(lián)起來,與ResNet 結(jié)構(gòu)組合后很好地提高了SE 的性能。其空間注意力模塊是將輸入特征圖同時(shí)通過平均池化和最大池化兩個(gè)操作,將兩個(gè)結(jié)果再通過一個(gè)帶隱含層的多層感知機(jī),生成通道注意力圖。其空間注意力模塊沿通道軸施加平均池化和最大池化操作,并將結(jié)果拼接起來,再將這個(gè)拼接的特征圖通過一個(gè)卷積層,得到空間注意力圖。
然后,再通過一個(gè)全連接層強(qiáng)化表達(dá),最后使用sigmoid 激化:
其中,∈R,用來表示尺度縮放和平移的兩個(gè)參數(shù)。
空間注意力模塊使用GN(group norm)來獲得空間統(tǒng)計(jì)數(shù)據(jù),再通過一個(gè)全連接層來強(qiáng)化表達(dá),最后通過sigmoid 激活,得到空間注意力圖:
將F′與F′做拼接,得到的注意力圖的通道數(shù)與原子特征通道數(shù)相同。
對(duì)所有的子特征都進(jìn)行上述操作后,將所有結(jié)果聚合,再做channel shuffle,具體做法是先對(duì)特征圖做分組卷積得到多個(gè)子特征圖,但是這些子特征圖可能各自表征了局部通道的信息,為了獲得更具全局性的信息,將多個(gè)子特征圖的特征沿著通道維度進(jìn)行組合,使得每個(gè)組都包含其他組的特征信息,讓組間信息沿著通道維度充分交流,然后再通過一個(gè)分組卷積,從各組中提取特征,得到最終的注意力圖。改進(jìn)后的模型如圖4 所示。其中,SA 模塊如圖5所示。
圖4 改進(jìn)后的網(wǎng)絡(luò)結(jié)構(gòu)
圖5 混合注意力機(jī)制
訓(xùn)練所用硬件平臺(tái)配置為Intel(R)Core(TM)i5-6500 CPU @3.2 GHz,Nvidia GeForce GTX 1080Ti 11GB GPU,8 G 內(nèi)存的服務(wù)器,采用Ubuntu 20.04 操作系統(tǒng),CUDA11.4,Python 3.7。
本文使用的是自建數(shù)據(jù)集,包含3 類目標(biāo):“長(zhǎng)試管”、“短試管”和“蓋帽”,總共11534張圖片,為了增強(qiáng)學(xué)習(xí)到的模型的泛化能力,采用不同光照、試管架、拍攝距離、背景和角度,每次對(duì)多根試管進(jìn)行拍攝,得到數(shù)據(jù)集,示例見圖6。
圖6 自建數(shù)據(jù)集
圖像大小為547×364,送入網(wǎng)絡(luò)后會(huì)先調(diào)整大小為640×640再進(jìn)行訓(xùn)練。
本文采用目標(biāo)檢測(cè)模型常用的評(píng)價(jià)指標(biāo):召回率(Recall)、(mean average precision)、模型大小以及檢測(cè)速度。
召回率等于網(wǎng)絡(luò)正確識(shí)別為正例的樣本個(gè)數(shù)占總正例樣本個(gè)數(shù)的比例。為各類別的平均值,其值等于(precision-recall)曲線下的面積,其中為,為,計(jì)算如下:
檢測(cè)速度定義為每秒處理圖像的幀數(shù)(frame per second,F(xiàn)PS)。
訓(xùn)練輪次為200,批大小為8,采用YOLOv5s官方的預(yù)訓(xùn)練權(quán)重,將11534張圖片按照8∶1∶1的比例進(jìn)行隨機(jī)劃分,分別生成訓(xùn)練集、驗(yàn)證集和測(cè)試集。因?yàn)橥ㄟ^前期訓(xùn)練發(fā)現(xiàn)loss收斂很快,所以統(tǒng)一 采用epoch 為100,batch-size 為8,圖片大小固定為640×640,線程數(shù)為8。
將改進(jìn)后的網(wǎng)絡(luò)與原始YOLOv5s 網(wǎng)絡(luò)以及YOLOv4 網(wǎng)絡(luò)進(jìn)行對(duì)比,檢測(cè)結(jié)果如圖7 所示。統(tǒng)計(jì)結(jié)果見表1。
表1 對(duì)比實(shí)驗(yàn)結(jié)果
圖7 各模型檢測(cè)結(jié)果
可以看出,在YOLOv5 網(wǎng)絡(luò)中添加了SA 注意力機(jī)制之后,在增加一定參數(shù)量的情況下,模型的召回率有了0.8%的提高,而、和模型大小幾乎沒有變化;若單獨(dú)使用ShuffleNet來構(gòu)建YOLOv5s的主干網(wǎng),可以顯著降低參數(shù)量和模型大小,有了67.6%的提高,在召回率、則沒有明顯下降,說明對(duì)于試管檢測(cè)任務(wù)來說,輕量級(jí)的ShuffleNetV2 的特征提取能力已經(jīng)足夠;若將ShuffleNetV2 作為主干網(wǎng)再添加SA 注意力機(jī)制,則在原YOLOv5 網(wǎng)絡(luò)上有了89.9%的提高,有1.9%的提高,參數(shù)量只有原來的6.2%,模型大小只有原來的7.6%,在、、參數(shù)量和模型大小四個(gè)指標(biāo)上達(dá)到最優(yōu),代價(jià)只是召回率較原YOLOv5s網(wǎng)絡(luò)有1.6%的下降。說明對(duì)YOLOv5 網(wǎng)絡(luò)的輕量化改進(jìn)是成功的。
本文針對(duì)試管檢測(cè)任務(wù),對(duì)YOLOv5網(wǎng)絡(luò)進(jìn)行輕量化改進(jìn):使用ShuffleNetV2 構(gòu)建YOLOv5的主干網(wǎng),減少檢測(cè)頭的通道數(shù),并添加混合注意力機(jī)制。在自建數(shù)據(jù)集上實(shí)驗(yàn)證明,該改進(jìn)在少量精度損失下,大大減少了模型大小,加快了檢測(cè)速度。該改進(jìn)網(wǎng)絡(luò)在模型大小、檢測(cè)速度和精度上取得了較好的平衡,利于在嵌入式設(shè)備上運(yùn)行。