何欽,李根,嚴(yán)永煜,于文靜,王嶸
(華東理工大學(xué)信息科學(xué)與工程學(xué)院,上海,200237)
在傳統(tǒng)的養(yǎng)牛行業(yè),常見(jiàn)的識(shí)別方法包括基于耳標(biāo)的系統(tǒng)識(shí)別,基于圖案的標(biāo)記技術(shù),嵌入式微芯片生物標(biāo)記技術(shù)[1]以及基于RFID的射頻識(shí)別系統(tǒng)。傳統(tǒng)的識(shí)別系統(tǒng)用于防止動(dòng)物的盜竊、數(shù)量的統(tǒng)計(jì)、個(gè)體識(shí)別、疾病監(jiān)測(cè)等一系列管理,然而這些傳統(tǒng)的識(shí)別方法無(wú)法阻止對(duì)動(dòng)物體內(nèi)嵌入標(biāo)簽的復(fù)制和篡改,進(jìn)而發(fā)生欺詐行為。隨著現(xiàn)代化養(yǎng)牛業(yè)的發(fā)展,通過(guò)圖像識(shí)別實(shí)現(xiàn)群體中個(gè)體識(shí)別及數(shù)量的統(tǒng)計(jì)從而實(shí)現(xiàn)精細(xì)化管理成為目前智能化養(yǎng)殖的一個(gè)新興熱點(diǎn)。本項(xiàng)目利用TensorFlow object Detection API及Intel OpenVINOTM工具套件在目標(biāo)識(shí)別的快速性、便利性及高遷移性,并利用牛的特征信息改善其精確度,建立自己的數(shù)據(jù)集進(jìn)行訓(xùn)練,實(shí)現(xiàn)圖像中目標(biāo)牛數(shù)量的統(tǒng)計(jì)及多目標(biāo)的標(biāo)定,目前未見(jiàn)相關(guān)技術(shù)應(yīng)用于牛類養(yǎng)殖業(yè)。
牛養(yǎng)殖行業(yè)的規(guī)模在現(xiàn)代科技的輔助下不斷擴(kuò)大,然而其監(jiān)管方法卻存在著很多瑕疵。傳統(tǒng)方法之一的生物耳紋身及機(jī)械烙印方法不僅標(biāo)記過(guò)程極為耗時(shí)而且容易丟失、損壞、可二次復(fù)制;再者,像RFID等電子標(biāo)簽技術(shù)的缺陷在于電子標(biāo)簽可能會(huì)遭到修改、復(fù)制,極易造成欺詐行為,降低可監(jiān)管的程度?,F(xiàn)提出的前沿技術(shù)主要有三種:視網(wǎng)膜血管形態(tài)、DNA測(cè)序檢測(cè)、基于生物虹膜特征的動(dòng)物識(shí)別[2],由于高昂的檢測(cè)費(fèi)用及虹膜數(shù)據(jù)獲取效率低下的原因,不被廣泛采用。隨著圖像處理技術(shù)的普及和發(fā)展,利用圖像識(shí)別算法輔助牛類畜牧業(yè)監(jiān)管為相關(guān)企業(yè)提供了一定的借鑒作用。
TensorFlow是目前非常流行的開(kāi)源機(jī)器學(xué)習(xí)平臺(tái)。它擁有極其豐富的而全面的社區(qū)資源,且包含大量工具及不同應(yīng)用方向的機(jī)器學(xué)習(xí)庫(kù)。在本項(xiàng)目中主要應(yīng)用到了TensorFlow Object Detection技術(shù),其發(fā)源于Google公司物體識(shí)別系統(tǒng)。2017年Google宣布將TensorFlow Object Detection API進(jìn)行開(kāi)源,幫助機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺(jué)社區(qū)進(jìn)一步發(fā)展。其次,TensorFlow還提供了預(yù)訓(xùn)練模型。TensorFlow預(yù)訓(xùn)練模型提供了在多個(gè)數(shù)據(jù)集上完成了訓(xùn)練的模型。使用該技術(shù)可以迅速的對(duì)目標(biāo)對(duì)象進(jìn)行標(biāo)定,同時(shí)模型的訓(xùn)練基于TensorFlow預(yù)訓(xùn)練模型可以輕松實(shí)現(xiàn)目標(biāo)對(duì)象的訓(xùn)練。
2.2.1 原理
Single Shot MultiBox Detector(SSD)目標(biāo)檢測(cè)算法屬于one-stage方法,相較于two-stage方法有很大的不同:two-stage方法是先進(jìn)行粗略的分劃,再對(duì)分劃后的對(duì)象進(jìn)行判斷。而one-stage方法首先在圖片的不同位置進(jìn)行均勻密集地抽樣,抽樣時(shí)可以采用不同尺度和長(zhǎng)寬比,然后利用CNN提取特征后直接進(jìn)行分類與回歸,整個(gè)過(guò)程只需要一步,所以其優(yōu)勢(shì)是速度快,但是均勻密集采樣的一個(gè)重要缺點(diǎn)是訓(xùn)練比較困難,這主要是因?yàn)槟繕?biāo)與背景極其不均衡,導(dǎo)致模型準(zhǔn)確度稍低。
2.2.2 設(shè)計(jì)
SSD最核心的設(shè)計(jì)理念分為三點(diǎn):采用多尺度特征圖用于檢測(cè)、采用卷積進(jìn)行檢測(cè)、設(shè)置先驗(yàn)框。
多尺度特征圖,可以用來(lái)檢測(cè)不同大小的目標(biāo)。一般最開(kāi)始的特征圖尺度較大,可以用來(lái)檢測(cè)較小的目標(biāo),然后對(duì)特征圖進(jìn)行處理,改變特征圖的尺度,而小的特征圖檢測(cè)大目標(biāo)。其次,SSD直接采用卷積對(duì)不同的特征圖來(lái)進(jìn)行提取檢測(cè)結(jié)果。對(duì)于任意大小的特征圖,采用一個(gè)卷積核進(jìn)行處理,得到檢測(cè)值,然后對(duì)目標(biāo)結(jié)果進(jìn)行判斷。最后,SSD借鑒了Faster R-CNN中的anchor的理念,每個(gè)單元格設(shè)置了不同尺度的先驗(yàn)框,預(yù)測(cè)框是以這些先驗(yàn)框?yàn)榛A(chǔ)的,可以在一定的程度上減少訓(xùn)練難度。一般情況下,針對(duì)不同的對(duì)象,有不同形狀的先驗(yàn)框。
在SSD中對(duì)于每個(gè)單元的先驗(yàn)框都輸出一套獨(dú)立的檢測(cè)值,對(duì)應(yīng)一個(gè)邊界框。檢測(cè)值分成兩個(gè)部分,第一個(gè)部分是各個(gè)類別的置信度,特別的是,SSD將背景也看做一個(gè)特殊的類別,如果檢測(cè)目標(biāo)共有n個(gè)類別,SSD需要對(duì)每個(gè)先驗(yàn)框預(yù)測(cè)n+1個(gè)置信度,其中第一個(gè)置信度代表的是先驗(yàn)框內(nèi)容為背景的評(píng)分。第二部分是邊框的位置,邊框包含四個(gè)元素(cx,cy,w,h),分別代表了邊框的中心坐標(biāo)、寬和高。先驗(yàn)框用表示,其對(duì)應(yīng)邊界框那么,邊界框的預(yù)測(cè)值l是b相對(duì)于d的轉(zhuǎn)換值:
一般我們將其稱為編碼,當(dāng)?shù)玫搅祟A(yù)測(cè)值的時(shí)候需要反向這個(gè)過(guò)程,稱為解碼,即從預(yù)測(cè)值和先驗(yàn)值推出邊框的真實(shí)位置:
OpenVINOTM工具套件是英特爾于2018年發(fā)布的主要用于計(jì)算機(jī)視覺(jué)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)模型優(yōu)化和推理計(jì)算加速的軟件工具套件。該工具套件基于最新一代的人工神經(jīng)網(wǎng)絡(luò),可擴(kuò)展跨英特爾?硬件的計(jì)算機(jī)視覺(jué)和非視覺(jué)工作負(fù)載。OpenVINOTM主要包括用于優(yōu)化神經(jīng)網(wǎng)絡(luò)模型的工具M(jìn)odel Optimizer和用于加速推理計(jì)算的軟件包Inference Engine。如圖1所示。
圖1 OpenVINO?工具套件
當(dāng)模型訓(xùn)練完畢,導(dǎo)出TensorFlow凍結(jié)圖模型文件(*.pb文件),接著使用工具套件中的Model Optimizer工具優(yōu)化凍結(jié)圖模型。Model Optimizer工具是一個(gè)跨平臺(tái)命令行工具,可將經(jīng)過(guò)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型執(zhí)行多項(xiàng)優(yōu)化。優(yōu)化完畢后會(huì)將模型從源框架轉(zhuǎn)換為與nGraph兼容的中間表示(IR文件)。IR文件包含兩個(gè)文件,一個(gè)是描述神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的*.xml文件,另一個(gè)是儲(chǔ)存模型權(quán)重參數(shù)的*.bin文件。優(yōu)化過(guò)后的模型在不影響精度的情況下,在英特爾的多平臺(tái)硬件上可以更快的執(zhí)行。
獲得IR文件后,就可以使用Inference Engine來(lái)完成推理計(jì)算。Inference Engine其本質(zhì)為一組C++/Python API函數(shù),依靠該函數(shù)組,可以實(shí)現(xiàn)初始化AI推理計(jì)算硬件,同步或者異步加載經(jīng)過(guò)優(yōu)化后的神經(jīng)網(wǎng)絡(luò)模型及執(zhí)行推理計(jì)算并返回推理計(jì)算的結(jié)果。
本文所有工作在以下環(huán)境中完成:
Windows 10(64 bit),Ubuntu 20.04,labelImg Windows_v1.8.0,TensorFlow Obeject Detection API r1.13.0,OpenVINO 2021.2,Cmake V3.4,CPU為 intel i7-10875H;GPU為Nvidia RTX 2070s
原始圖片一部分來(lái)源于Kaggle數(shù)據(jù)集,一部分來(lái)源于現(xiàn)場(chǎng)拍攝。圖片清晰,噪點(diǎn)較少,且包含牛個(gè)體不同角度的照片,部分圖片中牛的數(shù)量多于1頭,在后期的時(shí)候都需要進(jìn)行標(biāo)注。在標(biāo)注前需要進(jìn)行準(zhǔn)備工作,將圖片按照順序標(biāo)號(hào)同時(shí)轉(zhuǎn)換為標(biāo)準(zhǔn)RGB通道格式。原始數(shù)據(jù)如圖2所示:
圖2 原始圖片數(shù)據(jù)集
其次進(jìn)行標(biāo)注工作,本項(xiàng)目使用LabelImg軟件進(jìn)行標(biāo)定。提前預(yù)設(shè)標(biāo)簽,在圖片數(shù)據(jù)集中將目標(biāo)進(jìn)行人工標(biāo)記,如圖3所示。在完成所有圖片的標(biāo)記之后每張圖片會(huì)自動(dòng)生成xml文件,其中包括目標(biāo)檢測(cè)對(duì)象在圖片中的位置和標(biāo)簽信息。
圖3 圖片標(biāo)記過(guò)程
圖4 圖片標(biāo)記典型流程
圖5 xml文件標(biāo)記信息
數(shù)據(jù)集中用來(lái)訓(xùn)練的圖片和用來(lái)作驗(yàn)證的圖片比例為8:2,本項(xiàng)目訓(xùn)練數(shù)據(jù)集為812張,測(cè)試數(shù)據(jù)集為208張。
3.3.1 數(shù)據(jù)集的轉(zhuǎn)換
TensorFlow推薦使用TFRecord格式文件向TensorFlow模型輸入訓(xùn)練數(shù)據(jù),該數(shù)據(jù)結(jié)構(gòu)下訓(xùn)練速度最快、效率最高。TensorFlow內(nèi)核很多的數(shù)據(jù)處理機(jī)制都是基于TFRecord文件做的優(yōu)化。TFRecord格式文件是TensorFlow定義的二進(jìn)制文件,基于Google Protocol Buffers這個(gè)跨平臺(tái)跨語(yǔ)言序列化結(jié)構(gòu)數(shù)據(jù)的協(xié)議標(biāo)準(zhǔn)。其擴(kuò)展名為*.tfrecord。因此為了提高訓(xùn)練效率,需要將xml文件轉(zhuǎn)換為csv文件進(jìn)行過(guò)渡,然后將csv文件轉(zhuǎn)換為tfrecord文件。
csv主要是將xml中的信息進(jìn)行整合,其內(nèi)容包括:圖片文件名Filename;圖片寬度Width;圖片高度Height;標(biāo)注Class;坐標(biāo)的起始位置和終止位置Xmin、Ymin、Xmax、Ymax。如圖6所示。
圖6 csv文件提取xml文件內(nèi)容
在得到csv文件后,將其轉(zhuǎn)換為tfrecord文件即可作為標(biāo)準(zhǔn)輸入文件,輸入目標(biāo)檢測(cè)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。
3.3.2 基于預(yù)訓(xùn)練模型進(jìn)行模型訓(xùn)練
本項(xiàng)目使用的預(yù)訓(xùn)練模型網(wǎng)絡(luò)為ssd_inception_v2_coco,結(jié)合SSD目標(biāo)檢測(cè)方法[3]和inception特征提取網(wǎng)絡(luò)對(duì)原始數(shù)據(jù)集進(jìn)行訓(xùn)練。在訓(xùn)練之前需要設(shè)置訓(xùn)練參數(shù),為了更有效率的完成訓(xùn)練,本項(xiàng)目采取TensorFlow-gpu進(jìn)行基于GPU的訓(xùn)練。
本次實(shí)驗(yàn)參數(shù)的設(shè)置為:Batch_size為6,訓(xùn)練步數(shù)為5000步。在訓(xùn)練過(guò)程中可以使用TensorFlow的可視化工具tensorboard對(duì)相關(guān)參數(shù)進(jìn)行監(jiān)控和調(diào)整。主要關(guān)注的參數(shù)為L(zhǎng)oss虧損函數(shù),主要用于描述訓(xùn)練的模型參數(shù)同真實(shí)值之間的差異,在訓(xùn)練過(guò)程中會(huì)隨著訓(xùn)練步數(shù)的增加而減小,其值越接近于0說(shuō)明其訓(xùn)練效果越好。
在訓(xùn)練完成之后得到model.ckpt.data-00000-of-00001、model.ckpt.index和model.ckpt.meta文件。這三個(gè)文件一起構(gòu)成TensorFlow和Checkpoint文件,是訓(xùn)練過(guò)程中保存的模型變量、模型權(quán)重等重要參數(shù)。當(dāng)模型訓(xùn)練完畢后需要執(zhí)行Frozen操作,將所有變量的值提取出來(lái)變成常量,同模型權(quán)重一起合并為一個(gè)*.pb文件作為后期推理計(jì)算的模型文件。
3.3.3 Loss函數(shù)
Loss函數(shù)作為模型訓(xùn)練中的一個(gè)重要參數(shù),可以通過(guò)其數(shù)值大小來(lái)反映訓(xùn)練效果。SSD算法中的損失函數(shù)定義為位置誤差(localization loss,loc)與置信度誤差(confidence loss, conf)的加權(quán)和[4]:
其中,N為符合先驗(yàn)框的樣本數(shù)量,c為類別置信度預(yù)測(cè)值,l為邊界框的預(yù)測(cè)值,α為權(quán)重系數(shù),設(shè)置為1,g為真實(shí)框的位置參數(shù)。
同時(shí)SSD采用Smooth L1 loss方法計(jì)算位置誤差:
采用softmax loss表示:
其中,Neg代表負(fù)樣本集。
通過(guò)TensorFlow自帶的tensorboard可以將該過(guò)程可視化,隨時(shí)監(jiān)控訓(xùn)練的過(guò)程,如圖所示。在經(jīng)過(guò)10000步迭代后loss值約為1.37。
圖7 classification_loss變化趨勢(shì)
圖8 locallization_loss變化趨勢(shì)
圖9 TotalLoss變化趨勢(shì)
圖10 clone_loss變化趨勢(shì)
當(dāng)模型訓(xùn)練完畢,可以導(dǎo)出TensorFlow凍結(jié)圖模型文件(*.pb文件),接著使用OpenVINOTM中的Model Optimizer工具優(yōu)化TensorFlow凍結(jié)圖模型,獲得模型的中間表示(IR)。IR模型包含兩個(gè)文件,一個(gè)是描述神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的*.xml文件,另一個(gè)是儲(chǔ)存模型權(quán)重參數(shù)的*.bin文件。經(jīng)過(guò)該工序優(yōu)化過(guò)后的模型,在不影響精度的情況下,在英特爾的多平臺(tái)硬件上可以更快的執(zhí)行,為之后的硬件實(shí)現(xiàn)提供基礎(chǔ)。
在模型優(yōu)化完畢后,可在基于Intel的平臺(tái)之間通用。從測(cè)試結(jié)果可以看出模型還是具有相當(dāng)好的泛化效果。經(jīng)過(guò)完整的測(cè)試,本次訓(xùn)練的模型識(shí)別精度較低,并不是特別理想。由于識(shí)別過(guò)程對(duì)背景、圖片的清晰度有一定的要求,且牛群相互遮擋時(shí)的識(shí)別效果不佳,總體的識(shí)別率還是有待提高,后期的改進(jìn)措施應(yīng)提高訓(xùn)練步數(shù)至150k乃至300k步迭代,其次通過(guò)圖片的變換豐富原始數(shù)據(jù)集,得到更好的訓(xùn)練模型。
圖11 牛個(gè)體檢測(cè)示意圖1
圖12 牛個(gè)體檢測(cè)示意圖2
Nvidia Jetson nano是Nvidia推出的GPU運(yùn)算平臺(tái),可以做為嵌入式設(shè)備實(shí)現(xiàn)推理。Intel Neural Compute Stick 2 (NCS2) 是Intel公司推出的邊緣側(cè)推理加速設(shè)備。本項(xiàng)目引入Nvidia Jetson nano和Intel NCS 2,將上述部分的所有環(huán)境移植到Ubuntu 20.02系統(tǒng)中實(shí)現(xiàn)了基于視頻流的牛個(gè)體識(shí)別與檢測(cè),為相關(guān)企業(yè)提供了基于圖像處理的監(jiān)管方案。
本文從圖像處理角度為牛養(yǎng)殖業(yè)提出了新的監(jiān)管手段,基于TensorFlow框架和OpenVINOTM實(shí)現(xiàn)了牛個(gè)體的識(shí)別與統(tǒng)計(jì),為大規(guī)模畜牧業(yè)養(yǎng)殖的監(jiān)管提出了新的解決思路。在該構(gòu)想的實(shí)現(xiàn)過(guò)程中也有很大的改善空間,如牛群遮擋狀況下的識(shí)別,以及超大規(guī)模的牛群識(shí)別等。John Hopkins大學(xué)提出了使用殘差網(wǎng)絡(luò)估計(jì)大密度人群[5],下一步研究的方向集中于如何利用殘差提取網(wǎng)絡(luò)對(duì)超大規(guī)模的牛群實(shí)現(xiàn)識(shí)別,進(jìn)一步提高技術(shù)的效果與可用度。綜上,為了更好的將圖像識(shí)別技術(shù)應(yīng)用于畜牧業(yè)養(yǎng)殖過(guò)程中,需要軟硬件協(xié)同工作,綜合利用各種方法的優(yōu)缺點(diǎn),最終達(dá)到最佳的識(shí)別效果。