王琰,郭祺赟,畢美華
(杭州電子科技大學通信工程學院,浙江杭州,310016)
近年來,隨著水產(chǎn)養(yǎng)殖業(yè)規(guī)模的迅速加大和監(jiān)控設備的普及,智能化的養(yǎng)殖狀態(tài)監(jiān)測和信息管理技術(shù)受到越來越廣泛的關注[1]。本文從魚塘養(yǎng)殖環(huán)境進行分析,設計了一套基于YOLOv5的魚塘養(yǎng)殖系統(tǒng)。此系統(tǒng)不僅可以實時監(jiān)測水體環(huán)境因素,還可以通過機器學習模型實現(xiàn)魚類的分類,方便記錄魚體活動,并針對魚類行為進行深入分析,反映魚體的生存情況[2],提高養(yǎng)殖效率,降低人工成本。
本系統(tǒng)主要分為水質(zhì)監(jiān)測與目標檢測兩個部分。水質(zhì)監(jiān)測部分中,使用嵌入式單片機STM32與各類傳感器進行數(shù)據(jù)的讀取和分析,樹莓派與STM32之間使用串口通信協(xié)議獲取傳感器采集得到的數(shù)據(jù),再將傳感器的數(shù)據(jù)信息傳輸給Flask框架部署的Web端顯示。目標檢測部分使用樹莓派自帶的攝像頭進行拍照,然后使用已經(jīng)訓練好的模型進行識別,使用的模型基于yolov5,最后將識別結(jié)果傳輸?shù)紽lask框架,顯示在網(wǎng)頁上。圖1為機器學習和FLASK框架的養(yǎng)殖監(jiān)測設計的結(jié)構(gòu)圖。
圖1 系統(tǒng)結(jié)構(gòu)
在水質(zhì)監(jiān)測模塊中,使用嵌入式單片機獲取傳感器數(shù)據(jù)。單片機通過可以感知水質(zhì)環(huán)境的各類傳感器進行交互,并且通過定時循環(huán),可以做到定時采樣環(huán)境數(shù)據(jù)并且將原始數(shù)據(jù)進行處理打包,然后與樹莓派進行串口通信[3],將采集到的水質(zhì)數(shù)據(jù)發(fā)送給樹莓派,水質(zhì)檢測模塊的系統(tǒng)框圖如圖2所示。
圖2 水質(zhì)監(jiān)測模塊系統(tǒng)框圖
在傳感器交互端,本系統(tǒng)采用了四種傳感器來獲取水質(zhì)數(shù)據(jù),分別是溫度采集、濁度采集、pH采集和溶解氧采集。通過這四種傳感器,可以獲得較為準確的水質(zhì)數(shù)據(jù),同時這四種水質(zhì)數(shù)據(jù)對于魚類養(yǎng)殖有著至關重要的作用。
對于魚塘的溫度采集,雖然單片機內(nèi)部自帶了溫度傳感器,但是因為芯片發(fā)熱導致溫升較大等問題,與實際溫度差別較大,并且制作防水外殼費時費力,難度大。因此本系統(tǒng)采用外接的方式,使用數(shù)字溫度傳感器DS18B20來得到較為準確的水溫。DS18B20的工作電壓范圍為3-5.5V,接線方便,封裝靈活,可以使用防水探頭工作,體積小,功耗低,抗干擾能力強,使得系統(tǒng)設計較為靈活,還可以在更為復雜的環(huán)境下使用。同時它有掉電儲存機制,設定的溫度分辨率會儲存在EEPROM中,以便在通電時直接讀取使用,不需要再次校正。利用單總線技術(shù)來使得單片機與其進行通信,只需要一條口線即可以實現(xiàn)雙向通信。
濁度采集使用專用的總?cè)芙夤腆w(TDS)傳感器進行測量。其激勵源為交流信號,可以有效防止探頭極化,并且可以使用防水探頭工作,長期浸于水中采集數(shù)據(jù)。TDS傳感器在使用前需要進行校準修正參數(shù),在測量過程中,其會根據(jù)總?cè)芙夤腆w量輸出一個模擬電壓,單片機使用內(nèi)部模數(shù)轉(zhuǎn)換模塊采集這個電壓,并最后將其量化轉(zhuǎn)換成相應的溶解性固體總量。
pH采集電路由穩(wěn)壓源電路、電壓跟隨電路與信號放大電路組成。與TDS傳感器一樣,采集pH使用的傳感器在使用前也需要進行校準。其校準方法為將pH傳感器的電極分別放入pH值不同的標準溶液中,并調(diào)節(jié)電位器旋鈕使模擬輸出口輸出電壓到指定值附近。pH傳感器使用防水探頭進行采集工作,輸出的模擬電壓值,需要通過單片機進行電壓采集與模數(shù)轉(zhuǎn)換,得到pH值結(jié)果。
溶解氧采集傳感器在使用前需要進行兩點校準,即校準不同溫度下的飽和溶解氧。使用兩點校準可以進行溫度補償計算,適用于寬溫度范圍的溶解氧測量。當溫度固定時,電壓與溶解氧濃度成線性關系,可以由輸出電壓轉(zhuǎn)換得到水中的溶解氧。
本系統(tǒng)所使用的樹莓派4B擁有兩個串口,分別是硬件串口ttyAMA0與mini串口ttyS0。其中硬件串口ttyAMA0有單獨的波特率時鐘源,性能好,穩(wěn)定性強,默認分配給藍牙模塊使用;而mini串口ttyS0相對功能簡單,穩(wěn)定性較差,并且波特率由CPU內(nèi)核時鐘提供,受內(nèi)核時鐘影響,默認分配給GPIO串口TXD0和RXD0。在樹莓派4B中,TX對應GPIO口8腳,RX對應GPIO口10腳。但在使用過程中需要注意,mini串口的波特率隨CPU內(nèi)核時鐘的變化而變化,如果使用該串口經(jīng)常會導致因時鐘頻率發(fā)生變化而產(chǎn)生的錯誤,因此需要將硬件串口映射到GPIO串口上,以保證串口信息交換的穩(wěn)定,而硬件串口默認是分配給板載藍牙使用,所以需要首先釋放掉硬件串口,并將其映射到GPIO串口。
讀取傳感器信息的是自制的STM32F407最小系統(tǒng)板,使用串口1,對應的TXD為PA9,RXD為PA10。樹莓派發(fā)送定時信息到STM32,STM32在接收到消息后觸發(fā)串口中斷,STM32將當前采集到的溫度、PH值、水質(zhì)濁度和溶解氧信息回傳給樹莓派,以完成對水質(zhì)數(shù)據(jù)信息的獲取,樹莓派接收信息后刷新網(wǎng)頁,以實現(xiàn)數(shù)據(jù)在網(wǎng)頁上的動態(tài)更新。
首先,YOLOv5相比于早先的模型,例如Fast R-CNN,先前的檢測模型使用的是利用分類器或者定位器來執(zhí)行檢測,先生成可能的大邊框,再將模型應用與檢測多個位置和比例的圖像。將檢測到圖像較大可能性的區(qū)域作為結(jié)果。但是從YOLOv3開始,yolo就開始使用完全不同的方法進行預測,將單個神經(jīng)網(wǎng)絡應用于整個圖像,將圖像劃分成多個區(qū)域,預測區(qū)域邊框和概率,因為在測驗的時候采用的是全局上下關聯(lián)生成,所以有較快的速度。
其次,YOLOv5相較于YOLOv3,在性能上有著很大的提升。我們使用的模型是根據(jù)YOLOv5s進行更改的,YOLOv5s是YOLOv5系列中特征圖寬度最小、深度最淺的模型。所以YOLOv5s的模型是最小的也是需要算力最少的一個模型。通過對比YOLOv5s和YOLOv5的其他模型,可以明顯的看到Y(jié)OLOv5的網(wǎng)絡最小,速度最快但是AP精度較低,考慮到我們只檢測魚類的檢測,同時樹莓派只能通過中央處理器進行運算,無專用的圖形處理器,其算力極低。因此yolov5s很適合我們在樹莓派上進行目標檢測。
如圖3所示,YOLOv5主要分為四個部分,分別是輸入端,Backbone,Neck,Prediction。
圖3 YOLOv5架構(gòu)
相比YOLOv3輸入端增加了Mosaic數(shù)據(jù)增強,自適應瞄框計算,自適應圖片縮放。Mosaic為使用四張圖片進行隨機縮放剪裁,隨機排布的方式進行拼接。使用這種方法可以提高檢測數(shù)據(jù)集的豐富性,隨機縮放也可以提升對于小目標的檢測。有利于我們在需要檢測多條魚時出現(xiàn)較多小目標的時候的目標檢測。自適應瞄框是不斷優(yōu)化初始瞄框,提高瞄框的準確度。在YOLOv3、YOLOv4中,訓練不同的數(shù)據(jù)集時,計算初始錨框的值是通過單獨的程序運行的。在網(wǎng)絡訓練中,網(wǎng)絡在初始錨框的基礎上輸出預測框,進而和真實框groudtruth進行比對,計算兩者差距,再反向更新,迭代網(wǎng)絡參數(shù)。但YOLOv5中將此功能嵌入到代碼中,每次訓練時,自適應的計算不同訓練集中的最佳錨框值。自適應圖片縮放可以減少在檢測時候的計算量,有利于提高檢測速度。
在Backbone加入了Focus結(jié)構(gòu)和CSP結(jié)構(gòu),在focus結(jié)構(gòu)中以切片操作為主,將圖片從608*608*3轉(zhuǎn)化為304*304*12的特征圖,經(jīng)過卷積核之后變成了304*304*32的特征圖。CSP結(jié)構(gòu)中采用兩種不同的CSP結(jié)構(gòu),在Yolov5s網(wǎng)絡中,CSP1_X結(jié)構(gòu)應用于Backbone主干網(wǎng)絡,另一種CSP2_X結(jié)構(gòu)則應用于Neck中,提高了檢測的準確度和效率。CSPNet(Cross Stage Partial Network):跨階段局部網(wǎng)絡,可以緩解以前需要大量推理計算的內(nèi)容。增強了學習能力,并且能夠在較少算力和內(nèi)存的情況下保持較好的準確性。
在Neck中加入了FPN+PAN結(jié)構(gòu),采用借鑒CSPnet設計的CSP2結(jié)構(gòu),提高了網(wǎng)絡特征的融合能力。在Prediction中加入了GIOU_Loss。
本系統(tǒng)使用Flask框架進行Web頁面的顯示。擁有豐富的工具包與活躍的開源社區(qū)Python語言,在Web開發(fā)數(shù)據(jù)可視化等領域的價值日漸增長。Flask[4]是由Python實現(xiàn)的一個Web微框架,讓我們可以使用Python語言快速實現(xiàn)一個網(wǎng)站或Web服務。通過該框架,從后端向前端發(fā)送數(shù)據(jù),前端拿到數(shù)據(jù)進行處理,可以通過折線圖或者表格的形式,將數(shù)據(jù)以可視化的方式展現(xiàn)出來,使數(shù)據(jù)更加客觀、更具說服力,能讓用戶清楚的獲得各種數(shù)據(jù)信息。使用樹莓派作為服務器,樹莓派使用ubuntu20.04,系統(tǒng)裝有Python3,可以完美運行pytorch以進行yolov5的圖像識別,同時運行Flask框架比較方便。
現(xiàn)代Web框架使用路由技術(shù)來幫助用戶記住應用程序URL,可以直接訪問所需的頁面,而無需從主頁導航。route裝飾器是用于把一個函數(shù)綁定到一個 URL 上。導入Flask類,使用命令“app = Flask(__name__)” 創(chuàng)建此類的實例。使用命令“@app.route(‘’)”設置參數(shù),即可設置路由映射到下一行的函數(shù)。比如設置為“/”時,則每次訪問該頁面時都將執(zhí)行該路由映射的函數(shù)。同時,該行代碼還支持擴展,可以使用methods參數(shù)指定可接受的請求方式,如“GET”、“POST”等。在html文件中使用“href=”來使用鏈接,完成路由。使用“$.post(“”)”來使用post請求方式,該操作還可以將前端的參數(shù)傳送到后端。Flask框架還可以調(diào)用”render_template()”方法來渲染模板。在當前目錄下,創(chuàng)建一個名為template的子目錄,在該目錄下保存網(wǎng)頁html5文件,即可通過return render_template(index.html’)來渲染模板,使頁面更豐富。添加參數(shù),**變量名,即可直接傳遞改變量。比如輸入一個字典的名稱即可將該字典中包含的參數(shù)和信息傳遞到后端。
通過該方式傳遞溫度信息、水質(zhì)信息和PH值到網(wǎng)頁上進行顯示。圖4為頁面顯示結(jié)果。
圖4 Web端目標檢測結(jié)果顯示
本系統(tǒng)設計基于傳感器與機器學習方案,實現(xiàn)了基于YOLOv5的魚塘養(yǎng)殖系統(tǒng)。通過對多種傳感器進行分析和比對,綜合了系統(tǒng)成本及傳感器精度等因素,選取了較為合適的傳感器,以實現(xiàn)對水質(zhì)數(shù)據(jù)的測量。同時,本文通過樹莓派系統(tǒng)和自主搭建的基于FLASK的網(wǎng)站,實現(xiàn)了對水質(zhì)數(shù)據(jù)的網(wǎng)絡傳輸以及存儲,并且為用戶提供了清晰的用戶界面,為用戶提供了便利。同時,本方案借助機器學習及YOLOv5s模型,對常用魚塘養(yǎng)殖魚類進行分析,能夠快速準確的識別常用魚類,方便了用戶對不同的魚類的分辨,實現(xiàn)了對魚類的智能識別功能。