python实现交并比IOU教程


Posted in Python onApril 16, 2020

交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,是产生的候选框(candidate bound)与原标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。

python实现交并比IOU教程

计算公式:

python实现交并比IOU教程

Python实现代码:

def cal_iou(box1, box2):
 """
 :param box1: = [xmin1, ymin1, xmax1, ymax1]
 :param box2: = [xmin2, ymin2, xmax2, ymax2]
 :return: 
 """
 xmin1, ymin1, xmax1, ymax1 = box1
 xmin2, ymin2, xmax2, ymax2 = box2
 # 计算每个矩形的面积
 s1 = (xmax1 - xmin1) * (ymax1 - ymin1) # C的面积
 s2 = (xmax2 - xmin2) * (ymax2 - ymin2) # G的面积
 
 # 计算相交矩形
 xmin = max(xmin1, xmin2)
 ymin = max(ymin1, ymin2)
 xmax = min(xmax1, xmax2)
 ymax = min(ymax1, ymax2)
 
 w = max(0, xmax - xmin)
 h = max(0, ymax - ymin)
 area = w * h # C∩G的面积
 iou = area / (s1 + s2 - area)
 return iou
# -*-coding: utf-8 -*-
"""
 @Project: IOU
 @File : IOU.py
 @Author : panjq
 @E-mail : pan_jinquan@163.com
 @Date : 2018-10-14 10:44:06
"""
def calIOU_V1(rec1, rec2):
 """
 computing IoU
 :param rec1: (y0, x0, y1, x1), which reflects
   (top, left, bottom, right)
 :param rec2: (y0, x0, y1, x1)
 :return: scala value of IoU
 """
 # 计算每个矩形的面积
 S_rec1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])
 S_rec2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])
 
 # computing the sum_area
 sum_area = S_rec1 + S_rec2
 
 # find the each edge of intersect rectangle
 left_line = max(rec1[1], rec2[1])
 right_line = min(rec1[3], rec2[3])
 top_line = max(rec1[0], rec2[0])
 bottom_line = min(rec1[2], rec2[2])
 
 # judge if there is an intersect
 if left_line >= right_line or top_line >= bottom_line:
  return 0
 else:
  intersect = (right_line - left_line) * (bottom_line - top_line)
  return intersect/(sum_area - intersect)
 
def calIOU_V2(rec1, rec2):
 """
 computing IoU
 :param rec1: (y0, x0, y1, x1), which reflects
   (top, left, bottom, right)
 :param rec2: (y0, x0, y1, x1)
 :return: scala value of IoU
 """
 # cx1 = rec1[0]
 # cy1 = rec1[1]
 # cx2 = rec1[2]
 # cy2 = rec1[3]
 # gx1 = rec2[0]
 # gy1 = rec2[1]
 # gx2 = rec2[2]
 # gy2 = rec2[3]
 cx1,cy1,cx2,cy2=rec1
 gx1,gy1,gx2,gy2=rec2
 # 计算每个矩形的面积
 S_rec1 = (cx2 - cx1) * (cy2 - cy1) # C的面积
 S_rec2 = (gx2 - gx1) * (gy2 - gy1) # G的面积
 
 # 计算相交矩形
 x1 = max(cx1, gx1)
 y1 = max(cy1, gy1)
 x2 = min(cx2, gx2)
 y2 = min(cy2, gy2)
 
 w = max(0, x2 - x1)
 h = max(0, y2 - y1)
 area = w * h # C∩G的面积
 
 iou = area / (S_rec1 + S_rec2 - area)
 return iou
 
if __name__=='__main__':
 rect1 = (661, 27, 679, 47)
 # (top, left, bottom, right)
 rect2 = (662, 27, 682, 47)
 iou1 = calIOU_V1(rect1, rect2)
 iou2 = calIOU_V2(rect1, rect2)
 print(iou1)
 print(iou2)

参考:https://3water.com/article/184542.htm

补充知识:Python计算多分类的混淆矩阵,Precision、Recall、f1-score、mIOU等指标

直接上代码,一看很清楚

import os
import numpy as np
from glob import glob
from collections import Counter
 
def cal_confu_matrix(label, predict, class_num):
 confu_list = []
 for i in range(class_num):
  c = Counter(predict[np.where(label == i)])
  single_row = []
  for j in range(class_num):
   single_row.append(c[j])
  confu_list.append(single_row)
 return np.array(confu_list).astype(np.int32)
 
 
def metrics(confu_mat_total, save_path=None):
 '''
 :param confu_mat: 总的混淆矩阵
 backgound:是否干掉背景
 :return: txt写出混淆矩阵, precision,recall,IOU,f-score
 '''
 class_num = confu_mat_total.shape[0]
 confu_mat = confu_mat_total.astype(np.float32) + 0.0001
 col_sum = np.sum(confu_mat, axis=1) # 按行求和
 raw_sum = np.sum(confu_mat, axis=0) # 每一列的数量
 
 '''计算各类面积比,以求OA值'''
 oa = 0
 for i in range(class_num):
  oa = oa + confu_mat[i, i]
 oa = oa / confu_mat.sum()
 
 '''Kappa'''
 pe_fz = 0
 for i in range(class_num):
  pe_fz += col_sum[i] * raw_sum[i]
 pe = pe_fz / (np.sum(confu_mat) * np.sum(confu_mat))
 kappa = (oa - pe) / (1 - pe)
 
 # 将混淆矩阵写入excel中
 TP = [] # 识别中每类分类正确的个数
 
 for i in range(class_num):
  TP.append(confu_mat[i, i])
 
 # 计算f1-score
 TP = np.array(TP)
 FN = col_sum - TP
 FP = raw_sum - TP
 
 # 计算并写出precision,recall, f1-score,f1-m以及mIOU
 
 f1_m = []
 iou_m = []
 for i in range(class_num):
  # 写出f1-score
  f1 = TP[i] * 2 / (TP[i] * 2 + FP[i] + FN[i])
  f1_m.append(f1)
  iou = TP[i] / (TP[i] + FP[i] + FN[i])
  iou_m.append(iou)
 
 f1_m = np.array(f1_m)
 iou_m = np.array(iou_m)
 if save_path is not None:
  with open(save_path + 'accuracy.txt', 'w') as f:
   f.write('OA:\t%.4f\n' % (oa*100))
   f.write('kappa:\t%.4f\n' % (kappa*100))
   f.write('mf1-score:\t%.4f\n' % (np.mean(f1_m)*100))
   f.write('mIou:\t%.4f\n' % (np.mean(iou_m)*100))
 
   # 写出precision
   f.write('precision:\n')
   for i in range(class_num):
    f.write('%.4f\t' % (float(TP[i]/raw_sum[i])*100))
   f.write('\n')
 
   # 写出recall
   f.write('recall:\n')
   for i in range(class_num):
    f.write('%.4f\t' % (float(TP[i] / col_sum[i])*100))
   f.write('\n')
 
   # 写出f1-score
   f.write('f1-score:\n')
   for i in range(class_num):
    f.write('%.4f\t' % (float(f1_m[i])*100))
   f.write('\n')
 
   # 写出 IOU
   f.write('Iou:\n')
   for i in range(class_num):
    f.write('%.4f\t' % (float(iou_m[i])*100))
   f.write('\n')

以上这篇python实现交并比IOU教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python Grid使用和布局详解
Jun 30 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
基于python if 判断选择结构的实例详解
May 06 Python
pycharm新建一个python工程步骤
Jul 16 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python sorted函数原理解析及练习
Feb 10 Python
如何学习Python time模块
Jun 03 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
python 弧度与角度互转实例
Apr 15 #Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 #Python
Python selenium自动化测试模型图解
Apr 15 #Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 #Python
Python unittest单元测试框架及断言方法
Apr 15 #Python
python 连续不等式语法糖实例
Apr 15 #Python
Python中使用socks5设置全局代理的方法示例
Apr 15 #Python
You might like
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python中的元类编程入门指引
2015/04/15 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python后端接收前端回传的文件方法
2019/01/02 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
财务会计专业求职信范文
2013/12/31 职场文书
重阳节登山活动方案
2014/02/03 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
处级干部考察材料
2014/12/24 职场文书
监考失职检讨书
2015/01/26 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库