恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
YOLOv5行人检测现成权重实战:推理、微调与边缘部署避坑指南
首页
资讯中心
/
YOLOv5行人检测现成权重实战:推理、微调与边缘部署避坑指南
YOLOv5行人检测现成权重实战:推理、微调与边缘部署避坑指南
发布时间:2026/10/10 23:26:36
简介本资源为YOLOv5-6.0行人检测训练权重与配套数据集面向从事街道、公路场景行人检测的算法工程师、学生及研究者帮助快速获得可直接推理或继续微调的模型省去从零训练的时间成本。压缩包共约2000个文件整体378.52MB以jpg图像与txt标注为主另含yaml配置、py训练脚本、pt权重及少量xml、md说明文件覆盖数据、代码与权重三类内容。资源包含3000张多行人图像标签同时提供VOC与YOLO两种格式并附有训练曲线图模型基于一万多条数据训练准确率达90%以上类别为person。已有6309人学习下载读者可据此复现训练流程、验证检测效果或直接替换自有数据继续迭代适合作为行人检测项目的起点与对照基准。1. 街道行人检测的现成权重拿到就能跑但别急着高兴做街道或公路行人检测的兄弟多半有过这种经历自己从零训一个 YOLOv5数据集标注、类别平衡、anchor 聚类、训练调参一路折腾下来mAP 卡在 0.7 上不去显存和时间倒是烧了不少。这份yolov5-6.0-person_detect.zip就是冲着这个痛点来的——它直接给了一份在 1 万多张数据上训好的行人检测权重单类person宣称准确率 90% 以上还附带 3000 张多行人数据标签同时给了 VOC 和 YOLO 两种格式。换句话说你拿到的不只是权重还有一份能继续微调、能验证、能换场景再训的数据底子。它适合谁一是想快速搭行人检测 demo、做算法验证或课程设计的同学省掉从零标注的苦二是已经有业务场景比如路口监控、园区人流统计想拿现成权重做 baseline再决定要不要自己补数据微调的人。但我要先把丑话说前面现成权重不是万能药它的 90% 是在特定数据分布上测出来的换到你的摄像头、你的光照、你的拍摄角度掉点很正常。这篇就按「这是什么 → 怎么跑起来 → 怎么微调 → 坑在哪」的顺序把它拆开讲透。2. 权重与数据集拆包先看清目录结构和标签格式2.1 压缩包里到底装了什么解压后你会看到典型的 YOLOv5-6.0 工程结构外加权重和数据。README、CONTRIBUTING、bug-report、feature-request、question 这些是官方仓库自带的文档模板真正干活的是train.py、datasets.py、general.py这几个脚本。权重文件一般是best.pt或last.pt数据集则分 images 和 labels 两个目录。先别急着跑第一步是把结构摸清楚否则后面路径对不上报错能让你怀疑人生。文件/目录作用使用注意train.py训练与微调入口改--data、--weights、--cfgdatasets.py数据加载与增强标签路径、缓存逻辑在这里general.py通用工具函数NMS、坐标转换等best.pt/last.pt训练好的权重推理直接用微调做起点images/labels/3000 张图与标签确认标签格式与目录对应2.2 VOC 与 YOLO 两种标签格式的差别这份资源同时给了 VOC 和 YOLO 两种标签这是它比较贴心的地方但也最容易让人翻车。VOC 是 XML一个图一个文件坐标是绝对像素值xmin, ymin, xmax, ymaxYOLO 是 txt每行class cx cy w h全部归一化到 0~1。YOLOv5 训练只认 YOLO 格式所以如果你手上是 VOC必须先转。很多人直接把 VOC 的 XML 丢进 labels 目录训练时 loss 不降反升就是因为格式没对上。# VOC XML 转 YOLO txt 的核心逻辑 import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, out_path): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls_name obj.find(name).text # 单类 person类别 id 固定为 0 cls_id 0 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化并转为中心点 宽高 cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))这段代码的关键点有三个一是cls_id固定为 0因为这份权重是单类 person多类场景要按你的data.yaml顺序改二是归一化必须用图片真实宽高img_w、img_h要从对应图片读不能写死三是坐标要转成中心点加宽高YOLO 不认角点坐标。转换完记得抽查几张用可视化脚本画框确认别信脚本跑完没报错就万事大吉。2.3 环境依赖与版本对齐YOLOv5-6.0 对版本比较敏感尤其是 PyTorch 和 torchvision。常见做法是建一个干净虚拟环境按官方 requirements 装。如果你用太新的 PyTorch某些算子行为变了推理结果可能对不上。我一般会先确认 CUDA 版本再选对应的 torch 轮子。# 建环境并安装依赖示例按自己 CUDA 版本调整 conda create -n person_detect python3.8 -y conda activate person_detect pip install torch1.10.0 torchvision0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt参数说明python3.8是 6.0 版本比较稳的搭配torch 1.10 对应 cu113如果你显卡驱动只支持 cu111就换对应轮子。装完先跑python detect.py --weights best.pt --source 你的测试图能出框再谈训练。这一步是分水岭环境没对齐后面全是玄学报错。3. 用现成权重跑推理detect.py 参数怎么设才不翻车3.1 最小可跑命令与参数含义拿到权重第一件事是验证它到底能不能用。别一上来就接摄像头先用几张静态图跑通。detect.py是推理入口核心参数就那么几个但每个都影响结果。python detect.py \ --weights best.pt \ --source ./test_images \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --device 0 \ --save-txt逐项说明--weights指向权重文件--source可以是单图、目录、视频或0摄像头--img-size 640是推理分辨率权重训练时用的多少这里最好对齐否则小目标漏检明显--conf-thres 0.25是置信度阈值行人检测场景我一般从 0.25 起调太低误检多太高漏检多--iou-thres 0.45控制 NMS 合并人群密集时这个值要谨慎调太低会把挨着的人合并成一个框--device 0指定 GPU没 GPU 写cpu--save-txt会把检测结果存成 YOLO 格式 txt方便你后续做统计或二次处理。3.2 置信度与 NMS 阈值对行人检测的实际影响这两个阈值是行人检测里最需要动手调的地方没有之一。街道场景里远处行人像素少置信度天然偏低人群密集时NMS 的 IoU 阈值直接决定你会不会把三个人检成一个人。我的血泪经验是先固定iou-thres0.45把conf-thres从 0.5 往下扫看漏检和误检的平衡点再固定conf-thres把iou-thres在 0.3~0.6 之间试观察密集人群的框合并情况。# 批量扫阈值统计不同 conf 下的检测框数量 import subprocess for conf in [0.15, 0.25, 0.35, 0.45, 0.55]: cmd fpython detect.py --weights best.pt --source ./test_images \ f--conf-thres {conf} --iou-thres 0.45 --save-txt --project runs/conf_{conf} subprocess.run(cmd, shellTrue) print(fconf{conf} done)跑完对比runs/conf_*下的结果挑一个漏检和误检都能接受的。注意--project参数把不同阈值的结果分目录存不然会互相覆盖这是很多人第一次跑就踩的坑。参数没有标准答案取决于你的场景更怕漏检还是更怕误检——安防场景通常宁可误检不可漏检那就把 conf 调低。3.3 推理结果的可视化与验证跑完推理runs/detect/exp下会有带框的图。别只看一两张就下结论要覆盖不同光照、不同密度、不同距离的样本。我一般会挑三类图重点看远景小目标、密集人群、遮挡严重比如树荫、车辆遮挡的。这三类最能暴露权重在你场景下的真实水平。如果远景漏检严重说明--img-size可能偏小可以试 1280但速度会掉如果密集人群合并严重回去调iou-thres。提示验证时把--save-txt打开txt 里的框坐标可以拿去和你的标注做对比算个简单的召回率比肉眼看靠谱。4. 微调自己的数据从 3000 张底子到你的场景4.1 为什么要微调而不是从零训现成权重是在 1 万多张通用街道数据上训的你的场景如果和它分布接近直接推理可能就够用。但如果你做的是园区、校园、特定摄像头角度分布差异大微调能明显提点。微调的本质是拿预训练权重当起点用你的数据继续训学习率调小让模型在你的分布上做适配而不是把学到的通用特征全推翻。从零训需要大量数据和算力微调几百到几千张就能见效这是性价比最高的路子。4.2 data.yaml 配置与目录组织微调前先把数据组织成 YOLOv5 认的结构并写一个data.yaml。这份资源给的 3000 张数据可以直接当底子再混入你自己的图。# data.yaml path: ./person_data train: images/train val: images/val nc: 1 names: [person]参数说明path是数据集根目录train、val是相对路径分别指向训练和验证的图片目录YOLOv5 会自动去找同级的labels目录nc: 1是类别数单类 person 就写 1names顺序必须和标签里的 class id 对应写错会导致类别全乱。目录结构建议images/train、images/val、labels/train、labels/val四件套图片和标签文件名一一对应差一个都会在加载时报错。4.3 微调命令与关键超参数微调命令和训练一样只是--weights指向现成权重学习率调小。python train.py \ --weights best.pt \ --data data.yaml \ --cfg models/yolov5s.yaml \ --epochs 50 \ --batch-size 16 \ --img-size 640 \ --lr0 0.001 \ --freeze 10 \ --cache逐项说明--weights best.pt是微调起点--cfg必须和权重对应的模型结构一致权重是 yolov5s 就写 yolov5s写错会加载失败--epochs 50微调不用太多通常 30~100 够--batch-size 16按显存调爆显存就减--lr0 0.001比从零训的 0.01 小一个量级避免把预训练特征冲掉--freeze 10冻结前 10 层 backbone小数据微调常用数据多可以不冻--cache把图缓存到内存加速数据大且内存不够就别加。跑起来后盯mAP0.5和mAP0.5:0.95两条曲线验证集不涨甚至掉就说明学习率太大或数据有问题。4.4 训练曲线怎么读资源里附了各种训练曲线图这是判断训练好坏的直接依据。重点看三条train/box_loss和val/box_loss是否同步下降如果 train 降 val 不降过拟合了metrics/mAP_0.5是否稳定上升后收敛lr曲线是否符合预期调度。常见问题是 val loss 早早反弹多半是数据量不够或增强太猛。我一般会在--hyp里调低 mosaic 增强概率小数据集上 mosaic 太强反而拖后腿。5. 避坑与排查这几处翻车我替你踩过了5.1 现象推理框全错位或框到背景原因标签格式没转对VOC 的绝对坐标被当成 YOLO 归一化坐标用了或者图片和标签文件名不匹配导致错配。解决确认 labels 目录下全是 txt 且每行是class cx cy w h归一化格式写个脚本抽查图片和标签是否一一对应坐标乘回宽高画框验证。5.2 现象训练 loss 为 nan 或直接崩原因学习率太大、标签里有非法值坐标超过 1 或为负、图片损坏。解决先把--lr0降到 0.001 以下试用脚本扫一遍标签过滤掉坐标越界的行确认没有 0 字节图片。这类问题在混入自己数据后特别常见标注工具导出格式不统一是重灾区。5.3 现象显存爆了batch 调到 1 还爆原因--img-size太大或--cache把整个数据集塞内存或模型 cfg 和权重不匹配导致结构异常。解决先把 img-size 降到 640 甚至 416去掉--cache核对--cfg和权重是否同一规模s/m/l。如果还爆用nvidia-smi看是不是别的进程占着显存没释放。5.4 现象密集人群检测框大量合并原因NMS 的iou-thres设太低把相邻行人当成同一目标合并了。解决把iou-thres往上调到 0.5~0.6同时适当降低conf-thres保留更多候选框。如果还不行考虑换用 soft-NMS但 YOLOv5 默认没带要自己改general.py里的 NMS 逻辑。5.5 现象换到自己摄像头后准确率暴跌原因域偏移。现成权重的训练分布和你的场景差异大光照、角度、分辨率都变了。解决别指望直接推理老老实实采几百张你场景的图标注后微调。微调时把现成权重当起点学习率调小通常几十个 epoch 就能拉回来。6. 进阶技巧把权重用到边缘设备和量化部署上现成权重跑通只是第一步真落地往往要上边缘设备。最近问得多的就是 yolov5 量化部署到 RK3568 或树莓派 4B 这类板子。核心思路是先把 PyTorch 权重导出成 ONNX再转成目标平台支持的格式。导出 ONNX 时注意 opset 版本和输入尺寸要固定动态轴在部分推理引擎上支持不好。# 导出 ONNX固定输入尺寸便于后续量化 python export.py --weights best.pt --include onnx --img-size 640 640 --opset 12 --simplify参数说明--include onnx指定导出格式--img-size 640 640固定宽高边缘设备上动态尺寸往往不支持--opset 12是兼容性较好的版本太低缺算子太高部分工具链不认--simplify用 onnx-simplifier 精简计算图能减少转换时的算子兼容问题。导出后用onnxruntime跑一遍确认输出和 PyTorch 一致再往 RKNN 或 NCNN 转。量化环节最容易掉点的是 INT8 校准校准集一定要用你真实场景的图别拿训练集随便凑否则量化后小目标检测会明显变差。验证量化模型时我习惯拿同一批测试图分别跑 PyTorch 和量化后的模型逐张对比框数量和位置差异超过 10% 就回去查校准集和量化配置。边缘设备上还要关注后处理耗时NMS 在 CPU 上可能比推理还慢必要时把 NMS 也放到 NPU 或做并行优化。从那以后我每次导出模型都强制走一遍「PyTorch 输出 vs 导出后输出」的逐元素对比确认误差在可接受范围才敢往设备上烧。这套流程看着繁琐但能帮你省下大量在板子上反复调试的时间。希望帮到你。本文还有配套的精品资源点击获取