系列文章目录(更新中)
`
第一章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)loss.py–[1个类]
第五章deeplabv3+源码之慢慢解析 utils文件夹(3)scheduler.py–[1个类]
第五章deeplabv3+源码之慢慢解析 utils文件夹(4)utils.py–[1个类,4个函数]
第五章deeplabv3+源码之慢慢解析 utils文件夹(5)visualizer.py–[1个类]
总结
文章目录
- 系列文章目录(更新中)
- 前期准备和说明
- utils文件夹结构
- \_\_init__.py
- ext_transforms.py的导入部分
- ext_transforms.py需要补充的内容
- 水平随机翻转 ExtRandomHorizontalFlip类
- 竖直随机翻转 ExtRandomVerticalFlip类
- 功能组合 ExtCompose类
前期准备和说明
提示:源码众多,此次选这个版本pytorch版
- 本章是收尾的章节,既然坚持看到这里,就慢慢把所有部分啃完,体现deeplab慢慢学系列的初心。
- 本章包含图片的转换(数据增强)、损失函数计算,图表可视化等内容。
- 内容有点杂,但相对前面的学习而言,比较简单。
utils文件夹结构
提示:utils文件夹结构如下。
- 先介绍以下整体结构和__init__.py。
- 然后按顺序,本章从ext_transforms.py开始。ext_transforms.py是本章最长的一个文件,但源代码中存在错误(缺东西,本节已补全),main.py对ext_transforms.py有使用,本代码的作用就是各种数据增强。
__init__.py
from .utils import *
from .visualizer import Visualizer #可视化功能
from .scheduler import PolyLR #图表
from .loss import FocalLoss #损失计算
ext_transforms.py的导入部分
#简简单单,都是基本功能
import collections
import torchvision
import torch
import torchvision.transforms.functional as F
import random
import numbers
import numpy as np
from PIL import Image
'''(本代码使用的是Pillow库)Pillow是基于PIL库的一个派生分支,它在 PIL 库的基础上增加了许多新的特性。
发展至今,已经成为比PIL本身更具活力的图像处理库。
Pillow 和 PIL 不能共存于同一个环境中,在安装 Pillow 前,需要先卸载 PIL。
Pillow 安装后,导入库的使用方式仍是import PIL,但实际上使用的是 Pillow 库,这里的 PIL 可以看做是 Pillow 库的简称。
'''
ext_transforms.py需要补充的内容
提示:此部分来自于网络上的补充,如果没有这个部分,源代码中的_pil_interpolation_to_str会报错未定义 。
# _pil_interpolation_to_str = { #网上自补,使用时去掉注释。
# Image.NEAREST: 'PIL.Image.NEAREST', #最近相邻插值算法/最近邻法,速度快但精度低,明显可见的锯齿。
# Image.BILINEAR: 'PIL.Image.BILINEAR', #两次线性插值算法/双线性内插法,平均周围像素颜色来添加像素的方法,该方法可生成中等品质的图像,消除了锯齿现象。
# Image.BICUBIC: 'PIL.Image.BICUBIC', #两次立方插值算法/立方卷积法,计算精度很高,处理后图像像质损失较小。
# Image.LANCZOS: 'PIL.Image.LANCZOS', #Lanczos算法,兰索斯窗口函数插值,通常用于多变量内插,例如用于调整大小或旋转一个数字图像。被其视为几个简单过滤器中的‘最佳折中方案’。Antialias比Bicubic的速度要快,但Bicubic的更清晰些。
# Image.HAMMING: 'PIL.Image.HAMMING', #汉明窗口函数插值。汉明窗口,一种常用的数字信号处理技术,提高接收信号的分辨率。主要作用是在时域上对信号进行平滑加权,抑制信号的端点泄漏,以减小快速傅里叶变换过程中信号的泄漏现象,从而得到更精确的频域信息。
# Image.BOX: 'PIL.Image.BOX', #盒采样(Box sampling),盒采样通过将原始图像上的目标像素视为盒子,并对盒子内的所有像素进行采样,确保所有输入像素都对输出有贡献。这种算法的主要弱点是很难优化。
# }
水平随机翻转 ExtRandomHorizontalFlip类
class ExtRandomHorizontalFlip(object): # 以随机概率水平翻转给定的图像
"""Horizontally flip the given PIL Image randomly with a given probability.
Args:
p (float): probability of the image being flipped. Default value is 0.5
"""
def __init__(self, p=0.5): #默认概率值0.5
self.p = p
def __call__(self, img, lbl):
"""
Args:
img (PIL Image): Image to be flipped. #注,此处img为PIL Image,读入图片为(w,h)。其他多为(h,w),所以后续代码有转换。
Returns:
PIL Image: Randomly flipped image.
"""
if random.random() < self.p: #如果随机概率小于0.5则翻转。
return F.hflip(img), F.hflip(lbl)
return img, lbl
def __repr__(self): #Pyhon自我描述功能,object 类提供的 __repr__() 方法总是返回一个对象(类名 + obejct at + 内存地址),这个值并不能真正实现自我描述的功能,必须重写!
return self.__class__.__name__ + '(p={})'.format(self.p) #即输出“类+名字+(p=0.5)”此处self.p=0.5,因此是p=0.5。
竖直随机翻转 ExtRandomVerticalFlip类
class ExtRandomVerticalFlip(object): #随机垂直翻转。#除了翻转函数之外,都和水平翻转相同。
"""Vertically flip the given PIL Image randomly with a given probability.
Args:
p (float): probability of the image being flipped. Default value is 0.5
"""
def __init__(self, p=0.5):
self.p = p
def __call__(self, img, lbl):
"""
Args:
img (PIL Image): Image to be flipped.
lbl (PIL Image): Label to be flipped.
Returns:
PIL Image: Randomly flipped image.
PIL Image: Randomly flipped label.
"""
if random.random() < self.p:
return F.vflip(img), F.vflip(lbl)
return img, lbl
def __repr__(self):
return self.__class__.__name__ + '(p={})'.format(self.p)
功能组合 ExtCompose类
class ExtCompose(object): #多操作的组合,图像和标签都操作。
"""Composes several transforms together.
Args:
transforms (list of ``Transform`` objects): list of transforms to compose.
Example:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.ToTensor(),
>>> ])
"""
def __init__(self, transforms): #通过参数,输入多操作参数。
self.transforms = transforms
def __call__(self, img, lbl): #img是指输入图像数据。lbl就是label标签。
for t in self.transforms:
img, lbl = t(img, lbl) #循环进行每一个操作。
return img, lbl
def __repr__(self): #自我描述输出。
format_string = self.__class__.__name__ + '('
for t in self.transforms:
format_string += '\n'
format_string += ' {0}'.format(t)
format_string += '\n)'
return format_string
Tips
- 补充:PIL.Image.Nearest/Bilinear/Bicubic/Antialias。
- 补充:HAMMING Window汉明窗口。
- 补充:图像缩放插值算法。
- 补充:Python:__repr__(self) 方法。
- 补充:Pytorch的各种transforms转换函数。
- 下一个节介绍ext_transforms.py中的2个裁剪类和2个缩放类。