作者丨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 (传统方式)

  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=backint 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 代码

给你们留点活呀!

本文仅做学术分享,如有侵权,请联系删文。

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

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

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

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

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

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

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

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

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

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

觉得有用,麻烦给个赞和在看~  

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

  1. 实操教程|PyTorch AutoGrad C++层实现

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨xxy-zhihu@知乎 来源丨https://zhuanla ...

  2. [转载]你们要的GIF动图制作全攻略!看完就会做!(实操教程)

    非常实用呀 原文地址:你们要的GIF动图制作全攻略!看完就会做!(实操教程)作者:木木老贼 来源:文案匠(ID:sun-work) 作者:一木(授权转载,如需转载请联系文案匠) 文章配图的GIF动图怎 ...

  3. 通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上)

    通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上) 前言 进入大白菜u盘的pe系统 用GHOST进行系统盘备份/还原 在D盘上安装新系统(以win10-2004为例) 镜像下载 ...

  4. 寻找亚马逊测评师邮箱_美国及欧盟亚马逊产品外观专利查询步骤实操教程(已验证)...

    亚马逊产品外观专利防不胜防:美国及欧盟外观专利查询步骤实操教程(已验证) 欧洲 https://www.tmdn.org/tmdsview-web/dsview-logo-white.15c95da2 ...

  5. 实操教程|火遍全网的剪纸风格究竟是怎么做出来的?

    原文来自公众号:希音的设计笔记 > 添加微信:xiyin0820 获取高质量样机 | C4D教程 | OC渲染教程 | Sketch教程 Adobe2021 | Adobe2020 | LED字 ...

  6. mysql教程乛it教程网_MySQL数据库实操教程(35)——完结篇

    版权声明 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在专栏<MySQL数据库实操教程>,概述如下: 共计35篇文章 每篇文章均附源码和运行 ...

  7. MySQL数据库实操教程(35)——完结篇

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在 ...

  8. 二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测

    一. 背景介绍 在我前面的博文 十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型 中,我介绍过在基于Jetson Nano硬件平台和Ubuntu 18.04 with Jet ...

  9. 四维图新:高精度地图构建的实时物体检测和分割

    四维图新在欧洲成立Advanced Research Lab,该实验室专家谈"高精度地图构建的实时物体检测和分割".

最新文章

  1. Java项目:财务预算管理系统(java+SSM+Jsp+Mysql+Layui+Maven)
  2. R和Python谁更好?这次让你「鱼与熊掌」兼得
  3. 华为某员工感慨:岗位太闲想离职,基本不加班!
  4. 零基础python从入门到精通 pdf-PYTHON从入门到精通 PDF 下载
  5. hihoCoder太阁最新面经算法竞赛18
  6. 区块链BaaS云服务(15)复杂美chain33
  7. 浅谈UML类图中类之间的5种关系
  8. 复旦计算机测试,复旦大学计算机用能力水平测试(Fudan Computer Skills.doc
  9. mysql数据库的分离_数据库分离和附加 (SQL Server)
  10. 十个必备的.NET开发小工具(1):Snippet Compiler
  11. Java中调用文件中所有bat脚本
  12. 如何监视SQL Server索引的总大小
  13. 使用Eclipse-Maven-git做Java开发(9)--eclipse新建maven结构工程
  14. java各版本之间的差异_Java 8-13版本功能差异一览指南 - marcobehler
  15. 我在这战斗的一年里(阎阳生)
  16. HTML实现图文混排效果
  17. 计算机切屏的三种快捷键,小技巧:笔记本切换屏幕快捷键_计算机的基本知识_IT /计算机_信息...
  18. oracle 创建唯一索引
  19. 麒麟操作系统基于linux哪个版本_如今的国产操作系统deepin和优麒麟哪个更好?...
  20. IT教育大反思之一:多元化是IT教育的必然之路

热门文章

  1. Maven使用笔记(四)pom.xml配置详解
  2. 系列文章--AJAX技术系列总结
  3. android WebView中js的alert()失效
  4. CentOS6.*安装gitolite
  5. 面试八股文最新版出炉!一周肝了15个新篇章……
  6. SpringBoot+MDC实现全链路调用日志跟踪,这才叫优雅!
  7. 『假如我是面试官』RabbitMQ我会这样问!
  8. 面试现场:小伙伴美团一面的分享和分析「含解答」
  9. 【决战西二旗】|Redis面试热点之底层实现篇
  10. 自古帝王多短命,假如皇帝也懂负载均衡算法...