這篇文件主要介紹《基於YOLOv8的農田病蟲害檢測與分析》的程式碼實現部分,整篇論文的目的主要是改進YOLOv8的網路結構,使其在檢測病蟲害的精度和實時性上有所提升。接下來,我將介紹如何從零開始搭建起本專案。
安裝Python
到python的官方網站:https://www.python.org/下載,安裝
安裝完成後,在命令列視窗執行:python,檢視安裝的結果,如下圖:
至此,Python安裝完成,接下來還需要安裝anaconda,這是一個python虛擬環境,特別適合管理python的環境。
安裝anaconda
到anaconda的官方網站:https://www.anaconda.com/download/success下載,並安裝:
安裝成功後,會在開始選單出現如下圖所示:
anaconda安裝完成,接下來安裝pycharm,主要用來編寫程式碼。
安裝Pycharm
學生可以申請教育版
支援,所有的軟體安裝完成。
YOLOv8目錄結構介紹
首先介紹整個專案的目錄:
和原來的YOLOv8相比,根目錄新增一些訓練的指令碼和測試的指令碼,比如train.py和Detect.py,當然也可以直接透過命令列的方式來實現,兩者效果都是一樣的。
重點是ultralytics/nn目錄,所有的改進模組都是在這裡進行,在這裡我新建了一個Addmodules的目錄,裡面是改進的各種模組,包括主幹網路,頸部網路和檢測頭的改進。
需要修改的部分我都已經作了修改,不用再做其他的改動
還有一個重要的目錄:ultralytics/cfg/models/Add,這裡面放的都是yaml檔案,其中改進的yaml檔案都已經寫好,不需要改動。
以下是一個yaml檔案的示例,其它的都是類似的結構,只是引數不同:
安裝專案的環境(非常重要)
環境配置非常重要,我當時配環境換了一週左右的時間,中間經歷了各種報錯,軟體包不相容的問題和顯示卡驅動匹配的問題,總之就是不好搞。為了方面復現工作,我已經把anaconda的環境匯出為environment.yml,位於專案的根目錄裡面,建立虛擬環境的時候直接使用就可以
anaconda虛擬環境
再anaconda prompt終端輸入conda env create -f environment.yml,就可以根據environment.yml檔案建立虛擬環境,建立好後,透過conda env list檢視環境是否存在,如下圖所示就表明建立成功:
如果安裝的時候出現torch相關的錯誤,大機率是你的顯示卡驅動和這裡面的torch包版本不匹配,這個問題需要自行修改即可,網上關於這方面的資料很多。
使用虛擬環境
虛擬環境建立完成之後,就可以在pycharm中使用,點選右下角,切換conda環境,選擇剛才建立的虛擬環境。如果到了這一步還沒有報錯的話,恭喜你,已經完成了80%的工作。
執行Detect.py指令碼,測試檢測效果,如果沒有報錯,接下來就是訓練模型。
訓練指令碼train.py
找到根目錄的train.py檔案,註釋已經寫的很清楚,如下圖:
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('yolov8-HSFPN.yaml')
# model.load('yolov8n.pt') # 是否載入預訓練權重,科研不建議大家載入否則很難提升精度
model.train(data=r'D:/Downloads/YOLOv8/datasets/data.yaml',
# 如果大家任務是其它的'ultralytics/cfg/default.yaml'找到這裡修改task可以改成detect, segment, classify, pose
cache=False,
imgsz=640,
epochs=150,
single_cls=False, # 是否是單類別檢測
batch=4,
close_mosaic=10,
workers=0,
device='0',
optimizer='SGD', # using SGD
# resume='runs/train/exp21/weights/last.pt', # 如過想續訓就設定last.pt的地址
amp=True, # 如果出現訓練損失為Nan可以關閉amp
project='runs/train',
name='exp',
)
model = YOLO('yolov8-HSFPN.yaml'),把裡面的yaml檔案換成自己的yaml檔案,我這裡用的是yolov8-HSFPN.yaml,data=r'D:/Downloads/YOLOv8/datasets/data.yaml,同理,換成自己資料集的yaml檔案,我這裡的資料集是yolo格式。其它的引數可以按照自己的任務自行調整。
還有一個檢測的指令碼,Detect.py:
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('D:/Downloads/YOLOv8/result/result_8_HSFPN/train/exp/weights/best.pt') # select your model.pt path
model.predict(source='D:/Downloads/YOLOv8/ultralytics/assets',
imgsz=640,
project='runs/detect',
name='exp',
save=True,
)
同理,把best.pt換成你自己訓練好的模型,source裡面輸入檢測圖片的路徑,執行該指令碼就可以開始檢測,結果儲存在runs/detect目錄。
開始訓練
準備好資料集,最好是yolo格式的,我的資料集專案裡自帶了,不需要重新下載:
datasets目錄裡面就是我的資料集:有train,test,valid三個目錄,分別存放訓練集,測試集和驗證集的影像和標籤:
準備這些之後,執行train.py檔案,開始訓練。如果報錯的話,請自行上網查詢,無非就是找不到資料集,某個包的版本不對,或者是GPU用不了,只能用CPU。
訓練結果
訓練結果會儲存在runs/train目錄下,exp1,exp2,exp3的順序,表示每一次的訓練結果。
上圖就是訓練完成後目錄的結構,weights目錄裡面就是我們需要的模型:best.pts是效果最好的,最後也是需要這個,last.pt是最後一次的訓練結果。
總結
整個專案的改進工作我已經做好,復現的話只需裝好對應的環境,修改train.py的引數,執行train.py就可以開始訓練;修改Detect.py的引數,就可以檢測。目前專案只針對檢測任務,對於分割和分類沒有做改進。
經驗之談
(1)以下為兩個重要庫的版本,必須對應下載,否則會報錯
python == 3.9.7
pytorch == 1.12.1
timm == 0.9.12 # 此安裝包必須要
mmcv-full == 1.6.2 # 不安裝此包部分關於dyhead的程式碼執行不了以及Gold-YOLO
(2)mmcv-full會安裝失敗是因為自身系統的編譯工具有問題,也有可能是環境之間安裝的有衝突
推薦大家離線安裝的形式,下面的地址中大家可以找找自己的版本,下載到本地進行安裝。
https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html
https://download.openmmlab.com/mmcv/dist/index.html
(3)basicsr安裝失敗原因,透過pip install basicsr 下載如果失敗,大家可以去百度搜一下如何換下載映象源就可以修復
針對一些報錯的解決辦法在這裡說一下
(1)訓練過程中loss出現Nan值.
可以嘗試關閉AMP混合精度訓練.
(2)多卡訓練問題,修改模型以後不能支援多卡訓練可以嘗試下面的兩行命令列操作,兩個是不同的操作,是代表不同的版本現嘗試第一個不行用第二個
python -m torch.distributed.run --nproc_per_node 2 train.py
python -m torch.distributed.launch --nproc_per_node 2 train.py
(3) 針對執行過程中的一些報錯解決
1.如果訓練的過程中驗證報錯了(主要是一些形狀不匹配的錯誤這是因為驗證集的一些特殊圖片導致)
找到ultralytics/models/yolo/detect/train.py的DetectionTrainer class中的build_dataset函式中的rect=mode == 'val'改為rect=False
2.推理的時候執行detect.py檔案報了形狀不匹配的錯誤
找到ultralytics/engine/predictor.py找到函式def pre_transform(self, im),在LetterBox中的auto改為False
3.訓練的過程中報錯型別不匹配的問題
找到'ultralytics/engine/validator.py'檔案找到 'class BaseValidator:' 然後在其'__call__'中
self.args.half = self.device.type != 'cpu' # force FP16 val during training的一行程式碼下面加上self.args.half = False
(4) 針對yaml檔案中的nc修改
不用修改,模型會自動根據你資料集的配置檔案獲取。
這也是模型列印兩次的區別,第一次列印出來的就是你選擇模型的yaml檔案結構,第二次列印的就是替換了你資料集的yaml檔案,模型使用的是第二種。
(5) 針對環境的問題
環境的問題每個人遇見的都不一樣,可自行上網查詢。