核心是:给一个图片,检测物体的类别和位置(框出来,即坐标)
不管哪个方法,记住我们的目标 ,即 objective
输入是:448*448
各种卷积+maxpool等
倒数第三层网络的时候:使用全连接层
然后reshape变成 7*7*30 中间都不管,因为没有意义,现在卷积层谁不会用亚....这都不是trick
除了最后一层的输出使用了线性激活函数,其他层全部使用Leaky Relu激活函数
一般大家介绍都会说的
参考一:yolo讲解
参考2:理解
补充:参考2:理解
第二点我说明一下,就是网络不管是训练还是测试都是吐出了一个值c,但是训练的时候用了pr(objcet)* iou 来纠正c的值,而训练时候就是直接得到c。
如上述原文中提及,在强行施加了格点限制以后,每个格点只能输出一个预测结果,所以该算法最大的不足,就是对一些邻近小物体的识别效果不是太好,例如成群结队的小鸟
剩下的训练loss 具体解释 和 其他的 trick 直接看这篇博客:【论文解读】Yolo三部曲解读——Yolov1 我选了好几个,这个算是最清楚的了,比知乎高赞答案都清楚很多,可能是我的能力还理解不来高赞答案吧
比v1一共改进 了 7 个地方,都不太好理解
优点:更好,更快,更强
然后我发现大家都不太详细解释.........
better:
这个yolo2更多的是集合了当时的深度学习各种技巧,相当于工程类的trick,由于暂时用不到,先这样吧..(太忙了
stronger:分类、检测训练集联合训练的方案
物体分类的数据集,最著名的ImageNet,物体类别有上万个,而物体检测数据集,例如coco,只有80个类别,因为物体检测、分割的打标签成本比物体分类打标签成本要高很多。
联合训练方法思路简单清晰,Yolo v2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和ImageNet大致相同。
参考理解:
联合分类与检测数据集,这里不同于将网络的backbone在ImageNet上进行预训练,预训练只能提高卷积核的鲁棒性,而分类检测数据集联合,可以扩充识别物体种类。例如,在检测物体数据集中,有类别人,当网络有了一定的找出人的位置的能力后,可以通过分类数据集,添加细分类别:男人、女人、小孩、成人、运动员等等。这里会遇到一个问题,类别之间并不一定是互斥关系,可能是包含(例如人与男人)、相交(运动员与男人),那么在网络中,该怎么对类别进行预测和训练呢?
参考理解 参考理解2 排名不分先后..
网络结构图如下
稍微梳理了参考理解的博客知识:
1.总的来说:网络先不说,先大概来了解一下:
(强调,你必须看过cnn等基础知识,必须看过yolo1等,小白跳过吧...)
输入:256 × 256 × 3 图片 —— >
不同的输入尺寸,会得到不同大小的输出特征图 ——>
每个特征图的每个格子中,都配置3个不同的先验框 ——>
输出:8 × 8 × 3 × 85、16 × 16 × 3 × 85、32 × 32 × 3 × 85
85指的是 检测框位置(4维)、检测置信度(1维)、类别(80维,coco数据集)、3是3个先验框、N × N × 3,N × N代表了检测框的参考位置信息
最后的最后:
三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:
2.然后肯定一堆不懂的概念:
先验框
在Yolov1中,网络直接回归检测框的宽、高,这样效果有限。所以在Yolov2中,改为了回归基于先验框的变化值,这样网络的学习难度降低,整体精度提升不小。Yolov3沿用了Yolov2中关于先验框的技巧,并且使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框 。注:先验框只与检测框的w、h有关,与x、y无关。
使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。
3.训练策略与损失函数
推荐直接去看这里 参考理解
要点解析:
正样本、负样本、无关样本
怎么得到上述三个样本的
loss函数解析
作者实验解析
其他参考
第一个 yolo3
yolo4
然后 两阶段的 有个博主很清晰易懂的 有个专栏
小白可以去看
第二个参考我没看但是截止目前5000+点赞..一文读懂Faster RCNN
后面应该还会继续加资料
它只是个工具代码,可以基于它进行修改 op=operation操作
1. 根据参数和config文件创建模型、输入
2. 利用VisualizationDemo的run_on_image、run_on_video接口处理输入图片/视频
3. 利用opencv-python的专用函数,记录或者显示detectron处理后的图片/视频
backbone:模型的CNN特征提取器,目前只支持resnet,另外一点是detectron2也把FPN作为backbone的一部分;
proposal_generator:候选框生成器,目前只支持RPN,一般用于faster R-CNN的一部分,其实RPN单拿出来也是一个简单的one-stage检测模型
roi_heads:faster R-CNN系列的detector,包括ROIPooler,box_head,mask_head等,其中ROIPooler就是指的ROIPool和ROIAlign方法;
meta_arch:定义最终的模型,不能说是一个单独的模块,应该要集成backbone,proposal_generator和roi_heads构建最终模型。
训练自己定义的数据集 :对于dataloader我们更关注的是数据的预处理和数据增强,detectron2在这方面支持性非常好,你只需要自定义DatasetMapper就好,然后送入build_loader的mapper
字段,detectron2对image的normalize是在Model中完成的,所以mapper中只需要转成float32的Tensor就可以。(数据进行处理增强——对应知识点:特征工程)
自定义模型:必须要了解detectron2中的模型的输入和输出格式,根据模型的不同,所需要的字段也有变化,测试和训练的不同,也有变化
我们有时候需要自定义新的模型,这就要利用前面所说的detectron2注册机制。由于detectron2是模块化设计的,你也可以自定义模型的某一个模块,比如你想实现一个新的backbone
from detectron2.modeling import BACKBONE_REGISTRY, Backbone, ShapeSpec
## 注册backbone
@BACKBONE_REGISTRY.register()
class ToyBackBone(Backbone):
def __init__(self, cfg, input_shape):
super().__init__()
# create your own backbone
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=16, padding=3)
# 输出格式是dict,这是detectron2的约定格式,与后面的detector相适应
def forward(self, image):
return {"conv1": self.conv1(image)}
# 这个方法是必须的,因为detector的head需要backbone的输出channel
def output_shape(self):
return {"conv1": ShapeSpec(channels=64, stride=16)}
使用这个新的backbone,只需要在配置文件中修改cfg.MODEL.BACKBONE.NAME = 'ToyBackBone'
,那么build_model(cfg)
得到的模型将使用这个新的backbon
然后自己定义的可以学习一下原有代码里面的模型来进行定义
自定义训练器:如果你觉得DefaultTrainer满足不了自己的训练需求,更进一步地你可以参考tools/plain_train_net.py实现自己的某些策略
你想自定义某些训练逻辑,就可以按照train_net.py那样重写DefaultTrainer的某些方法,比如你希望使用自定义的mapper进行训练,那么只需要重写build_train_loader
方法:
@classmethod
def build_train_loader(cls, cfg):
return build_detection_train_loader(cfg, mapper=your_mapper)
RCNN
结构模型 (detectron代码、基础知识) [参考]
backbone
:从图片提取特征表示的卷积神经网络结构,比如说ResNet。proposal_generator
:从图片的特征预测“哪里可能有物体”roi_head
:以proposal_generator
部分预测的有物体区域为基础,预测物体的类别和检测框坐标参考1:参考2:
如果想提高工程能力的xdm,可以看看这个链接
贴个这个链接的图