本文主要是介绍coco如何计算map的,recall如何插值的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
不同召回率阈值是通过将累积的真阳性数量除以所有正样本的数量来产生的。在代码中,召回率阈值 `recThrs` 是预定义的,是用于评估的标准参数。具体步骤如下:
1. **预定义召回率阈值:**
- `recThrs` 是在参数 `p` 中预定义的,是一组固定的值,用于在评估过程中衡量不同的召回率水平。
- 例如,`recThrs` 可能是一个从 0 到 1 的等间隔数组,用于表示从 0% 到 100% 的召回率。
2. **计算每个 IoU 阈值下的召回率:**
- 对于每个 IoU 阈值 `t`,通过累积的真阳性 `tp_sum` 和假阳性 `fp_sum` 来计算召回率 `rc` 和精度 `pr`。
- 具体计算如下:
```python
rc = tp / npig # 计算召回率
pr = tp / (fp + tp + np.spacing(1)) # 计算精度
```
3. **将累积的召回率与预定义的召回率阈值匹配:**
- 使用 `np.searchsorted` 函数将计算得到的召回率数组 `rc` 与预定义的召回率阈值 `recThrs` 进行匹配。
- `np.searchsorted` 会返回 `rc` 中大于等于 `recThrs` 的位置索引。
```python
inds = np.searchsorted(rc, p.recThrs, side='left')
```
4. **插值计算对应的精度值:**
- 根据找到的索引 `inds`,从计算得到的精度数组 `pr` 中提取对应位置的精度值,并存储到 `precision` 数组中。
- 如果索引超出范围,会捕获异常并继续处理。
```python
try:
for ri, pi in enumerate(inds):
q[ri] = pr[pi]
ss[ri] = dtScoresSorted[pi]
except:
pass
```
5. **存储结果:**
- 将计算得到的精度和得分分别存储到 `precision[t, :, k, a, m]` 和 `scores[t, :, k, a, m]` 中。
以下是代码中相关部分的详细解释:
```python
for t, (tp, fp) in enumerate(zip(tp_sum, fp_sum)):
tp = np.array(tp)
fp = np.array(fp)
nd = len(tp)
rc = tp / npig # 计算召回率
pr = tp / (fp + tp + np.spacing(1)) # 计算精度
q = np.zeros((R,))
ss = np.zeros((R,))
if nd:
recall[t, k, a, m] = rc[-1]
else:
recall[t, k, a, m] = 0
pr = pr.tolist()
q = q.tolist()
for i in range(nd - 1, 0, -1):
if pr[i] > pr[i - 1]:
pr[i - 1] = pr[i]
inds = np.searchsorted(rc, p.recThrs, side='left')
try:
for ri, pi in enumerate(inds):
q[ri] = pr[pi]
ss[ri] = dtScoresSorted[pi]
except:
pass
precision[t, :, k, a, m] = np.array(q)
scores[t, :, k, a, m] = np.array(ss)
```
通过这些步骤,预定义的召回率阈值 `recThrs` 被用作基准,计算得到的召回率 `rc` 和精度 `pr` 被匹配和插值,最终得到不同召回率阈值下的精度值 `precision[t, :, k, a, m]`。
这篇关于coco如何计算map的,recall如何插值的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!