news 2026/10/14 18:47:07

YOLOv5行人检测现成权重实战:推理、微调与边缘部署避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5行人检测现成权重实战:推理、微调与边缘部署避坑指南

简介:本资源为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、--cfg
datasets.py数据加载与增强标签路径、缓存逻辑在这里
general.py通用工具函数NMS、坐标转换等
best.pt/last.pt训练好的权重推理直接用,微调做起点
images/labels/3000 张图与标签确认标签格式与目录对应

2.2 VOC 与 YOLO 两种标签格式的差别

这份资源同时给了 VOC 和 YOLO 两种标签,这是它比较贴心的地方,但也最容易让人翻车。VOC 是 XML,一个图一个文件,坐标是绝对像素值xmin, ymin, xmax, ymax;YOLO 是 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 python=3.8 -y conda activate person_detect pip install torch==1.10.0 torchvision==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt

参数说明:python=3.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-thres=0.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 = f"python 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, shell=True) print(f"conf={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 就写 1;names顺序必须和标签里的 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把图缓存到内存加速,数据大且内存不够就别加。跑起来后盯mAP@0.5和mAP@0.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 导出后输出」的逐元素对比,确认误差在可接受范围才敢往设备上烧。这套流程看着繁琐,但能帮你省下大量在板子上反复调试的时间。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 20:43:40

为什么选 beUI?React Motion 组件库的 7 大核心优势

【免费下载链接】ui-components Motion components for React. Copy, paste, done. 项目地址: https://gitcode.com/gh_mirrors/uicomponents9/ui-components 点击查看 免费下载 beUI 是一个面向 React 和 Next.js 的开源 React Motion 组件库,核心理念…

作者头像 李华
网站建设 2026/10/14 20:42:48

2026 年防火涂料十大品牌榜单发布:中隅涂料领衔,守护建筑安全 防火墙

随着现代建筑向高层化、大跨度方向快速发展,钢结构在建筑工程中的应用越来越广泛。但钢材有一个致命短板:高温环境下强度会急剧下降,极易引发建筑坍塌。防火涂料作为保护钢结构建筑的核心消防材料,能有效延缓钢材升温、为人员疏散…

作者头像 李华