目标检测中的mAP-代码实现
mAPmAP,全称为mean Average Precision,在目标检测任务中被用于衡量检测器的好坏。本文第一部分讲解mAP的概念以及计算过程,第二部分专注于用代码实现mAP的计算。 在做目标检测时,每个类别对应有一个AP,全部类别的AP求平均就是mAP。 AP是P-R曲线下方的面积。 P-R曲线的横轴是Recall,纵轴是Precision。 因此,欲计算mAP,得先计算每个类别对应的AP,进一步,得先计算每个类别对应的Recall和Precision。 下面正文开始~ 一、计算某个类别对应的AP1. 获取测试集上所有预测的bbox的结果(TP or FP)这里,假设预测得到的bbox已经做过NMS处理,如果不清楚什么是NMS,请查看这篇文章。 GT总数(绿色框)为4,而红色框是预测得到的,红色数字表示置信度(confidence)。 接下来需要计算每张图片中的每一个红色预测框与其附近的绿色真实框的IoU,当IoU大于预先设定的IoU阈值时,设置该预测框为TP,否则设置为FP。 之所以使用TP和FP,是因为我们感兴趣的是 预测框的位置是否接近真实框的位置...
批量生成评语
这一天,你收到了一封来自远方的邮件,邮件内容如下: 嗨,最近忙吗?我的领导想让我帮他写一份员工评价表,针对全体员工及进行评价,不限字数。给的表格文件(.csv)大概是这样的:但是,总共有一万名员工,每个员工写一句的话,需要写一万句!这太枯燥了,所以想问问你能不能用Python来解决呢? 能!Python啥都能!解放双手,从使用Python做起~ 既然是评价他人,无非就是总结一下优缺点嘛,那我搜集一些表达优点的句子,再搜集一些表达缺点的句子,将它们随机组合起来不就成了。就像这样: 1虽然xxxxx,但是xxxxx 说干就干,开始写代码~ 先把用到的库导进来: 12import pandas as pdimport numpy as...
NLP极简入门笔记
一、文本数据预处理step1. Tokenization(text to words) step2. 统计词频 统计完词频后,将这些词按照词频从高到低进行排序:一般会删掉低频词,也就是排在后面的词,因为这些词有可能是拼写错误的词或者人名。将它们删除以后,可减小vocabulary的维度,这有利于减轻后续计算负担,并且能防止过拟合。 接着将词频改为index表示(index从1开始,0一般用于表示缺失词对应index): step3. One-Hot Encoding 如果某个词无法在字典中找到,可以忽略它或者将其index设置为0。 二、文本处理与词嵌入先按照上一节的步骤进行处理:后续如有必要,还要做One-Hot Encoding处理,这里没有写出。 由于每句话的长度不一,因此可以限制句子最大长度,多则砍掉,少则补齐(比如zero-padding)。 现在做 Word to Vec。 做Word to Vec的目的是将目前用index数值表示的单词转为用向量表示。One-Hot...
经典卷积架构:ResNeXt
ResNeXt在前面的文章中,我们已经介绍了ResNet以及Inception的原理及其PyTorch实现。而今天要介绍的ResNeXt,正是在ResNet的基础上,结合Inception得到的。 在Inception中,其多个分支的结构是不同的,就像这样: ResNeXt的作者提议将每个分支的结构搞成一样的,以减少网络复杂性,便于扩展;再加上一个skip connection,就得到了ResNeXt block。 下面是论文中给出的一个ResNeXt block: 它总共有32个分支,每个分支的结构都是完全相同的,且输入与输出之间做了跳连(skip connection)。 其实,上面的这个结构还是可以简化的,作者在论文中指出,以下3种结构是等价的: 因此,为了方便,编码时我们就采用(c)结构。 现在把ResNeXt block的(c)结构单独拎出来: 再把ResNet block拿过来: 对比来看,两者在结构上的区别在于,前者的3x3卷积是分组卷积。在论文中,作者将分组数用Cardinality来表示,并且指出: increasing cardinality is...
经典卷积架构:MobileNet-v2
MobileNet V2MobileNet V2在MobileNet V1的基础上,引入了线性瓶颈层(Linear Bottlenecks)和倒残差结构(Inverted residuals)。 Linear Bottlenecks作者认为,非线性的激活函数,比如ReLU,会导致信息的丢失。 具体地,作者将一个二维空间的流形( manifolds)通过一个后接ReLU激活的变换矩阵,嵌入到另一个维度的空间中,然后再投影回原来的二维空间。 结果显示:当另一个空间的维度较低(n=2,3,5)时,还原效果很差;当另一个空间维度高一些(n=15,30)时,才能够基本还原。 但是,在接下来你会看到,这里采用的Inverted residuals中的通道数会被最后一个1x1进行压缩,也就是要将3x3卷积提取的特征进行压缩,但这样做就对应了上述实验中另一个空间维度较低时的情况,即”信息丢失”。 针对这个问题,作者提出将卷积后的激活函数设置为线性的。实验证明,该方法能够有效保留信息。具体实现时,只需去掉本来在卷积后的非线性激活函数即可。 Inverted...
经典卷积架构:MobileNet-v1
MobileNet V1MobileNet V1 有点像VGG,它们的网络结构都是单分支的,通俗点说就是:一条路走到底。 只不过,相比于VGG,MobileNet V1 大量使用了深度可分离卷积,在模型的预测能力变化很小的前提下,极大地提升了模型的速度。 ps:关于深度可分离卷积,可以查看这篇文章;关于VGG,可以查看这篇文章。 MobileNet V1 的网络结构如下: 其中,Conv表示普通卷积,Conv dw表示逐通道卷积,s1表示卷积步长为1,s2表示卷积步长为2。 PyTorch 实现 MobileNet V1对于普通的卷积,即上面结构图中的Conv直接调用torch.nn.Conv2d就可以了; 而在上面的网络结构图中,每一个蓝色框起来的两部分组合起来就是深度可分离卷积,它包括了逐通道卷积(Conv...
经典卷积架构:Xception
XceptionXception将Inception中的Inception模块替换为深度可分离卷积。在几乎不增加参数量的前提下,Xception在一些图像分类任务中的表现超越了Inception V3。 我们之前介绍的深度可分离卷积是先做逐通道卷积,再做逐点卷积,而在Xception的论文描述中,这两步的顺序正好相反(见下图)。不过没关系,论文中也指出,这里的顺序并不影响效果(理由:in particular because these operations are meant to be used in a stacked setting.)。 同时,经过实验发现,深度可分离卷积中的卷积层之间不加非线性激活函数的效果相较于加入非线性激活函数来说会更好一些。 Xception的网络结构如下: 网络总共可以分为3个部分:Entry flow,Middle flow,以及Exit flow,并且借鉴了ResNet的思想,引入了跳连(skip connection)。注意每个卷积(包括普通卷积与深度可分离卷积)之后都做了批归一化操作,只是没在网络结构图中画出。 PyTorch...
分组卷积与深度可分离卷积
分组卷积(Group Convolution)分组卷积将输入特征图进行分组,分别对每组的特征图进行卷积操作,得到输出的特征图,最后再将每组卷积后得到的特征图拼接在一起,就完成了整个卷积操作。 在PyTorch中,输入特征图个数与输出特征图个数需要能够被分组数整除,因为输出特征图个数需要均摊给每一组。比如输入特征图个数为X,输出特征图个数为Y,分组数为g,且g可整除X和Y,那么每一组的输入特征图个数为X/g,输出特征图个数为Y/g,总的输出特征图个数为(Y/g)*g=Y 假设输入特征图个数为6,卷积核尺寸为3*3,输出特征图个数为10,不考虑偏置项。以下操作基于本例》 普通卷积:当分组数为1时,就是普通的卷积 12345678910import torchimport torch.nn as nnfrom torchsummary import summaryclass Model(nn.Module): def __init__(self): super().__init__() ...
经典卷积架构:ResNet
ResNet一般来说,网络越深越复杂,同时网络提取特征的能力也就越强。但是,实验发现,当继续增加网络层数,使得网络越来越深时,网络能力不增反减。 似乎,当网络层数达到一定程度时,就达到了深度学习的天花板了? ResNet的提出,解决了这一问题。深度学习的天花板还远着呢! 对于一个浅层网络,我们想在此基础上加深网络,同时希望加深后的网络至少能力不能退化。也就是说,新加进来的几层即使不能提升网络的能力,也不要影响到加入这些新的层之前的网络的能力。 具体地,直接将添加新的层之前的网络输出与添加新的层之后的网络输出做一个加法,然后让网络自己去学习新加进来的层是否起作用,起多大的作用。 这样,如果新加进来的层不怎么起作用,那么网络最终的输出就是添加新的层之前的输出,这样就能保证网络的能力至少不会因为网络的加深而退化。 这张图描绘了上述文字所要传达的思想: 对于浅层网络的输出x,有两个分支,一个分支直线向下,代表映射F,它将x映射为F(x);另一个分支直接将x连接到F(x)处,这被称之为skip...
经典卷积架构:GoogLeNet
GoogLeNetGoogLeNet,也叫做Inception,没错,翻译过来就是《盗梦空间》。 相较于之前的网络,GoogLeNet网络层数更多,网络变得更深,网络结构也变得更加复杂。 不过,虽然网络结构复杂,但由于使用了1*1卷积来减少通道数,GoogLeNet所包含的参数不增反减,这也是GoogLeNet表现如此出众的重要原因之一。 GoogleNet的网络结构参数表如下: type:网络层类型patch size/stride:(卷积核or池化窗口)尺寸/(卷积/池化)步长output size:该层输出特征图的shape GoogLeNet重复使用了inception,和NiN基础块一样,它也是一个单独的块,不妨记作inception block,蓝色框起来的是便是inception block需要的参数。 inception block结构如下: inception...













