开发者社区 > ModelScope模型即服务 > 计算机视觉 > 正文

demo-yolo导出成onnx文件后如何处理其输出与pipeline一致

已解决

我将modelscope上的‘DAMOYOLO-高性能通用检测模型-S’模型导出成onnx文件后,相比于pipeline,输入同一张图片,有如下区别:
1.pipeline可以输入任意大小数量的图片,而该onnx文件读取模型后需要输入一个(batch_size,3,640,640)的张量。
2.输入一张图片,pipeline直接输出包含探测目标的种类位置的字典,而该onnx文件读取模型后输出一个(1,1,8400,84)的张量。
问题:
1.如何处理图片为(640,640)的大小(压缩还是裁剪?)使使用了onnx文件的demo可以完成与pipline相同的功能?
2.如何处理onnx文件的模型读取(1,3,640,640)的图片张量输入后输出的(1,1,8400,84)的张量以得到探测目标的种类和box位置?

展开
收起
游客bql32tq4iyd76 2023-10-10 22:11:10 185 0
4 条回答
写回答
取消 提交回答
  • 采纳回答

    这个问题就是我问的,现在已经解决了:输入一张图片,输出一个(1,1,8400,84)的张量,实验证明,通过以下步骤可以得到输出结果:
    1.提取其中的(8400,84)的矩阵;
    2.该矩阵的任一行前4个元素为bbox,后80个元素为各个类的可能性,该bbox的置信度即为后80个元素中的最大值,对置信度排序,设置一个阈值,筛选所有置信度大于阈值行的索引;
    3.依据索引提取这些行,合并若干重合度高的bbox得输出矩阵(objs,84);
    4.就每行依据后80个元素最大值位置对应在coco数据集中对应物体的位置输出物体种类,就前4个元素输出bbox(图片左上角坐标为(0,0))

    2023-10-12 22:51:10
    赞同 1 展开评论 打赏
  • 首先,你需要确保demo-yolo的输出与pipeline的输入格式一致。如果它们的格式不一致,你需要使用一些工具将输出转换为与pipeline输入格式一致的格式。
    然后,你需要将demo-yolo的输出转换为ONNX格式。你可以使用一些ONNX工具将demo-yolo的输出转换为ONNX格式。
    最后,你需要将ONNX文件导入到pipeline中,并将其设置为pipeline的输入。这样,pipeline就可以使用ONNX文件的输出作为输入,从而实现输出与pipeline一致。

    2023-10-12 15:58:51
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    对于问题1,你需要处理图片大小以使其适应ONNX模型的输入。你可以选择压缩或裁剪图片,但都需要确保图片的尺寸符合模型的输入要求。

    • 压缩:你可以使用图像处理库,如PIL或OpenCV来减小图片的尺寸。这将降低图像的质量,但可以使其适应模型的输入。注意,你需要找到适合你的模型的正确的压缩比例,这可能需要一些实验。如果你的模型对图像质量不是很敏感,这种方法可能就足够了。
    • 裁剪:如果图片的尺寸大于模型的输入尺寸,你也可以选择裁剪图片。这可以保持图像的质量,但需要确定裁剪的区域。你可以随机选择一个区域进行裁剪,也可以根据某种策略(例如中心裁剪)来选择区域。这需要确保裁剪后的图片仍然包含所有的重要信息。

    问题2:处理ONNX模型的输出以得到探测目标的种类和box位置

    对于问题2,你需要处理ONNX模型的输出以得到探测目标的种类和box位置。这可能会根据模型的具体实现有所不同,但通常你需要对模型的输出进行后处理。

    通常情况下,模型可能会输出一个具有多个维度的张量,其中包括每个目标的种类和位置信息。这可能是一个二维或三维的张量,其中每行或每立方体代表一个目标。然后,你可能需要使用一些方法来解析这个张量并提取出目标种类和位置信息。

    具体来说,目标的种类信息可能会在张量中的某个特定位置,而位置信息可能在张量中的其他位置。你可能需要将输出张量转换为numpy数组,然后通过索引来访问这些信息。另外,你可能还需要一些辅助代码来处理不同种类的目标以及它们的位置信息。

    2023-10-11 10:19:42
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com
    1. 对于输入大小不一的图片,可以根据实际情况选择将其进行压缩或者裁剪成 (640, 640) 的大小。具体来说,可以使用 PIL 等库对图片进行处理,调整图片尺寸后再传入模型进行预测。如果需要保持图片的比例不变,则可以先将较短的一边缩放至 640,然后将长边按比例缩放至小于等于 640。

    2. 对于输出张量的处理,您需要了解 YOLO 检测算法的原理。YOLO 算法将图片分成多个网格单元,每个单元负责预测该单元中是否存在物体以及物体的类别和位置信息。为了得到探测目标的种类和位置信息,需要对模型输出张量进行解析。

    具体来说,可以按照以下步骤进行解析:

    • 首先,将输出的张量 reshape 成 (1, 8400, 84) 的形状;
    • 然后,根据不同的类别数量,将 shape (1, 8400, 84) 的张量拆分成一个列表,列表中每个元素都是一个 (1, 8400, num_classes + 5) 的张量,这里的 5 表示每个单元预测的结果包括物体存在的置信度、物体的 x、y、w、h 等信息,加上 num_classes 表示预测的结果还包括各个类别的置信度;
    • 接下来,将每个单元的 (num_classes + 5) 个值解析出来,计算出预测框的坐标,然后筛选出置信度高的预测框即可获取最终的检测结果。
    2023-10-11 07:48:11
    赞同 展开评论 打赏

包含图像分类、图像生成、人体人脸识别、动作识别、目标分割、视频生成、卡通画、视觉评价、三维视觉等多个领域

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载