主要代碼參考了https://github.com/datawhalechina/team-learning-cv/tree/master/DefectDetection的baseline,使用的YOLOv5系列模型,關于原始碼的注釋在YOLOV5訓練代碼train.py注釋與決議
記錄一下遇到的問題:
1、資料預處理問題

train.sh檔案中,第二步使用了process_data_yolo.py,原始碼中關于資料集存放位置存在問題,只寫了val的處理,沒寫train的處理,所以生成的process_data檔案夾中, 只有val而沒有train,訓練時會報錯,
所以不能直接用train.sh腳本,要順序運行里面的命令,到第二步的時候,先執行一遍,如下圖做修改后再執行一遍,從而把訓練集和驗證集都準備好,

2、 預訓練權重問題
使用如下命令訓練
python train.py --weights weights/yolov5x.pt --cfg models/yolov5x.yaml --batch-size 3
加載YOLOv5的官方預訓練權重,結果報錯
KeyError: "weights/yolov5m.pt is not compatible with models/yolov5m.yaml. This may be due to model differences or weights/yolov5x.pt may be out of date. Please delete or update weights/yolov5x.pt and try again, or use --weights '' to train from scratch."
谷歌后找到的官方原始碼的issue,https://github.com/ultralytics/yolov5/issues/222#issuecomment-650999053
在原始碼的120行做如下修改,就能正常加載權重了,

3、docker構建
3.1 本地訓練
首先在本地訓練幾個epoch,生成best.pt權重檔案,訓練的方式隨便,Windows環境、Linux環境、docker訓練都可以,然后使用把用得上的檔案拷貝到要構建docker的檔案夾中,
但要注意docker教程中拉取的Pytorch鏡像為1.4版本(registry.cn-shanghai.aliyuncs.com/tcc-public/pytorch:1.4-cuda10.1-py3),我們現在常用的pytorch環境為1.7,在保存權重的時候會使用新版本的序列化方式,導致docker測驗時權重讀取序列化失敗,所以新建個Python腳本,把best.pt重新保存下,
ckpt = torch.load('best.pt', map_location=device) # 讀取best.pt權重
torch.save(ckpt, 'new.pt', _use_new_zipfile_serialization=False) # 使用舊的方式保存
3.2 構建docker
baseline的原始碼中,run.sh中為空,改為
python detect.py --source ./tcdata/guangdong1_round2_testB_20191024
然后使用 docker build 命令構建鏡像,
通過 docker run 進入容器,
注意點:
根據https://github.com/datawhalechina/team-learning-cv/blob/master/DefectDetection/docker%E6%8F%90%E4%BA%A4%E6%95%99%E7%A8%8B.pdf構建完鏡像后,
進入容器后安裝額外依賴
pip install opencv-python
pip install matplotlib
pip install scipy
注意安裝完后檢查opencv能否正常運行,直接在終端打開Python,然后 import cv2,如果報錯的話,
# 解決方法:
apt update
apt install libgl1-mesa-glx
apt-get install -y libglib2.0-0
注意此時不要關閉容器,因為如果關掉的話,剛才安裝的依賴不會被更新到剛才的鏡像中!
要想使鏡像也實作這些改動,需要把當前容器另存為一個新的鏡像,

所以教程里讓退出但不關閉容器,
使用 docker commit 將當前容器提交為鏡像,然后使用 docker images 列出所有鏡像,最新的一條就是剛才另存為的新鏡像,可以看到imageID和剛才構建出的那個鏡像是不同的,
然后就可以
docker run your_image(自己替換) sh run.sh
運行自己的鏡像,看是否報錯,因為現在目錄里沒有tcdata這個測驗檔案夾,如果報檔案相關的錯誤就是正常的,或者可以自己建個檔案夾試一下,
程序中,如果報錯的話,一般就是run.sh有問題,可以在容器內修改完再另存為鏡像一次(同上),這樣比較省時間,或者參考修改已有docker容器中的內容,操作規范一些,
4 推送鏡像
直接 docker push 到自己的鏡像倉庫,
由于我是訓練完構建的鏡像,基礎環境加上權重,鏡像一共9.44G,非常大,推送很慢,估計在600k左右,程序中如果因為網路問題想中斷重試的話,可以Ctrl+C打斷,已經推送成功的layer會保存,不需要重新傳(不知道保存多久),但是傳到一半的會重新開始,要注意,
5 提交
這里注意賬號密碼不要填錯,我一開始填錯了密碼,匯出出現了 ImagePullBackOff 錯誤,
訓練了50個epoch的結果如下,確實挺差的,,,

6 更新
多訓練幾個epoch后,生成新的權重檔案best.pt,使用docker cp命令將其拷貝到容器中,然后docker commit保存為新的鏡像,重新docker push

可以看到只需要重新上傳權重檔案就可以了,其他層都已存在,比第一次上傳9個G快很多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261867.html
標籤:其他
