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 3.6 读取并操作文件内容的实例
Apr 23 Python
Python读写/追加excel文件Demo分享
May 03 Python
Django学习笔记之为Model添加Action
Apr 30 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
python编写俄罗斯方块
Mar 13 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
python zip()函数的使用示例
Sep 23 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 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
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
详解Python中的type()方法的使用
2015/05/21 Python
python发送邮件实例分享
2017/07/28 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python实现扫雷游戏的示例
2020/10/20 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
一套C++笔试题面试题
2012/06/06 面试题
几个数据库方面的面试题
2016/07/01 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
新闻专业个人自我评价
2013/09/21 职场文书
初一生物教学反思
2014/01/18 职场文书
小学语文国培感言
2014/03/04 职场文书
预备党员的自我评价
2014/03/12 职场文书
《观舞记》教学反思
2014/04/16 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
金陵十三钗观后感
2015/06/04 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
中学校园广播稿
2015/08/18 职场文书
高三英语教学反思
2016/03/03 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL