资讯详情

实操教程:android camera nanodet 实时物体检测的高效实现总结

作者丨nihui@知乎(已授权)

来源丨https://zhuanlan.zhihu.com/p/356991989

极市平台编辑

未经允许禁止二次转载

本文介绍了高效合作的介绍Android应用层体现nanodet总结实时物体检测的有效实现,并附有代码地址。

0x0 起因

  • ncnn 神经网络推理框架是为移动终端优化的

  • nanodet 轻量级通用物体检测算法

为了跑得更快更好,ncnn 和 nanodet 费了很大功夫优化模型结构和代码实现

然而,只有与高效合作 android 只有实现应用层,才能实现应用层 ncnn nanodet 优势体现

否则,底层努力节省的时间很容易被上层低效浪费

似乎找不到可靠的代码,自己写吧

https://github.com/Tencent/ncnngithub.com

https://github.com/nihui/opencv-mobilegithub.com

https://github.com/RangiLyu/nanodetgithub.com

0x1 源代码传输门

不废话,先上源码和APK包下载链接

nihui/ncnn-android-nanodetgithub.com

https://github.com/nihui/ncnn-android-nanodet/releases/download/v1/com.tencent.nanodetncnn-release.apkgithub.com

dda5c5dcd10ff8f45ac8e9076122f058.png

0x2 NdkCamera 取帧,画画,渲染

Camera2 (传统方式)

  1. java 创建初始化和设置相机 ImageReader 做预览回调

  2. java OnImageAvailable 转换为 rgba / Bitmap

  3. java 通过 JNI 调用 C 实现的 nanodet 检测函数

  4. c nanodet 推理

  5. java 通过 JNI 返回检测框信息,使用 Canvas 在 Bitmap 画框画字,更新

  6. 重复 3-5

NdkCamera

  1. c 创建初始化和设置相机 AImageReader 做预览回调

  2. java 通过 JNI 设置显示的 SurfaceView ANativeWindow

  3. c onImageAvailable 获得 yuv420sp,旋转,转 RGB

  4. c nanodet 推理

  5. c opencv-mobile 画框画字,更新 ANativeWindow buffer

  6. 重复 3-5

相较于 Camera2 传统的实现过程具有以下优点

  • 每帧的处理循环完全使用 c 实现,避免 JNI 与 java api 的数据传输

  • 使用 ncnn 优化的 yuv420sp 旋转,转 RGB 实现函数,效率更高

  • 使用 opencv-mobile 画框画字,更高效

  • ANativeWindow buffer 从硬件到屏幕的缩放完成

还要说缺点

  • 需要 android 7.0 或以上系统

  • 不兼容很老 LEGACY camera interface

总之,很老的手机就别折腾实时检测了吧,承受着不该承受的计算压力。。

NdkCamera.h 白嫖攻略

光明正大地把app/src/main/jni/ndkcamera.happ/src/main/jni/ndkcamera.cpp两个文件 Ctrl C Ctrl V,配合链接 ncnn 和 opencv-mobile

class NdkCamera { public:     // facing 0=front 1=back     int open(int camera_facing = 0);     void close();       virtual void on_image(const cv::Mat& rgb) const; };

我已经做了足够简单易懂的这个类别,把 on_image 自己实现下

用的时候先 open,会自动调用你写的 on_image,rgb 它是目前预览的帧,取决于你如何使用它,比如做测试或绘画

先切换摄像头 close,重新 open

0x3 高效的 NanoDet 推理技巧

nanodet 动态模型 shape 输入,打开 param 文件把 Intep 固定参数改为 scale_factor

比如 480x640 图片,可以直接 480x640 不需要先输入模型推理 pad 到 640x640,节约了 25% 的运算量

7个nanodet模型,打开 param 文件把输出 blob 名称全部改为统一cls_pred_stride_8,这样写代码ex.extract("cls_pred_stride_8", cls_pred);可以处理所有模型

  • 设置内存池

  • 大核心的设置和使用

  • 设置线程数等于大核心数

会比默认效率更高(计划默认启用,未来ncnn不设置版本更容易使用)

0x4 其实可以更优化

比如

  • 针对 nanodet 输入尺寸,先在 yuv420sp resize 而不是 rgb resize

  • ANativeWindow buffer 使用 RGB565 进一步减少带宽

  • NdkCamera 中的 yuv420sp 旋转和转换 RGB 复用内存,而不是每次申请

  • 编译git最新版 ncnn 代码

给你留点工作!

本文仅进行学术分享。如有侵权行为,请联系删除。

1.自动驾驶领域的多传感器数据集成技术

2.自动驾驶领域3D点云目标检测全栈学习路线!(单模态 多模态/数据 代码)3.彻底了解视觉三维重建:原理分析、代码解释、优化和改进4.中国第一门面向工业级实战的点云处理课程5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解6.彻底理解视觉-惯性-惯性SLAM:基于VINS-Fusion正式开课啦7.彻底了解基础LOAM框架的3D激光SLAM: 从源代码分析到算法优化

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

14.ROS2从入门到精通:理论与实战

扫码添加小助手微信,可

也可申请加入我们的细分方向交流群,目前主要有等微信群。

一定要备注:,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。也请联系。

▲长按加微信群或投稿

▲长按关注公众号

:针对3D视觉领域的五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

 圈里有高质量教程资料、答疑解惑、助你高效解决问题

标签: cls系列传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台