基于TensorFlow Object Detection API实现RetinaNet目标检测网络(附源码)

一、RetinaNet简介

  RetinaNet是作者Tsung-Yi Lin和Kaiming He于2018年发表的论文Focal Loss for Dense Object Detection中提出的网络。RetinaNet凭借其结构精简清晰、可扩展性强、检测准确率高等特点,成为了很多目标检测算法的baseline。
在这里插入图片描述

1. Backbone网络

  RetinaNet基本结构如上,主要由Backbone、FPN、和Head三部分组成。
  其中Backbone为ResNet网络,ResNet一般从18层到152层(甚至更多)不等,主要区别在于采用的残差单元/模块不同或者堆叠残差单元/模块的数量和比例不同。
  当前,ResNet已经被广泛运用于各种特征提取应用中,当深度学习网络层数越深时,理论上表达能力会更强,但是CNN网络达到一定的深度后,再加深,分类性能不会提高,而是会导致网络收敛更缓慢,准确率也随着降低,即使把数据集增大,解决过拟合的问题,分类性能和准确度也不会提高,而ResNet(残差网络)能够很好的解决这一问题。
在这里插入图片描述
  上图是ResNet50的网络结构,也是RetinaNet使用的Backbone网络,其中共包含五个Stage:
  Stage 0是使输入先后经过卷积层、BN层、ReLU激活函数、和MaxPooling层,对输入图片做了初始处理,供后续4个Stage特征提取使用。
  Stage 1-4的主要作用是在不同的感受野维度提取不同尺寸的特征图(下图中的C2 - C5),而利用不同感受野的特征图有助于目标的检测和识别。
在这里插入图片描述

2. FPN网络

  我们都知道卷积神经网络在提取图像的过程中,特征图(feature map)会由于采样而导致其尺寸缩小。特征图尺寸减小的方向得到的特征图为高层特征(如上图的C5),反之则称为低层特征(如上图中的C2)。
  而只使用某一层的特征图进行目标预测,会由于未使用足够低层的特征而丢失了图像的细节,最终导致结果的不准确。
  而FPN网络则很好的解决了上述问题。FPN网络通过上采样(upsampling),将高层特征图(如上图的C5)的尺寸扩大为和低层特征图(如上图的C4)同样大小,再将高层特征(如上图的C5)与低层特征(如上图的C4)融合(上图中的特征“相加”),形成新的特征图(如上图的P4),之后再对新的特征图进行独立的预测。
  这样做的优点是低层特征和高层特征相融合,提高了检测的性能,且预测结果更准确。

二、RetinaNet实现

1. tf.train.CheckPoint简介

  在模型的训练过程中,经常会遇到这样的场景:我们需要保存某个时刻训练好的模型参数,这样在对模型进行微调时,才能使用保存好的参数继续训练,而不是再随机生成参数大范围的拟合。
  这里保存模型的方法就是tf.train.Checkpoin。
  具体用法参考官方文档

2. RetinaNet的TensorFlow源码

  Step 1:安装Tensorflow 2 Object Detection API及相关包

# 删除models文件夹下所有文件
!rm -rf ./models/
# 拷贝Tensorflow Model Garden
!git clone --depth 1 https://github.com/tensorflow/models/
# 编译Object Detection API protocol buffers
!cd models/research/ && protoc object_detection/protos/*.proto --python_out=.

%%writefile models/research/setup.py
import os
from setuptools import find_packages
from setuptools import setup

REQUIRED_PACKAGES = [
    'tf-models-official==2.8.0',
    'tensorflow_io==0.24.0',
    'numpy==1.21.5'
]

setup(
    name='object_detection',
    version='0.1',
    install_requires=REQUIRED_PACKAGES,
    include_package_data=True,
    packages=(
        [p for p in find_packages() if p.startswith('object_detection')] +
        find_packages(where=os.path.join('.', 'slim'))),
    package_dir={
   
        'datasets': os.path.join('slim', 'datasets'),
        'nets': os.path.join('slim', 'nets'),
        'preprocessing': os.path.join('slim', 'preprocessing'),
        'deployment': os.path.join('slim', 'deployment'),
        'scripts': os.path.join('slim', 'scripts'),
    },
    description='Tensorflow Object Detection Library',
    python_requires='>3.6',
)

# Run the setup script you just wrote
!python -m pip install models/research

  Step 2:导入包

import matplotlib
import matplotlib.pyplot as plt

import os
import random
import io
import imageio
import glob
import scipy.misc
import numpy as np
from six import BytesIO
from PIL import Image, ImageDraw, ImageFont
from IPython.display import display, Javascript
from IPython.display import Image as IPyImage

import tensorflow as tf

from object_detection.utils import label_map_util
from object_detection.utils import config_util
from object_detection.utils import visualization_utils as viz_utils
from object_detection.utils import colab_utils
from object_detection.builders import model_builder

%matplotlib inline

  Step 3:图片加载&画图工具函数定义

def load_image_into_numpy_array(path):
  """Load an image from file into a numpy array.

  Puts image into numpy array to feed into tensorflow graph.
  Note that by convention we put it into a numpy array with shape
  (height, width, channels), where channels=3 for RGB.

  Args:
    path: a file path.

  Returns:
    uint8 numpy array with shape (img_height, img_width, 3)
  """
  img_data = tf.io.gfile.GFile(path, 'rb').read()
  image = Image.open(BytesIO(img_data))
  (im_width, im_height
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bestaier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值