基于RK3576开发板的车辆检测算法
车辆检测,作为计算机视觉领域的一项基础且关键的技术,本质上是一种基于深度学习的目标检测任务。它的核心任务是在图像或视频流中,精准地定位并识别出车辆。这项技术是众多智能应用落地的基石,无论是智慧园区内的违停管理、交通路口的拥堵分析,还是城市级的车流量统计,都离不开稳定可靠的车辆检测算法作为支撑。
我们提供的这套车辆检测算法,在标准数据集上取得了不错的性能表现,具体数据如下:
检测目标 |
mAP@0.5 |
| 车辆 (CAR) | 0.78029 |
更重要的是其在实际硬件平台上的运行效率。在EASY-EAI-Orin-nano这款嵌入式AI主板上进行部署和测试,其推理速度表现如下:
算法任务 |
单次推理耗时 |
| car_detect | 约59毫秒 |
这个效率意味着它能够满足大多数实时性应用场景的需求。
快速上手指南
如果你是第一次接触这个项目,建议先花点时间阅读相关的《入门指南》,特别是其中关于源码管理和工程组织的部分。这能帮你建立起清晰的代码管理流程,强烈建议采用“远程挂载管理”的方式,可以有效避免开发过程中的代码丢失风险。
1. 获取源码工程
首先,在你的PC或虚拟机中,定位到用于网络文件系统(NFS)共享的目录,并创建一个专门管理代码仓库的文件夹。
cd ~/nfsroot mkdir GitHub cd GitHub
接着,使用git工具克隆远程仓库到本地。请注意,执行此操作需要你的设备能够正常访问外网。
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git
这里有个小提示:克隆过程可能会因网络状况而有所延迟,请耐心等待。如果确实需要通过网页下载,务必下载整个代码仓库,而不是单独下载某个示例目录,以保证依赖的完整性。
2. 搭建开发环境
通过adb shell连接到你的开发板,进入板卡的命令行环境。
然后,将PC上的NFS目录挂载到开发板上,方便后续的文件共享与编译。
mount -t nfs -o nolock: /home/orin-nano/Desktop/nfs/
3. 编译示例程序
切换到开发板上已挂载的NFS目录,找到车辆检测算法的示例代码所在路径,执行编译脚本。
cd EASY-EAI-Toolkit-3576/Demos/algorithm-car/ ./build.sh
4. 部署算法模型
要运行算法演示程序,需要先获取预训练好的车辆检测模型文件。
模型可以通过提供的网盘链接下载,提取码已附上。
下载完成后,请将模型文件复制到编译生成的 `Release/` 目录下。
5. 运行与效果验证
进入开发板上的 `Release` 目录,执行以下命令来运行示例程序:
cd Release/ ./test-car_detect car_detect.model test.jpg
命令执行过程如下图所示:
程序运行后,会对输入的测试图片进行车辆检测,并生成标注后的结果图片,效果如下:
至此,你已经完成了从环境搭建到效果验证的完整流程。接下来,我们将详细解读提供给开发者调用的API接口。
车辆检测API详细说明
为了便于开发者将车辆检测功能集成到自己的项目中,我们封装了清晰的API接口。下面逐一介绍其使用方式。
API引用方式
在你的工程中,需要正确链接以下库文件和头文件:
配置项 |
路径/参数 |
| 头文件目录 | easyeai-api/algorithm/car_detect |
| 库文件目录 | easyeai-api/algorithm/car_detect |
| 库链接参数 | -lcar_detect |
初始化函数:car_detect_init
在使用检测功能前,必须调用此函数进行初始化。
int car_detect_init(rknn_context *ctx, const char * path)
函数名: car_detect_init() |
|
| 头文件 | car_detect.h |
| 输入参数 | ctx:指向rknn_context句柄的指针,用于接收初始化后的上下文。 |
| 输入参数 | path: 算法模型文件在设备上的存放路径。 |
| 返回值 | 成功返回0,失败返回-1。 |
运行函数:car_detect_run
这是核心的检测函数,负责对输入的图像执行推理并返回结果。
int car_detect_run(rknn_context ctx, cv::Mat input_image, person_detect_result_group_t *detect_result_group)
函数名:car_detect_run() |
|
| 头文件 | car_detect.h |
| 输入参数 | ctx: 由初始化函数获得的rknn_context句柄。 |
| 输入参数 | input_image: 待检测的输入图像,使用OpenCV的Mat格式。 |
| 输出参数 | detect_result_group: 指向检测结果结构体的指针,函数将把检测到的所有目标信息填充到此结构中。 |
| 返回值 | 成功返回0,失败返回-1。 |
释放函数:car_detect_release
在程序结束或不再需要检测功能时,调用此函数释放模型占用的资源。
int car_detect_release(rknn_context ctx)
函数名:car_detect_release () |
|
| 头文件 | car_detect.h |
| 输入参数 | ctx: 需要释放的rknn_context句柄。 |
| 返回值 | 成功返回0,失败返回-1。 |
算法例程源码解析
完整的示例代码位于 `Demos/algorithm-car/test-car_detect.cpp`。其核心逻辑流程清晰,如下图所示:
下面附上主要代码片段,展示了API的典型调用顺序:初始化、运行、处理结果、释放资源。
#include#include #include #include "car_detect.h" using namespace cv; using namespace std; // ... 省略绘图工具函数 plot_one_box ... int main(int argc, char **argv) { if (argc != 3) { printf("%s ", argv[0]); return -1; } const char *model_path = argv[1]; const char *image_path = argv[2]; /* 1. 参数初始化 */ detect_result_group_t detect_result_group; /* 2. 算法模型初始化 */ rknn_context ctx; car_detect_init(&ctx, model_path); /* 3. 算法运行 */ cv::Mat src = cv::imread(image_path, 1); car_detect_run(ctx, src, &detect_result_group); /* 4. 处理与可视化结果 */ char text[256]; for (int i = 0; i < detect_result_group.count; i++) { detect_result_t* det_result = &(detect_result_group.results[i]); // 过滤低置信度结果 if(det_result->prop < 0.4){ continue; } sprintf(text, "%s %.1f%%", det_result->name, det_result->prop * 100); // 在图像上绘制检测框和标签 plot_one_box(src, det_result->box.left, det_result->box.right, det_result->box.top, det_result->box.bottom, text, i%10); } cv::imwrite("result.jpg", src); /* 5. 算法模型空间释放 */ car_detect_release(ctx); return 0; }