我正在为一篇论文做一些工作,我必须在不同的图像上尝试一些滤镜,看看物体是否被检测到。一切都很好,但我的意图是将4个滤镜(对比度,模糊和其他)中的每一个逐渐应用100个不同的度数,看看它在哪里停止正确检测。
我会将它们组合在一起,例如,首先将一些图像导入到帧中,然后尝试通过添加" 0%“对比度、" 0%”模糊、"0%“调整大小、"0%”噪声、下一轮1%对比度、其他图像都为0%、然后是2%对比度、其他图像为0%来进行检测,直到对比度达到100%。下一个循环应该做同样的事情,但是有1%的模糊,0%的调整大小,0%的噪声。然后是2%模糊,0%,0%,等等--所有的组合。
但这意味着它需要进行100^4次迭代(如果我想要100度和4个过滤器,则需要1亿次迭代)。我目前用OpenCV实现的YOLOv3-320以大约0.5秒的速度执行检测。这意味着完成一张图片的测试大约需要580天。
def tester(depth, correct_answer):
container_a = []
for a in range(depth):
print((a*(100/depth)))
frame1 = apply_sepia(frame, int((a*(100/depth))))
container_b = []
for b in range(depth):
frame2 = apply_blur(frame1, int((b*(100/depth))))
container_c = []
for c in range(depth):
frame3 = sp_noise(frame2, int((c*(100/depth))))
container_d = []
for d in range(depth):
frame4 = image_resize(frame3, int((d*(100/depth))))
try:
net.setInput(cv.dnn.blobFromImage(frame4, 1/255, (vers, vers), [0,0,0], 1, crop=False))
result = postprocess(net.forward(getOutputsNames(net)))
if result == correct_answer:
container_d.append(1)
else:
container_d.append(0)
except Exception as e:
container_d.append(0)
container_c.append(container_d)
container_b.append(container_c)
container_a.append(container_b)
return container_a我怎么才能加快速度呢?
发布于 2019-05-06 02:11:06
我将把这作为一个答案,以便有更多的空间来说明我的观点。
我用“高参数分辨率”这个术语来描述小步迭代你的参数。
假设你的算法在18%的噪声下失败了,而噪声是你唯一变化的东西。
然后,执行1%的增量将导致您的对象检测在您运行的第19次迭代中失败。
使用更大的步骤进行筛选,例如10%,当您测试20%的噪声时,将导致您的算法在第三次迭代中失败。然后,你就知道你的算法在10%到20%的噪声之间失败了。你现在可以使用像bisection这样的东西来询问,如果算法失败超过或低于15%,那么在这之后,高于或低于17.5%。
因此,在这种方法中,您总共运行算法五次,并得到与暴力方法相同的答案。
https://stackoverflow.com/questions/55994120
复制相似问题