`
第一章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–[17个类]
第五章deeplabv3+源码之慢慢解析 utils文件夹(2)loss.py–[1个类]
第五章deeplabv3+源码之慢慢解析 utils文件夹(3)scheduler.py–[1个类]
第五章deeplabv3+源码之慢慢解析 utils文件夹(4)utils.py–[1个类,4个函数]
第五章deeplabv3+源码之慢慢解析 utils文件夹(5)visualizer.py–[1个类]
总结
提示:源码众多,此次选这个版本pytorch版
from .modeling import *
from ._deeplab import convert_to_separable_conv
1.按显示顺序,modeling.py和_deeplab.py在backbone文件夹结束后再做详解。
from . import resnet
from . import mobilenetv2
from . import hrnetv2
from . import xception
1.简单明了,对外而言,确实就是这个四个模块。
#简简单单,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包含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个函数,相对简单。
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
补充,很喜欢这位大佬的风格,个人推荐HRNetV2详解。
本节讲述了除了类代码以外的所有部分,是整体性的介绍。
下一个节介绍hrnetv2.py中的类。