deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类

系列文章目录(共五章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类(完结)

文章目录

  • 系列文章目录(共五章33节已完结)
    • 前期准备和说明
    • utils文件夹结构
    • \_\_init__.py
    • ext_transforms.py的导入部分
    • ext_transforms.py需要补充的内容
    • 水平随机翻转 ExtRandomHorizontalFlip类
    • 竖直随机翻转 ExtRandomVerticalFlip类
    • 功能组合 ExtCompose类


前期准备和说明

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

  1. 本章是收尾的章节,既然坚持看到这里,就慢慢把所有部分啃完,体现deeplab慢慢学系列的初心。
  2. 本章包含图片的转换(数据增强)、损失函数计算,图表可视化等内容。
  3. 内容有点杂,但相对前面的学习而言,比较简单。

utils文件夹结构

提示:utils文件夹结构如下。
deeplabv3+源码之慢慢解析26 第五章utils文件夹(1)ext_transforms.py--2个翻转类和ExtCompose类_第1张图片

  1. 先介绍以下整体结构和__init__.py。
  2. 然后按顺序,本章从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

  1. 补充:PIL.Image.Nearest/Bilinear/Bicubic/Antialias。
  2. 补充:HAMMING Window汉明窗口。
  3. 补充:图像缩放插值算法。
  4. 补充:Python:__repr__(self) 方法。
  5. 补充:Pytorch的各种transforms转换函数。
  6. 下一个节介绍ext_transforms.py中的2个裁剪类和2个缩放类。

你可能感兴趣的:(技术,人工智能,deeplab,v3+,语义分割,深度学习)