10

AI老铁 · 2020年07月22日

海思AI芯片(Hi3519A/3559A)方案学习(十六)对图像进行不变形缩放,可以提高识别准确度

本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之十六,系列文章请关注海思AI芯片方案学习
作者:ltshan139

前言

海思AI芯片(Hi3519A/3559A)方案学习(十四)JPEG图片转换成bgr文件中,有提到如何将jpeg文件转换为bgr格式数据,然后再输入到NNIE模型进行目标识别。但是在jpeg图片转换中,是先将原始图像直接resize成模型网络size,如下红框所示。
1.png

问题 

加入说待识别的输入图片size是1200x800,而我们的模型网络size是600x600,那么如果长、宽按都按2:1比例缩小的话,图片应该resize成600x400。但事实上,高度缩小比是800/600=4/3 < 2。 这种不等比例的缩放会导致图像变形。就这个例子而言,因为高度方向缩小比小些,会使得图像上的目标被拉长了。 这里大家脑补一下吧,我就不画图了。

另外, 当输入图片size为800x1200,类似的,直接resize成600x600后,图像上目标会显得拉宽了。

解决办法

以图像较大的边为基准,宽高方向上 等比例缩放到网络size,并对小边方向上进行适当填充,以保证方放缩后的图像size和网络size相等。代码实现如下。

Mat img = imread("D:/work/xxxx.jpg");
 
if (img.empty())
{
 
    printf("reading image file fails \n");
    return 1;
}
        int net_w, net_h;
    net_w = 416;
    net_h = 416;
#if 0
    Mat box;
    resize(img, box, Size(net_w, net_h));
#else
    //resize
    int new_w, new_h;
    if (((float)net_w / img.cols) < ((float)net_h / img.rows)) {
        new_w = net_w;
        new_h = (img.rows * new_w) / img.cols;
    }
    else {
        new_h = net_h;
        new_w = (img.cols * net_h) / img.rows;
    }
    Mat resized;
    cv::resize(img, resized, Size(new_w, new_h));
 
    Mat box = Mat(Size(net_w, net_h), CV_MAKETYPE(CV_8U, img.channels()), Scalar::all(127));
    Mat roi(box, Rect((net_w - new_w) >> 1, (net_h - new_h) >> 1, new_w, new_h));
    resized.copyTo(roi);

识别结果比较 

以两种放缩方式在3519A上进行仿真推理,其结果示意图如下。左图(仔细看,狗被拉长了)是直接resize的识别结果;右图是等比例缩放,由于小边高度缩的比较多,所以上下进行了填充。显然,右边的结果要好一些。 

3.png

 

 

版权声明:本文为CSDN博主「ltshan139」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/avideointerfaces/article/details/90544820



海思AI芯片系列文章



更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习

推荐阅读
关注数
855
内容数
40
海思AI芯片(Hi3519A/3559A)方案学习系列笔记,欢迎关注。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息