deeplabv3+源码之慢慢解析11 第四章network文件夹(1)backbone文件夹(a1)hrnetv2.py--4个函数和可执行代码

系列文章目录(共五章33节已完结)

第一章deeplabv3+源码之慢慢解析 根目录(1)main.py–get_argparser函数
第一章deeplabv3+源码之慢慢解析 根目录(2)main.py–get_dataset函数
第一章deeplabv3+源码之慢慢解析 根目录(3)main.py–validate函数
第一章deeplabv3+源码之慢慢解析 根目录(4)main.py–main函数
第一章deeplabv3+源码之慢慢解析 根目录(5)predict.py–get_argparser函数和main函数

第二章deeplabv3+源码之慢慢解析 datasets文件夹(1)voc.py–voc_cmap函数和download_extract函数
第二章deeplabv3+源码之慢慢解析 datasets文件夹(2)voc.py–VOCSegmentation类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(3)cityscapes.py–Cityscapes类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(4)utils.py–6个小函数

第三章deeplabv3+源码之慢慢解析 metrics文件夹stream_metrics.py–StreamSegMetrics类和AverageMeter类

第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a1)hrnetv2.py–4个函数和可执行代码
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a2)hrnetv2.py–Bottleneck类和BasicBlock类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a3)hrnetv2.py–StageModule类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a4)hrnetv2.py–HRNet类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b1)mobilenetv2.py–2个类和2个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b2)mobilenetv2.py–MobileNetV2类和mobilenet_v2函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c1)resnet.py–2个基础函数,BasicBlock类和Bottleneck类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c2)resnet.py–ResNet类和10个不同结构的调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d1)xception.py–SeparableConv2d类和Block类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d2)xception.py–Xception类和xception函数
第四章deeplabv3+源码之慢慢解析 network文件夹(2)_deeplab.py–ASPP相关的4个类和1个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(3)_deeplab.py–DeepLabV3类,DeepLabHeadV3Plus类和DeepLabHead类
第四章deeplabv3+源码之慢慢解析 network文件夹(4)modeling.py–5个私有函数(4个骨干网,1个模型载入)
第四章deeplabv3+源码之慢慢解析 network文件夹(5)modeling.py–12个调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(6)utils.py–_SimpleSegmentationModel类和IntermediateLayerGetter类

第五章deeplabv3+源码之慢慢解析 utils文件夹(1)ext_transforms.py.py–2个翻转类和ExtCompose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(2)ext_transforms.py.py–2个裁剪类和2个缩放类
第五章deeplabv3+源码之慢慢解析 utils文件夹(3)ext_transforms.py.py–旋转类,填充类,张量转化类和标准化类
第五章deeplabv3+源码之慢慢解析 utils文件夹(4)ext_transforms.py.py–ExtResize类,ExtColorJitter类,Lambda类和Compose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(5)loss.py–FocalLoss类
第五章deeplabv3+源码之慢慢解析 utils文件夹(6)scheduler.py–PolyLR类
第五章deeplabv3+源码之慢慢解析 utils文件夹(7)utils.py–去标准化,momentum设定,标准化层锁定和路径创建
第五章deeplabv3+源码之慢慢解析 utils文件夹(8)visualizer.py–Visualizer类(完结)


前期准备和说明

提示:源码众多,此次选这个版本pytorch版

  1. 本章是各类神经网络的代码,所以前期准备是已经了解过(最好是学习过)pytorch。此处对于新手同学推荐的是沐神的动手学深度学习开篇前置链接,新手必学内容,再次强调一遍,推荐资源都是免费的。
  2. 知道深度学习,特别是卷积神经网络为基础的系列网络的构建理论。
  3. 本章应该是新手同学最为关心的章节,建议有足够的耐心看全部补充链接。
  4. 每次只说一个函数,进度足够慢,尽量足够简单。

总体目录

提示:network文件夹总体结构如下。
在这里插入图片描述

  1. 先介绍以下整体结构和__init__.py。
  2. 然后按顺序,本章从backbone文件夹,也就是主干网络(骨干网络)开始。
  3. 本章是全部代码中最长的章节,后续按函数和类进行内容安排,遇到长的类和函数,一节讲一个,体现deeplab慢慢学系列的初心。

__init__.py

from .modeling import *
from ._deeplab import convert_to_separable_conv

1.按显示顺序,modeling.py和_deeplab.py在backbone文件夹结束后再做详解。


backbone文件夹

提示: backbone文件夹总体结构如下。
在这里插入图片描述

  1. 本文件夹内虽然只有4个主要的python文件,但涉及的内容稍多,目的以详解为主,时间可能会有点长,望大家见谅。
  2. 题外话:学习靠日积月累,而不是突击。也许这是目前反主流的观点,但本系列目的一是讲东西,二就在于传播一些我认为有用的观念吧。

backbone文件夹中的__init__.py

from . import resnet
from . import mobilenetv2
from . import hrnetv2
from . import xception

1.简单明了,对外而言,确实就是这个四个模块。


hrnetv2.py的导入部分

#简简单单,torch的各种基本功能
import torch
from torch import nn
import torch.nn.functional as F
import os

1.简单明了,对外而言,确实就是这个四个模块。
2.传统的卷积神经网络模型常常存在多个下采样的过程,输入进来的图片利用卷积或者最大池化进行高和宽的压缩。HRNet则通过下采样以及上采样,在网络进行特征提取时融合不同形状的特征。HRNetV2可以适应不同任务的需要,语义分割就是其中之一。HRNet提取出来的特征极其丰富,包含各种的分辨率,理论上可以适应不同的CV需求(目标检测、语义分割、实例分割等)。整个HRNetV2由三部分组成,分别是主干部分、特征整合部分、预测头部分。详情后补链接。
3.理论不清楚的建议一定先高清楚,代码仅仅是对理论的实现,想真正搞清楚的必须看,切记切记!

hrnetv2.py的非函数非类代码


提示:hrnetv2.py包含4个类,4个函数,和其他可执行代码。先介绍非函数非类的代码。
1,文件开头的代码

__all__ = ['HRNet', 'hrnetv2_48', 'hrnetv2_32']   #一共有三种结构可选。

# Checkpoint path of pre-trained backbone (edit to your path). Download backbone pretrained model hrnetv2-32 @
# https://drive.google.com/file/d/1NxCK7Zgn5PmeS7W1jYLt5J9E0RRZ2oyF/view?usp=sharing .Personally, I added the backbone
# weights to the folder /checkpoints

model_urls = {
    'hrnetv2_32': './checkpoints/model_best_epoch96_edit.pth',   #源代码中保存hrnetv2_32模型的位置。
    'hrnetv2_48': None
}

2,文件结尾的代码

if __name__ == '__main__':      #单独运行本代码使用,被别的模块调用时不起作用。先学好python,切记!

    try:  #此段是检测要载入的模型文件是否存在。
        CKPT_PATH = os.path.join(os.path.abspath("."), '../../checkpoints/hrnetv2_32_model_best_epoch96.pth')
        print("--- Running file as MAIN ---")
        print(f"Backbone HRNET Pretrained weights as __main__ at: {CKPT_PATH}")
    except:
        print("No backbone checkpoint found for HRNetv2, please set pretrained=False when calling model")

    # Models
    model = hrnetv2_32(pretrained=True)  #使用与训练模型,详见hrnetv2_32函数。
    #model = hrnetv2_48(pretrained=False)

    if torch.cuda.is_available():   #GPU可用则用,不可用则用CPU。
        torch.backends.cudnn.deterministic = True
        device = torch.device('cuda')
    else:
        device = torch.device('cpu')
    model.to(device)
    in_ = torch.ones(1, 3, 768, 768).to(device)  #用全1输入测试输出。
    y = model(in_)
    print(y.shape)

    # Calculate total number of parameters:
    # pytorch_total_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
    # print(pytorch_total_params)

hrnetv2.py的4个函数


提示:hrnetv2.py包含4个函数,相对简单。
1,文件开头的函数

def check_pth(arch):      #检查路径。
    CKPT_PATH = model_urls[arch]  #从前文的model_urls字典中选择具体的模型路径。 
    if os.path.exists(CKPT_PATH):
        print(f"Backbone HRNet Pretrained weights at: {CKPT_PATH}, only usable for HRNetv2-32")
    else:
        print("No backbone checkpoint found for HRNetv2, please set pretrained=False when calling model")
    return CKPT_PATH
    # HRNetv2-48 not available yet, but you can train the whole model from scratch.

2,文件末尾的函数

def _hrnet(arch, channels, num_blocks, pretrained, progress, **kwargs):
    model = HRNet(channels, num_blocks, **kwargs)  #详见HRNet类。
    if pretrained:    #如使用预训练模型,则检验路径,载入模型。
        CKPT_PATH = check_pth(arch)   #详见上文check_pth函数。
        checkpoint = torch.load(CKPT_PATH)
        model.load_state_dict(checkpoint['state_dict'])
    return model


def hrnetv2_48(pretrained=False, progress=True, number_blocks=[1, 4, 3], **kwargs):
    w_channels = 48   #hrnetv2_48,即w_channels = 48。
    return _hrnet('hrnetv2_48', w_channels, number_blocks, pretrained, progress,
                  **kwargs)


def hrnetv2_32(pretrained=False, progress=True, number_blocks=[1, 4, 3], **kwargs):
    w_channels = 32  #hrnetv2_32,即w_channels = 32。
    return _hrnet('hrnetv2_32', w_channels, number_blocks, pretrained, progress,
                  **kwargs)

Tips

  1. 补充,很喜欢这位大佬的风格,个人推荐HRNetV2详解

  2. 本节讲述了除了类代码以外的所有部分,是整体性的介绍。

  3. 下一个节介绍hrnetv2.py中的类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值