王月明,陳甜甜
(內(nèi)蒙古科技大學(xué)信息工程學(xué)院,內(nèi)蒙古包頭 014010)
內(nèi)蒙古畜牧業(yè)發(fā)展處于全國(guó)領(lǐng)先地位,是我國(guó)牛奶、牛肉等資源主要產(chǎn)地之一,牛養(yǎng)殖業(yè)是當(dāng)?shù)啬撩竦闹匾?jīng)濟(jì)來(lái)源。隨著現(xiàn)代科學(xué)技術(shù)的發(fā)展,牛養(yǎng)殖自動(dòng)化是現(xiàn)代智慧牧場(chǎng)發(fā)展的趨勢(shì),準(zhǔn)確監(jiān)測(cè)其行為信息對(duì)于判斷牛的生理健康狀況有重要作用,可以及時(shí)發(fā)現(xiàn)牛的異常行為,采取治療措施,減少養(yǎng)殖場(chǎng)的經(jīng)濟(jì)損失。反芻作為牛羊等瘤胃動(dòng)物所特有的行為,牛的反芻監(jiān)測(cè)是牛健康監(jiān)控中的一項(xiàng)重要影響因子,反芻時(shí)間及頻次的變化與牛的健康狀況以及生理狀態(tài)息息相關(guān)。生產(chǎn)中可以通過(guò)反芻時(shí)間的不同對(duì)牛日糧成分及顆粒度進(jìn)行修改,實(shí)現(xiàn)不同牛的精準(zhǔn)飼養(yǎng),反芻監(jiān)測(cè)還可以用于奶牛發(fā)情行為判別,也可以對(duì)牛的健康狀況進(jìn)行判斷,及時(shí)發(fā)現(xiàn)疾病特別是消化系統(tǒng)疾病,及早進(jìn)行治療。
就目前而言,牛的反芻行為的監(jiān)測(cè)大多通過(guò)人工觀測(cè)或配有傳感器的接觸式設(shè)備進(jìn)行,接觸式設(shè)備主要有壓力傳感器、加速度傳感器、聲音收集裝置3 類,雖然這些接觸式設(shè)備可以較好地識(shí)別出牛的反芻行為以及反芻的時(shí)間、次數(shù)等,但是由于它們需要接觸牛的身體,可能產(chǎn)生動(dòng)物福利問(wèn)題,且易損壞。在現(xiàn)代化大規(guī)模的養(yǎng)殖場(chǎng)中,使用計(jì)算機(jī)視覺(jué)的方法無(wú)需接觸動(dòng)物身體,對(duì)牛的反芻行為進(jìn)行自動(dòng)檢測(cè)識(shí)別更為合適。通過(guò)計(jì)算機(jī)視覺(jué)技術(shù)對(duì)動(dòng)物反芻行為自動(dòng)檢測(cè)的應(yīng)用還比較少,主要有以下幾種方式:采用Horn-Schunck 光流法實(shí)現(xiàn)反芻奶牛嘴部區(qū)域的檢測(cè);運(yùn)用均值漂移算法對(duì)牛嘴區(qū)域進(jìn)行精確跟蹤,提取牛嘴運(yùn)動(dòng)的質(zhì)心軌跡曲線,實(shí)現(xiàn)對(duì)奶牛反芻的識(shí)別;還有通過(guò)對(duì)比核相關(guān)濾波算法和壓縮跟蹤算法對(duì)奶牛嘴部的跟蹤效果,驗(yàn)證了KCF 對(duì)奶牛反芻行為監(jiān)測(cè)的可行性,為本試驗(yàn)牛的頭部跟蹤起到啟示作用。本試驗(yàn)提出一種利用計(jì)算機(jī)視覺(jué)技術(shù)自動(dòng)識(shí)別牛的反芻行為,并計(jì)算反芻時(shí)間和反芻咀嚼次數(shù),為牛反芻行為的智能監(jiān)測(cè)提供參考。
1.1 試驗(yàn)視頻采集 本次試驗(yàn)視頻采集于2020 年10 月中旬內(nèi)蒙古自治區(qū)包頭市的養(yǎng)殖場(chǎng),視頻采集當(dāng)天為晴天,通過(guò)手持?jǐn)z像機(jī)的方式采集視頻,視頻幀率為30 幀/s,篩選出只含單目標(biāo)牛并且能清晰看出其頭部在進(jìn)行反芻的視頻共7 段。在這7 段視頻中,牛是以臥躺的姿態(tài)反芻,編號(hào)2、3、43 段視頻采集于室外,光線較好,編號(hào)1、5、6、74 段視頻采集于室內(nèi),光照較弱,同時(shí)牛也有部分時(shí)間的非反芻行為(轉(zhuǎn)頭、抬頭、靜止等),通過(guò)人工觀測(cè)的方式對(duì)其進(jìn)行統(tǒng)計(jì),得到每段視頻的反芻時(shí)間與反芻的咀嚼次數(shù)。反芻視頻信息統(tǒng)計(jì)情況,如表1所示,反芻的咀嚼次數(shù)以牛嘴部的一張一合記為1次。
表1 反芻視頻信息的人工統(tǒng)計(jì)
1.2 技術(shù)方案 牛反芻行為識(shí)別與分析的總體技術(shù)方案示意圖如圖1 所示。采用YOLOv4-tiny 模型對(duì)收集到的牛的圖片進(jìn)行訓(xùn)練,檢測(cè)牛的頭部,利用YOLOv4和KCF 結(jié)合的方法跟蹤牛的頭部,之后用幀間差分法對(duì)相鄰兩幀的牛頭部圖像進(jìn)行差分,提取出牛頭部的運(yùn)動(dòng)輪廓圖像,轉(zhuǎn)化為二值圖,對(duì)其進(jìn)行分割,得到頭部?jī)刹糠值倪\(yùn)動(dòng)輪廓二值圖,通過(guò)計(jì)算二值圖中白色像素點(diǎn)個(gè)數(shù),得到反芻參數(shù),設(shè)置合適的閾值判斷牛是否反芻,得到牛的反芻時(shí)間,根據(jù)反芻時(shí)的下顎運(yùn)動(dòng)輪廓二值圖中白色像素點(diǎn)個(gè)數(shù)的變化規(guī)律得到反芻的咀嚼次數(shù),最后與人工觀測(cè)的反芻時(shí)間與咀嚼次數(shù)進(jìn)行對(duì)比,驗(yàn)證此算法的可行性。
1.3 牛的頭部跟蹤 牛反芻時(shí),身體一般處于放松狀態(tài),除了頭部的咀嚼運(yùn)動(dòng)外,其余部分基本保持靜止,或者運(yùn)動(dòng)幅度較小,為防止身體其他部分的運(yùn)動(dòng)對(duì)試驗(yàn)造成影響,對(duì)牛的頭部進(jìn)行跟蹤提取。
1.3.1 YOLOv4 目標(biāo)檢測(cè) 試驗(yàn)前收集大約2 500 張牛的圖像數(shù)據(jù),使用labelImg 工具對(duì)牛頭部進(jìn)行標(biāo)注,按照8:2 的比例分為訓(xùn)練集和測(cè)試集,2 000 張作為訓(xùn)練集,500 張作為測(cè)試集,試驗(yàn)使用YOLO 目標(biāo)檢測(cè)算法中的YOLOv4-tiny 模型進(jìn)行訓(xùn)練,調(diào)用訓(xùn)練好的模型檢測(cè)牛頭部,YOLOv4-tiny 模型結(jié)構(gòu)如圖1 中Training 模塊所示。YOLOv4-tiny 模型訓(xùn)練的系統(tǒng)環(huán)境為:Ubuntu 16.04 操作系統(tǒng),CPU 為Intel(R)Core(TM)i9-9900K,主頻為3.60GHz,GPU 為NVIDIA GeForce GTX 2080Ti×2,運(yùn)行內(nèi)存為64 GB。
1.3.2 KCF 算法原理 KCF(核相關(guān)濾波算法)通過(guò)訓(xùn)練一個(gè)跟蹤器,對(duì)目標(biāo)區(qū)域進(jìn)行跟蹤,是一種判別式目標(biāo)跟蹤算法,需要先在給出的視頻幀圖像中框出目標(biāo)區(qū)域進(jìn)行初始化,并且在目標(biāo)區(qū)域周圍進(jìn)行平移采樣,生成大量正負(fù)樣本訓(xùn)練跟蹤器,利用循環(huán)矩陣經(jīng)過(guò)傅立葉變換可對(duì)角化的性質(zhì),簡(jiǎn)化算法的運(yùn)算量,提高運(yùn)算速度,通過(guò)跟蹤器所預(yù)測(cè)的下一幀目標(biāo)位置與真實(shí)的下一幀位置的最大響應(yīng)值來(lái)確定目標(biāo)區(qū)域新位置,并根據(jù)目標(biāo)新位置訓(xùn)練新的跟蹤器,實(shí)現(xiàn)對(duì)目標(biāo)區(qū)域的跟蹤。
牛頭部的跟蹤采用KCF 與YOLO 結(jié)合的方式實(shí)現(xiàn),牛頭部跟蹤的算法流程圖如圖1 中模塊②所示。利用OpenCV 調(diào)用訓(xùn)練好的YOLOv4-tiny 模型對(duì)視頻幀圖像進(jìn)行檢測(cè),若能檢測(cè)到牛的頭部,則用其檢測(cè)框初始化KCF 進(jìn)行跟蹤,若該幀中未能檢測(cè)到牛的頭部,則繼續(xù)檢測(cè)下一幀,直至得到牛的頭部檢測(cè)框,開(kāi)始跟蹤牛的頭部。由于KCF 進(jìn)行目標(biāo)跟蹤時(shí)無(wú)法適應(yīng)目標(biāo)的尺度變化,可能產(chǎn)生偏移誤差,試驗(yàn)結(jié)合YOLO 的檢測(cè)對(duì)KCF 的跟蹤框進(jìn)行更新,每隔30 幀調(diào)用一次訓(xùn)練好的YOLOv4-tiny 模型對(duì)視頻幀圖像進(jìn)行檢測(cè),若當(dāng)前幀YOLO 的檢測(cè)框與KCF 跟蹤框的中心點(diǎn)距離相近,則繼續(xù)跟蹤,反之,則使用新的檢測(cè)框初始化KCF 進(jìn)行跟蹤,從而獲得比較準(zhǔn)確穩(wěn)定的牛頭部圖像,以固定大小進(jìn)行存儲(chǔ)。
圖1 總體技術(shù)方案示意圖
利用本文算法對(duì)牛的頭部跟蹤效果還比較理想,一般牛反芻的頭部運(yùn)動(dòng)較小,KCF 可以較好地跟蹤到牛的頭部,但牛有時(shí)會(huì)轉(zhuǎn)頭扭頭等,其中視頻4 中牛在15~17 s 有轉(zhuǎn)頭的運(yùn)動(dòng),用此算法仍可較好的跟蹤到牛的頭部,牛轉(zhuǎn)頭過(guò)程中部分幀的頭部跟蹤效果如圖2 所示。
圖2 牛的頭部跟蹤效果
1.4 牛反芻行為識(shí)別 在得到牛的頭部圖像后,需要對(duì)其進(jìn)行進(jìn)一步處理,獲取牛的反芻參數(shù),以判斷牛是否在反芻。試驗(yàn)采用幀間差分法得到牛的頭部運(yùn)動(dòng)輪廓圖像,即取得相鄰兩視頻幀的牛的頭部圖像后,轉(zhuǎn)化成灰度圖像,用高斯濾波進(jìn)行處理,通過(guò)幀間差分法得到圖像像素點(diǎn)灰度差的絕對(duì)值,從而獲得牛的頭部運(yùn)動(dòng)輪廓圖,只保留輪廓圖中像素點(diǎn)的差值大于閾值的點(diǎn),進(jìn)一步去除噪點(diǎn),并轉(zhuǎn)換為二值圖,對(duì)其進(jìn)行分割,進(jìn)一步計(jì)算反芻參數(shù)。
牛反芻時(shí)下顎部分會(huì)進(jìn)行運(yùn)動(dòng),圖3 中(1)為牛反芻時(shí)嘴部閉合圖像與嘴部張開(kāi)至最大的頭部圖像,以及幀差后的二值圖,圖3 中(2)為牛靜止時(shí)的頭部圖像和幀差后的圖像,可以看出反芻時(shí)頭部運(yùn)動(dòng)的白色像素點(diǎn)較多,靜止時(shí)則幾乎沒(méi)有白色像素點(diǎn)。
圖3 牛反芻與靜止的頭部變化對(duì)比圖
1.4.1 反芻參數(shù)計(jì)算 一般來(lái)說(shuō),牛的下顎部分在其頭部圖像中所占比例較小,約為1/3,采用2:1 的比例分割牛的頭部運(yùn)動(dòng)輪廓二值圖,將其分割為頭頂與下顎2個(gè)部分,如圖4 所示,以此進(jìn)一步計(jì)算牛的反芻參數(shù)。
圖4 牛的頭部運(yùn)動(dòng)輪廓二值圖
算法分別統(tǒng)計(jì)了每幀牛的頭部圖像的頭頂與下顎兩部分的運(yùn)動(dòng)輪廓二值圖中白色像素點(diǎn)的個(gè)數(shù)ti 和ji。由于反芻牛嘴部張合過(guò)程中會(huì)有少部分視頻幀之間變化過(guò)小,導(dǎo)致運(yùn)動(dòng)輪廓二值圖中白色像素點(diǎn)個(gè)數(shù)太少,無(wú)法直接判斷出牛是否在進(jìn)行反芻。試驗(yàn)采取計(jì)算25 幀白色像素點(diǎn)個(gè)數(shù)平均值的方法進(jìn)行判斷,分別計(jì)算頭頂與下顎兩部分的二值圖中25 幀(當(dāng)前幀與前24 幀)白色像素點(diǎn)個(gè)數(shù)的平均值averti 和averji,如式(1)所示,作為反芻參數(shù),用于后續(xù)的反芻行為識(shí)別。
式中,t為第i 幀牛的頭頂白色像素點(diǎn)個(gè)數(shù),j為第i 幀牛的下顎白色像素點(diǎn)個(gè)數(shù)。
1.4.2 反芻閾值的獲取 牛在反芻時(shí),一般只有頭部的下顎部分運(yùn)動(dòng),其他部分可能有輕微運(yùn)動(dòng),但運(yùn)動(dòng)幅度較小,需要確定反芻的下顎與頭頂部分的閾值區(qū)間,按以下步驟獲?。孩?gòu)牟煌T诜雌c的視頻中各截取5 s;②計(jì)算出截取的視頻中牛反芻參數(shù)avert和averj的值;③計(jì)算其中下顎部分白色像素點(diǎn)個(gè)數(shù)averj的最小值minj、最大值maxj,和頭頂部分白色像素點(diǎn)個(gè)數(shù)avert的最大值maxt;④(0.8minj,1.2maxj)作為反芻下顎部分的閾值區(qū)間,1.2maxt 作為反芻頭頂部分的最大閾值。
若當(dāng)前幀的頭部運(yùn)動(dòng)輪廓的二值圖像的下顎和頭頂兩部分的白色像素點(diǎn)個(gè)數(shù)的平均值avert和averj均處于其對(duì)應(yīng)的反芻閾值區(qū)間內(nèi),即滿足式(2),則判定此時(shí)目標(biāo)牛正在進(jìn)行反芻,并添加反芻標(biāo)志rflag;反之,牛正在進(jìn)行非反芻行為。
1.5 牛反芻時(shí)間計(jì)算 若在當(dāng)前視頻幀中檢測(cè)到反芻標(biāo)志rflag,反芻幀數(shù)加一;反之,牛正在進(jìn)行其他行為,幀數(shù)不變,直至視頻結(jié)束,即可得到該視頻中牛的總反芻幀數(shù)。
根據(jù)時(shí)間、視頻幀數(shù)與幀率的關(guān)系,如公式(3)所示,即可計(jì)算出視頻中目標(biāo)牛的總反芻時(shí)間,結(jié)束運(yùn)行后,輸出反芻時(shí)間。
式中,Time 為反芻時(shí)間;Framecount 為反芻的視頻幀數(shù);FPS 為幀率。
1.6 反芻的咀嚼次數(shù)計(jì)算 若當(dāng)前視頻幀可檢測(cè)到反芻標(biāo)志,則進(jìn)一步判斷其咀嚼次數(shù)。牛反芻時(shí),嘴部會(huì)重復(fù)進(jìn)行張開(kāi)-閉合的動(dòng)作,下顎的運(yùn)動(dòng)輪廓二值圖的變化呈現(xiàn)出一定的規(guī)律性,其白色像素點(diǎn)個(gè)數(shù)j 會(huì)隨著嘴部的張開(kāi)增大,嘴部閉合時(shí)逐漸減小,如圖5 所示。
圖5 牛反芻時(shí)下顎運(yùn)動(dòng)二值圖中白色像素點(diǎn)數(shù)量變化
試驗(yàn)采用極大值點(diǎn)的個(gè)數(shù)來(lái)確定牛反芻的咀嚼次數(shù),極大值點(diǎn)即當(dāng)前視頻幀圖像中牛的下顎運(yùn)動(dòng)輪廓二值圖中白色像素點(diǎn)個(gè)數(shù)ji 滿足式(4):
一般牛反芻咀嚼一次的時(shí)間要0.8 s 以上,本次試驗(yàn)的視頻幀率為30,為了減少輕微抖動(dòng)產(chǎn)生的誤差,還需設(shè)置相鄰兩次咀嚼即相鄰兩極大值點(diǎn)的幀數(shù)之差應(yīng)大于24,咀嚼次數(shù)的計(jì)算流程圖如圖6 所示。
圖6 咀嚼次數(shù)計(jì)算流程圖
①判斷當(dāng)前幀下顎白色像素點(diǎn)個(gè)數(shù)j是否為極大值點(diǎn),若不是,咀嚼次數(shù)不變;
②若為極大值點(diǎn),判斷之前是否有咀嚼,若沒(méi)有,即為第一次咀嚼,此時(shí)咀嚼次數(shù)fcount 為1,記錄此時(shí)咀嚼幀數(shù),即rcount 等于i;
③若不是第一次咀嚼,判斷當(dāng)前幀數(shù)i 與上次咀嚼幀數(shù)rcount 之差是否大于24,若小于24,則認(rèn)為是抖動(dòng)誤差,咀嚼次數(shù)不變;
④若大于,咀嚼次數(shù)fcount 加1,記錄此時(shí)咀嚼幀數(shù),即rcount 等于i;
繼續(xù)檢測(cè)直至視頻結(jié)束,得到視頻中牛反芻的總咀嚼次數(shù)。
本試驗(yàn)在Windows10 環(huán)境下實(shí)現(xiàn),CPU 為Intel(R)Core(TM)i7-7500U,GPU 為NVIDIA GeForce 920MX,主頻2.70 GHz,顯存2 G,運(yùn)行內(nèi)存8 G。
反芻時(shí)間的誤差(r)根據(jù)公式(5)進(jìn)行計(jì)算:
式中,Stime 為試驗(yàn)得到的反芻時(shí)間;Atime 為人工觀測(cè)的反芻時(shí)間。
反芻的咀嚼次數(shù)誤差(c)根據(jù)公式(6)進(jìn)行計(jì)算:
式中,Cfre 為試驗(yàn)得到的咀嚼次數(shù);Acfre 為人工觀測(cè)的咀嚼次數(shù)。
平均誤差(aver)根據(jù)公式是(7)進(jìn)行計(jì)算:
式中,error 為試驗(yàn)的誤差(反芻時(shí)間誤差r 或反芻咀嚼次數(shù)誤差c)。
試驗(yàn)對(duì)采集的視頻進(jìn)行檢測(cè),得到反芻時(shí)間與咀嚼次數(shù)的結(jié)果,與人工觀測(cè)的反芻時(shí)間與咀嚼次數(shù)進(jìn)行對(duì)比,得到此算法的誤差如表2 所示,反芻時(shí)間的最小誤差為2.817%,最大誤差為6.667%,反芻時(shí)間的平均誤差為4.193%;反芻的咀嚼次數(shù)誤差最小為3.409%,最大誤差為6.667%,咀嚼次數(shù)的平均誤差為4.929%。
表2 反芻時(shí)間與咀嚼次數(shù)的試驗(yàn)結(jié)果與誤差
試驗(yàn)視頻中牛也會(huì)進(jìn)行其他行為,但由于牛進(jìn)行其他行為時(shí),相比反芻時(shí)其頭部的運(yùn)動(dòng)幅度相對(duì)較大,白色像素點(diǎn)較多,仍可以較好地識(shí)別出牛的反芻行為。試驗(yàn)視頻采集于養(yǎng)殖場(chǎng)室內(nèi)光照偏弱和室外光線較強(qiáng)2 種場(chǎng)景下,但試驗(yàn)結(jié)果還比較準(zhǔn)確,此方法可以用于養(yǎng)殖場(chǎng)中牛反芻行為自動(dòng)識(shí)別。
試驗(yàn)中誤差略大的3 號(hào)視頻,有部分誤差是由于視頻拍攝過(guò)程中攝像機(jī)移動(dòng)產(chǎn)生的抖動(dòng),在實(shí)際使用中,攝像頭固定,反芻時(shí)間與咀嚼次數(shù)的計(jì)算準(zhǔn)確率可能會(huì)略有提升。
試驗(yàn)暫未考慮到其他因素的影響,目前試驗(yàn)中牛的頭部檢測(cè)是對(duì)單目標(biāo)進(jìn)行的,僅能自動(dòng)識(shí)別視頻中單頭牛的反芻行為,多頭牛場(chǎng)景的反芻行為識(shí)別還需進(jìn)一步改進(jìn)研究多目標(biāo)的檢測(cè)算法。
牛反芻的變化與多種疾病相關(guān),密切監(jiān)控牛的反芻時(shí)間與咀嚼次數(shù)可以及早發(fā)現(xiàn)并治療牛的疾病,本文提出了一種基于計(jì)算機(jī)視覺(jué)的反芻行為識(shí)別方法,并分析計(jì)算其反芻時(shí)間與咀嚼次數(shù),對(duì)7 段視頻進(jìn)行驗(yàn)證,得到反芻時(shí)間和咀嚼次數(shù)的平均相對(duì)誤差率分別為4.193%和4.929%,誤差率較小,說(shuō)明此方法基本可以滿足牛養(yǎng)殖過(guò)程中反芻行為自動(dòng)監(jiān)測(cè)要求,為牛日常行為監(jiān)測(cè)與智能養(yǎng)殖提供技術(shù)支持。