【发布时间】:2021-09-23 09:49:59
【问题描述】:
我在 Ubuntu 20.04 上使用 Python 3.8.10、OpenCV 版本 4.3.0 和 Cuda 10.2。我使用 Yolov3 为我想在图像中检测的 23 个对象生成了一个权重文件。一切正常,我可以在 Python 中围绕检测置信度高于某个阈值的对象绘制漂亮的框。
但是,循环通过由提供的所有输出需要半秒以上
outputs = net.forward(outputLayers)
当过滤高于某个置信水平的结果时。
这是我的循环:
boxes = []
confs = []
class_ids = []
for output in outputs:
for detect in output:
scores = detect[5:]
class_id = np.argmax(scores)
conf = scores[class_id]
if conf > 0.7:
center_x = int(detect[0] * width)
center_y = int(detect[1] * height)
w = int(detect[2] * width)
h = int(detect[3] * height)
x = int(center_x - w/2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confs.append(float(conf))
class_ids.append(class_id)
需要这么长时间的原因是输出的大小。似乎在调用net.forward(outputLayers) 时返回了所有可能的检测结果,无论置信度如何。就我而言,这些是我必须循环遍历的 30000 多个元素。
有什么方法可以在模型仍驻留在 GPU 上的情况下排除低于某个置信水平的检测?据我所知,net.forward() 似乎不允许任何过滤。任何想法将不胜感激!
【问题讨论】:
-
是
outputs一个numpy数组,还是一个python列表,还是别的什么? -
这是一个 numpy 数组。
-
它的确切形状是什么?您可以使用一些过滤所有内容的表达式来删除这两个循环。那么你也可以摆脱
append的东西,并把这些计算作为一个整体进行。scores = outputs[:,:,5:]; mask = (scores.max(axis=2) > 0.7)(可能在两者之间有一个 argmax 来计算一次,然后是一些索引) -
谢谢 Christoph,您的方法帮助我解决了我的问题。
标签: python opencv image-processing yolo opencv-python