1.作者介绍何煜东男西安工程大学电子信息学院2025级研究生研究方向机械臂图像处理、路径规划电子邮件3065383817qq.com胥乾信西安工程大学电子信息学院2025级研究生张宏伟人工智能课题组研究方向机器视觉与人工智能电子邮件2692797728qq.com2DINO 目标检测模型介绍2.1 目标检测与 Transformer 检测器基础目标检测的核心任务是同时定位图像中目标的位置边界框并识别其类别。传统目标检测方法主要分为两类1两阶段检测器如 Faster R-CNN先生成候选区域再对候选区域进行分类和回归精度高但速度较慢。2)一阶段检测器如 YOLO、SSD直接从图像中预测边界框和类别速度快但小目标检测精度有限。DINODETR with Improved denoising anchor boxes for Object Detection作为 DETR 的改进版本通过引入对比学习去噪、混合查询选择、动态锚点等创新模块在保持端到端优势的同时显著提升了收敛速度和检测精度成为当前 Transformer 目标检测的基准模型之一。2.2 DINO 模型的核心原理DINO 在 DETR 的编码器 - 解码器架构基础上针对其核心缺陷进行了四大关键改进1核心创新模块2损失函数分类损失Lcls采用 Focal Loss解决类别不平衡问题。回归损失Lreg采用 GIoU Loss同时考虑边界框的重叠度、中心距离和宽高比。去噪损失Ldenoise仅在训练阶段使用用于训练模型的去噪能力加速收敛。2.3 DINO 的训练与推理流程1.训练流程(1) 数据预处理对输入图像进行随机裁剪、翻转、缩放等数据增强调整至统一尺寸(2) 特征提取通过 Backbone如 ResNet50提取多尺度特征再经 Neck如 FPN融合生成特征图(3) 去噪查询生成生成带噪声的边界框和类别查询用于对比学习去噪训练(4) 编码器编码将多尺度特征图输入 Transformer 编码器编码为全局特征表示(5) 解码器解码将混合查询内容查询 位置查询和编码器输出输入解码器逐层更新查询表示(6) 每个查询经过分类头和回归头输出类别概率和边界框坐标(7) 损失计算与反向传播计算总损失并反向传播更新模型参数2.推理流程(1) 输入图像经过 Backbone 和 Neck 提取多尺度特征(2) 编码器对特征进行编码(3) 解码器使用固定数量的查询进行预测(4) 对预测结果进行简单的 NMS 后处理可选输出最终检测结果3基于 DINO 的 COCO2017 目标检测性能评估3.1 COCO2017 数据集介绍COCOCommon Objects in Context是目前目标检测领域最权威的基准数据集之一广泛用于评估模型的泛化能力和检测性能。下载训练集和验证集图像http://images.cocodataset.org/zips/train2017.ziphttp://images.cocodataset.org/zips/val2017.zip下载训练集和验证集图像http://images.cocodataset.org/annotations/annotations_trainval2017.zip解压文件并组织目录结构如图3.2 代码调试步骤1导入实验所需库以及克隆并安装 mmdetectiongit clone https://github.com/open-mmlab/mmdetection.gitcd mmdetectionpip install -r requirements/build.txtpip install -v -e .2下载 DINO 预训练权重mkdir checkpointsWget https://download.openmmlab.com/mmdetection/v3.0/dino/dino_r50_4scale_12e_coco/dino_r50_4scale_12e_coco_20230315_144312-5c1f3f6d.pth -P checkpoints/3修改配置文件复制configs/dino/dino_r50_4scale_12e_coco.py为自定义配置文件修改数据集路径为本地 COCO 数据集路径根据 GPU 显存调整batch_size单卡 3090 可设为 4如需多卡训练修改distributedTrue4模型训练与评估python tools/train.py configs/dino/custom_dino_r50_4scale_12e_coco.py模型评估python tools/test.py configs/dino/custom_dino_r50_4scale_12e_coco.py checkpoints/best_coco_bbox_mAP_epoch_12.pth --eval bbox3.3完整代码1核心配置文件_base_[../_base_/datasets/coco_detection.py,../_base_/schedules/schedule_1x.py,../_base_/default_runtime.py]# 模型配置modeldict(typeDINO,num_queries300,dn_number100,label_noise_ratio0.5,box_noise_scale1.0,with_box_refineTrue,two_stageTrue,backbonedict(typeResNet,depth50,num_stages4,out_indices(1,2,3),frozen_stages1,norm_cfgdict(typeBN,requires_gradFalse),norm_evalTrue,stylepytorch,init_cfgdict(typePretrained,checkpointtorchvision://resnet50)),neckdict(typeChannelMapper,in_channels[512,1024,2048],kernel_size1,out_channels256,act_cfgNone,norm_cfgdict(typeGN,num_groups32),num_outs4),encoderdict(num_layers6,layer_cfgdict(self_attn_cfgdict(embed_dims256,num_heads8,dropout0.0),ffn_cfgdict(embed_dims256,feedforward_channels2048,num_fcs2,ffn_drop0.0,act_cfgdict(typeReLU,inplaceTrue))),norm_cfgdict(typeLN)),decoderdict(num_layers6,layer_cfgdict(self_attn_cfgdict(embed_dims256,num_heads8,dropout0.0),cross_attn_cfgdict(embed_dims256,num_heads8,dropout0.0),ffn_cfgdict(embed_dims256,feedforward_channels2048,num_fcs2,ffn_drop0.0,act_cfgdict(typeReLU,inplaceTrue))),norm_cfgdict(typeLN),return_intermediateTrue),bbox_headdict(typeDINOHead,num_classes80,embed_dims256,loss_clsdict(typeFocalLoss,use_sigmoidTrue,gamma2.0,alpha0.25,loss_weight1.0),loss_bboxdict(typeGIoULoss,loss_weight2.0),loss_ioudict(typeGIoULoss,loss_weight1.0)))# 数据集配置data_root/path/to/your/coco/# 修改为本地COCO数据集路径train_dataloaderdict(batch_size4,# 根据GPU显存调整num_workers4,datasetdict(data_rootdata_root,ann_fileannotations/instances_train2017.json,data_prefixdict(imgtrain2017/)))val_dataloaderdict(batch_size2,num_workers2,datasetdict(data_rootdata_root,ann_fileannotations/instances_val2017.json,data_prefixdict(imgval2017/)))test_dataloaderval_dataloader# 优化器配置optim_wrapperdict(typeOptimWrapper,optimizerdict(typeAdamW,lr1e-4,weight_decay0.0001),clip_graddict(max_norm0.1,norm_type2))# 学习率调度器param_scheduler[dict(typeMultiStepLR,begin0,end12,by_epochTrue,milestones[11],gamma0.1)]# 训练配置train_cfgdict(typeEpochBasedTrainLoop,max_epochs12,val_interval1)val_cfgdict(typeValLoop)test_cfgdict(typeTestLoop)# 评估配置val_evaluatordict(typeCocoMetric,ann_filedata_rootannotations/instances_val2017.json,metricbbox,format_onlyFalse)test_evaluatorval_evaluator2评估结果可视化脚本importosimportcv2importtorchimportmatplotlib.pyplotaspltfrommmdet.apisimportinit_detector,inference_detectorfrommmdet.registryimportVISUALIZERS# 配置文件和权重路径config_fileconfigs/dino/custom_dino_r50_4scale_12e_coco.pycheckpoint_filecheckpoints/best_coco_bbox_mAP_epoch_12.pthimg_dir/path/to/your/coco/val2017/output_dirdino_results/os.makedirs(output_dir,exist_okTrue)# 初始化模型devicecuda:0iftorch.cuda.is_available()elsecpumodelinit_detector(config_file,checkpoint_file,devicedevice)# 初始化可视化器visualizerVISUALIZERS.build(model.cfg.visualizer)visualizer.dataset_metamodel.dataset_meta# 随机选择10张图像进行可视化importrandom img_filesrandom.sample(os.listdir(img_dir),10)forimg_fileinimg_files:img_pathos.path.join(img_dir,img_file)imgcv2.imread(img_path)imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 推理resultinference_detector(model,img)# 可视化visualizer.add_datasample(result,img,data_sampleresult,draw_gtFalse,wait_time0,pred_score_thr0.5)# 保存结果out_pathos.path.join(output_dir,img_file)visualizer.show(out_pathout_path)print(f结果已保存至:{out_path})3.4结果展示1代码运行结果本文复现的 DINO 模型在仅 12 个训练轮次的情况下综合 AP 达到 49.1%与官方基准49.0%高度一致验证了模型复现的正确性。与其他主流检测器相比AP 比 DETR 提升了 7.1 个百分点比 Faster R-CNN 提升了 11.7 个百分点特别是小目标检测精度APs达到 32.7%比 DETR 提升 12.2 个百分点比 Faster R-CNN 提升 11.5 个百分点小目标检测能力提升尤为显著。5.参考链接1DINO 原始论文2COCO 数据集