【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
图像处理里面,opencv基本是一个标准模块。但是由于图像处理的特点,如果所有的算法都是cpu来做的话,效率会很低。那么,为了提高效率,就会使用好一点的cpu。在嵌入式设备上,用好一点的soc,自然而然对应的成本就会上升。所以,这里面就需要有一个平衡,即提高算法的性能,也要降低硬件的成本。
1、opencv常用的加速方法
目前来说,opencv加速主要有这么几个方向。第一,汇编优化。这种方法,就是把常用的算法,用汇编指令重新实现一下,一般难度较大。第二,用cuda代替。cuda是nvidia公司的gpu开发平台。所以如果使用cuda,要么安装nvidia的显卡,要么使用nvidia的嵌入式soc,两者都不便宜。第三,使用带有硬加速平台的soc,比如某思的ive模块。
2、哪些算法可以做成硬加速
图像处理中,有一些固定模式的算法,可以做成硬件加速的形式。这里面包括文件格式的转换、增强、滤波、二值化、膨胀、腐蚀等等。工业图像上面,一般对物体的提取也就是这几个步骤。只有最后一步轮廓提提取的时候,才会用cpu去算。
3、硬件加速原理
和cpu一个、一个去处理元素不同,硬件处理图像的时候一般是数据读取、处理、保存同时进行的。在过程当中,很多计算是同时进行的,假设有一个3x3的矩阵,硬件来处理的话,就会这么来做,
第一步,同时计算矩阵的9个数据,每个计算就是mac处理,即3乘1加;
第二步,将9个计算好的数据做一次加法运算;
第三步,计算结果写入buffer,等待写入内存。
4、怎么使用加速模块
使用方法基本和opencv是一样,直接调用soc厂家提供的api即可。一般来说,对于一个应用而言,前半部分,都是使用加速模块完成的;后面的部分还是由cpu完成的。后面的这一段算法,没有办法用硬件加速完成,类似于轮廓查找、阈值剔除、业务逻辑处理等等。
很多加速api其实一眼就知道对应的功能是什么,比如ss_mpi_ive_dilate、ss_mpi_ive_erode、ss_mpi_ive_threshold等等。如果想更简单一点,可以把mode设置为阻塞的模式,这样硬件执行完毕了,才能进行后续的动作。不过为了提高效率,最好是把所有的command都提交上去,等待所有的command的结果一起下来就好了。
当然,使用加速模块的前提,首先是保证对应的算法驱动加载好。这些驱动要么位于kernel中,要么位于ko文件中。
5、怎么调试
调试的方法一般有两种,一种是直接看api的返回值,即通过打印的方法来进行调试;另外一种就是通过查看cat /pro/unmap/ive的办法来进行调试。这些都是通用的步骤。
6、其他加速模块
除了常用的图像加速之外,另外一块就是AI加速。很多soc现在都配备了npu,所以现在需要做的就是把pc训练好的model,通过厂家的工具翻译成soc可以识别的model,通过npu来加载、运行,获得最终的结果。不同的厂家可能有不同的名字来做这一件事情,比如某思就叫nnie,但是实质是一个道理。
本质上,不管是isp,还是编解码、ive、nnie、crc、aes、mpp,本质上都是把常用的、费时间的、逻辑固定的算法硬件化,这样就不需要很好的cpu,也能实现一样的图像处理性能。