我将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位置?
这个问题就是我问的,现在已经解决了:输入一张图片,输出一个(1,1,8400,84)的张量,实验证明,通过以下步骤可以得到输出结果:
1.提取其中的(8400,84)的矩阵;
2.该矩阵的任一行前4个元素为bbox,后80个元素为各个类的可能性,该bbox的置信度即为后80个元素中的最大值,对置信度排序,设置一个阈值,筛选所有置信度大于阈值行的索引;
3.依据索引提取这些行,合并若干重合度高的bbox得输出矩阵(objs,84);
4.就每行依据后80个元素最大值位置对应在coco数据集中对应物体的位置输出物体种类,就前4个元素输出bbox(图片左上角坐标为(0,0))
首先,你需要确保demo-yolo的输出与pipeline的输入格式一致。如果它们的格式不一致,你需要使用一些工具将输出转换为与pipeline输入格式一致的格式。
然后,你需要将demo-yolo的输出转换为ONNX格式。你可以使用一些ONNX工具将demo-yolo的输出转换为ONNX格式。
最后,你需要将ONNX文件导入到pipeline中,并将其设置为pipeline的输入。这样,pipeline就可以使用ONNX文件的输出作为输入,从而实现输出与pipeline一致。
对于问题1,你需要处理图片大小以使其适应ONNX模型的输入。你可以选择压缩或裁剪图片,但都需要确保图片的尺寸符合模型的输入要求。
问题2:处理ONNX模型的输出以得到探测目标的种类和box位置
对于问题2,你需要处理ONNX模型的输出以得到探测目标的种类和box位置。这可能会根据模型的具体实现有所不同,但通常你需要对模型的输出进行后处理。
通常情况下,模型可能会输出一个具有多个维度的张量,其中包括每个目标的种类和位置信息。这可能是一个二维或三维的张量,其中每行或每立方体代表一个目标。然后,你可能需要使用一些方法来解析这个张量并提取出目标种类和位置信息。
具体来说,目标的种类信息可能会在张量中的某个特定位置,而位置信息可能在张量中的其他位置。你可能需要将输出张量转换为numpy数组,然后通过索引来访问这些信息。另外,你可能还需要一些辅助代码来处理不同种类的目标以及它们的位置信息。
对于输入大小不一的图片,可以根据实际情况选择将其进行压缩或者裁剪成 (640, 640) 的大小。具体来说,可以使用 PIL 等库对图片进行处理,调整图片尺寸后再传入模型进行预测。如果需要保持图片的比例不变,则可以先将较短的一边缩放至 640,然后将长边按比例缩放至小于等于 640。
对于输出张量的处理,您需要了解 YOLO 检测算法的原理。YOLO 算法将图片分成多个网格单元,每个单元负责预测该单元中是否存在物体以及物体的类别和位置信息。为了得到探测目标的种类和位置信息,需要对模型输出张量进行解析。
具体来说,可以按照以下步骤进行解析: