学习方法和资源
误区1:一定要把所有的基础知识学会之后再动手弄具体任务。
误区2:一直读文献而由于种种原因不动手做实验
误区3:一定要完完全全从头搭建一个框架
如何打破误区,这里我推荐一份学习路线和资源:
1.李沐动手学深度学习。跟着网上的教程敲下来,能让你对深度学习有一个基本的认识。期间可以适当看一些论文,时间大概在一个半月左右。
2.学习完之后就可以确定一个方向了。确定方向之后,最重要的事情就是先不断积累该方向的代码经验。具体以差异检测为例,如何找开源代码来跑呢?如下图所示,Github上有Awsome系列,把近年来数据集,网络结构,论文都总结了,能快速了解领域的发展。
3配环境->跑通->修改数据集/网络/… 然后就是不断重复这个过程,期间配合读代码对应的论文,结合代码食用,就能大大提升对论文的理解能力,所以一开始尽量读有开源代码的论文,否则读了之后你也不知道他具体做了什么工作。期间的任务就是就做好文献管理和数据管理。
4 在3的过程中,可以逐渐搭建起自己的一套训练框架了。也摸清楚了自己的领域里大多数人都是怎么做研究的了。然后就可以不断尝试新方法了。思路主要有两种:1.在自己任务的Baseline上加模块,目的就是涨点 2.将其他领域上的方法借鉴过来解决一个特定的问题。两种思路各有优缺点,前者优点:思路比较明确,路子比较明确,就不断挑好的方法、模块去试;也正是因为这样,导致其缺点是有时候很难达到SOFA。后者优点:做的人可能比较少,竞争小。但是正是因为这样,才没有明确的路子,甚至连待解决的问题本身都是不明确的,这就需要自主地去探索。这两种方法如何择优则需要结合这就得结合实验室基础和自身角度去选择了。
5在确定了要解决的问题并且寻找到了一个解决办法之后,剩下的就是不断跑实验,积累数据:基本数据,对比数据,自身方法数据。跑出来一个基本的效果之后,感觉心里有底之后,就可以开始边写论文了。
从语义分割入手
先从跑通一个语义分割的小项目开始,对任务整体流程有一个直观的认识。
UNet是应用很广的一个网络结构,最初是用于医学图像分割领域的。在此之前广泛应用的是FCN全连接网络。如果对语义分割的框架还不熟悉的,可以看看上一个专题,有详细的讲解。
1.数据集准备Dataloader
初学者还是直接用现有的数据集来训练。数据集分为图像-标签。这里使用Pascal VOC数据集。其实我一开始接触的时候,挺害怕处理数据集的,因为很多时候会被卡住,从下载到顺利跑通中间可能要踩的坑挺多的。网上有很多手把手教的教程,在这里我想分享一下自己的经验。
首先下载。常见的数据集,可以在百度飞浆AI上下载,优点是可以用百度网盘直接下载。其次,统一路径。下载下来之后,根据之前介绍过的,在dataset文件里,统一路径,确保dataloader能顺利加载。最后,数据预处理。其实还有些可能需要对类别再进行处理的,比如Cityscape里面默认是30多类,但是有时候需要特定的几类,需要我们下载数据集之后再进行额外的操作的,否则,在计算loss的时候,会由于标签的原因而报错。往往这是大家容易忽视的地方。
2.网络构建
样子是一个U形,所以称之为UNet,分成两个部分,左边是下采样的过程,可以理解为通过卷积在不断提取图片的特征,这样一通操作之后,图片大小逐渐减小,图片通道数从原来的三通道逐渐增加。右边的部分是上采样的过程,可以理解为不断恢复图像的大小,注意在中间灰色的线,灰色的线代表,将下采样的几个特征矩阵在通道位“贴”到上采样的特征矩阵上。举个例子,就是(左边部分[1, 32, 256, 256] 和 右边部分[1, 32, 256, 256]在通道方向上叠加,变成[1, 64, 256, 256], 其中1是Batch size, 256, 256是大小)。
3.训练过程
不断循环这个过程
image, segment_image=image.to(device),segment_image.to(device)
out_image=net(image)
loss=loss_fun(out_image,segment_image)
opt.zero_grad()
loss.backward()
opt.step()