基于 NanoDet-Plus 轻量级检测模型与 OpenVINO 推理引擎,专为 排球单目标检测 优化的实时视觉系统。采用自定义多因子 NMS 策略,通过终端标准输出打印球心坐标,可配合重定向或管道与下位机系统联动。
项目定位:本项目是排球机器人系统的上位机检测模块之一。与 Nanodet_OpenVINO(可视化调试版)共享核心检测代码,区别在于本项目摄像头模式关闭了窗口显示,改为输出球心坐标。如需功能更完整的上位机方案(串口通信、JSON 配置),推荐使用 yolov8_volleyball。
| 仓库 | 角色 | 说明 |
|---|---|---|
| yolov8_volleyball | 上位机(推荐) | YOLOv8+NanoDet 双引擎,Boost.Asio 串口通信 |
| nanodet_volleyball(本项目) | 上位机 | NanoDet 专用版,终端坐标输出 |
| Nanodet_OpenVINO | 上位机(调试用) | NanoDet 可视化调试版本 |
| RM-C-board-volleyball | 下位机 | STM32F407 麦克纳姆轮底盘控制 |
- NanoDet-Plus 轻量级模型,排球单类别检测
- 自定义多因子 NMS:形状评分 x 距离惩罚 x 尺寸惩罚
- OpenVINO 推理引擎加速,支持 INT8 / FP16 / FP32 多精度
- 卡尔曼滤波目标追踪,轨迹历史记录
- 海康工业相机 PIMPL 封装(MvCameraControl SDK)
- 摄像头模式下通过
printf输出球心像素坐标到终端 - 4 种运行模式:图像 / 摄像头 / 视频 / 基准测试
- 视频模式支持空格暂停、逐帧分析
nanodet_volleyball/
├── include/
│ └── Nanodet.h # NanoDet 类定义(单类别:排球)
├── src/
│ ├── Nanodet.cpp # 推理实现:自定义多因子NMS + 追踪
│ └── main.cpp # 主程序:检测 + 球心坐标输出
├── camera/
│ ├── hikvision_wrapper.hpp # 海康相机 PIMPL 接口
│ └── hikvision_wrapper.cpp # 海康相机实现
├── struct/
│ └── common_struct.hpp # 公共数据结构
├── test/
│ ├── nanodet_IR.xml # OpenVINO IR 模型
│ ├── nanodet_IR.bin # 模型权重
│ ├── nanodet.onnx # ONNX 模型
│ ├── main_onnx.py # Python ONNX 测试
│ ├── main_openvion.py # Python OpenVINO 测试
│ ├── 排球.mp4 # 排球测试视频
│ └── ... # 测试媒体文件
├── CMakeLists.txt # CMake 构建配置
└── run.sh # 一键编译并启动脚本
| 依赖 | 版本要求 | 安装方式 |
|---|---|---|
| Intel OpenVINO | >= 2022.1 | 官方安装指南 |
| OpenCV | >= 4.0 | sudo apt install libopencv-dev |
| 海康 MVS SDK | 最新版 | 海康机器人官网,安装到 /opt/MVS/ |
| CMake | >= 3.10 | sudo apt install cmake |
| GCC | >= 7.0 | C++17 支持 |
git clone https://github.com/51hhh/nanodet_volleyball.git
cd nanodet_volleyball# 设置 OpenVINO 环境变量(每次编译/运行前需要,或写入 ~/.bashrc)
source /opt/intel/openvino/setupvars.shmkdir -p build && cd build
cmake ..
make -j$(nproc)# 海康摄像头实时检测(输出球心坐标到终端)
./nanodet_openvino 1 0
# 视频文件检测(带可视化窗口,空格暂停,其他键逐帧)
./nanodet_openvino 2 ../test/排球.mp4
# 图像检测
./nanodet_openvino 0 ../test/rc.jpg
# 性能基准测试(1000 次推理)
./nanodet_openvino 3 0注:
run.sh可一键编译并以海康相机模式启动(mkdir build && cmake && make && ./build/nanodet_openvino 1 0)。
| 模式 | 参数 | 说明 |
|---|---|---|
0 |
图像路径 | 单张图像检测,显示结果窗口 |
1 |
摄像头 ID | 海康工业相机实时检测,终端输出球心坐标(无窗口显示) |
2 |
视频路径 | 视频逐帧检测,空格暂停/继续,其他键逐帧,ESC 退出 |
3 |
0 |
1000 次推理性能基准测试 |
摄像头模式(mode=1)下,每帧检测到排球时输出球心坐标到标准输出:
Box center: (320.50, 240.75)
注:这是
printf标准输出,不是硬件串口通信。如需真正的串口通信以对接下位机,请使用 yolov8_volleyball,它实现了 Boost.Asio 串口发送。
区别于传统多框 NMS 抑制流程,本项目针对排球单目标场景,采用多因子加权评分选出唯一最优检测框:
最终分数 = 置信度 × 形状评分 × 距离惩罚 × 尺寸惩罚
→ 选出综合得分最高的单个检测框
- 预过滤:移除面积 > 50% 屏幕、宽高比 > 2、score < 0.05 的框
- 形状评分:基于检测框宽高比评估,排球应接近正方形
- 距离惩罚:与图像中心距离的惩罚因子
- 尺寸惩罚:排除过大或过小的异常检测框
该策略在排球单目标检测中,能有效过滤误检并保证输出唯一稳定的目标框。
| 特性 | Nanodet_OpenVINO | nanodet_volleyball | yolov8_volleyball |
|---|---|---|---|
| 检测模型 | NanoDet | NanoDet | YOLOv8 + NanoDet |
| NMS 策略 | 单目标最优选择 | 单目标最优选择 | 标准 NMS |
| 坐标输出 | 无(仅窗口显示) | printf 标准输出 | Boost.Asio 串口 |
| 可视化窗口 | 有 | 摄像头模式关闭 | DEBUG 模式可开 |
| 配置方式 | 硬编码 | 硬编码 | JSON 配置文件 |
| 适用场景 | 算法调试 | 轻量部署/测试 | 正式部署 |
| 问题 | 解决方案 |
|---|---|
| 编译报错找不到 OpenVINO | source /opt/intel/openvino/setupvars.sh |
| 海康摄像头打不开 | 确认 MVS SDK 安装在 /opt/MVS/,检查 USB 连接 |
| 检测不到排球 | 降低代码中的 score_threshold(默认 0.8 较高) |
| 没有海康相机 | 修改 main.cpp 中摄像头模式为 OpenCV VideoCapture |
| 如何真正通过串口发送坐标 | 使用 yolov8_volleyball |
- NanoDet — 轻量级目标检测模型
- Intel OpenVINO — 推理引擎
- 海康机器人 — 工业相机 SDK
本项目基于 Apache License 2.0 开源。