实操教程: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
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=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 实时物体检测的高效实现总结相关推荐
- 实操教程|PyTorch AutoGrad C++层实现
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨xxy-zhihu@知乎 来源丨https://zhuanla ...
- [转载]你们要的GIF动图制作全攻略!看完就会做!(实操教程)
非常实用呀 原文地址:你们要的GIF动图制作全攻略!看完就会做!(实操教程)作者:木木老贼 来源:文案匠(ID:sun-work) 作者:一木(授权转载,如需转载请联系文案匠) 文章配图的GIF动图怎 ...
- 通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上)
通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上) 前言 进入大白菜u盘的pe系统 用GHOST进行系统盘备份/还原 在D盘上安装新系统(以win10-2004为例) 镜像下载 ...
- 寻找亚马逊测评师邮箱_美国及欧盟亚马逊产品外观专利查询步骤实操教程(已验证)...
亚马逊产品外观专利防不胜防:美国及欧盟外观专利查询步骤实操教程(已验证) 欧洲 https://www.tmdn.org/tmdsview-web/dsview-logo-white.15c95da2 ...
- 实操教程|火遍全网的剪纸风格究竟是怎么做出来的?
原文来自公众号:希音的设计笔记 > 添加微信:xiyin0820 获取高质量样机 | C4D教程 | OC渲染教程 | Sketch教程 Adobe2021 | Adobe2020 | LED字 ...
- mysql教程乛it教程网_MySQL数据库实操教程(35)——完结篇
版权声明 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在专栏<MySQL数据库实操教程>,概述如下: 共计35篇文章 每篇文章均附源码和运行 ...
- MySQL数据库实操教程(35)——完结篇
版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在 ...
- 二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测
一. 背景介绍 在我前面的博文 十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型 中,我介绍过在基于Jetson Nano硬件平台和Ubuntu 18.04 with Jet ...
- 四维图新:高精度地图构建的实时物体检测和分割
四维图新在欧洲成立Advanced Research Lab,该实验室专家谈"高精度地图构建的实时物体检测和分割".
最新文章
- Java项目:财务预算管理系统(java+SSM+Jsp+Mysql+Layui+Maven)
- R和Python谁更好?这次让你「鱼与熊掌」兼得
- 华为某员工感慨:岗位太闲想离职,基本不加班!
- 零基础python从入门到精通 pdf-PYTHON从入门到精通 PDF 下载
- hihoCoder太阁最新面经算法竞赛18
- 区块链BaaS云服务(15)复杂美chain33
- 浅谈UML类图中类之间的5种关系
- 复旦计算机测试,复旦大学计算机用能力水平测试(Fudan Computer Skills.doc
- mysql数据库的分离_数据库分离和附加 (SQL Server)
- 十个必备的.NET开发小工具(1):Snippet Compiler
- Java中调用文件中所有bat脚本
- 如何监视SQL Server索引的总大小
- 使用Eclipse-Maven-git做Java开发(9)--eclipse新建maven结构工程
- java各版本之间的差异_Java 8-13版本功能差异一览指南 - marcobehler
- 我在这战斗的一年里(阎阳生)
- HTML实现图文混排效果
- 计算机切屏的三种快捷键,小技巧:笔记本切换屏幕快捷键_计算机的基本知识_IT /计算机_信息...
- oracle 创建唯一索引
- 麒麟操作系统基于linux哪个版本_如今的国产操作系统deepin和优麒麟哪个更好?...
- IT教育大反思之一:多元化是IT教育的必然之路
热门文章
- Maven使用笔记(四)pom.xml配置详解
- 系列文章--AJAX技术系列总结
- android WebView中js的alert()失效
- CentOS6.*安装gitolite
- 面试八股文最新版出炉!一周肝了15个新篇章……
- SpringBoot+MDC实现全链路调用日志跟踪,这才叫优雅!
- 『假如我是面试官』RabbitMQ我会这样问!
- 面试现场:小伙伴美团一面的分享和分析「含解答」
- 【决战西二旗】|Redis面试热点之底层实现篇
- 自古帝王多短命,假如皇帝也懂负载均衡算法...