本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之二十四,系列文章请关注海思AI芯片方案学习。
作者:ltshan139
前言
前面我们讲的算法模型在海思nnie上的推理都是基于bgr格式数据或*.bgr文件。本博文则介绍如何对于YUV图片进行识别。
YUV格式分析
前面的博文都是用软解码(opencv库)jpeg图片,然后转换成bgr格式数据(bbbb...ggg....rrrr.....)再输入到算法模型。现在则是用硬解码VDEC将jpeg图片解码成yuv数据流。
YUV格式很多,有YUV444,422以及420等。 这里我们只关心420(相对更常用).
但是420里面又可以细分为planar和semi planar。Planar是指每个通道值分别连续占据一块完整内存比如YYYY....UUU.....VVV.... 根据U和V planar循序,它可以细分为I420和YV12;
与planar相对应的是packed,它指每个像素三通道数据交织在一起,比如YUVYUVYUV... ....当然,对于Yuv420来说,它是半交织的,即Y通道数据连续占据第一块内存区域,后面UV则交织在一起,而根据U和V的交织顺序又可以细分为NV12和NV21
具体可以参考下面图例解释。
YUV格式图片的识别
如果想硬解码图片而且做缩放的话,VDEC需要bind到VPSS,然后从VPSS里面读取数据。这里面首先要注意一点:对于3519av100来说,VPSS中所有channel都仅仅支持YUV格式,它们包括YVU-SP420/YVU-SP422/YUV-SP420/YUV-SP422/YUV400。与它们相对应的宏有PIXEL_FORMAT_YVU_SEMIPLANAR_420(即NV21)、PIXEL_FORMAT_YUV_SEMIPLANAR_420(即NV12)等。
由前面可知,VPSS不支持YUV转换RGB处理,那么从VPSS里面获取的YUV数据怎么扔到nnie里面来做推理? 毕竟目前所有的经典目标检测算法模型本身都只支持BGR/RGB格式数据,那么如何将YUV数据先转换成BGR再输入到网络模型呢? 可以调用opencv库来做这个转换,当然更笨的办法是根据yuv转RGB公式来手写这段转换代码。但是更好的办法是利用NNIE的硬件来做颜色转换。
其方法是,在使用ruyistudio来进行模型量化时,image_type选择YVU420SP或YVU422SP,当然选择哪一个,得取决于VPSS里面得图像数据格式,不过要注意得一点是,VPSS支持多种YUV格式,而ruyistudio只支持YVU420SP和YVU422SP两种,换句话说,NNIE硬件只支持这两种格式转换到RGB空间。至于是RGB还是BGR,它由下图右边红框RGB_order得值来决定,这个得和算法模型本身支持得数据格式输入对应起来。
实际运行时, NNNI硬件会根据 基于上面选项所生成得WK模型文件 来自动将YUV格式得图像数据转换成BGR/RGB,然后再进行推理识别,整个转换过程在内部完成,不需要外部软件参与。
海思AI芯片系列文章
- 海思AI芯片方案学习(二十三)nnie上进行图像数据预处理(Normalize)的五种方式
- 海思AI芯片方案学习(二十二)如何在ubuntu18.0.4上跑通nnie mapper
- 海思AI芯片(Hi3519A/3559A)方案学习(二十一)extern "C"和C/C++混合编程
更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习。