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 相关文章推荐
python解析模块(ConfigParser)使用方法
Dec 10 Python
跟老齐学Python之编写类之一创建实例
Oct 11 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
微信跳一跳辅助python代码实现
Jan 05 Python
Python实现查看系统启动项功能示例
May 10 Python
详解python里的命名规范
Jul 16 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python中os包的用法
Jun 01 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
Python中的 Set 与 dict
Mar 13 Python
Python实现仓库管理系统
May 30 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中如何直接执行SHELL
2013/06/28 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
JSONP跨域请求
2017/03/02 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
愚人节活动策划方案
2014/03/11 职场文书
实验室标语
2014/06/21 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
幼师必备:幼儿园期末教师评语50条
2019/11/01 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers
vue组件vue-esign实现电子签名
2022/04/21 Vue.js