我有一个真实标签的json文件,和模型预测结果的json文件,我想要得到固定iou值=0.5情况下的准确率和召回率,用python实现
时间: 2024-03-06 20:49:56 浏览: 91
好的,下面是一个用Python实现计算固定IoU阈值下的准确率和召回率的示例代码:
```python
import json
import numpy as np
# 加载真实标签和模型预测结果的json文件
with open('real_labels.json') as f:
real_labels = json.load(f)
with open('model_predictions.json') as f:
model_predictions = json.load(f)
# 设置IoU阈值
iou_threshold = 0.5
# 初始化预测正确和预测错误的边界框数量
num_true_positives = 0
num_false_positives = 0
# 统计真实标签中的边界框数量
num_ground_truth_boxes = 0
for image_id in real_labels.keys():
num_ground_truth_boxes += len(real_labels[image_id]['boxes'])
# 遍历模型预测结果的边界框
for image_id in model_predictions.keys():
for box in model_predictions[image_id]['boxes']:
# 获取当前预测结果的边界框
box_pred = np.array(box['box'])
# 初始化最大IoU值和匹配的真实标签边界框
max_iou = 0
best_match = None
# 遍历真实标签的边界框
for real_box in real_labels[image_id]['boxes']:
# 获取当前真实标签的边界框
box_real = np.array(real_box['box'])
# 计算IoU值
intersection = np.maximum(0, np.minimum(box_pred[2], box_real[2]) - np.maximum(box_pred[0], box_real[0])) \
* np.maximum(0, np.minimum(box_pred[3], box_real[3]) - np.maximum(box_pred[1], box_real[1]))
union = (box_pred[2] - box_pred[0]) * (box_pred[3] - box_pred[1]) + (box_real[2] - box_real[0]) * (box_real[3] - box_real[1]) - intersection
iou = intersection / (union + 1e-6)
# 如果IoU值大于当前最大值,并且大于等于阈值,更新最大值和匹配的真实标签边界框
if iou > max_iou and iou >= iou_threshold:
max_iou = iou
best_match = real_box
# 如果有匹配的真实标签边界框,将其视为预测正确,否则视为预测错误
if best_match is not None:
num_true_positives += 1
real_labels[image_id]['boxes'].remove(best_match)
else:
num_false_positives += 1
# 计算准确率和召回率
precision = num_true_positives / (num_true_positives + num_false_positives)
recall = num_true_positives / num_ground_truth_boxes
print('Precision: {:.4f}'.format(precision))
print('Recall: {:.4f}'.format(recall))
```
在这个示例代码中,首先使用`json.load()`函数加载真实标签和模型预测结果的json文件,然后设置IoU阈值和初始化预测正确和预测错误的边界框数量。接下来,遍历模型预测结果的边界框,对于每个边界框,计算其与真实标签边界框的IoU值,并与设定的阈值进行比较。如果IoU值大于等于阈值,就认为预测正确,并将其从真实标签中删除。最后,根据统计的预测正确和预测错误的边界框数量,以及真实标签中的边界框数量,计算准确率和召回率,并输出结果。
希望这个示例代码能帮助您完成您的任务!
阅读全文