简介YOLOv13完整源码与权重文件打包自清华大学联合太原理工大学、北京理工大学等团队于2025年6月发布的最新实时目标检测模型。模型延续“只需看一次”的设计思想Nano版本以6.4G FLOPs在MS COCO上实现41.6% mAP较YOLOv12-N提升1.5%精度参数减少0.1M并首次将超图理论引入实时检测建模多目标间高阶语义关联提升复杂场景下的鲁棒性。包内共486个文件压缩包约263.76MB以164个Python脚本、109个pyc字节码、86个YAML配置、8个权重pt文件为主同时包含C推理代码、Dockerfile、Jupyter示例、说明文档与训练日志覆盖环境部署、配置调整、模型训练、推理与部署全流程。资源主要面向计算机、电子信息或数学专业学生可支撑课程设计、期末大作业与毕业设计中的目标检测与图像分析任务。目前已有235人浏览学习适合希望快速搭建YOLOv13实验、对照源码理解模型结构并完成实际检测应用的读者。1. 2026年YOLOv13完整源码与权重文件先看清这东西值不值得碰2026年的目标检测圈子里不少人一上来就直接搜“yolov13完整源码权重文件”因为前几代版本迭代太快复现成本高而这一代官方把完整工程和预训练权重一起放出主打“拿来就能跑”。它解决了三个问题不用自己搭网络结构、不用从头训练几十天、权重可以直接迁移到私有数据上。我觉得它适合两类人一类是急着在本地或边缘设备上落地检测服务的工程开发者另一类是研究遮挡目标、小目标改进的学生和算法工程师。但动手之前得先把源码目录、权重格式和加载方式摸清楚否则开局就是翻车现场。2. 从源码结构看到权重文件YOLOv13的组成与加载原理2.1 源码目录拆解哪些文件是核心哪些是生成物官方解压后源码一般长这样. ├── models/ # 网络结构定义 │ ├── yolo.py # 模型组装入口 │ ├── blocks.py # 基础模块Conv, C2f等 │ ├── head.py # 检测头分类回归 │ └── ... ├── data/ # 数据集配置与类名 │ ├── coco.yaml │ └── custom.yaml ├── utils/ # 数据增强、损失函数、NMS等 ├── weights/ # 预训练权重yolov13.pt等 ├── train.py ├── detect.py ├── export.py └── requirements.txt这里最关键的是models/yolo.py它通过网络配置文件yaml动态组装整个模型你改结构时改这里。blocks.py放的是每个组件比如Conv、C2f、SPPF这些改动一个模块会影响全局。head.py则负责把neck输出的特征映射成检测结果如果改了head对应权重文件的输出通道数也必须改。weights目录经常是空的或者只放了一个README因为大文件不会进git仓库需要单独下载。所谓“完整源码”是指网络定义、损失函数、数据增强、训练验证脚本全都在不用自己补但和权重文件是两件事必须配对使用。还要提醒一下源码里会出现runs/目录这是训练时自动生成的里面放日志和每轮权重。还有__pycache__这种生成物不用管。如果你发现weights下有一个yolov13.pt只有几百KB那基本是下载不完整的假文件后面加载时会直接EOFError。2.2 权重文件格式与加载路径pth、onnx和TensorRT的差别权重文件最常见的三种形态有明确分工格式用途加载方式.pt / .pthPyTorch训练、继续训练、推理torch.load load_state_dict.onnx跨平台部署C/C#等onnxruntime / TensorRT解析.engineTensorRT序列化GPU专用trt runtime反序列化区别在于.pt保存了完整网络参数甚至优化器状态和训练轮次所以可以接着训练.onnx把网络结构固化成了计算图只保留前向推理.engine是在特定GPU上优化后的二进制换显卡或换CUDA版本都得重新生成。我拿到“完整源码权重文件”后的第一件事永远是写一段加载代码验证版本是否匹配。常见做法是这样import torch from models.yolo import Model # 通过yaml重建网络结构注意classes数量必须与权重训练时一致 model Model(cfgmodels/yolov13.yaml, ch3, nc80) checkpoint torch.load(weights/yolov13.pt, map_locationcuda:0) # 有些权重直接是state_dict有些包了ema等字段要剥开 if model in checkpoint: state_dict checkpoint[model].float().state_dict() else: state_dict checkpoint state_dict {k.replace(module., ): v for k, v in state_dict.items()} model.load_state_dict(state_dict, strictTrue) model.eval()参数说明cfg是结构文件路径ch3表示RGB三个通道nc80对应COCO类别数。load_state_dict的strictTrue表示每一层的参数都必须匹配如果源码改了head但权重还是旧版这里会同时报missing key和unexpected key这就是版本漂移证据。module.前缀通常来自多卡训练的DataParallel包装保存权重时没去干净就会出现所以这里先统一去掉再加载。这套逻辑能解决90%的“加载就报错”问题。如果你用的是onnx或TensorRT权重加载方式完全不同前者用onnxruntime的InferenceSession后者用trt.Runtime反序列化不需要碰PyTorch模型。3. 用YOLOv13跑通一次推理从权重到目标框的最短路径3.1 环境配置与依赖项CUDA、PyTorch和编译器的版本陷阱YOLOv13的依赖项写在requirements.txt里安装不难难的是版本组合。我见过最多的翻车场景是用显卡驱动最高版本去要求PyTorch或者反过来。先跑两条命令确认环境nvidia-smi python -c import torch; print(torch.__version__, torch.version.cuda)注意nvidia-smi显示的CUDA版本是驱动能支持的最高版本而torch.version.cuda是PyTorch内置的运行时版本两者不要求相等但差距太大会出现奇怪的算子崩溃。比如驱动支持12.4PyTorch编译在12.1上一般能跑但如果源码里用了自定义CUDA算子编译时就会因为头文件版本不匹配失败。如果源码带自定义算子比如超图卷积的CUDA实现还需要提前编译pip install -r requirements.txt python setup.py developsetup.py develop会生成一个.so文件并软链接进site-packages这样改Python代码不用重装但改C代码必须重新执行一次编译。千万别跳过这一步直接跑否则会报“No module named models.ext”之类的找不到符号错误。3.2 最小推理代码加载权重、预处理、后处理的一体化脚本官方detect.py功能很全但参数多不利于理解。我自己会写一个最小推理脚本保留核心几步import cv2 import torch from models.yolo import Model from utils.augmentations import letterbox from utils.general import non_max_suppression # ---------- 1. 加载模型 ---------- model Model(models/yolov13.yaml, ch3, nc80).eval() ckpt torch.load(weights/yolov13.pt, map_locationcuda:0) state_dict ckpt.get(model, ckpt) state_dict {k.replace(module., ): v for k, v in state_dict.items()} model.load_state_dict(state_dict) model.cuda() # ---------- 2. 预处理 ---------- img cv2.imread(test.jpg) # letterbox保持宽高比缩放同时padding到32的倍数 img_pad, ratio, (dw, dh) letterbox(img, new_shape640, stride32, autoTrue) img_tensor torch.from_numpy(img_pad[:, :, ::-1].transpose(2, 0, 1)).float() # 归一化到0-1并增加batch维度 img_tensor img_tensor / 255.0 img_tensor img_tensor.unsqueeze(0).cuda() # ---------- 3. 前向推理 ---------- with torch.no_grad(): preds model(img_tensor) # ---------- 4. 后处理NMS ---------- if isinstance(preds, tuple): preds torch.cat(preds, dim1) results non_max_suppression(preds, conf_thres0.25, iou_thres0.45)逻辑说明第二步的letterbox是YOLO系列标准预处理把图片长边缩放到640短边填充灰色而不是直接拉伸这样能避免目标变形。img_pad[:, :, ::-1]是把BGR转成RGBtranspose把HWC转成CHW。第三步前向得到的是一个tensor形状是[1, 84, 8400]84表示4个框坐标加80个类别概率8400表示三个尺度的anchor点总和。第四步non_max_suppression内部会做置信度过滤和类别NMS返回的results是list里面每个元素对应一张图的检测框格式是[x1, y1, x2, y2, score, class_id]。参数说明new_shape640是推理分辨率显存小就改512显存大可以调768但要注意训练时用的分辨率推理比训练分辨率小太多会影响小目标检测。conf_thres0.25是置信度阈值实际误检多就拉高到0.4iou_thres0.45是NMS交并比阈值遮挡场景下想让密集目标保留更多可以降到0.35。这段代码跑通后你就知道从权重文件到检测框的全路径了后面改网络、改预处理都有据可依。3.3 训练你自己的数据集数据标注与yaml配置推理只是开始落业务还得用自己的数据微调。YOLOv13沿用YOLO格式标注每张图片对应一个同名txt文件每行是“class x_center y_center width height”坐标全部归一化。我习惯用labelImg或Label Studio导出。data/my_dataset.yaml配置# 数据集路径建议写绝对路径 path: /data/yolo_dataset train: images/train val: images/val # 类别数 nc: 3 # 类别名称顺序必须与标注txt的class_id一致 names: 0: person 1: car 2: traffic_light训练命令python train.py --data data/my_dataset.yaml --weights weights/yolov13.pt --batch-size 8 --epochs 100 --img-size 640 --device 0参数说明--weights加载官方预训练权重如果类数改了源码会自动跳过不匹配的输出层所以不用自己删层。--batch-size 8是起步值12G显存建议先跑2用nvidia-smi观察占用再逐步上调。--epochs至少100少于这个数很难收敛。--img-size影响显存和精度640是默认平衡点。训练过程中会持续打印mAP如果发现loss降不下去先回去检查yaml里的path路径和标注内容我犯过的错误就是把train/val路径写反导致验证集比训练集还大模型精度永远上不去。4. 避坑记录YOLOv13训练和推理的5个典型翻车现场4.1 现象加载权重就报错 missing key 和 unexpected key原因最常见的是源码和权重版本错位。YOLOv13迭代快可能你今天拖下来的源码已经改了head结构昨天发布的权重还没跟上。多卡训练产生的module.前缀也会导致键名不匹配。解决先用git log确认源码commit时间和权重文件的release日期对比日期差超过一个月就不建议硬用。然后在加载代码里统一strip掉module.前缀即使当前没遇到也要写上这是一张后悔药。4.2 现象训练时显存瞬间占满然后OOM原因默认参数按大卡配置batch size和输入分辨率都太高。很多人拿源码直接跑默认batch 16和分辨率1280如果显卡只有12G直接OOM。解决先把batch size降到2img-size降到640跑通流程再用nvidia-smi看显存余量逐次往上加。还需要检查单卡训练时有没有开sync BN如果开了会额外占一批显存要关掉。4.3 现象自定义数据集训练出来的mAP接近零原因多半是类别编号和yaml的names顺序对不上或者数据增强太激进把目标裁掉了。解决训练前先打印增强后的图片看看标注框还套在目标上没有。再检查txt里的class_id是否从0开始连续。还有一种情况是图片尺寸差异巨大直接缩放到640后目标只剩几个像素这种要调大训练分辨率或者用多尺度训练。4.4 现象推理速度比官方宣称慢一大截原因你直接跑了PyTorch模型而官方benchmark用了TensorRT和FP16另外测试卡通常是A100你的卡可能只有它十分之一算力。解决先用torch.inference_mode()替换torch.no_grad()能省一些显存和调度开销。再把模型导出成onnx和TensorRT engine这才是真实部署形态。如果模型里用了超图卷积这类自定义算子ONNX导出时会提示算子不支持需要特殊处理见第5章。4.5 现象权重文件下载不完整加载时直接报EOFError原因大文件下载中断或者被劫持文件没到结尾。解决下载后先看文件大小和release页面是否一致再算一遍md5对比。加载时如果torch.load报EOFError不要尝试修补文件直接重新下载。我见过有人用zipfile修复工具强行解包最后模型精度完全不可用浪费时间。5. 超图改进与遮挡场景把YOLOv13的能力再榨一层5.1 超图卷积的设计思路为什么能改善遮挡目标遮挡目标检测难在特征被部分掩盖普通卷积只看局部感受野被遮住的信息直接丢了。超图卷积的思路是让多个特征节点通过一条“超边”连接特征可以在超内传播从而让被遮挡的节点借助周围未遮挡节点恢复响应。相比普通图卷积一条边只连两个节点超图的一条边能连多个节点更适合建模“人和自行车”“车和交通灯”这种空间共现关系。我把话放这里如果你直接把这个模块塞进YOLOv13的每一个stage大概率会掉点因为低层特征分辨率大超图卷积的邻接矩阵参数量爆炸。常见做法是只在neck的深层特征上加也就是感受野最大的那一层或者作为C2f内部的一个可选项。5.2 在YOLOv13中替换C2f模块具体修改点和参数下面是我常用的改法在blocks.py里加一个HyperGraphConv然后让C2f通过配置参数决定用普通模块还是超图模块。# blocks.py 中 C2f 类的修改示例 import torch import torch.nn as nn class HyperGraphConv(nn.Module): def __init__(self, c1, c2, k3, groups1): super().__init__() self.conv nn.Conv2d(c1, c2, 1) # 邻接矩阵是可学习参数初始化为单位矩阵变体 self.adj nn.Parameter(torch.eye(c2).unsqueeze(0), requires_gradTrue) def forward(self, x): x self.conv(x) # 先做通道混合 B, C, H, W x.shape x x.view(B, C, H * W) # 展成特征节点 # 超图传播邻接矩阵右乘让每个节点融合其他节点的信息 x torch.einsum(bcn,bdk-bdn, x, self.adj) return x.view(B, C, H, W) class C2f(nn.Module): def __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5, use_hyperFalse): super().__init__() self.c int(c2 * e) self.cv1 nn.Conv2d(c1, 2 * self.c, 1, 1) self.cv2 nn.Conv2d((2 n) * self.c, c2, 1) self.m nn.ModuleList() for _ in range(n): if use_hyper: self.m.append(HyperGraphConv(self.c, self.c)) else: self.m.append(Bottleneck(self.c, self.c, shortcut, g)) def forward(self, x): y list(self.cv1(x).chunk(2, 1)) y.extend(m(y[-1]) for m in self.m) return self.cv2(torch.cat(y, 1))逻辑说明HyperGraphConv先用1x1卷积调整通道再把特征图展开成H*W个节点用可学习的邻接矩阵self.adj做矩阵乘法相当于每个节点都聚合了所有节点的信息。代码里初始化为单位矩阵所以模型加载后特征不变训练时才开始学习非对角线的连接权重。C2f的use_hyper参数通过yaml配置例如在对应stage设置use_hypertrue源码就会走超图分支。参数说明self.adj的维度是[1, c2, c2]如果特征层是80x80节点数量6400矩阵乘法计算量会很大所以一般加在stage4或stage5分辨率较低的层。训练时建议保持warmup不变超图模块需要更多轮次才能稳定epochs最好从150起步。如果你把use_hyper打开后mAP反而下降先检查是不是邻接矩阵的学习率设置太高可以单独给这个参数设置10倍衰减。5.3 验证改进效果用mAP和遮挡子集做对比改完之后不能只看整体mAP因为遮挡目标对整体指标贡献小需要专门构造遮挡子集。我通常从COCO val里筛出带遮挡属性的图片或者自己挑一批“行人被护栏、树木挡住”的测试图然后分别跑官方权重和改进权重python val.py --data data/coco.yaml --weights weights/yolov13.pt --task val python val.py --data data/coco.yaml --weights runs/train/exp/weights/best.pt --task val对比输出里每个类目的AP重点看person、bicycle这些容易被遮挡的类。如果正常类掉点不超过0.3而遮挡子集AP提升至少2个百分点这个改进就值得留。如果整体都在掉说明超图卷积加的位置不对试着从stage4换到stage5或者把邻接矩阵改成低秩表示两个小矩阵相乘减少参数量的同时保持表达能力。6. 从训练到部署的收尾技巧用TensorRT加速并稳定复现模型训练收尾后我习惯直接把best.pt转成TensorRT engine因为纯PyTorch推理在低端GPU上太慢生产环境根本撑不住。源码一般自带export.py执行python export.py --weights runs/train/exp/weights/best.pt --include onnx engine --device 0生成engine时会做算子融合和精度校准。如果没有完整数据集做INT8校准建议先用FP16FP16在多数检测场景下精度损失可以忽略。我的一个教训是如果你在源码里改过自定义模块比如上一章的超图卷积ONNX导出可能会提示“不支持的节点”。这时需要为HyperGraphConv写一个symbolic函数让PyTorch导出时把它映射成ONNX能识别的MatMul。但我不建议这么干更省事的做法是把超图卷积的邻接矩阵乘法用等价的1x1卷积和矩阵乘组合重写这样ONNX原生支持。验证engine和原始权重精度的对比命令python val.py --data data/coco.yaml --weights runs/train/exp/weights/best.engine --task valTensorRT输出会有微小浮点误差mAP下降在0.5%以内是正常的如果下降超过1%先怀疑FP16回退到FP32再看。部署时还有个习惯把letterbox预处理一并写入模型图里这样下游服务只需要传原始图片不用自己写resize和填充逻辑能少很多对接bug。我踩过最大的坑就是忽略了版本对齐。现在拿到“完整源码权重文件”后第一件事是记下源码commit和权重md5写进部署文档里然后才动代码和训练。这个习惯帮我少熬了很多个夜。希望帮到你。本文还有配套的精品资源点击获取
