NanoDet目标检测之"微调训练"

《NanoDet目标检测之"搭建预测篇"》 中,我们搭建了NanoDet的环境,并用默认权重做了简单的预测,本节我们继续用自己的数据做微调。

1 准备数据

NanoDet支持yolo或者coco格式的标注,自行准备即可,我这里以yolo为例,目录结构如下:

TODO

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
xxx
xxx
xxx

2 配置

我们需要融合下两个配置文件,复制:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cp nanodet-plus-m_320.yml nanodet-plus-m_320_face.yml
cp nanodet-plus-m_320.yml nanodet-plus-m_320_face.yml
cp nanodet-plus-m_320.yml nanodet-plus-m_320_face.yml

修改1,保存位置:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
save_dir: workspace/nanodet-plus-m_320_face
save_dir: workspace/nanodet-plus-m_320_face
save_dir: workspace/nanodet-plus-m_320_face

修改12,你的标注类别数:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
head:
name: NanoDetPlusHead
num_classes: 1
head: name: NanoDetPlusHead num_classes: 1
head:
  name: NanoDetPlusHead
  num_classes: 1
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
aux_head:
name: SimpleConvHead
num_classes: 1
aux_head: name: SimpleConvHead num_classes: 1
aux_head:
  name: SimpleConvHead
  num_classes: 1

修改3,类别标签:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class_names: ['face']
class_names: ['face']
class_names: ['face']

修改4,数据,注意这里是从xxx_yolo.yml节选拷贝的:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
data:
train:
name: YoloDataset
img_path: yolo_data/train
ann_path: yolo_data/train
class_names: *class_names
input_size: [320,320] #[w,h]
keep_ratio: False
pipeline:
perspective: 0.0
scale: [0.6, 1.4]
stretch: [[0.8, 1.2], [0.8, 1.2]]
rotation: 0
shear: 0
translate: 0.2
flip: 0.5
brightness: 0.2
contrast: [0.6, 1.4]
saturation: [0.5, 1.2]
normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]
val:
name: YoloDataset
img_path: yolo_data/val
ann_path: yolo_data/val
class_names: *class_names
input_size: [320,320] #[w,h]
keep_ratio: False
pipeline:
normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]
data: train: name: YoloDataset img_path: yolo_data/train ann_path: yolo_data/train class_names: *class_names input_size: [320,320] #[w,h] keep_ratio: False pipeline: perspective: 0.0 scale: [0.6, 1.4] stretch: [[0.8, 1.2], [0.8, 1.2]] rotation: 0 shear: 0 translate: 0.2 flip: 0.5 brightness: 0.2 contrast: [0.6, 1.4] saturation: [0.5, 1.2] normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]] val: name: YoloDataset img_path: yolo_data/val ann_path: yolo_data/val class_names: *class_names input_size: [320,320] #[w,h] keep_ratio: False pipeline: normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]
data:
  train:
    name: YoloDataset
    img_path: yolo_data/train
    ann_path: yolo_data/train
    class_names: *class_names
    input_size: [320,320] #[w,h]
    keep_ratio: False
    pipeline: 
      perspective: 0.0
      scale: [0.6, 1.4] 
      stretch: [[0.8, 1.2], [0.8, 1.2]]
      rotation: 0
      shear: 0
      translate: 0.2
      flip: 0.5
      brightness: 0.2                                                                                
      contrast: [0.6, 1.4]                                                                           
      saturation: [0.5, 1.2]                                                                         
      normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]                                
  val:
    name: YoloDataset
    img_path: yolo_data/val
    ann_path: yolo_data/val
    class_names: *class_names                                                                        
    input_size: [320,320] #[w,h]                                                                     
    keep_ratio: False
    pipeline:
      normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]

修改batch、总迭代、效果检查点(按需修改):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
device:
gpu_ids: [0] # Set like [0, 1, 2, 3] if you have multi-GPUs
workers_per_gpu: 8
batchsize_per_gpu: 96
precision: 32 # set to 16 to use AMP training
...
total_epochs: 100
...
val_intervals: 10
device: gpu_ids: [0] # Set like [0, 1, 2, 3] if you have multi-GPUs workers_per_gpu: 8 batchsize_per_gpu: 96 precision: 32 # set to 16 to use AMP training ... total_epochs: 100 ... val_intervals: 10
device:
  gpu_ids: [0] # Set like [0, 1, 2, 3] if you have multi-GPUs
  workers_per_gpu: 8
  batchsize_per_gpu: 96
  precision: 32 # set to 16 to use AMP training
...
  total_epochs: 100
...
  val_intervals: 10

修改,强制使用CPU(可选)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
device:
gpu_ids: -1 # Set like [0, 1, 2, 3] if you have multi-GPUs
workers_per_gpu: 4
batchsize_per_gpu: 16
precision: 32 # set to 16 to use AMP training
device: gpu_ids: -1 # Set like [0, 1, 2, 3] if you have multi-GPUs workers_per_gpu: 4 batchsize_per_gpu: 16 precision: 32 # set to 16 to use AMP training
device:
  gpu_ids: -1 # Set like [0, 1, 2, 3] if you have multi-GPUs
  workers_per_gpu: 4
  batchsize_per_gpu: 16
  precision: 32 # set to 16 to use AMP training

3 训练

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python tools/train.py ./config/nanodet-plus-m_320_face.yml
python tools/train.py ./config/nanodet-plus-m_320_face.yml
python tools/train.py ./config/nanodet-plus-m_320_face.yml

最终模型会保存在“workspace/nanodet-plus-m_320_face”中的model_best下

4 模型转化为onnx

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python ./tools/export_onnx.py --cfg_path ./config/nanodet-plus-m_320_face.yml --model_path ./nanodet-plus-m_320_face/nanodet_model_best.pth
python ./tools/export_onnx.py --cfg_path ./config/nanodet-plus-m_320_face.yml --model_path ./nanodet-plus-m_320_face/nanodet_model_best.pth
python ./tools/export_onnx.py --cfg_path ./config/nanodet-plus-m_320_face.yml --model_path ./nanodet-plus-m_320_face/nanodet_model_best.pth

会生成一个nanodet.onnx

5 模型转化为ncnn

在线工具转化(貌似挂了)

或者用官方编译好的onnx2ncnn工具(下载Ubuntu的)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./onnx2ncnn nanodet.onnx nanodet.param nanodet.bin
./onnx2ncnn nanodet.onnx nanodet.param nanodet.bin
./onnx2ncnn nanodet.onnx nanodet.param nanodet.bin

6 验证ncnn

进入nanodet/demo/ncnn,修改以下点:

主要是形状、类别

编译demo

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export ncnn_DIR=/path/ncnn-20240820-ubuntu-2404/lib/cmake/ncnn
cmake .
make
export ncnn_DIR=/path/ncnn-20240820-ubuntu-2404/lib/cmake/ncnn cmake . make
export ncnn_DIR=/path/ncnn-20240820-ubuntu-2404/lib/cmake/ncnn
cmake .
make

运行

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./nanodet_demo 2 ~/code/server/face-still/1.mp4
./nanodet_demo 2 ~/code/server/face-still/1.mp4
./nanodet_demo 2 ~/code/server/face-still/1.mp4

benchmark

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./nanodet_demo 3 0
./nanodet_demo 3 0
./nanodet_demo 3 0

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *