系列文章目录(更新中)
第一章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文件夹(0)backbone文件夹(a)hrnetv2.py–[4个类,4个函数,1个主函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(0)backbone文件夹(b)mobilenetv2.py–[3个类,3个函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(0)backbone文件夹©resnet.py–[2个类,12个函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(0)backbone文件夹(d)xception.py–[3个类,1个函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(1)_deeplab.py–[7个类和1个函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(2)modeling.py–[15个函数]
第四章deeplabv3+源码之慢慢解析 network文件夹(3)utils.py–[2个类]
第五章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个类]
总结
文章目录
- 系列文章目录(更新中)
- 前期准备和说明
- 总体目录
- __init__.py
- voc.py导入
- DATASET_YEAR_DICT字典
- voc_cmap函数
- download_extract函数
前期准备和说明
提示:源码众多,此次选这个版本pytorch版
- 已经搞明白了第一章各个函数的意图。
- 本章讲述的是数据预处理相关的代码。
- 每次只说一个大函数或大类(如果函数和类足够小,就讲多个),尽量足够简单。
总体目录
提示:本章讲解的是总体结构如下datasets文件夹下的内容。
- data文件夹下存放的是下载后解压的数据,总体上readme.md说的挺详细的,在第一章的get_dataset函数中有介绍和截图,可以参阅。
- 从本章起,init.py不做单独介绍(作用是将文件夹变为一个Python模块),在每章的第一节作为一个部分简要介绍。Python中的基础薄弱的,init.py的作用看此链接。
init.py
#从两个文件模块导入了两个类,后文有详细说明
from .voc import VOCSegmentation
from .cityscapes import Cityscapes
voc.py导入
#都是基本操作
import os
import sys
import tarfile
import collections
import torch.utils.data as data
import shutil
import numpy as np
from PIL import Image
from torchvision.datasets.utils import download_url, check_integrity
- 导入部分,都是常用包,不理解的单独搜索即可。
- voc.py中一共由4个部分组成:1个字典DATASET_YEAR_DICT ,2个函数voc_cmap函数和download_extract函数,1个类VOCSegmentation,本节说除了类的其他3个部分。
DATASET_YEAR_DICT字典
字典部分就是列举了数据集每个年份的下载链接url,文件名filename,校验码md5,和对应的目录路径base_dir。
DATASET_YEAR_DICT = {
'2012': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar',
'filename': 'VOCtrainval_11-May-2012.tar',
'md5': '6cd6e144f989b92b3379bac3b3de84fd',
'base_dir': 'VOCdevkit/VOC2012'
},
'2011': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2011/VOCtrainval_25-May-2011.tar',
'filename': 'VOCtrainval_25-May-2011.tar',
'md5': '6c3384ef61512963050cb5d687e5bf1e',
'base_dir': 'TrainVal/VOCdevkit/VOC2011'
},
'2010': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2010/VOCtrainval_03-May-2010.tar',
'filename': 'VOCtrainval_03-May-2010.tar',
'md5': 'da459979d0c395079b5c75ee67908abb',
'base_dir': 'VOCdevkit/VOC2010'
},
'2009': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2009/VOCtrainval_11-May-2009.tar',
'filename': 'VOCtrainval_11-May-2009.tar',
'md5': '59065e4b188729180974ef6572f6a212',
'base_dir': 'VOCdevkit/VOC2009'
},
'2008': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2008/VOCtrainval_14-Jul-2008.tar',
'filename': 'VOCtrainval_11-May-2012.tar',
'md5': '2629fa636546599198acfcfbfcf1904a',
'base_dir': 'VOCdevkit/VOC2008'
},
'2007': {
'url': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar',
'filename': 'VOCtrainval_06-Nov-2007.tar',
'md5': 'c52e279531787c972589f7e41ab4ae64',
'base_dir': 'VOCdevkit/VOC2007'
}
}
voc_cmap函数
提示:新手注意:这个函数是处理VOC数据集特有的,自己的数据集不一定要使用,对比cityscape数据集就没有。此处结果大小返回有256个,只用到前21个对应VOC数据集的21个标注类,其他的为未标注。后附补充链接。
def voc_cmap(N=256, normalized=False):
def bitget(byteval, idx):
return ((byteval & (1 << idx)) != 0) #后补链接。1<<idx,把1左移idx位,相当于1乘以2^idx。byteval与2^idx按位进行与操作(全1为1,其他的都是0),看结果不等于0则返回True,等于0则返回False.
dtype = 'float32' if normalized else 'uint8'
cmap = np.zeros((N, 3), dtype=dtype)
for i in range(N): #N=256,即0-255
r = g = b = 0
c = i
for j in range(8):
r = r | (bitget(c, 0) << 7-j) #单纯的计算,如第一个循环bitget(0, 0)=False,False<<7得到0,0|0得到0。经过8次循环得到一个r的数值。
g = g | (bitget(c, 1) << 7-j) #同上过程,经过8次循环得到一个g的数值。
b = b | (bitget(c, 2) << 7-j) #同上过程,经过8次循环得到一个b的数值。
c = c >> 3 #右移3位,即除以8.
cmap[i] = np.array([r, g, b]) #经过256次循环得到一个cmap数组。这个数组的值是固定的,需要的话,可以单独输出看一下。但其中只有前21个对应VOC数据集的21个颜色(即21个类)。
cmap = cmap/255 if normalized else cmap
return cmap
download_extract函数
提示:此函数位于文件末尾,就是数据的下载校验和解压缩。
def download_extract(url, root, filename, md5): #按url下载,MD5校验
download_url(url, root, filename, md5) #download_url来自torchvision.datasets.utils,导入的最后一行。
with tarfile.open(os.path.join(root, filename), "r") as tar: #tar文件解压缩
tar.extractall(path=root)
Tips
-
补python中的左移<<和右移>>运算
-
补VOC数据集21个类,21种颜色说明。
-
下一节是VOC数据集最重要的VOCSegmentation类。