前言
接梦飞openmv博客,本篇重点剖析openmv的算法和功能实现。openmv是国外开源团队依托mirco-python架构开发的一套基于stm32内核优化算法的图像识别模组,其目的是让图像视觉算法应用开发更加简便,算法运行效率更高,其底层代码全部由C语言实现,上层代码用micro-python开发。经问世以来,受到广大高校学生和开发者的追捧和喜爱,常常在电赛上使用,并且也可帮助快速学习嵌入式和图像识别;笔者作为openmv源码二次开发者和3年开发经验的嵌入式工作者,在此简单分析下openmv的算法实现和其优劣势;

openmv集成了哪些功能?
(1)sensor驱动
作为一款机器视觉模块,支持多种摄像头是必须的,openmv开发了一套完整且有效的coms–sensor驱动框架,其核心数据结构是sensor功能结构体,包括sensor ID,分辨率,图像格式,sensor功能配置函数等,用结构体的方式定义了整个sensor的全部功能,在实现上只需要实现每个sensor对应得功能函数即可,方便接入各种不同的图像传感器;当然openmv也集成了很多其他硬件模块,如wifi模块,LCD,servo驱动,测距模块等,不过其硬件价格稍贵;
(2)图像处理算法
openmv上基本实现了大部分传统图像处理算法和机器视觉算法,具体包括图像滤波如均值滤波,中值滤波,盒子滤波,高斯滤波,拉普拉斯滤波等等,另外集成了整套RGB/YUV/以及灰度图像的颜色空间转换处理算法,其中包括LAB颜色空间变换,YUV颜色空间变换等;并且openmv上实现了基于sensor自带的3A算法和图像控制处理算法,如图像任意方向旋转,畸变矫正,透视变换,3D旋转等;
(3)传统图像识别算法
在色块识别上,openmv最常用的功能是色块识别算法,其实现方式是联通域标记,其算法优势是遍历一遍即可标记所有的联通区域,方便快速实现色块定位,支持灰度和LAB颜色标记;
在形状识别上,openmv基于霍夫变换算法实现了直线,圆,矩形识别等算法;
在常见标签和条码识别上,openmv集成了开源的zbar,quirc等用于二维码解码和条形码识别,支持datamatrix识别,另外还支持了apriltag标签识别,可用于目标3D标记和跟踪定位;
在目标跟踪上,集成了目标关键特征点keypoints标记orb算法,以及帧差分算法可用于移动侦测;
在特征算法上,集成了光流特征,HOG特征计算,边缘特征CANNY算法等
在模式识别上,集成NCC模板匹配算法,可进行任意模板匹配;
在传统机器学习算法上,openmv集成了haarcascade小波特征检测算法,可基于opencv训练的各种haar特征,将其转换成openmv支持的haar文件,支持任意目标的检测;
(4)深度学习算法
openmv集成了各种框架的深度学习算法,其中包括基于ST cube-AI的深度学习框架,以及lenet,CNN,caffe,tensorflow等,可能是识别效果和占用资源的关系,最新的openmv源码中深度学习框架只保留了tensor-flow;

openmv算法为什么能在单片机上运行这么快?
首先,openmv的算法是不同于opencv的,openmv的算法底层优化策略是基于ARM-cortex-M指令集优化的,其类似于采用ARM的NEON指令集作一些算法优化,由于单片机并不具备强大的DSP,GPU,NPU这些专用数字处理模块,stm32也仅集成了具备较弱DSP功能的FPU,支持单/双精度浮点运算;因此,想要让算法跑的更快,只能在单片机内核上和算法实现策略上下功夫。
(1)指令集优化
值得称赞的是openmv算法团队将传统的图像处理算法(如滤波算法),图像分割(联通域算法)等重新优化并实现了一遍。举一个简单的例子来说,openmv上实现卷积的方式是采用32位乘加指令smlad,利用内联汇编实现的优化计算,另外对于传统数学计算,也采用了内联汇编的优化方式,这是其算法运行效率得到大幅度提升的关键因素;
(2)定点计算优化
openmv做了很多定点化计算,也是就我们常用的查表法,进一步加快算法运算速度,将一些确定的计算和数据提前算好并保存在一个数组中,直接查表计算;
(3)数据处理优化
openmv在图像像素处理上做了很多优化,如取像素,存像素,数据转换等,最大程度上适应32位处理器架构;
(4)ROI感兴趣区域
openmv在算法运行上,支持roi区域计算,只取部分区域图像进行运算,方便多种算法配合执行,这也算一个优化项;
(5)图像前处理优化
由于openmv是顺序执行,先解析python代码,再调用C函数,由于sensor图像采集一般为RGB565的图像或者YUV的图像,要处理成算法直接能运行的图像,需要作一些图像格式转换,这部分图像采集和转换处理做了单缓存,双缓存,和三缓存优化,使得图像采集速度更快,并在DCMI中断中做图像格式变换,以及图像拷贝操作,最大程度提升图像前处理的效率,使得采集出来的图像直接进入算法处理环节;
(6)资源分配优化
由于stm32的分散内存特性,openmv将文件系统缓存分配给CCM快速内存,可以方便micro-python代码的快速读取和解析,这算一个隐藏的优化项,另外支持从底层图像缓存中分配内存用于算法计算,提高了内存的利用率,不管是flash还是内存,openmv在芯片的资源利用率基本上能达到90%以上;
总的来说,openmv采用的算法优化策略主要包括,ARM-cortex-M指令集优化(thumb指令集),内联汇编优化,定点化计算优化等策略,另外还在内存,flash,图像采集方法上做了很多优化;

梦飞在openmv上做了哪些事?
前面的博客文章有介绍梦飞自己设计的openmv的硬件并自己开发了底层的固件,这里重点讲解梦飞在开发openmv底层代码上做的几件事:
(1)梦飞在openmv4上做了一些算法集成和硬件集成,其中算法主要为了保证openmv支持更多的机器学习和深度学习,在底层代码上,支持ST cube-AI运行的mnist手写数字识别(但是不能支持自己训练,自己训练之后要转换到底层才能使用,如果有需要我们会提供整套代码和模型转换方法),支持lenet,CNN训练的模型算法,支持最新的mobile NET训练的模型;另外,收集了很多haarcascade训练的模型文件,通过openmv提供的工具转换成cascade模型,可在openmv上运行,支持行人检测,口罩检测,车辆识别,车牌检测,笑脸检测,动物,水果检测等等;
(2)梦飞在stm32F407上实现了整套openmv代码的集成,基于openmv源码和自主移植支持了大部分openmv3支持的算法,进一步降低了openmv硬件的成本,并在其基础上开发了一些识别例程,其中包括颜色识别,二维码识别,巡线识别,基于模板匹配的数字识别,手势识别,标记识别,人脸识别等;还有基于haarcascade的行人,车辆,口罩检测等,除了不支持深度学习,其他很多基本的算法都能使用,能在一些对硬件成本较敏感的实际应用上使用,另外梦飞支持的摄像头和LCD价格也更低;

openmv的优劣势
在传统算法性能上,openmv运行的传统图像处理和图像识别算法确实具备很大的优势,前面也分析了其算法优化的策略和实现;特别表现在色块识别,条码识别等传统算法上,这可能是openmv能转换到实际应用上的一个优势;
但是其在深度学习上没有优势,一般带AI核的芯片都能运行一些大型的深度学习框架和网络模型,但是openmv一般只能运行4-5层神经网络,就算使用带SDRAM的openmv4plus也只是在内存上占优势,依然不能运行像yolov3这样的网络模型,可想而知,硬件算力限制了其作为机器视觉模块的前景;从个人实际测试来看,openmv采用深度学习算法进行数字识别的准确度不如模板匹配算法,使用深度学习识别行人不如haar-cascade训练的模型;
未来趋势,尽管openmv依托stm32芯片表现出其劣势的一面,但是不影响其未来发展,目前ARM已经设计了cortex-M55的架构,也就是说未来单片机是支持AI算力的,并且最新的openmv源码中已经开始集成cortex-M55的底层库,未来前景依然是客观的;
总结启示
openmv虽然是一个MIT开源且不受限制的项目,但是有人将其硬件注册商标并指定其为官方的做法限制了很多人的学习道路,至少对于那些资金有限而勤奋好学的学生是不公平的,在此,梦飞智能自主开发的硬件将持续发光发热,购买硬件其学习资料是免费提供和持续更新的,有兴趣可以在梦飞智能店铺寻找自己心动的模块;通过学习和开发openmv,对于个人能力和认知的提升和进步是非常有益的,在其C语言部分个人学到了非常多有用的知识,虽然短期内还未将其完全学懂学透,从长远来看学习它是一个不错的选择。

openmv底层算法剖析---梦飞openmv前传相关推荐

  1. 基于梦飞openmv的自主识别物联网图传小车

    前言 接上一篇<梦飞openmv py-AI机器视觉_自主开发openmv底层固件和硬件>,在自主开发的oepnmv硬件之后,时隔一年,我们终于在openmv自主开发的路上又进一步,这一次 ...

  2. 深入理解Go底层原理剖析 (送书)

    互联网迅猛发展的数十年时间里,不断面领着各种新的场景与挑战,例如大数据.大规模集群计算.更复杂的网络环境.多核处理器引起对于高并发的需求,云计算,上千万行的服务器代码-- 那些成熟但上了年纪的语言没能 ...

  3. 『Go 语言底层原理剖析』文末送书

    互联网迅猛发展的数十年时间里,不断面领着各种新的场景与挑战,例如大数据.大规模集群计算.更复杂的网络环境.多核处理器引起对于高并发的需求,云计算,上千万行的服务器代码-- 那些成熟但上了年纪的语言没能 ...

  4. 基于八叉树的网格生成算法剖析

    基于八叉树的网格生成算法剖析 前言 对于网格生成这个主题,之前的网格生成系列的三篇博客文章分别介绍了MC算法,SMC算法以及Cuberille算法三种方法.同时还有一篇介绍网格生成与种子点生长算法高效 ...

  5. 高手都是通过这9种方法找到了“底层算法”

    知乎上有个很火的话题:厉害的人遇到问题时的思维模式与普通人之间差别在哪? 很多网友纷纷列举出了自己身边厉害的人思维方式,比如做一件事情时总是准备好Plan B的"预演困难思维";广 ...

  6. 基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法

    作者 | Marat Dukhan from Google Research 译者 | 凯隐 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) [导读]本文介绍的内容主要聚焦 ...

  7. 文本比较算法剖析(1)-如何确定最大匹配率

    最近看到有人在找关于文本比较的算法,刚好最近休假,研究了一下,终于找到一个简单有效的算法,和大家分享一下. 算法本身很简单,但是要说清楚思路和原理就比较复杂了,打算分两次发表(明天就要上班拉!),分别 ...

  8. 自然语言处理(NLP)任务中常用的分词工具及底层算法支持

    刚刚和一个在三快在线(美团)的算法老同学聊天,聊到了他们现有分词工具效果不好的问题,我们最终讨论的结果就是没有效果好或者效果不好之后,只有适合不适合,归根结底还是要看各个分词工具中模型的基础训练数据成 ...

  9. C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解

    这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...

最新文章

  1. 网络工程师_记录的一些真题_2005上半年上午
  2. HP NIC Teaming技术探讨
  3. Python 技术篇-用win32库实现读取、添加、修改注册表的值实例演示
  4. Linux环境搭建:设置主机名颜色、设置vim颜色
  5. 脑裂问题解决方案_从解决方案到问题
  6. etcd官方推荐的硬件配置
  7. MongoDB中常用的几种数据类型
  8. excel学习range
  9. 【MFC开发(1)】MFC的介绍、与Qt的区别
  10. UCI数据集(论文常用数据集)
  11. 数据预测模型_如何根据已有数据得出预测模型?线性回归公式来帮你!
  12. 笔记本如何解除锁定计算机,笔记本电脑数字小键盘如何解锁_笔记本电脑数字键盘被锁定了如何打开-win7之家...
  13. wei.getA()
  14. 素食崇尚的是养身和修心的生活方式,鼎沐素食让你身心共融
  15. CSS实战样式:文字两侧加居中横线
  16. LED Designing
  17. 边缘云市场份额,百度智能云领先!
  18. 惠花生活小礼盒v2.0.1
  19. android点击不灵敏,华为手机触摸屏没反应怎么办?解决手机触摸屏时灵时不灵的办法...
  20. 人工智能/机器学习/深度学习:学习路线图

热门文章

  1. 实用网站推荐(3):菜鸟教程
  2. EXCEL作曲线图,如何转成高质量的图片
  3. java输出到空心三角形_java经典算法_019打印三角形(空心,实心) | 学步园
  4. sql查询电话号敏感数据加* 的写法
  5. RabbitMQ中的cluster、mirrored queue,以及 warrens机制、RAM node、disk node及vhost介绍
  6. A19-Python基础之lambda匿名函数-过滤器-映射
  7. 2022-2028年全球与中国汽车超声波传感器行业深度分析
  8. SteamVR Unity工具包(VRTK)之概览和控制器事件
  9. background-image图片不存在时显示默认照片
  10. threejs 实现场景围绕鼠标缩放,而不是默认的场景缩放中心