作者丨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

0x2 NdkCamera 取帧,画画,渲染
Camera2 (传统方式)
java 创建初始化和设置相机 ImageReader 做预览回调
java OnImageAvailable 转换为 rgba / Bitmap
java 通过 JNI 调用 C 实现的 nanodet 检测函数
c nanodet 推理
java 通过 JNI 返回检测框信息,使用 Canvas 在 Bitmap 画框画字,更新
重复 3-5
NdkCamera
c 创建初始化和设置相机 AImageReader 做预览回调
java 通过 JNI 设置显示的 SurfaceView ANativeWindow
c onImageAvailable 获得 yuv420sp,旋转,转 RGB
c nanodet 推理
c opencv-mobile 画框画字,更新 ANativeWindow buffer
重复 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.h
和app/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视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题