說明文件

Geek-opk發表於2024-10-06

這篇文件主要介紹《基於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) 針對環境的問題
環境的問題每個人遇見的都不一樣,可自行上網查詢。

相關文章