Python影像辨識筆記(二十三):NanoDet,可能是目前最輕量化的Object Detection模型

Yanwei Liu
7 min readNov 26, 2020

更新

[0]建議使用PyTorch > 1.6版本進行訓練[1]實際以320x320的size去訓練後發現,在70個epochs,同樣採用COCO2017 dataset的情況下,mAP有明顯的差距我所訓練出來的mAP: 18.4
官方宣稱的mAP: 20.6
[2]Model Size也差了將近1倍(7.55對上3.86)新舊版PyTorch Model說明實際訓練出來的Model,Size為7.55MB(*.pth)
官方提供訓練好的Model,size為3.86MB(*.pth)(PyTorch>=1.6)
官方提供訓練好的Model,size為3.79MB(*.pth)(PyTorch<1.6)
[3]將PyTorch Model轉成NCNN格式[4]無法Reproduce出官方宣稱的resultsgd存在一定的随机性,20.6的mAP是多次调参后得到的,如果想要复现效果,可以加长第一次lr decay前的epoch数,取mAP最佳的模型进行lr decay。训练过程中保存的模型是附带优化器的check point,可以在save model时不保存优化器来获得3MB的模型。初始化是加载imagenet预训练模型的,调参都是在sgd上调的,具体方式就是另一个评论里说的,用初始的大lr训练比较多的epoch,当大lr情况下的mAP不再上升之后,选取最高mAP的checkpoint进行lr decay继续训练。多卡大batch训练的话总step数变少,确实是会导致mAP略微下降,但是我在总共70epoch下是能训练到19多mAP。目前给出的20.6是在125epoch第一次decay,总共训练150epoch得到的。收敛需要保证足够的step数,coco是11万张,如果在1万张上训练,至少需要10倍epoch数,尝试调大epoch加载预训练模型,从头来训练,最终保存的模型是否把预训练的参数也保存进去,这样3+7=10,也就是模型最终的大小为10M,PC端1G多的内存占用,20%的CPU占用。

原作者知乎文章

GitHub連結

官方釋出的對照表

如上圖所示,與YOLO v3/v4系列的Tiny版本相比,NanoDet在416*416的size下,明顯勝過YOLO模型。在Model size只有約略十分之一左右的情況下,AP@0.5:0.95(即圖中的mAP)甚至與YOLOv4-Tiny一模一樣,真的非常強大。

使用方式

本文假設讀者已完成PyTorch的安裝,且不考慮virtual environment使用的情況。因此我們將直接從套件安裝開始

pip install Cython termcolor numpy tensorboard pycocotools matplotlib pyaml opencv-python tqdmgit clone https://github.com/RangiLyu/nanodet.git
cd nanodet
python setup.py develop

資料集

可以使用get_coco2017.sh來進行資料圖片下載

#!/bin/bash
# Zip coco folder
# zip -r coco.zip coco
# tar -czvf coco.tar.gz coco
# Download labels from Google Drive, accepting presented query
filename="coco2017labels.zip"
fileid="1cXZR_ckHki6nddOmcysCuuJFM--T-Q6L"
curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}" >/dev/null
curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=$(awk '/download/ {print $NF}' ./cookie)&id=${fileid}" -o ${filename}
rm ./cookie
# Unzip labels
unzip -q ${filename} # for coco.zip
# tar -xzf ${filename} # for coco.tar.gz
rm ${filename}
# Download and unzip images
cd coco/images
f="train2017.zip" && curl http://images.cocodataset.org/zips/$f -o $f && unzip -q $f && rm $f
f="val2017.zip" && curl http://images.cocodataset.org/zips/$f -o $f && unzip -q $f && rm $f
# cd out
cd ../..

Config檔案準備

開啟config/裡面的nanodet-m.yml檔案進行修改

修改save_path路徑到您所指令的位置
修改num_classes到目標class的數量
修改image path and annotation path的路徑到上一個步驟所取得的COCO圖片路徑位置
修改第69行的device,指定第幾顆GPU以及batch size等相關參數
可自己修改total_epochs、lr和lr_schedule來符合自己的需求
更多詳情,請參考config_file_detail.md

訓練

#單顆GPU
python tools/train.py config/nanodet-m.yml
#多顆GPU(目前Windows在1.7版以前的PyTorch,尚不支援多GPU訓練)
python -m torch.distributed.launch --nproc_per_node=GPU_NUM --master_port 29501 tools/train.py CONFIG_PATH

NanoDet的完整架構圖

下載並解壓nanodet_ncnn_model.zip後,可使用Netron開啟nanodet_m.param檔案,呈現如下圖的完整架構

--

--