SSD环境部署+自定义数据集训练+评估指标(P、R、mAP)

简介: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

输出结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值