news 2026/9/12 8:44:04

如何用 InsightFace 的 SCRFD Person 模型完成全身人物检测?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 InsightFace 的 SCRFD Person 模型完成全身人物检测?

如何用 InsightFace 的 SCRFD Person 模型完成全身人物检测?

【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface

InsightFace 的 SCRFD Person 检测示例 可以完成一个具体任务:给定一张图片,在一次前向推理中同时输出全身人物的 bounding box,以及该人物当前可见区域的标记。模型是scrfd_person_2.5g.onnx,通过download=True参数自动从官方存储服务器下载到本地,不需要手动找模型文件。最终产物是叠加了标注结果的图片:绿色框表示全身,蓝色掩码表示可见区域。

环境准备

示例入口是 scrfd_person.py,文件开头的版本断言给出了最低要求:

import insightface assert insightface.__version__>='0.4'

安装与升级方式见 examples/README.md 和 examples/person_detection/README.md:

pip install -U insightface

代码中还依赖cv2numpy来读图、画框和保存结果。运行示例脚本前,需要准备两样东西:

  1. 一个可读写的工作目录(脚本从这里读取输入图片);
  2. 一个名为data/images的目录,把待检测的.jpg图片放进去——脚本用glob.glob('data/images/*.jpg')匹配文件。

另外注意脚本结尾会把结果写到./outputs/目录,运行前需确认当前工作目录下已存在该目录,否则cv2.imwrite会失败。

加载并初始化 SCRFD Person 模型

模型加载和参数配置是两行代码,官方示例中的写法是:

detector = insightface.model_zoo.get_model('scrfd_person_2.5g.onnx', download=True) detector.prepare(0, nms_thresh=0.5)

逐条说明:

  • get_model('scrfd_person_2.5g.onnx', download=True):如果本地~/.insightface/models/下已有该 onnx 文件就直接加载;不存在则自动下载(model_zoo.py 中allow_download为 True 时走下载分支,默认root~/.insightface)。这一步需要网络可访问,断网环境下请提前准备好模型文件再传download=False以外的本地路径。
  • detector.prepare(0, nms_thresh=0.5)ctx_id0表示使用非负上下文标识初始化,nms_thresh用于后置 NMS 的 IoU 阈值。SCRFD 类中 NMS 阈值默认为0.4、检测分数阈值det_thresh默认为0.5(见 scrfd.py 第 87–88 行),示例显式把nms_thresh调到了0.5,即框重叠达到 0.5 才会被 NMS 抑制。

运行检测并理解返回结果

官方示例的核心函数(节选自 scrfd_person.py):

def detect_person(img, detector): bboxes, kpss = detector.detect(img) bboxes = np.round(bboxes[:,:4]).astype(np.int) kpss = np.round(kpss).astype(np.int) kpss[:,:,0] = np.clip(kpss[:,:,0], 0, img.shape[1]) kpss[:,:,1] = np.clip(kpss[:,:,1], 0, img.shape[0]) vbboxes = bboxes.copy() vbboxes[:,0] = kpss[:, 0, 0] vbboxes[:,1] = kpss[:, 0, 1] vbboxes[:,2] = kpss[:, 4, 0] vbboxes[:,3] = kpss[:, 4, 1] return bboxes, vbboxes

detector.detect(img)返回两个数组:

  • bboxes:每个检测出的人物一行,前 4 列是全身框(x1, y1, x2, y2),最后一列是置信度;示例取前 4 列并取整用于画框。
  • kpss:每个人物 5 个关键点,形状(n, 5, 2)

示例的“可见区域”是这样得到的:直接取第 1 个关键点(kpss[:, 0, 0], kpss[:, 0, 1])作为可见框左上角、第 5 个关键点(kpss[:, 4, 0], kpss[:, 4, 1])作为右下角,构造vbboxes,并把坐标裁剪到图像边界内。这就是 README 里说的“单次前向中同时输出全身框与可见区域”。

完整脚本的运行逻辑是:遍历data/images/*.jpg,对每张图调用detect_person,然后为每个人物画绿色全身框(cv2.rectangle,颜色(0,255,0)),并在可见区域内用 alpha 为 0.8 的蓝色(255, 0, 0)做混合着色,四角再画圆点标记。最后按原文件名写入./outputs/

如果你的图片不是.jpg,把glob.glob('data/images/*.jpg')里的后缀改成实际格式即可,其余代码不变。

验证结果

示例脚本没有打印数值型指标,验证方式是查看./outputs/下生成的标注图:

  • 绿色矩形 = 该人物的全身检测框;
  • 蓝色着色区域 = 该人物的可见区域。

examples/person_detection/README.md 中给出的检测效果示意(文档示例图片,仅供参考):

判断运行是否正常的依据:

  1. 加载模型时如果本地没有 onnx 文件,终端会打印download_path:开头的下载信息;加载成功后get_model内部会打印Applied providers: ...一行(onnxruntime 会话创建后输出)。
  2. ./outputs/下出现了与输入同名的图片,且图中框与人物位置相符,即说明检测链路已跑通。
  3. 如果某张图输出为空白(没有框),表示该输入下没有满足阈值的检测——可以调低nms_thresh/检测阈值重新尝试,但示例本身没有给出推荐数值,请按自己的数据试验。

限制与适用条件

  • 官方示例的测试条件是 640 输入尺寸(README 原文:“We make tests on the input size of 640”),换其他输入尺寸效果未在该文档中说明。
  • 模型自动下载依赖网络;download=True时请确认能访问存储服务器。
  • 脚本按data/images/*.jpg硬匹配输入目录,图片放错目录或格式不符时img_paths为空,脚本会静默不处理任何图片——运行前先用ls data/images确认。
  • 版本要求以示例自带的断言insightface.__version__>='0.4'为准。

进一步阅读:模型实现见 detection/scrfd 目录,onnx 模型加载逻辑见 python-package/insightface/model_zoo。

【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

SAR点目标仿真中CSA算法的相位一致性原理与MATLAB实现

简介:本资源是一套面向雷达信号处理初学者与高校相关专业学生的合成孔径雷达(SAR)点目标仿真教学代码,聚焦Chirp Scaling Algorithm(CSA,即线性变标算法)的核心实现,用于理解SAR成像…

作者头像 李华
网站建设 2026/9/12 8:40:23

C++内存池技术:原理、实现与性能优化

1. 内存池技术背景与核心价值内存池(Memory Pool)是C/C开发中一种经典的内存管理优化技术,它的核心思想是通过预分配和复用内存块来减少频繁调用系统内存分配函数带来的性能损耗。我第一次接触这个概念是在处理一个高频交易系统时——当时系统…

作者头像 李华
网站建设 2026/9/12 8:37:00

ClaudeCode自动技能库:智能编程助手的核心机制与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 8:36:39

Mindustry安装教程:JDK 17环境下3步完成部署与运行

Mindustry安装教程:JDK 17环境下3步完成部署与运行 【免费下载链接】Mindustry The automation tower defense RTS 项目地址: https://gitcode.com/GitHub_Trending/min/Mindustry Mindustry是一个用Java编写的自动化塔防RTS开源项目,核心玩法是搭…

作者头像 李华