
一、RT-DETR 模型介绍在计算机视觉领域目标检测作为一项基础任务其性能的提升对于自动驾驶、视频监控、智能安防等应用至关重要。而目标检测任务近年来一直被YOLO系列模型主导截止该文章发布目前YOLO已经更新到了V11版本了这也预示着YOLO系列有很大的优化空间。不过随着大模型的进一步发展另一个分支Transformer架构也逐渐在CV领域崭露头角其中基于Transformer架构的多模态模型层出不穷VIT也在视觉分类任务上也取得了不错的成绩。这都进一步表示了Transformer在CV领域的大有可为。其中DETR便是第一个将Transformer架构应用在目标检测领域的模型其创新性地将目标检测任务转化为一个序列生成问题移除了之前传统模型依赖的NMS过程核心思想是利用Transformer的强大特征提取和序列建模能力直接对图像中的目标进行定位和分类。 整体过程如下图所示不过DETR虽然移除了NMS过程不过相比于YOLO系列还是在速度上要慢很多。为此由百度公司提出的新一代的RT-DETR模型在DETR的基础上又进行了多项优化。进一步解决了该问题。RT-DETR整体结构如下图所示RT-DETR采用了高效的混合编码器和IoU感知有效降低了计算成本、提高了检测精度。在速度和精度方面均超过了YOLOV8。主要特点高效混合编码器采用高效混合编码器通过解耦尺度内交互和跨尺度融合来处理多尺度特征。这种独特的基于Vision Transformers的设计降低了计算成本并允许实时物体检测。IoU 感知查询选择通过IoU感知查询选择改进了对象查询初始化。这使得模型能够专注于场景中最相关的对象从而提高检测精度。推理速度可调支持通过使用不同的解码器层灵活调整推理速度无需重新训练。这种适应性有助于在各种实时目标检测场景中的实际应用。RT-DETR 模型使用本文使用ultralytics框架进行测试和后续微调训练其中ultralytics和pytorch的版本如下torch1.13.1cu116ultralytics8.3.0Ultralytics提供了不同尺度的预训练RT-DETR模型RT-DETR-L53,0% AP auf COCO val2017, 114 FPS auf T4 GPURT-DETR-X54,8% AP auf COCO val2017, 74 FPS auf T4 GPU预训练模型下载地址https://docs.ultralytics.com/de/models/rtdetr/模型使用测试图片预测目标fromultralyticsimportRTDETR# Load a modelmodelRTDETR(rtdetr-l.pt)model.info()resultsmodel.predict(../img/1.png)results[0].show()可以观察到就连手里拿着的手机都被检测出来了效果确实非常不错。二、微调训练自定义的目标检测数据集使用本专栏前面实验YOLO-V10时标注的人脸数据集 这里你可以收集一些自定义的图片然后根据下面文章中介绍的方式进行标注基于 YOLO V10 Fine-Tuning 训练自定义的目标检测模型微调训练其中face.yaml文件内容和上面文章YOLO-V10时的一致fromultralyticsimportRTDETR# 加载模型modelRTDETR(rtdetr-l.pt)# 训练model.train(dataface.yaml,# 训练配置文件epochs50,# 训练的周期imgsz640,# 图像的大小device[0],# 设备如果是 cpu 则是 devicecpuworkers0,lr00.01,# 学习率batch8,# 批次大小ampFalse# 是否启用混合精度训练)运行后可以看到打印的网络结构from n params module arguments0-1125248ultralytics.nn.modules.block.HGStem[3,32,48]1-16155072ultralytics.nn.modules.block.HGBlock[48,48,128,3,6]2-111408ultralytics.nn.modules.conv.DWConv[128,128,3,2,1, False]3-16839296ultralytics.nn.modules.block.HGBlock[128,96,512,3,6]4-115632ultralytics.nn.modules.conv.DWConv[512,512,3,2,1, False]5-161695360ultralytics.nn.modules.block.HGBlock[512,192,1024,5,6, True, False]6-162055808ultralytics.nn.modules.block.HGBlock[1024,192,1024,5,6, True, True]7-162055808ultralytics.nn.modules.block.HGBlock[1024,192,1024,5,6, True, True]8-1111264ultralytics.nn.modules.conv.DWConv[1024,1024,3,2,1, False]9-166708480ultralytics.nn.modules.block.HGBlock[1024,384,2048,5,6, True, False]10-11524800ultralytics.nn.modules.conv.Conv[2048,256,1,1, None,1,1, False]11-11789760ultralytics.nn.modules.transformer.AIFI[256,1024,8]12-1166048ultralytics.nn.modules.conv.Conv[256,256,1,1]13-110torch.nn.modules.upsampling.Upsample[None,2,nearest]1471262656ultralytics.nn.modules.conv.Conv[1024,256,1,1, None,1,1, False]15[-2, -1]10ultralytics.nn.modules.conv.Concat[1]16-132232320ultralytics.nn.modules.block.RepC3[512,256,3]17-1166048ultralytics.nn.modules.conv.Conv[256,256,1,1]18-110torch.nn.modules.upsampling.Upsample[None,2,nearest]1931131584ultralytics.nn.modules.conv.Conv[512,256,1,1, None,1,1, False]20[-2, -1]10ultralytics.nn.modules.conv.Concat[1]21-132232320ultralytics.nn.modules.block.RepC3[512,256,3]22-11590336ultralytics.nn.modules.conv.Conv[256,256,3,2]23[-1,17]10ultralytics.nn.modules.conv.Concat[1]24-132232320ultralytics.nn.modules.block.RepC3[512,256,3]25-11590336ultralytics.nn.modules.conv.Conv[256,256,3,2]26[-1,12]10ultralytics.nn.modules.conv.Concat[1]27-132232320ultralytics.nn.modules.block.RepC3[512,256,3]28[21,24,27]17303907ultralytics.nn.modules.head.RTDETRDecoder[1,[256,256,256]]训练结束后可以在runs目录下面看到训练的结果其中weights下面的就是训练后保存的模型这里可以先看下训练时loss的变化图三、模型测试在runs\detect\train\weights下可以看到best.pt和last.pt两个模型表示最佳和最终模型下面使用best.pt模型进行测试fromultralyticsimportRTDETRfrommatplotlibimportpyplotaspltimportos plt.rcParams[font.sans-serif][SimHei]# 测试图片地址base_path../data/images# 加载模型modelRTDETR(runs/detect/train/weights/last.pt)forimg_nameinos.listdir(base_path):img_pathos.path.join(base_path,img_name)imageplt.imread(img_path)# 预测resultsmodel.predict(image,devicecpu)boxesresults[0].boxes.xyxy confsresults[0].boxes.conf axplt.gca()forindex,boxeinenumerate(boxes):x1,y1,x2,y2boxe[0],boxe[1],boxe[2],boxe[3]scoreconfs[index].item()ax.add_patch(plt.Rectangle((x1,y1),(x2-x1),(y2-y1),linewidth2,fillFalse,colorred))plt.text(xx1,yy1-10,s{:.2f}.format(score),fontsize15,colorwhite,bboxdict(facecolorblack,alpha0.5))plt.imshow(image)plt.show()