-
先写个简略版的笔记..看之后的情况要不要读得更精细一点.. 背景 two stage的检测比one stage的检测效果好,原因是啥? 作者认为是正负样本不平衡导致的. two stage的方法在proposal 的时候干掉了大部分负样本,所以效果好. 因为作者提出了一种新的loss,称为Focal Loss 是对交叉熵loss的改进,作用是提高没有正确分类的样本的权重,降低正确分类的样本的权重. 然后设计了个retinaNet 来验证效果. 主要是用了Focal Loss 作为损失函数,以及backbone比起之前的one stage的检测用上了FPN. Focal Loss 一图胜千言 Focal loss是在交叉熵loss的 …
Read More -
问题描述 一年debug 三次faster rcnn,每次都有新感觉(不 接到一个bug report,现象为某人脸模型,转换成trt模型,当batch size为1时结果完全正确,但是batch size大于1时结果不正确。 具体的现象是,如果跑多张不同的图,只有第一张图有结果,后面的图都没有结果。 如果跑的图中有相同的,那么和第一张相同的图都会有结果,其余的图没有结果。 1layer {2 name: "POD_proposal"3 type: "RPRoIFused"4 bottom: "Reshape_105"5 bottom: "Conv_100"6 …
Read More -
检测不同尺度的物体一直是计算机视觉领域中比较有挑战性的事情.我们先从之前的工作出发,并对比FPN比起之前的工作有哪些改进. 之前的工作 Featurized image pyramid 思路是对于同一张图,生成不同的scale,然后每个scale的image单独去做检测. 这个方法是手工设计feautre时代的常用办法. 这个办法是比较显然的,也的确可以解决检测不同尺度物体的问题. 缺点非常明显...inference的速度几乎和scale的个数线性相关. 以及由于显存的开销,没办法做end-to-end 的training. Single feature map 再之后,手工设计的feature逐渐被由CNN生成 …
Read More -
概述 SSD是一种单阶段目标检测算法.所谓单阶段,是指只使用了一个deep neural network,而不是像faster-rcnn这种两阶段网络. 为什么有了faster-rcnn还要使用SSD? 最主要是慢... 两阶段网络虽然准确率高,但是在嵌入式等算力不足的设备上做inference速度非常感人,很难达到real time的要求. (实际业务上也是这样,公有云上的检测模型几乎都是faster-rcnn,而到了一些盒子之类的硬件设备,检测模型就全是SSD等single stage 模型了) 之前一直没有写SSD是因为相比faster rcnn的细节,SSD的问题似乎并不是很多.直到最近转模型的时候被FASF模型的一个细节卡 …
Read More -
年中的时候接了离职的同事模型转换的锅,在不断地更新迭代的过程中,发现了一些痛点。 发现k8s能够解决一部分痛点,因此来分享一下在这方面的探索。 什么是模型转换 简单来说,深度学习模型的流程分为training和inference两部分。训练时用的一般是pytorch等框架,这些框架训练出的model是没办法直接部署在各个硬件平台上做inference的。因此需要将使用训练框架得到的模型,转换为能够部署到各个硬件平台上的模型。这个过程就是模型转换。 模型转换的一般流程为,先将pytorch等训练框架训练得到的模型转换为caffe model(是的,caffe才是业界中间表示的事实标准,而不是号称支持所有框架中间表示的onnx),再 …
Read More -
最近有同事report给我们,用同一个模型转换工具,转同一个faster rcnn 模型, 同样的sdk代码,在有些显卡上结果正常,但是再比较新的显卡上(比如Titan V)上 结果完全不正确. 听说之后我的内心其实是 **喵喵喵喵喵?**的 先在模型转换工具中infer了一下,发现...结果竟然真的不一样! 于是又开始了debug faster rcnn 的旅程(奇怪..我为什么要说又) 一份典型的faster rcnn 的 prototxt 按照经验,我们先对照了ROIS,来判断RPN 是否存在问题 惊讶地发现,竟然是没有问题的... 那看一下模型的输出 cls_score 和 bbox_pred好了 发现cls_score 完 …
Read More -
动机 将一张图分成多个grid cell进行检测之后,每个cell只能检测到一个object. 如果这个grid cell中不止有一个物体要怎么办呢? 因此提出了anchor box algorithm来解决这个问题. 什么是anchor anchor其实就是一组预设的参考框,每个框有不同的长宽比和大小. 提供参考框可以将问题转换为"这个固定参考框中有没有认识的目标,目标框偏离参考框多远". 这样如果一个grid cell中有多个物体,那么就可以形状最姐姐的anchor box来负责检测该物体. anchor的其他用途 实际上当grid cell很多的时候,一个grid cell中有多个object的情况是很少 …
Read More -
对象检测(Object Detection)的目的是”识别对象并给出其在图中的确切位置”,其内容可解构为三部分: 识别某个对象(Classification); 给出对象在图中的位置(Localization); 识别图中所有的目标及其位置(Detection)。 本文将介绍滑动窗口这一方法. 滑动窗口 滑动窗口是这些方法中最暴力的一个.简单来说,就是暴力枚举侯选框的尺寸和位置,每次crop得到一张小图,将每个小图送进后面的分类器进行分类. 早年后面通常会接一个计算量比较小的分类器,比如SVM,随着算力的提升,现在常常后面会接CNN. 值得一提的是,原始的滑动窗口方法是将每个小图,分别放入后面的分类器.但是实际上,小图和小图之 …
Read More -
记录一些一个没有之前没有接触过caffe/caffe2的人为了添加自定义的op 到caffe2需要做的工作. 首先参考caffe2 tutorial,随便跑个op来试试,不妨以比较简单的 Accumulate_op 为例子. 这个op的作用就是计算Y=X+gamma*Y, 其中X为输入,Y为输出,gamma是参数. 跑起来这个运算所需要的代码如下: from caffe2.python import workspace, model_helper import numpy as np # Create the input data data = np.arange(6).reshape(2,3).astype(np.float32) …
Read More -
NMS是为了在诸多CV任务如边缘检测,目标检测等,找到局部最大值 其主要思想是先设定一个阈值,然后计算检测框的IOU(所谓IOU,也就是intersection-over-union,指的是相交面积除以相并面积,是来衡量overlap程度的指数)。如果IOU大于阈值,说明overlap过大,我们要通过某种算法来将其剔除。 比如下图,在经典的人脸识别任务中,出现了多个检测框,每个检测框有一个置信度confidence,我们通过某个算法,保留一个最好的。 顺便说一下算法的实现步骤把,其实不太重要。就是贪心。 其基本操作流程如下: * 首先,计算每一个 bounding box 的面积: * (x1, y1) ⇒ 左上点的坐 …
Read More