目标检测——FasterRCNN原理与实现

目录

  • 网络工作流程
    • 数据加载
    • 模型加载
    • 模型预测过程
      • RPN获取候选区域
      • FastRCNN进行目标检测
  • 模型结构详解
    • backbone
    • RPN网络
      • anchors
      • RPN分类
      • RPN回归
      • Proposal层
    • ROIPooling
    • 目标分类与回归
  • FasterRCNN的训练
    • RPN网络的训练
      • 正负样本标记
      • RPN网络的损失函数
      • 训练过程
      • 实现
        • 正负样本设置
        • 损失函数
    • FastRCNN网络的训练
      • 正负样本标记
      • FastRCNN网络的训练
      • 训练过程
      • 实现
        • 正负样本设置
        • 损失函数
    • 共享卷积训练
    • 端到端训练
      • 数据加载
      • 模型实例化
      • 模型训练

网络工作流程

目标检测——FasterRCNN原理与实现_第1张图片
目标检测——FasterRCNN原理与实现_第2张图片
目标检测——FasterRCNN原理与实现_第3张图片

数据加载

只要In[16]就可以送入网络了,剩下的只是方便展示观看
目标检测——FasterRCNN原理与实现_第4张图片
目标检测——FasterRCNN原理与实现_第5张图片

模型加载

目标检测——FasterRCNN原理与实现_第6张图片

模型预测过程

分为两部分:RPN生成候选区域和Fast RCNN进行目标的分类与回归

RPN获取候选区域

目标检测——FasterRCNN原理与实现_第7张图片

FastRCNN进行目标检测

将获取的候选区域送入到Fast RCNN网络中进行检测
目标检测——FasterRCNN原理与实现_第8张图片
res是一个字典,其中rois是目标框,class_ids是所属的类别,scores是置信度

模型结构详解

目标检测——FasterRCNN原理与实现_第9张图片
目标检测——FasterRCNN原理与实现_第10张图片

backbone

目标检测——FasterRCNN原理与实现_第11张图片
目标检测——FasterRCNN原理与实现_第12张图片
FPN就是特征融合,使用多个特征图而不是使用一个特征图
目标检测——FasterRCNN原理与实现_第13张图片
目标检测——FasterRCNN原理与实现_第14张图片
目标检测——FasterRCNN原理与实现_第15张图片
目标检测——FasterRCNN原理与实现_第16张图片

RPN网络

目标检测——FasterRCNN原理与实现_第17张图片

anchors

预设一组anchors(不同尺度,不同长宽比)
遍历特征图上的特征点,并映射回原图
目标检测——FasterRCNN原理与实现_第18张图片
目标检测——FasterRCNN原理与实现_第19张图片
目标检测——FasterRCNN原理与实现_第20张图片
目标检测——FasterRCNN原理与实现_第21张图片
目标检测——FasterRCNN原理与实现_第22张图片

RPN分类

目标检测——FasterRCNN原理与实现_第23张图片
目标检测——FasterRCNN原理与实现_第24张图片

RPN回归

目标检测——FasterRCNN原理与实现_第25张图片
目标检测——FasterRCNN原理与实现_第26张图片
目标检测——FasterRCNN原理与实现_第27张图片

Proposal层

利用回归结果对anchor的坐标进行修正
目标检测——FasterRCNN原理与实现_第28张图片
在这里插入图片描述

ROIPooling

确定proposal要映射到哪个特征图上,获取对应的候选框
将候选框进行H*W的网格划分
在每一个网络中取最大值得到ROIPooling的结果
目标检测——FasterRCNN原理与实现_第29张图片
目标检测——FasterRCNN原理与实现_第30张图片
目标检测——FasterRCNN原理与实现_第31张图片
目标检测——FasterRCNN原理与实现_第32张图片

目标分类与回归

在这里插入图片描述
目标检测——FasterRCNN原理与实现_第33张图片
目标检测——FasterRCNN原理与实现_第34张图片

FasterRCNN的训练

目标检测——FasterRCNN原理与实现_第35张图片

RPN网络的训练

目标检测——FasterRCNN原理与实现_第36张图片

正负样本标记

目标检测——FasterRCNN原理与实现_第37张图片

RPN网络的损失函数

目标检测——FasterRCNN原理与实现_第38张图片

训练过程

目标检测——FasterRCNN原理与实现_第39张图片

实现

正负样本设置

目标检测——FasterRCNN原理与实现_第40张图片
目标检测——FasterRCNN原理与实现_第41张图片

损失函数

目标检测——FasterRCNN原理与实现_第42张图片

FastRCNN网络的训练

在这里插入图片描述

正负样本标记

在这里插入图片描述

FastRCNN网络的训练

目标检测——FasterRCNN原理与实现_第43张图片

训练过程

目标检测——FasterRCNN原理与实现_第44张图片

实现

正负样本设置

目标检测——FasterRCNN原理与实现_第45张图片

目标检测——FasterRCNN原理与实现_第46张图片

损失函数

目标检测——FasterRCNN原理与实现_第47张图片
在这里插入图片描述

共享卷积训练

目标检测——FasterRCNN原理与实现_第48张图片

端到端训练

目标检测——FasterRCNN原理与实现_第49张图片

数据加载

目标检测——FasterRCNN原理与实现_第50张图片
目标检测——FasterRCNN原理与实现_第51张图片

模型实例化

在这里插入图片描述

模型训练

#导入工具吧
from detection.datasets import pascal_voc
from detection.model.detectors import faster_rcnn
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

#数据获取
train_dataset=pascal_voc.pascal_voc('train')
num_classes=len(train_dataset.classes)

#加载模型
model=faster_rcnn.FasterRCNN(num_classes=num_classes)

#优化器
optimizer=tf.keras.optimizers.SGD(1e-3,momentum=0.1,nesterov=True)

#损失函数变化列表
loss_his=[]

#使用tf.gradientTape进行训练
#epoch
for epoch in range(2):
    #获取索引
    indices=np.arange(train_dataset.num_gtlabels)
    np.random.shufflele(indices)
    #迭代次数
    iter=np.round(train_dataset.num_gtlabels/train_dataset.batch_size).astype(np.uint8)
    for idx in range(iter):
        #获取batch数据索引
        idx=indices[idx]
        #获取batch_size
        batch_image,batch_metas,batch_bboxes,batch_label=train_dataset[idx]
        #梯度下降
        with tf.GradientTape() as tape:
            #计算损失函数
            rpn_class_loss,rpn_bbox_loss,rcnn_class_loss,rcnn_bbox_loss=model((batch_image,batch_metas,batch_bboxes,batch_label),training=True)
            #总损失
            loss=rpn_class_loss+rpn_bbox_loss+rcnn_bbox_loss+rcnn_class_loss
            #计算梯度
            grads=tape.gradient(loss,model.trainable_variables)
            #更新参数值
            optimizer.apply_gradients(zip(grads,model.trainable_variables))
            print('epoch:%d,batch:%d,loss:%f'%(epoch+1,idx,loss))
            loss_his.append(loss)

你可能感兴趣的:(tensorflow和cv,目标检测,人工智能,计算机视觉)