网络模型mAP计算实现代码

一、mAP精度计算

  这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negtive)分别是:

  1)True positives(TP):  被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数);

  2)False positives(FP): 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;

  3)False negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;

  4)True negatives(TN): 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。 

P

代表precision即准确率,计算公式为预测样本中实际正样本数 / 所有的正样本数 即  precision=TP/(TP+FP);

R

代表recall即召回率,计算公式为 预测样本中实际正样本数 / 预测的样本数即   Recall=TP/(TP+FN)=TP/P

一般来说,precision和recall是鱼与熊掌的关系,往往召回率越高,准确率越低

AP

AP 即 Average Precision即平均精确度

mAP

mAP 即 Mean Average Precision即平均AP值,是对多个验证集个体求平均AP值,作为 object dection中衡量检测精度的指标。

F

度量(F-measure),F度量涵盖了准确率和召回率这两个指标。其计算公式如下:F = 2 * P * R / (P + R)

P-R曲线

P-R曲线即 以 precision 和 recall 作为 纵、横轴坐标 的二维曲线。通过选取不同阈值时对应的精度和召回率画出

总体趋势,精度越高,召回越低,当召回达到1时,对应概率分数最低的正样本,这个时候正样本数量除以所有大于等于该阈值的样本数量就是最低的精度值。

另外,P-R曲线围起来的面积就是AP值,通常来说一个越好的分类器,AP值越高。

总结一下,在目标检测中,每一类都可以根据 recall 和 precision绘制P-R曲线,AP就是该曲线下的面积,mAP就是所有类AP的平均值。

二.评测代码

import tensorflow as tf

#精确率评价指标

def metric_precision(y_true,y_pred):

TP=tf.reduce_sum(y_true*tf.round(y_pred))

TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred)))

FP=tf.reduce_sum((1-y_true)*tf.round(y_pred))

FN=tf.reduce_sum(y_true*(1-tf.round(y_pred)))

precision=TP/(TP+FP)

return precision

#召回率评价指标

def metric_recall(y_true,y_pred):

TP=tf.reduce_sum(y_true*tf.round(y_pred))

TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred)))

FP=tf.reduce_sum((1-y_true)*tf.round(y_pred))

FN=tf.reduce_sum(y_true*(1-tf.round(y_pred)))

recall=TP/(TP+FN)

return recall

#F1-score评价指标

def metric_F1score(y_true,y_pred):

TP=tf.reduce_sum(y_true*tf.round(y_pred))

TN=tf.reduce_sum((1-y_true)*(1-tf.round(y_pred)))

FP=tf.reduce_sum((1-y_true)*tf.round(y_pred))

FN=tf.reduce_sum(y_true*(1-tf.round(y_pred)))

precision=TP/(TP+FP)

recall=TP/(TP+FN)

F1score=2*precision*recall/(precision+recall)

return F1score<br><br>

#编译阶段引用自定义评价指标示例

model.compile(optimizer='adam',

loss='binary_crossentropy',

metrics=['accuracy',

metric_precision,

metric_recall,

metric_F1score])

# AUC for a binary classifier

def auc(y_true, y_pred):

ptas = tf.stack([binary_PTA(y_true,y_pred,k) for k in np.linspace(0, 1, 1000)],axis=0)

pfas = tf.stack([binary_PFA(y_true,y_pred,k) for k in np.linspace(0, 1, 1000)],axis=0)

pfas = tf.concat([tf.ones((1,)) ,pfas],axis=0)

binSizes = -(pfas[1:]-pfas[:-1])

s = ptas*binSizes

return K.sum(s, axis=0)

#-----------------------------------------------------------------------------------------------------------------------------------------------------

# PFA, prob false alert for binary classifier

def binary_PFA(y_true, y_pred, threshold=K.variable(value=0.5)):

y_pred = K.cast(y_pred >= threshold, 'float32')

# N = total number of negative labels

N = K.sum(1 - y_true)

# FP = total number of false alerts, alerts from the negative class labels

FP = K.sum(y_pred - y_pred * y_true)

return FP/N

#-----------------------------------------------------------------------------------------------------------------------------------------------------

# P_TA prob true alerts for binary classifier

def binary_PTA(y_true, y_pred, threshold=K.variable(value=0.5)):

y_pred = K.cast(y_pred >= threshold, 'float32')

# P = total number of positive labels

P = K.sum(y_true)

# TP = total number of correct alerts, alerts from the positive class labels

TP = K.sum(y_pred * y_true)

return TP/P

#接着在模型的compile中设置metrics

# False Discovery Rate(FDR)

from sklearn.metrics import confusion_matrix

y_true = [0,0,0,0,0,0,,1,1,1,1,1]

y_pred = [0,0,0,0,0,0,,1,1,1,1,1]

tn, fp , fn, tp = confusion_matrix(y_true, y_pred).ravel()

fdr = fp / (fp + tp)

print(fdr)

网络模型mAP计算实现代码的更多相关文章

  1. 前端JS面试题汇总 Part 2 (null与undefined/闭包/foreach与map/匿名函数/代码组织)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  2. C++算法之大数加法计算的代码

    如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...

  3. Javascript时间差计算函数代码实例

    Javascript时间差计算函数代码实例 <script language="javascript"> Date.prototype.dateDiff = funct ...

  4. 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)

    近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...

  5. 关于UDP的检验和计算(附代码)

    关于UDP的检验和计算(附代码) 在下午的学习过程中https://www.cnblogs.com/roccoshi/p/13032356.html 有一张图讲述了UDP的校验方法, 如下: 老师只粗 ...

  6. 目标检测性能评价——关于mAP计算的思考

    1. 基本要求 从直观理解,一个目标检测网络性能好,主要有以下表现: 把画面中的目标都检测到--漏检少 背景不被检测为目标--误检少 目标类别符合实际--分类准 目标框与物体的边缘贴合度高-- 定位准 ...

  7. asp.net中C#中计算时间差代码

    我用的最简单的办法是 代码如下 复制代码 DateTime dtone = Convert.ToDateTime("2007-1-1 05:32:22");DateTime dtw ...

  8. 使用java8的StreamAPI对集合计算进行代码重构

    方法: 查询出所有部门成员中年龄大于30的员工姓名 部门对象: 员工对象: 模拟数据: private static List<Dept> list=new ArrayList<De ...

  9. 计算Python代码运行时间长度方法

    在代码中有时要计算某部分代码运行时间,便于分析. import time start = time.clock() run_function() end = time.clock() print st ...

随机推荐

  1. window.location 与window.open区别

    window.location 与window.open区别 1.window.location是window对象的属性,而window.open是window对象的方法   window.locat ...

  2. PHP--date转成时间戳,time()获取的是秒数

    date("Y-m-d H:i:s");  //如果存成datetime型在MYSQL中 必须用这种格式 实现功能:获取某个日期的时间戳,或获取某个时间的时间戳.strtotime ...

  3. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C

    题意:       这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...

  4. hdu3117 斐波那契前后4位

    题意:       求斐波那契的前后4位,n <= 10^8. 思路:       至于前四位,和hdu1568的求法一样:       http://blog.csdn.net/u013761 ...

  5. MS06-040漏洞研究(下)【转载】

    课程简介 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案 ...

  6. windows-CODE注入(远程线程注入)

    远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...

  7. 《NO STRATEGY》《重塑战略》

    书名:<NO STRATEGY> <重塑战略> 作者: [美]吉姆·柯林斯/[韩]W·钱·金/[美]迈克尔·波特(注意这个是内容的整理者不是内容作者) HBR:(Harvard ...

  8. c# p/invoke 无法加载指定的dll 找不到指定的模块 解决方法

    写的程序本来开始好好的,不知道怎么突然就出现了以上这个问题,纠结了好久,网上找了各种方法,比如什么嵌入dll,在system32下面放入dll等等,均宣告失败 下面把我的解决方法写出来,以后只要是这个 ...

  9. C异常处理和C++异常处理的对比

    每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理.这里以MSC编译器为例. C异常处理 #include <Windows.h> int main(in ...

  10. DirectX渲染时Clear无效的原因(造成叠影)

    最近在开发D3D程序的过程中,发现一件很奇怪的事情,就是在Render的时候,纹理总是留有"残影"(即上次Render后的帧):如上图,是一副纹理绕中心点旋转的向日葵,但是可以看到 ...