4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
GitHub - mangxiao2018/Semantic-Segmentation-Guide: A Theory...
来自 : github 发布时间:2021-03-24
x1_0 = self.conv1_0(self.pool(x0_0)) x0_1 = self.conv0_1(torch.cat([x0_0, self.up(x1_0)], 1)) x2_0 = self.conv2_0(self.pool(x1_0)) x1_1 = self.conv1_1(torch.cat([x1_0, self.up(x2_0)], 1)) x0_2 = self.conv0_2(torch.cat([x0_0, x0_1, self.up(x1_1)], 1)) x3_0 = self.conv3_0(self.pool(x2_0)) x2_1 = self.conv2_1(torch.cat([x2_0, self.up(x3_0)], 1)) x1_2 = self.conv1_2(torch.cat([x1_0, x1_1, self.up(x2_1)], 1)) x0_3 = self.conv0_3(torch.cat([x0_0, x0_1, x0_2, self.up(x1_2)], 1)) x4_0 = self.conv4_0(self.pool(x3_0)) x3_1 = self.conv3_1(torch.cat([x3_0, self.up(x4_0)], 1)) x2_2 = self.conv2_2(torch.cat([x2_0, x2_1, self.up(x3_1)], 1)) x1_3 = self.conv1_3(torch.cat([x1_0, x1_1, x1_2, self.up(x2_2)], 1)) x0_4 = self.conv0_4(torch.cat([x0_0, x0_1, x0_2, x0_3, self.up(x1_3)], 1)) if self.deep_supervision: output1 = self.final1(x0_1) output2 = self.final2(x0_2) output3 = self.final3(x0_3) output4 = self.final4(x0_4) return [output1, output2, output3, output4] else: output = self.final(x0_4) return output

完整实现过程可参考GitHub开源代码。

以上仅对几个主要的语义分割网络模型进行介绍,从当年的FCN到如今的各种模型层出不穷,想要对所有的SOTA模型全部进行介绍已经不太可能。其他诸如ENet、DeconvNet、RefineNet、HRNet、PixelNet、BiSeNet、UpperNet等网络模型,均各有千秋。本小节旨在让大家熟悉语义分割的主要模型结构和设计。深度学习和计算机视觉发展日新月异,一个新的SOTA模型出来,肯定很快就会被更新的结构设计所代替,重点是我们要了解语义分割的发展脉络,对主流的前沿研究能够保持一定的关注。

5. 语义分割训练Tips

PyTorch是一款极为便利的深度学习框架。在日常实验过程中,我们要多积累和总结,假以时日,人人都能总结出一套自己的高效模型搭建和训练套路。这一节我们给出一些惯用的PyTorch代码搭建方式,以及语义分割训练过程中的可视化方法,方便大家在训练过程中能够直观的看到训练效果。

5.1 PyTorch代码搭建方式

无论是分类、检测还是分割抑或是其他非视觉的深度学习任务,其代码套路相对来说较为固定,不会跳出基本的代码框架。一个深度学习的实现代码框架无非就是以下五个主要构成部分:

数据:Data模型:Model判断:Criterion优化:Optimizer日志:Logger

所以一个基本的顺序实现范式如下:

# datadataset = VOC()||COCO()||ADE20K()data_loader = data.DataLoader(dataSet)# modelmodel = ...model_parallel = torch.nn.DataParallel(model)# Criterionloss = criterion(...)# Optimizeroptimer = optim.SGD(...)# Logger and Visulizationvisdom = ...tensorboard = ...textlog = ...# Model Parametersdata_size, batch_size, epoch_size, iterations = ..., ...

不论是哪种深度学习任务,一般都免不了以上五项基本模块。所以一个简单的、相对完整的PyTorch模型项目代码应该是如下结构的:

|-- semantic segmentation example |-- dataset.py |-- models |-- unet.py |-- deeplabv3.py |-- pspnet.py |-- ... |-- _config.yml |-- main.py |-- utils | |-- visual.py | |-- loss.py | |-- ... |-- README.md

上面的示例代码结构中,我们把训练和验证相关代码都放到main.py文件中,但在实际实验中,这块的灵活性极大。一般来说,模型训练策略有三种,一种是边训练边验证最后再测试、另一种则是在训练中验证,将验证过程糅合到训练过程中,还有一种最简单,就是训练完了再单独验证和测试。所以,我们这里也可以单独定义对应的函数,训练train()、验证val()以及测试test()除此之外,还有一些辅助功能需要设计,包括打印训练信息print()、绘制损失函数plot()、保存最优模型save(),调整训练参数update()。

所以训练代码控制流程可以归纳为TVT+PPSU的模式。

5.2 可视化方法

PyTorch原生的可视化支持模块是Visdom,当然鉴于TensorFlow的应用广泛性,PyTorch同时也支持TensorBoard的可视化方法。语义分割需要能够直观的看到训练效果,所以在训练过程中辅以一定的可视化方法是十分必要的。

Visdom

visdom是一款用于创建、组织和共享实时大量训练数据可视化的灵活工具。深度学习模型训练通常放在远程的服务器上,服务器上训练的一个问题就在于不能方便地对训练进行可视化,相较于TensorFlow的可视化工具TensorBoard,visdom则是对应于PyTorch的可视化工具。直接通过pip install visdom即可完成安装,之后在终端输入如下命令即可启动visdom服务:

python -m visdom.server 

启动服务后输入本地或者远程地址,端口号8097,即可打开visdom主页。具体到深度学习训练时,我们可以在torch训练代码下插入visdom的可视化模块:

if args.steps_plot 0 and step % args.steps_plot == 0: image = inputs[0].cpu().data vis.image(image,f\'input (epoch: {epoch}, step: {step})\') vis.image(outputs[0].cpu().max(0)[1].data, f\'output (epoch: {epoch}, step: {step})\') vis.image(targets[0].cpu().data, f\'target (epoch: {epoch}, step: {step})\') vis.image(loss, f\'loss (epoch: {epoch}, step: {step})\')

visdom效果展示如下:


Fig25. visdom example

TensorBoard

很多TensorFlow用户更习惯于使用TensorBoard来进行训练的可视化展示。为了能让PyTorch用户也能用上TensorBoard,有开发者提供了PyTorch版本的TensorBoard,也就是tensorboardX。熟悉TensorBoard的用户可以无缝对接到tensorboardX,安装方式为:

pip install tensorboardX

除了要安装PyTorch之外,还需要安装TensorFlow。跟TensorBoard一样,tensorboardX也支持scalar, image, figure, histogram, audio, text, graph, onnx_graph, embedding, pr_curve,video等不同类型对象的可视化展示方式。tensorboardX和TensorBoard的启动方式一样,直接在终端下运行:

tensorboard --logdir runs

一个完整tensorboardX使用demo如下:

import torchimport torchvision.utils as vutilsimport numpy as npimport torchvision.models as modelsfrom torchvision import datasetsfrom tensorboardX import SummaryWriterresnet18 = models.resnet18(False)writer = SummaryWriter()sample_rate = 44100freqs = [262, 294, 330, 349, 392, 440, 440, 440, 440, 440, 440]for n_iter in range(100): dummy_s1 = torch.rand(1) dummy_s2 = torch.rand(1) # data grouping by `slash` writer.add_scalar(\'data/scalar1\', dummy_s1[0], n_iter) writer.add_scalar(\'data/scalar2\', dummy_s2[0], n_iter) writer.add_scalars(\'data/scalar_group\', {\'xsinx\': n_iter * np.sin(n_iter), \'xcosx\': n_iter * np.cos(n_iter), \'arctanx\': np.arctan(n_iter)}, n_iter) dummy_img = torch.rand(32, 3, 64, 64) # output from network if n_iter % 10 == 0: x = vutils.make_grid(dummy_img, normalize=True, scale_each=True) writer.add_image(\'Image\', x, n_iter) dummy_audio = torch.zeros(sample_rate * 2) for i in range(x.size(0)): # amplitude of sound should in [-1, 1] dummy_audio[i] = np.cos(freqs[n_iter // 10] * np.pi * float(i) / float(sample_rate)) writer.add_audio(\'myAudio\', dummy_audio, n_iter, sample_rate=sample_rate) writer.add_text(\'Text\', \'text logged at step:\' + str(n_iter), n_iter) for name, param in resnet18.named_parameters(): writer.add_histogram(name, param.clone().cpu().data.numpy(), n_iter) # needs tensorboard 0.4RC or later writer.add_pr_curve(\'xoxo\', np.random.randint(2, size=100), np.random.rand(100), n_iter)dataset = datasets.MNIST(\'mnist\', train=False, download=True)images = dataset.test_data[:100].float()label = dataset.test_labels[:100]features = images.view(100, 784)writer.add_embedding(features, metadata=label, label_img=images.unsqueeze(1))# export scalar data to JSON for external processingwriter.export_scalars_to_json(\"./all_scalars.json\")writer.close()

tensorboardX的展示界面如图所示。


Fig26. tensorboardX example

本文链接: http://mangxiaolab.immuno-online.com/view-696806.html

发布于 : 2021-03-24 阅读(0)