简介:SSD(Single Shot MultiBox Detector)是一个高效的目标检测算法,由 Wei Liu 等人在 2016 年提出。它能够在单次神经网络前向传播中完成目标检测任务,包括目标的分类和边界框回归,因此被称为“单次”检测器。其核心是在不同尺度特征图上预设默认框,通过卷积预测类别得分与位置偏移量来检测目标,利用非极大值抑制去除重叠框。网络以 VGGNet 等为基础网络提取特征,添加辅助卷积层生成多尺度特征图进行检测。训练时采用数据增强提升泛化能力,通过包含定位与置信度损失的函数优化参数。SSD 的主要特点是高效、实时,同时兼具较高的检测精度。广泛应用于自动驾驶、视频监控及机器人视觉等领域,为相关系统提供目标检测与定位信息,助力智能决策。
本教程配置:Unbuntu,CUDA 11.6,torch 1.13.1,python 3.8
1.代码拉取
代码链接:lufficc/SSD: High quality, fast, modular reference implementation of SSD in PyTorch
git clone https://github.com/lufficc/SSD.git
2.虚拟环境
conda create -n ssd python=3.8
source activate ssd
conda deactivate #退出虚拟环境
3.安装依赖
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
4.替换自定义数据集步骤
1)准备V0C格式的自定义数据集
位置:SSD > datasets
voc格式数据集:Annotations全是xml,JPEGimages全是jpg图片,ImageSets如下图
2)修改yaml文件
位置:SSD > ssd > configs > data.yaml (新建的yaml文件)
修改:a.NUM_CLASSES(类别数+1);b.MAX_ITER(迭代次数);c. BATCH_SIZE;d.OUTPUT_DIR(保存位置);
data.yaml代码如下图:
MODEL:
NUM_CLASSES: 2
INPUT:
IMAGE_SIZE: 300
DATASETS:
TRAIN: ("voc_2007_trainval", "voc_2012_trainval")
TEST: ("voc_2007_test", )
SOLVER:
MAX_ITER: 200
LR_STEPS: [80000, 100000]
GAMMA: 0.1
BATCH_SIZE: 32
LR: 1e-3
OUTPUT_DIR: 'outputs/vgg_ssd300_voc0712'
3)修改类别
位置:SSD > ssd > data > datasets > voc.py
修改:第11行类别为自己的类别
4)修改图片后缀
位置:SSD > ssd > demo.py
修改:第37行类别为自己的图片格式
5.训练
在终端运行训练命令,运行结果保存在:'outputs/vgg_ssd300_voc0712'
python train.py-config-file configs/data.yaml
6.评估指标(P、R、mAP50、mAP95)
位置:ssd > data > datasets > evaluation > voc > eval detection _voc.py
修改:eval_detection_voc函数
def eval_detection_voc(
pred_bboxes,
pred_labels,
pred_scores,
gt_bboxes,
gt_labels,
gt_difficults=None,
iou_thresh=0.5,
use_07_metric=False):
"""Calculate average precisions based on evaluation code of PASCAL VOC."""
# Calculate precision and recall for IoU threshold
prec, rec = calc_detection_voc_prec_rec(
pred_bboxes,
pred_labels,
pred_scores,
gt_bboxes,
gt_labels,
gt_difficults,
iou_thresh=iou_thresh
)
# Compute AP for IoU=0.5
ap = calc_detection_voc_ap(prec, rec, use_07_metric=use_07_metric)
map_50 = np.nanmean(ap) # Mean Average Precision at IoU=0.5
# Compute mAP50:95 (COCO-style)
ap_list = []
for iou in np.arange(0.5, 1.0, 0.05):
prec_iou, rec_iou = calc_detection_voc_prec_rec(
pred_bboxes,
pred_labels,
pred_scores,
gt_bboxes,
gt_labels,
gt_difficults,
iou_thresh=iou
)
ap_iou = calc_detection_voc_ap(prec_iou, rec_iou, use_07_metric=use_07_metric)
ap_list.append(np.nanmean(ap_iou))
map_95 = np.mean(ap_list) # Average over IoU thresholds 0.5:0.95
# Print results for reference
print(f"Precision : {np.nanmean([np.nanmean(p) for p in prec if p is not None]):.4f}")
print(f"Recall: {np.nanmean([np.nanmean(r) for r in rec if r is not None]):.4f}")
print(f"mAP@0.5: {map_50:.4f}")
print(f"mAP@0.5:0.95: {map_95:.4f}")
return {'prec':np.mean(prec[1]),'rec':np.mean(rec[1]),'ap': ap, 'map':np.nanmean(ap)}
7.测试
在终端运行训练命令,运行结果保存在:'outputs/vgg_ssd300_voc0712'
python test.py --config-file configs/data.yaml
输出结果