其實YOLOV7是在YOLO V5的基礎上修改的code,所以code讀起來應該會比較順暢。 YOLOV7演算法我們按照以下的結構進行講解:
Total Outline
- YOLOV7演算法(一):使用客製化數據集跑通YOLOV7演算法(包括對整個項目檔作用的解讀) → 會拆成7次medium 文章講解yolov7應用
- YOLOV7演算法(二):YOLO V7演演算法 detect.py 代碼解析
- YOLOV7演算法(三):YOLO V7演演算法 train.py 代碼解析
- YOLOV7演算法(四):YOLO V7演算法網路結構解析
5. 訓練過程中的重要代碼解析
6.YOLOV7演算法(六):YOLO V7演算法onnx模型部署
7.YOLOV7演算法(七):YOLOV7演算法總結
首先我們一樣先連進去王建堯博士(YOLOv4,v7主要作者之一…我的偶像)的github裡瀏覽一下有哪些檔案…:連結
接著把檔案下來解壓縮吧!然後存進我們平常最常放coding projects的地方即可!從git上clone下來整個項目資料夾,如下圖所示:
分別介紹下重要的資料夾和檔的作用:
cfg:存放訓練所需要的網路結構yaml檔
customdata:這個資料夾是存放使用者自定義數據集,這是我後來訓練v7的時候創建的,剛下載的時候是沒有的
data:存放訓練過程中超參數和訓練相關data的yaml檔
models:存放的是定義網路結構的相關python文件和導出模型部署所需要的code
runs:存放訓練和測試的權重文件和相關信息
utils:存放一些代碼運行中必備的代碼
detect.py:用於測試的腳本
requirement.txt:訓練和測試所需要下載的庫
train.py:用於開啟訓練的腳本
1、創建訓練環境
一般,推薦大家使用Anaconda或pycharm IDE創建虛擬環境去訓練模型,這樣不僅能隔離出本機環境,避免污染本機的環境。 而且還避免了創建訓練環境的時候下載相應的庫版本之間出現問題(有點docker的概念,缺點是環境占用硬體空間會稍大一些~哀呀換2T的SSD了啦~)。 conda或者miniconda的具體安裝方法直接google吧,這裡就不贅述了~
下載好Anaconda之後:
在conda prompt terminal中輸入以下code:
conda create -n yolov7 python=3.7
conda activate yolov7
pip install -r your_yolov7_path/requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
(使用清華大學鏡像安裝包比較不會安裝出錯)
2、創建自定義數據集
上述中有一個資料夾:customdata,該資料夾就是自定義數據集的存放路徑。
上圖就是具體的存放規則,這裡為了簡便只使用了幾張圖片。 分別創建images和labels資料夾來分別存放訓練train和測試valid的圖片和標籤。 下面可以使用我提供的代碼來創建train.txt和valid.txt。
import glob
#存放圖片的路徑
train_image_path = r”your_yolov7_path/customdata/images/train/”
valid_image_path = r”your_yolov7_path/customdata/images/valid/”
#生成的txt的路徑
txt_path = r”your_yolov7_path/customdata/”
def generate_train_and_val(image_path, txt_file): ##(記得縮排!!)
with open(txt_file, ‘w’) as tf:
for jpg_file in glob.glob(image_path + ‘*.jpg’):
tf.write(jpg_file + ‘\n’)
generate_train_and_val(train_image_path, txt_path + ‘train.txt’)
generate_train_and_val(valid_image_path, txt_path + ‘valid.txt’)
3、開始訓練
首先,在裡面創建一個custom_data.yaml檔,在以下路徑之下:your_yolov7_path/data
train: your_yolov7_path/customdata/train.txt
val: your_yolov7_path/customdata/valid.txt
test: your_yolov7_path/customdata/valid.txt
# number of classes
nc:
# class names
names: []
其中和根據自己自定義數據集進行修改。
然後,打開要選擇的網路結構yaml檔,這裡我就選擇,修改的值。
最後,打開 train.py 檔,根據自己的需求進行適當的參數修改:
nc,names,cfg/training/yolov7.yaml nc
parser.add_argument(‘ — weights’, type=str, default=’’, help=’initial weights path’)
parser.add_argument(‘ — cfg’, type=str, default=r’cfg/training/yolov7x.yaml’, help=’model.yaml path’)
parser.add_argument(‘ — data’, type=str, default=’data/custom_data.yaml’, help=’data.yaml path’)
parser.add_argument(‘ — hyp’, type=str, default=’data/hyp.scratch.p5.yaml’, help=’hyperparameters path’)
parser.add_argument(‘ — epochs’, type=int, default=300)
parser.add_argument(‘ — batch-size’, type=int, default=24, help=’total batch size for all GPUs’)
parser.add_argument(‘ — img-size’, nargs=’+’, type=int, default=[640, 640], help=’[train, test] image sizes’)
parser.add_argument(‘ — rect’, action=’store_true’, help=’rectangular training’)
parser.add_argument(‘ — resume’, nargs=’?’, const=True, default=False, help=’resume most recent training’)
parser.add_argument(‘ — nosave’, action=’store_true’, help=’only save final checkpoint’)
parser.add_argument(‘ — notest’, action=’store_true’, help=’only test final epoch’)
parser.add_argument(‘ — noautoanchor’, action=’store_true’, help=’disable autoanchor check’)
parser.add_argument(‘ — evolve’, action=’store_true’, help=’evolve hyperparameters’)
parser.add_argument(‘ — bucket’, type=str, default=’’, help=’gsutil bucket’)
parser.add_argument(‘ — cache-images’, action=’store_true’, help=’cache images for faster training’)
parser.add_argument(‘ — image-weights’, action=’store_true’, help=’use weighted image selection for training’)
parser.add_argument(‘ — device’, default=’cpu’, help=’cuda device, i.e. 0 or 0,1,2,3 or cpu’)
parser.add_argument(‘ — multi-scale’, action=’store_true’, help=’vary img-size +/- 50%%’)
parser.add_argument(‘ — single-cls’, action=’store_true’, help=’train multi-class data as single-class’)
parser.add_argument(‘ — adam’, action=’store_true’, help=’use torch.optim.Adam() optimizer’)
parser.add_argument(‘ — sync-bn’, action=’store_true’, help=’use SyncBatchNorm, only available in DDP mode’)
parser.add_argument(‘ — local_rank’, type=int, default=-1, help=’DDP parameter, do not modify’)
parser.add_argument(‘ — workers’, type=int, default=8, help=’maximum number of dataloader workers’)
parser.add_argument(‘ — project’, default=’runs/train’, help=’save to project/name’)
parser.add_argument(‘ — entity’, default=None, help=’W&B entity’)
parser.add_argument(‘ — name’, default=’exp’, help=’save to project/name’)
parser.add_argument(‘ — exist-ok’, action=’store_true’, help=’existing project/name ok, do not increment’)
parser.add_argument(‘ — quad’, action=’store_true’, help=’quad dataloader’)
parser.add_argument(‘ — linear-lr’, action=’store_true’, help=’linear LR’)
parser.add_argument(‘ — label-smoothing’, type=float, default=0.0, help=’Label smoothing epsilon’)
parser.add_argument(‘ — upload_dataset’, action=’store_true’, help=’Upload dataset as W&B artifact table’)
parser.add_argument(‘ — bbox_interval’, type=int, default=-1, help=’Set bounding-box image logging interval for W&B’)
parser.add_argument(‘ — save_period’, type=int, default=-1, help=’Log model after every “save_period” epoch’)
parser.add_argument(‘ — artifact_alias’, type=str, default=”latest”, help=’version of dataset artifact to be used’)
最後在terminal執行train.py檔就可以開始訓練自定義資料了!
python train.py
done!!
是不是很簡單呢?