系列文章目录(共五章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类(完结)
说明
提示:本节介绍visualizer.py文件,主要是画直线,表格,文本。重点在于Visdom的调用。
导入部分
from visdom import Visdom
import json
Visualizer类
class Visualizer(object):
""" Visualizer
"""
def __init__(self, port='13579', env='main', id=None): #visdom启动后,在浏览器查看,设置端口号,如这里用http://localhost:13579
#self.cur_win = {}
self.vis = Visdom(port=port, env=env)
self.id = id
self.env = env
# Restore
#ori_win = self.vis.get_window_data()
#ori_win = json.loads(ori_win)
#print(ori_win)
#self.cur_win = { v['title']: k for k, v in ori_win.items() }
def vis_scalar(self, name, x, y, opts=None):
if not isinstance(x, list): #如果不是列表数据,转为列表。
x = [x]
if not isinstance(y, list):
y = [y]
if self.id is not None:
name = "[%s]"%self.id + name #如果id不为空,则在name中加入id
default_opts = { 'title': name }
if opts is not None:
default_opts.update(opts) #更新字典
#win = self.cur_win.get(name, None)
#if win is not None:
self.vis.line( X=x, Y=y, win=name, opts=default_opts, update='append') # 使用line函数绘制直线。update使用“append”追加数据,“replace”使用新数据,“remove”用于删除“name”中指定的跟踪。
#else:
# self.cur_win[name] = self.vis.line( X=x, Y=y, opts=default_opts)
def vis_image(self, name, img, env=None, opts=None):
""" vis image in visdom
"""
if env is None:
env = self.env
if self.id is not None:
name = "[%s]"%self.id + name
#win = self.cur_win.get(name, None)
default_opts = { 'title': name }
if opts is not None:
default_opts.update(opts)
#if win is not None:
self.vis.image( img=img, win=name, opts=opts, env=env ) # 绘制图片
#else:
# self.cur_win[name] = self.vis.image( img=img, opts=default_opts, env=env )
def vis_table(self, name, tbl, opts=None): #绘制表格。
#win = self.cur_win.get(name, None)
tbl_str = "<table width=\"100%\"> " #对应的HTML标签。
tbl_str+="<tr> \
<th>Term</th> \
<th>Value</th> \
</tr>"
for k, v in tbl.items():
tbl_str+= "<tr> \
<td>%s</td> \
<td>%s</td> \
</tr>"%(k, v) #用(k,v)替换字符串显示。
tbl_str+="</table>" #table结束HTML代码。
default_opts = { 'title': name }
if opts is not None:
default_opts.update(opts)
#if win is not None:
self.vis.text(tbl_str, win=name, opts=default_opts) #绘制文本。
#else:
#self.cur_win[name] = self.vis.text(tbl_str, opts=default_opts)
本文件的测试代码
if __name__=='__main__':
import numpy as np
vis = Visualizer(port=35588, env='main') #端口号35588,这里用http://localhost:35588
tbl = {"lr": 214, "momentum": 0.9}
vis.vis_table("test_table", tbl) #查看{"lr": 214, "momentum": 0.9}的test_table
tbl = {"lr": 244444, "momentum": 0.9, "haha": "hoho"}
vis.vis_table("test_table", tbl) #查看{"lr": 244444, "momentum": 0.9, "haha": "hoho"}的test_table
vis.vis_scalar(name='loss', x=0, y=1) #查看(name='loss', x=0, y=1)的line
vis.vis_scalar(name='loss', x=2, y=4)
vis.vis_scalar(name='loss', x=4, y=6)
Tips
1.补充:Visdom简介。
2.补充:Visdom示例。
3. 至此,utils文件夹完毕。全部源码分析完毕。
全文总结
1.deeplab v3+慢慢学系列,至此五章33节全部结束。原计划单独列一节总结,还是觉得有些形式化了,就在这里简单总结一下吧。
2.本系列的目的在于完整的梳理代码,从每一句的角度理解。但涉及的全部理论知识和论文细节,最好能完全理解后再看代码。B站存在很多讲解视频,核心讲解甚好,但细枝末节没说清楚,对入门同学可能有点小门槛。故此,全文巨细都补充了链接,挑选了网络上免费讲解非常不错的资源链接。没有重复的必要,直接点击过去看即可。
3.原本的目的,是给自己的学生写着看的,也督促一下进度。因线下见面的缘故,有些实际的操作细节没有在此赘述。
4.欢迎看到此系列文章的朋友交流和指点,提出宝贵的意见。