ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RealSense 与 OpenVINO 集成实战指南:用 Depth 相机驱动人脸与物体检测示例

RealSense 与 OpenVINO 集成实战指南:用 Depth 相机驱动人脸与物体检测示例 RealSense 与 OpenVINO 集成实战指南用 Depth 相机驱动人脸与物体检测示例【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense本指南以 wrappers/openvino 目录为核心系统讲解如何将 RealSense 深度相机与 Intel OpenVINO™ 推理工具包结合完成人脸检测与基于 MobileNet-SSD 的物体检测并利用深度帧为每个检测目标估算物理距离。读完本文你将掌握 OpenVINO 示例的 CMake 集成方式、模型下载与版本适配机制、异步推理调用链以及深度对齐与距离标注的完整实现方案。示例定位补齐 SDK 示例之外的 AI 能力wrappers/openvino/readme.md 开宗明义本目录下的示例旨在补充现有 SDK examples如 capture、pointcloud、align 等纯感知与可视化示例专门演示 RealSense 相机与 OpenVINO™ 工具包在计算机视觉computer-vision领域的协同工作方式。目录下提供两个可独立构建运行的示例示例目录功能默认模型rs-face-vinowrappers/openvino/face人脸检测 深度距离估算face-detection-adas-0001rs-dnn-vinowrappers/openvino/dnn通用物体检测 深度距离估算mobilenet-ssd其中 dnn 示例与 wrappers/opencv/dnn 中的 OpenCV DNN 示例使用完全相同的神经网络便于在同一模型下对比 OpenVINO 与 OpenCV 两种推理后端的集成方式与效果。版本支持与适配机制原文档明确列出该示例集设计并测试过的 OpenVINO 版本2019.3.379、2020.3.194、2020.4.287、2021.1.110、2021.3.394使用其他版本可能需要修改代码。版本适配的核心逻辑在 wrappers/openvino/check_vino_version.cmake 中实现CMake 通过探测特定文件是否存在来判断 OpenVINO 版本代际——若存在{INTEL_OPENVINO_DIR}/inference_engine/src/extension/ext_list.hpp判定为2019 或更低OPENVINO2019使用旧版CNNNetReaderAPI 读取模型、依赖ie_cpu_extension库若存在{INTEL_OPENVINO_DIR}/deployment_tools/ngraph/include/ngraph/ngraph.hpp判定为2020.1 或更高OPENVINO_NGRAPH使用InferenceEngine::Core::ReadNetwork读取模型、链接 nGraph 库。对应地wrappers/openvino/CMakeLists.txt 依据这两个宏选择不同的依赖集合与头文件目录。也就是说同一份示例源码通过宏开关同时兼容了 2019 与 2020 两代 OpenVINO API——这正是示例能在多个版本上运行的关键设计。构建前置条件在开始任何 OpenVINO 安装之前强烈建议先查阅 OpenVINO 官方的 Getting Started 指南本指南并不试图替代它。示例本身还需满足以下两项前置OpenVINO Toolkit示例通过 CMake 变量INTEL_OPENVINO_DIR定位安装目录CMakeLists.txt 中该变量默认为空若未配置或路径无效会直接报FATAL_ERROR: Invalid OpenVINO directory specified with INTEL_OPENVINO_DIROpenCVOpenCV 是这些示例的硬性依赖OpenVINO 本身并不强制要求需要通过 CMake 变量OpenCV_DIR指向 OpenCV 的安装或构建目录例如C:/work/opencv/build。更省事的做法是直接使用 OpenVINO 自带的 OpenCV在 CMake 命令行追加-DOpenCV_DIRopenvino-dir/opencv/cmake关于 OpenCV 与 RealSense 的更多集成方式可参考 OpenCV samples。提示在 dnn/CMakeLists.txt 中若OpenCV_DIR未定义或不是有效目录同样会以FATAL_ERROR终止配置说明 OpenCV 缺失时示例无法构建。Windows 平台安装与配置以下步骤基于将 OpenVINO 安装到C:\work\intel\openvino的假设原文全部命令以此路径为基准请按实际安装位置替换。1. 打开命令行并初始化环境 cd C:\work\intel\openvino2. 确保 Python 可用并加载环境变量OpenVINO 的模型工具链依赖 Python 及其脚本如pip若缺失会引发各类失败。建议显式将 Python 与 Scripts 目录加入PATH然后运行环境脚本 set PATH%PATH%;C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\Scripts bin\setupvars.bat3. 安装模型优化器Model Optimizer前置依赖 cd deployment_tools\model_optimizer\install_prerequisites install_prerequisites.bat ...注意事项原文档实测经验networkx库曾因 API 变更引发问题手动回退到1.11版本后一切正常。注意事项若需重做本步或后续步骤建议先清理此前安装的包。默认情况下 OpenVINO 会将其安装到C:\Users\user\Documents\Intel\OpenVINO。4. 运行官方演示脚本完成附加配置 cd ../../demo demo_squeezenet_download_convert_run.bat ... demo_security_barrier_camera.bat ...这些脚本会下载并转换示例模型、验证推理环境是确认 OpenVINO 安装可用的快速手段。5. 下载模型 python tools/model_downloader/downloader.py --all --output_dir C:\Users\user\Documents\Intel\OpenVINO\models该命令会下载 OpenVINO 模型库model zoo中的全部预训练模型耗时较长。如果只想跑示例也可以只下载所需模型见下文模型自动下载机制。6. 转换额外公共模型部分模型以源码格式TensorFlow 等存放在public目录需转换为 OpenVINO IR 格式后才能使用。转换命令如下 cd C:\Users\${USER}\Documents\Intel\OpenVINO\models python C:\work\intel\openvino\deployment_tools\tools\model_downloader\converter.py --name faster_rcnn_resnet101_coco [--mo C:\work\intel\openvino\deployment_tools\model_optimizer\mo.py]--name指定要转换的模型名--mo可选地显式指定 Model Optimizer 入口脚本路径。与示例项目的 CMake 集成完成上述环境准备后构建示例的方式在 CMakeLists.txt 中可见一斑项目名为RealsenseOpenVINSamples通过include(${INTEL_OPENVINO_DIR}/inference_engine/share/InferenceEngineConfig.cmake)引入 Inference Engine 的 CMake 配置随后依据版本宏组装DEPENDENCIES并将rs-vino目录下的共享辅助类base-detection、object-detection、detected-object与openvino-helpers与 EasyLoggingELPP源码一并编译进每个示例可执行文件。Linux 平台安装与配置Linux 下的步骤与 Windows 高度相似原文档归纳为三步下载最新版 OpenVINO 工具包并遵循官方 Linux 安装指南与上述 Windows 步骤非常类似按 librealsense 安装文档 从源码构建librealsense但 CMake 命令需追加三个关键选项-DBUILD_OPENVINO_EXAMPLEStrue -DOpenCV_DIR... -DINTEL_OPENVINO_DIR...其中BUILD_OPENVINO_EXAMPLES是总开关OpenCV_DIR指向 OpenCVINTEL_OPENVINO_DIR指向 OpenVINO 安装根目录运行示例前确保$LD_LIBRARY_PATH指向 OpenVINO 库目录执行source $INTEL_OPENVINO_DIR/bin/setupvars.sh即可完成设置。模型文件自动下载与手动放置模型不在发行包中OpenVINO 模型文件既不属于 librealsense 发行包也不随 OpenVINO 分发需要单独获取。wrappers/openvino/dl_vino_model.cmake 定义了一个dl_vino_model(filename sha1)函数CMake 配置时按 SHA1 校验和从https://librealsense.realsenseai.com/rs-tests/OpenVINO_data2019 版或.../2020.1.033新版下载模型到CMAKE_CURRENT_BINARY_DIR即各示例的构建目录。例如 dnn/CMakeLists.txt 针对不同 OpenVINO 代际下载不同 IR 版本的mobilenet-ssd.xml/.binIRv10 仅用于 2020.1 及以后以及mobilenet-ssd.labels与README.txt。运行时依赖的放置规则多数示例要求 DLL 或附属文件能在可执行文件同目录下被找到而非写死绝对路径。例如可执行文件位于c:/work/lrs/build/Release则缺失的 DLL 或模型文件应复制到同一目录或修改代码中的查找路径。以非 Debug 构建为例需从${OpenCV_DIR}/bin复制以下 OpenCV DLL 到RelWithDebInfo输出目录opencv_core411.dll opencv_highgui411.dll opencv_imgcodecs411.dll opencv_imgproc411.dll opencv_videoio411.dllCMake 运行时会自动将预训练模型放入各示例的构建目录。例如 face 示例的构建目录build/wrappers/openvino/face下会有三个文件README.txt face-detection-adas-0001.xml face-detection-adas-0001.binrs-face-vino.cpp 的异常处理中也有对应提醒若模型加载失败请将.bin与.xml两个文件复制到程序运行的工作目录或修改构造函数中的模型路径。推理设备选择与 CPU 扩展OpenVINO 模型可加载到任意可用设备CPU、GPU、Movidius™ 神经计算棒或 FPGA前提是具备对应的.dll/.so运行库。示例默认使用CPU设备而非假定存在独立 GPU——在无独立显卡的环境下 CPU 往往反而更快但读者完全可以自行实验切换设备。设备名在源码中以字符串形式配置rs-face-vino.cpp 中的std::string const device_name { CPU }改成GPU即可切换同时需移除AddExtension()调用。使用 CPU 设备时示例在运行时依赖cpu_extension.dllWindows或libcpu_extension.soLinux。若遇到缺少该组件的运行时错误可从常规构建产物中找到它们放到与模型文件相同的位置当前目录或可执行文件旁。从源码看2019 版通过engine.AddExtension(std::make_sharedopenvino::Extensions::Cpu::CpuExtensions(), device_name)显式注册 CPU 扩展rs-face-vino.cpp而 OpenVINO 2020.1 起该扩展已并入 CPU 插件此调用被宏#ifdef OPENVINO2019包住不再执行。另外 CMakeLists.txt 提供了BUILD_WITH_CPU_EXTENSIONS开关关闭时会禁用 AVX2/AVX512F 指令集优化。人脸检测示例rs-face-vino实现剖析核心类object_detection示例将大部分 OpenVINO 细节封装进openvino_helpers::object_detection辅助类定义于 wrappers/openvino/rs-vino/object-detection.h。使用时只需两行openvino_helpers::object_detection faceDetector( face-detection-adas-0001.xml, 0.5 // Probability threshold -- anything with less confidence will be thrown out );第一个参数是模型 IR 文件.xml路径同目录的.bin权重会被自动加载源码中通过remove_ext(pathToModel) .bin推导见 object-detection.cpp第二个参数是置信度阈值detectionThreshold低于该值的检测结果会被丢弃。该类继承自 base_detection后者封装了InferenceEngine::ExecutableNetwork、InferRequest、批大小、异步标志等基础设施并提供load_into(ie, deviceName)将网络加载到指定推理设备。模型输入输出约束object_detection::read_network()object-detection.cpp 起对模型有明确校验网络必须恰好有 1 个或 2 个输入否则抛出std::logic_error4 维输入如1,3,300,300被识别为图像数据data精度设置为U82 维输入如1x3被识别为可选的im_infoheight, width, image_scale精度为FP32输出层预期为DetectionOutput类型。这些信息都可以在模型.xml文件中查看搜索typeInput层可找到输入typeDetectionOutput为期望的输出层。示例对 Faster R-CNN 这类双输入模型也做了适配尝试填充im_infoblob缩放因子置 1.0鼓励读者自行试验其他模型。异步推理流水线检测采用异步模式先排队当前帧等下一帧到来时再取回上一帧的结果从而将推理耗时与相机采集流水线重叠。核心调用链如下rs-face-vino.cpp// Wait for the results of the previous frame we enqueued: were going to process these faceDetector.wait(); auto results faceDetector.fetch_results(); // Enqueue the current frame so wed get the results when the next frame comes along! faceDetector.enqueue( image ); faceDetector.submit_request();在 object-detection.cpp 中enqueue()负责将cv::Mat转换为 Inference Engine Blob通过 openvino-helpers.h 中的matU8ToBlob模板实现支持 1/3 通道、自动 resizefetch_results()解析输出并生成带label、confidence、locationcv::Rect的结果集合。跨帧人脸跟踪IoU 关联检测结果会被放入容器并分配自增 ID。为避免同一张脸被反复当作新人脸创建示例用IoUIntersection over Union交并比关联新旧检测框detected-object.cpp 的find_object()将当前检测框与上一帧所有人脸框计算交并比阈值maxIoU 0.35f——超过该值则视为同一张脸并直接移动旧框位置否则才创建新的detected_objectrect rect cv::Rect( 0, 0, image.cols, image.rows ); auto face_ptr openvino_helpers::find_object( rect, prev_faces ); if( !face_ptr ) // New face face_ptr std::make_shared openvino_helpers::detected_object ( id, rect ); else // Existing face; just update its parameters face_ptr-move( rect );原文档对阈值选取给出了经验性说明人脸位置越稳定maxIoU可设得越高人脸静止但变大/变小靠近/远离相机时 IoU 变化不大而一旦移动 IoU 会迅速变小。深度距离估算关键技巧是先将深度帧与彩色帧做空间对齐rs2::align align_to(RS2_STREAM_COLOR)rs-face-vino.cpp使彩色帧中人脸框中心像素与深度帧同一像素对应随后直接查询深度auto center_x r.x r.width / 2; auto center_y r.y r.height / 2; auto d depth_frame.get_distance( center_x, center_y );得到的d单位米会被格式化输出到检测框上实现检测框 实时距离的可视化见 rs-face-vino.cpp。原文档也提醒这是粗略估算直接取框中心点未做更精细的深度采样或滤波。物体检测示例rs-dnn-vino实现剖析rs-dnn-vino 复用与 face 完全相同的openvino_helpers::object_detection辅助代码仅替换模型为面向通用物体检测的 MobileNet-SSD。运行效果从截图可见它能识别tvmonitor、bottle、person等类别并同样输出以米为单位的距离rs-dnn-vino.jpg。多模型热切换与 .labels 标签文件示例自带一组 IR 文件mobilenet-ssd.xml与.bin但它会加载当前目录下的任意模型并支持在运行时切换便于实验不同网络。为此rs-dnn-vino.cpp 定义了detector_and_labels结构用cv::utils::fs::glob扫描磁盘上所有*.xml模型为每个模型实例化检测器并加载其标签。每个模型可附带一个可选的.labels分类文件将输出的整数标签映射为可读名称如person、bottle。OpenVINO 模型库本身不提供这些文件需要根据训练模型时的类别手动创建。格式参见示例附带的mobilenet-ssd.labels每行一个分类从 0 开始第 0 行通常为背景。加载逻辑在 openvino-helpers.h 的read_labels()中实现——逐行读取字符串失败时仅告警并继续运行rs-dnn-vino.cpp。性能取向MobileNet 系列模型面向移动端设计性能高、适合 CPU 实时推理而更先进的模型可能精度或分类能力更强但通常需要 GPU 或其他加速设备才能流畅运行。这与前文默认 CPU 设备的设计互为呼应。从源码看整体调用链将上述内容串起来两个示例的运行主线是一致的创建rs2::pipeline并start()声明rs2::align将深度对齐到彩色流创建InferenceEngine::Core2019 版注册 CPU 扩展与错误监听error_listener其将引擎错误转发到LOG(DEBUG)实例化object_detection模型路径 置信度阈值load_into()加载到指定设备主循环wait_for_frames()→align_to.process()→frame_to_mat()转cv::Mat→ 异步enqueue/submit_request→wait/fetch_results对每个检测框做 IoU 跨帧关联、以框中心查询depth_frame.get_distance()最后cv::rectanglecv::putText可视化。整个数据流横跨 RealSense SDK采集与对齐、OpenCV图像格式与绘制、OpenVINO Inference Engine推理三大组件wrappers/openvino/rs-vino 目录正是这三者的胶水层。构建层面wrappers/CMakeLists.txt 与各示例自身的 CMakeLists 共同完成依赖链接、宏定义OPENVINO2019/OPENVINO_NGRAPH、模型下载与安装RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin等全部工作。常见问题与排错速查症状原因与处理FATAL_ERROR: Invalid OpenVINO directoryINTEL_OPENVINO_DIR未设置或指向无效目录需在 CMake 命令行显式传入FATAL_ERROR: OpenVINO examples require OpenCV; specify OpenCV_DIR未配置OpenCV_DIR指向 OpenCV 构建目录或 OpenVINO 自带 OpenCV 的opencv/cmake运行时提示缺少cpu_extension.dll/libcpu_extension.soCPU 扩展库未在可执行文件旁从构建产物复制到模型文件同目录模型加载失败Failed to load model files将face-detection-adas-0001.xml与.bin或对应模型文件复制到程序工作目录或修改构造函数的路径参数提示Object detection network should have only one or two inputs模型输入层数不符检查.xml中typeInput层的数量OpenVINO 版本不在支持列表代码使用宏兼容 2019 与 2020.1 两代 API其余版本可能需要修改代码Windows 下还应注意networkx需回退到 1.11结语本目录的示例以最少的代码展示了 RealSense OpenVINO 的完整闭环采集、对齐、推理、跟踪、测距、可视化。无论是替换自定义模型满足单/双输入 DetectionOutput约束即可还是切换推理设备CPU/GPU/Movidius/FPGA这套 rs-vino 辅助层都提供了清晰的扩展点。官方给出的适配版本为 2019.3.379 ~ 2021.3.394实际使用时请以 check_vino_version.cmake 的版本探测结果为准。【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表