python - 大图实例IOU快速计算
问题描述
我有一个实例布尔掩码,448 个实例的形状为 (448, 1000, 1000),实例的平均像素约为 100。
现在,如果我有一个形状为 (1000, 1000) 的预测矩阵并按整数预测实例,即如果矩阵预测 500 个实例,则 np.unique(pred) 将为 501(500 类 + 1 个背景)。
我需要计算每对预测和掩码的 IOU(杰卡德指数)以找到最大 IOU。我在下面编写了代码,但它超级慢且效率低下。
c = 0 #intersection count
u = 0 #union count
pred_used = [] #record prediction used
# loop for every ground truth mask
for idx_m in range(len(mask[:,0,0])):
m = mask[idx_m,:,:] #take one mask
intersect_list = []
union_list = []
# loop every prediction
for idx_pred in range(1, int(np.max(pred))+1):
p = (pred==idx_pred) # take one prediction mask
intersect = np.sum(m.ravel() * p.ravel()) #calculate intersect
union = np.sum(m.ravel() + p.ravel() - m.ravel()*p.ravel())
intersect_list.append(intersect)
union_list.append(union_list)
if np.sum(intersect_list) > 0:
idx_max_iou = np.argmax(np.array(intersect_list))
c += intersect_list[idx_max_iou]
u += union_list[idx_max_iou]
pred_used.append(idx_max_iou)
解决方案
因此,您有一个大小为 [1000,1000] 的输出图像,它是您的模型预测的数组/张量。
您可以做的第一件事是将标签和预测从 [1000,1000] 重塑为 [1000*1000, ]。这将复杂性从 N^2 降低到 N。这应该会显着提高速度。
你也可以试试 Scikit 的 IoU,它可能比你的版本快一点。
你可以在这里找到一个例子:如何从分割掩码中找到 IoU?
文档:http ://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_similarity_score.html
推荐阅读
- r - 基于具有相同名称的数据框中添加列
- ansible - Ansible Shell/Command Module - "msg": "[Errno 2] No such file or directory",
- python - 通过串口发送位串
- python - Training lstm model?
- python - Slugify 一个线程链接并在 home.html 上创建它
- javascript - 按钮需要点击 2 次才能换出 div
- c++ - Qt + OpenGL : how to properly override QOpenGLWidget::resizeEvent?
- html - 如何在加载新页面之前添加微调器?
- react-native - Invariant Violation error when using Redux with react-native
- r - How can I inject symbols for autocompletion into R in a specific context?