做项目一年了,围绕桥梁病害检测进行了殊死搏斗,总归是有个还不错的结果,期间还真是历经磨难,没人带飞,辛苦摸索,艰苦卓绝啊。
今天把自己整个过程总结一下:
1、深度学习技术,数据才是根本!数据才是根本!数据才是根本!重要的话说三遍。
数据量很重要。目前现有的网络,无论分类、检测,都是基于大数据作为支撑的,网络较深,参数较多,几百张图片别想着从头训练。有两条路:一是迁移训练。其实效果一般。因为工业场景图片跟ImageNet差得可太远了。迁移训练能保证收敛,不保证效果,但也可以了,总比从头训练不收敛强。二是自己搭建轻量型网络适应数据量较少的情况。不过到时候移植又是个麻烦事,毕竟工业上还是C++用的多,目前所有深度学习框架对C++的demo都好少。。。
数据量还是很重要。魔改网络,不如增加更多的样本。来自数据量对魔改党的可怕嘲讽。呵呵。改来改去,最后发现,不如增加样本效果来得直接。
数据质量很重要。现在学术领域深度学习效果这么好,都是基于清晰高分辨率的图片的。工业环境,图片质量那叫一个差,深度学习技术做也可以做,只是效果就没那么好了。
数据质量还是很重要。对图片各种预处理,不如换高分辨率相机,提高图片采集质量。来自高分辨率相机对图片处理的嘲讽。
总结一句话,就是数据才是根本。其他一切都是在这个基础上谈。无论自己数据增强,还是换高分辨率相机,这才是深度学习的第一步,这一步做好了,成功一半。
2、根据自己的任务挑选合适的网络,有现成的最好,然后迁移训练,也许会有不错的效果。
更多的时候还是要自己搭网络了,运用各种知识来实现。
我主要是搭建分割网络。知识自己补充,我只说干货。
首先说网络结构,分割网络要采用编码解码的结构,融合高低语义特征实现分割,具体可以参见Unet
其次考虑网络深度以及下采样次数,网络越深,适合复杂的任务、难的图片,浅层网络适合简单图片
下采样时,图片丢失信息,特别是工业环境拍摄的模糊图片,下采样多了,信息都丢没了,对语义分割影响很大。因此分割网络下采样次数不能多,但是我们又要获取大感受野怎么办?那么通用的做法是下采样三次,然后紧跟空洞卷积,参考商汤DetNet网络。那模糊的图片说不定第一次下采样时信息就丢失得差不多了,那么我们就要适当在前面也要加空洞卷积。这样我们就减轻了信息丢失的问题。
3、各种参数
激活函数:leaky_relu比较好用,既避免了死亡节点,又不至于参数量太大。
权重初始化:he_norm比较好用
优化函数:Adam比较好用
正则化:batchnormal比较好用,groupNormal也好用
4、结构块
我们引入比较好用结构块,比如res_block、suffle_block、batchnorm_block
网友评论