Tensorflow2.0:Yolo v3代码详解(一)

本文深入解析Tensorflow2.0中Yolo v3的实现,通过分析主要代码,理解模型构建过程。内容涵盖Yolo v3文件、common文件和backbone文件的代码解析,重点探讨了损失函数的计算,以及网络结构的搭建。
摘要由CSDN通过智能技术生成

为了避免重复造轮子,关于Yolo v3模型的原理就不多说了,下面主要是分析下Yolo v3在Tensorflow2.0版本里面是如何具体实现的,首先我们来分析下模型构建的主代码,这里非常感谢github 上的yunyang1994关于该代码的分享,我在这里只是对于他的代码进行了一个解读,来了解下Yolo v3在工程实现上的一些小细节,以提高自己对Tensorflow 2.0版本语法的掌握水平。

下面代码引入了common,backbone,utils和config文件的函数,对于cutils和config在Tensorflow2.0:Yolo v3代码详解(三)中,对于common和backbone则在第二部分和第三部分给出,下面给出第一部分

第一部分 针对Yolo v3文件代码解析

import numpy as np
import tensorflow as tf
import core.utils as utils
import core.common as common
import core.backbone as backbone
from core.config import cfg
NUM_CLASS = len(utils.read_class_names(cfg.YOLO.CLASSES))
ANCHORS = utils.get_anchors(cfg.YOLO.ANCHORS)
STRIDES = np.array(cfg.YOLO.STRIDES)
IOU_LOSS_THRESH = cfg.YOLO.IOU_LOSS_THRESH  # IoU阈值为0.5

进入正题,总的来说,分为五个步骤,其中比较关键的是如何计算Yolo v3的loss,这个loss我是查了很多资料才搞明白的,因为该loss和v1和v2并不完全一致,网上 很多地方并没有写清楚,关于loss的计算下次说。

# 1.模型计算与输出,输出为[conv_sbbox, conv_mbbox, conv_lbbox]
def YOLOv3(input_layer):
    route_1, route_2, conv = backbone.darknet53(input_layer)
    conv = common.convolutional(conv, (1, 1, 1024,  512))
    conv = common.convolutional(conv, (3, 3,  512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024,  512))
    conv = common.convolutional(conv, (3, 3,  512, 1024))
    conv = common.convolutional(conv, (1, 1, 1024,  512))
    conv_lobj_branch = common.convolutional(conv, (3, 3, 512, 1024))
    # 第一个输出  最后输出是不加激活也不加BN层
    conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3*(NUM_CLASS + 5)), activate=False, bn=False)
    conv = common.convolutional(conv, (1, 1,  512,  256))
    conv = common.upsample(conv)
    # 在通道维度上拼接
    conv = tf.concat([conv, route_2], axis=-1)

    conv = common.convolutional(conv, (1, 1, 768, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))
    conv = common.convolutional(conv, (3, 3, 256, 512))
    conv = common.convolutional(conv, (1, 1, 512, 256))

    conv_mobj_branch = common.convolutional(conv, (3, 3, 256, 512))
    conv_mbbox = common.convolutional(conv_mobj_branch, (1, 1, 512, 3*(NUM_CLASS + 5)), activate=False, bn=False)

    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.upsample(conv)

    conv = tf.concat([conv, route_1], axis=-1)

    conv = common.convolutional(conv, (1, 1, 384, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))
    conv = common.convolutional(conv, (3, 3, 128, 256))
    conv = common.convolutional(conv, (1, 1, 256, 128))

    conv_sobj_branch = common.convolutional(conv, (3, 3, 128, 256))
    conv_sbbox = common.convolutional(conv_sobj_branch, (1, 1, 256, 3*(NUM_CLASS +5)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值