#! /usr/bin/env python3
# coding=utf-8
#================================================================
# Copyright (C) 2018 * Ltd. All rights reserved.
#
# Editor : VIM
# File name : yolov3.py
# Author : YunYang1994
# Created date: 2018-11-21 18:41:35
# Description : YOLOv3: An Incremental Improvement
#
#================================================================
import tensorflow as tf
from core import common
slim = tf.contrib.slim
class darknet53(object):
"""network for performing feature extraction"""
def __init__(self, inputs):
self.outputs = self.forward(inputs)
def _darknet53_block(self, inputs, filters):
"""
implement residuals block in darknet53
"""
# 类似于残差网络的结构,通过1*1和3*3的卷积之后将input和output相加送入下一层
shortcut = inputs
inputs = common._conv2d_fixed_padding(inputs, filters * 1, 1)
inputs = common._conv2d_fixed_padding(inputs, filters * 2, 3)
inputs = inputs + shortcut
return inputs
def forward(self, inputs):
inputs = common._conv2d_fixed_padding(inputs, 32, 3, strides=1)
inputs = common._conv2d_fixed_padding(inputs, 64, 3, strides=2)
inputs = self._darknet53_block(inputs, 32)
inputs = common._conv2d_fixed_padding(inputs, 128, 3, strides=2)
for i in range(2):
inputs = self._darknet53_block(inputs, 64)
inputs = common._conv2d_fixed_padding(inputs, 256, 3, strides=2)
for i in range(8):
inputs = self._darknet53_block(inputs, 128)#27层
route_1 = inputs
inputs = common._conv2d_fixed_padding(inputs, 512, 3, strides=2)
for i in range(8):
inputs = self._darknet53_block(inputs, 256)
route_2 = inputs
inputs = common._conv2d_fixed_padding(inputs, 1024, 3, strides=2)
for i in range(4):
inputs = self._darknet53_block(inputs, 512)
#大小分别为[52,52,256] [26,26,512] [13,13,1024]
return route_1, route_2, inputs
class yolov3(object):
def __init__(self, num_classes, anchors,
batch_norm_decay=0.9, leaky_relu=0.1):
# self._ANCHORS = [[10 ,13], [16 , 30], [33 , 23],
# [30 ,61], [62 , 45], [59 ,119],
# [116,90], [156,198], [373,326]]
self._ANCHORS = anchors
self._BATCH_NORM_DECAY = batch_norm_decay
self._LEAKY_RELU = leaky_relu
self._NUM_CLASSES = num_classes
self.feature_maps = [] # [[None, 13, 13, 255], [None, 26, 26, 255], [None, 52, 52, 255]]
def _yolo_block(self, inputs, filters):
inputs = common._conv2d_fixed_padding(inputs, filters * 1, 1)
inputs = common._conv2d_fixed_padding(inputs, filters * 2, 3)
inputs = common._conv2d_fixed_padding(inputs, filters * 1, 1)
inputs = common._conv2d_fixed_padding(inputs, filters * 2, 3)
inputs = common._conv2d_fixed_padding(inputs, filters * 1, 1)
route = inputs
inputs = common._conv2d_fixed_padding(inputs, filters * 2, 3)
return route, inputs
#输出[gride,gride,3*(5+80)]大小的feature map
def _detection_layer(self, inputs, anchors):
num_anchors = len(anchors)
feature_map = slim.conv2d(inputs, num_anchors * (5 + self._NUM_CLASSES), 1,
stride=1, normalizer_fn=None,
activation_fn=None,
biases_initializer=tf.zeros_initializer())
return feature_map
#输入[gride,gride,3*(5+80)]大小的feature map,以及anchors,输出每个cell[7*7*1*2]左上角坐标
#box[13*13*3*4]坐标,box置信率[13*13*3</
yolov3网络架构以及代码解析二
最新推荐文章于 2022-08-24 18:07:58 发布