• mindspore::dataset::GetAffineTransform的输出与cv2的输出不同


    在使用C++进行推理时用到了函数mindspore::dataset::GetAffineTransform,但是输入相同的数据后,与Python的cv2中的同名函数cv2.getAffineTransform所输出的结果不同。

    C++ Ascend310端测试核心代码
     

    1. #include
    2. #include
    3. #include "include/dataset/lite_cv/lite_mat.h"
    4. #include "include/dataset/lite_cv/image_process.h"
    5. using mindspore::MSTensor;
    6. using mindspore::DataType;
    7. using mindspore::dataset::LiteMat;
    8. using mindspore::dataset::Point;
    9. using mindspore::dataset::Affine;
    10. using mindspore::dataset::GetAffineTransform;
    11. int main(int argc, char **argv) {
    12. float src[3][2] = {154.61, 90.4373,
    13. 154.61, 38.1699,
    14. 102.342, 38.1699,};
    15. float dst[3][2] = {144, 192,
    16. 144, 48,
    17. 0, 48,};
    18. mindspore::dataset::LiteMat trans;
    19. std::vector src_point = {Point(src[0][0], src[0][1]), Point(src[1][0], src[1][1]), Point(src[2][0], src[2][1])};
    20. std::vector dst_point = {Point(dst[0][0], dst[0][1]), Point(dst[1][0], dst[1][1]), Point(dst[2][0], dst[2][1])};
    21. int inv = 0;
    22. if (inv) mindspore::dataset::GetAffineTransform(dst_point, src_point, trans);
    23. else mindspore::dataset::GetAffineTransform(src_point, dst_point, trans);
    24. std::cout << "[D]trans: " << trans.width_ << ' ' << trans.height_ << std::endl;
    25. std::cout << *(float*)(trans.data_ptr_) << ' ' << *((float*)(trans.data_ptr_) + 1) << ' ' << *((float*)(trans.data_ptr_) + 2) << std::endl;
    26. std::cout << *((float*)(trans.data_ptr_ )+ 2 * 1 + 0) << ' ' << *((float*)(trans.data_ptr_ )+ 2 * 1 + 1) << ' ' << *((float*)(trans.data_ptr_) + 2 * 1 + 2) << std::endl;
    27. return 0;
    28. }

    程序运行环境为:Ascend310,Ubuntu18.04,g++8.1.0,mindspore1.8.0,mindspore-lite1.8.1 程序输出结果为:

    1. [D]trans: 3 2
    2. 2.80742e-15 2.09438 0
    3. 0 -0 -3.64823e-16

    Python cv2.getAffineTransform()

    1. import numpy as np
    2. import cv2
    3. src = np.array([[154.6097, 90.43735],
    4. [154.6097, 38.16989],
    5. [102.34224, 38.16989]])
    6. dst = np.array([[144., 192.],
    7. [144., 48.],
    8. [0., 48.]])
    9. inv = 0
    10. if inv:
    11. trans = cv2.getAffineTransform(np.float32(dst), np.float32(src))
    12. else:
    13. trans = cv2.getAffineTransform(np.float32(src), np.float32(dst))
    14. print(trans)

    程序运行环境为:CPU,Windows10,Python3.8.8,opencv4.6.0 程序输出结果为:

    1. [[ 2.75506043e+00 -0.00000000e+00 -2.81959054e+02]
    2. [ 9.19143827e-17 2.75506043e+00 -5.71603573e+01]]

    问题

    可以看到两者的输出完全不同。我想知道,这两个函数是否是对应关系,如果是的话,我的代码在哪里出了问题,如果不是的话,那么Mindspore在C++中是否有对应的API可以使用。

    ****************************************************解答*****************************************************

    mindspore端侧的GetAffineTransform算子的功能是和opencv的getAffineTransform保持一致的。

    我这边验证的结果是和opencv的一致。可能是std::cout的原因?打印的值不太一样?

    这边可以参考一下这边的用例:tests/ut/cpp/dataset/image_process_test.cc

    里面有对比计算值和期望值的方法AccuracyComparison。

  • 相关阅读:
    Linux下的基本指令
    前端开发中常见的跨域问题及解决方案
    【前端知识】Node——http模块&url模块的常用操作
    史上最详细的sqlmap使用教程
    Centos7.9部署snort-2.9.20
    Cholesterol-PEG-DBCO,CLS-PEG-DBCO,胆固醇-聚乙二醇-二苯基环辛炔PEG衍生物
    机器学习吴恩达课程学习笔记 Part2——从logistics regression到正则化
    金仓数据库 KingbaseGIS 使用手册(9.1. 拓扑类型、9.2. 拓扑域函数、9.3. 拓扑和拓扑几何对象管理)
    华融湘江银行正式更名湖南银行,周晖将出任该行行长一职
    ✔ ★ 算法基础笔记(Acwing)(六)—— 贪心【java版本】
  • 原文地址:https://blog.csdn.net/weixin_45666880/article/details/127800555