1、前言
这将会是一个非常非常长的专栏,写这个专栏目的是让更多人可以自助解决自己的问题。最近也慢慢忙起来了,很多时候我并没有办法很有耐心的解决一些问题,而且很多问题我甚至无法解决,不同的问题有不同的产生原因,也是希望很多同学可以通过这个专栏,把自己遇到的一些问题给解决掉。所以我会建议所有学习我视频的同学,看看这个专栏。
2、我的学习经验
我曾经是一名自动化专业的学生,非科班,大学时期基本上学过C语言,从某种意义上来讲,我的基础是非常差的,但是所有人都是从基础差的情况下一步一步走过来的,因此各位学习的小伙伴并不需要因为自身是小白,就对学习深度学习感到没有信心,能不能学好在于愿不愿意花时间下功夫去研究,而不是在于基础。
对于没有python基础的同学来讲,我建议先入门python后再考虑开始学习深度学习,不然连编程语法都不知道,学习是无法进行的。
对于有python基础,但没有深度学习基础的同学来讲,我建议先入门keras或者pytorch后,再开始学习深度学习。我当时学习的keras教程是莫烦python,但是这个教程已经偏老了,很多keras语法已经发生了改变,大家可以跟着学习也可以自己上网去搜索其它教程。而对于pytorch的学习,我基本上没怎么看教程,那时候已经学了很久的keras了,对深度学习的套路了解了一些,直接就入门硬看了。我的建议还是,先入门Keras或者Pytorch,至少会自己创建一些卷积网络再开始学习,其中尤其要注意权值的保存与载入。
对于有python基础,而且有深度学习基础的同学来讲,我建议可以直接开始学习我上传的一些代码了,我上传的代码均是我参考github加上自己的理解改编写出来的,并非完全原创也并非完全复制。我建议的学习顺序是经典卷积神经网络 => SSD => yolov3 => retinanet => yolov4 => Faster RCNN => efficientdet。这个建议顺序是根据网络的难易程度进行一个划分的,其中可以穿插语义分割网络、人脸识别网络、GAN网络的学习。这些网络的学习有助于同学们理解各个网络的原理。
各位同学请不要问我有没有什么秘诀或者什么好的方法可以快速入门,如果只是训练个网络,大家可以直接看训练和预测网络的视频;如果想要制作数据集可以直接看数据集制作的视频。但是如果想要深入理解网络,只能花时间去看代码,而且是一行一行的推。这个过程刚开始会很难,但是慢慢的就熟悉熟练起来了,特别是我这种格式非常类似的库,基本上每一部分干什么我都分好了,熟悉的同学可以很快入门。
3、我的相关网站与资源
其实没有什么特殊的网站与资源,我就生活在网上的三个地方:
1、Bilibili哔哩哔哩:https://space.bilibili.com/472467171
2、CSDN博客:https://blog.csdn.net/weixin_44791964
3、Github:https://github.com/bubbliiiing
其中,Bilibili哔哩哔哩里面是我上传的视频教程;CSDN博客里面是我写的一些文字博客;Github里面是我上传的代码。
而在这其中,Github是更新最快的地方,我偶尔会上传一些奇怪的代码上去,所以大家需要什么资源,可以直接在Github上搜索。在我的Github的个人主页上就可以直接搜索我的相关库。
一般录视频所需要花费的时间是最多的,所以在Bilibili这里,我会更新的稍微慢一些。
但是在Bilibili这里我是回复最快的地方,基本上每晚我都会专门找时间回复,所以如果想问问题,最好的选择是Bilibili。
4、关于提问问题
请各位提问问题的时候一定要注意一下几点:
先在问题汇总博客看看有没有类似的问题,博客网址为https://blog.csdn.net/weixin_44791964/article/details/107517428。同学们可以用ctrl+F利用关键字进行搜索,会更加高效。
如果问题汇总上不存在对应问题,可以私信联系我或者在视频下方留言。
如果出现问题,请一定要检查一下两点:1、环境是否正确。如果环境不正确,出现问题是很正常的,我有三个环境配置教程,各位可以参考。2、是否按照步骤进行模型的训练与预测,这个步骤主要包括了:数据集制作、训练参数的设置、预测参数的设置等。
问题请尽量简短一些,把重点提炼一下,不要想到什么说什么,因为问问题的人会比较多,如果问题字数特别多,我会抓不到重点是什么。我也无法花特别多的时间去看,因为确实非常费时间。
如果提问问题一定要注意把问题描述完全,有些提问的问题根本无法回答,比如:1、up主我用你的代码训练出错了,你知道是怎么回事吗?2、博主您好,我用您的代码配置好环境后无法使用,这是怎么回事?3、博主我想问问您,为什么我训练好的模型预测没效果?上面是我选出的一些典型问题,大家可以感受一下。
在代码报错的时候,请各位把具体错误的代码的定位,具体的报错以及自己使用的数据集情况,环境配置情况等等都说一下,不然的话我确实无法对错误进行判断。
并不是所有错误我都遇见过,所以很多错误我也无法解决,这种时候只能靠自己了。
最后再强调一遍,环境的配置非常重要,这是入门的第一步。
5、关于VOC数据集和COCO数据集
a、VOC数据集 :
PASCAL VOC挑战赛是一个世界级的计算机视觉挑战赛,在VOC数据集中,我们将目标区分为20个类别,我上传的目标检测库和语义分割库(新版)的训练集格式均为VOC数据集格式。
对于目标检测来讲,VOC数据集有几种划分格式:
07+12:使用 VOC07 和 VOC12 的 train+val(共16551) 来训练,然后使用 VOC07 的 test(共4952) 测试
07++12:使用 VOC07 的 train+val+test(共9963) 和 VOC12的 train+val(共11540) 训练,然后使用 VOC12 的 test 测试,评估结果需要上传到官网。
07+12+COCO:先在COCO数据集的train上预训练,再使用 VOC07 和 VOC12 的 train+val(共16551)微调训练,然后使用 VOC07 的 test 测试
07++12+COCO:先在COCO数据集的train上预训练,再使用 VOC07 的 train+val+test 和 VOC12的train+val微调训练,然后使用 VOC12 的 test 测试,评估结果需要上传到官网。
在这里我提供07+12的训练集和测试集,我已经划分好了,直接使用即可。
07+12的训练集,使用 VOC07 和 VOC12 的 train+val(共16551) 来训练
链接: https://pan.baidu.com/s/1_oEfkFns6Kkq_vT3n0yWuQ 提取码: amgm
07+12的测试集,使用 VOC2007 的 test(共4952) 测试
链接: https://pan.baidu.com/s/161k99pa_QW0jA_n4UFpROA 提取码: aan2
b、COCO数据集
MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。
对于目标检测来讲,常用的COCO数据集版本是2014和2017,其中2017版本的下载链接如下:
train_2017:http://images.cocodataset.org/zips/train2017.zip
val_2017:http://images.cocodataset.org/zips/val2017.zip
test_2017:http://images.cocodataset.org/zips/test2017.zip
训练集和验证集的标签:http://images.cocodataset.org/annotations/annotations_trainval2017.zip
需要注意的是,COCO数据集的测试集是没有公开标签的,因此要上传到服务器上才知道效果(我还没上传过,不太了解怎么上传,还挺麻烦的感觉)。如果想要训练COCO数据集,可以参考qqwweee的yolo3的github库,里面有读取对应训练用的txt的方法。
6、关于环境配置
我的代码一般包括了三个环境,分别是:
a、keras==2.1.5、tensorflow==1.13.2
b、pytorch==1.2.0、torchvision==0.4.0
c、tensorflow==2.2.0
对应的配置教程与配置博客为:
a、keras==2.1.5、tensorflow==1.13.2:视频教程:https://www.bilibili.com/video/BV1mE411u7zg;配置博客:https://blog.csdn.net/weixin_44791964/article/details/104702142
b、pytorch==1.2.0、torchvision==0.4.0:视频教程:https://www.bilibili.com/video/BV1Ui4y147un;配置博客:https://blog.csdn.net/weixin_44791964/article/details/106037141
c、tensorflow==2.2.0:视频教程:https://www.bilibili.com/video/BV16A411x7qN;配置博客:https://blog.csdn.net/weixin_44791964/article/details/109161493
在Windows上和Ubuntu上配置的顺序是一模一样的,均为先安装anaconda,然后安装cuda和cudnn,之后利用conda创建环境,最后利用pip安装模块。在入门阶段,我会非常建议使用Windows。
好多同学说,你的环境配置好麻烦,每一步都要分开进行,很容易出错,网上有好多教程只要通过conda一行就能配置了。
事实上确实是这样,conda一行就能配置。但是由于我的电脑里面是同时装了三个环境的,利用conda来一键配置会出非常多的问题,所以我不这样安装,如果有同学是只用一个框架,确实可以利用conda一键配置。
使用30系显卡的同学需要注意,30系显卡只支持cuda11,不支持cuda10,所以我的环境配置教程对于30系显卡并没有什么用,这种时候只能按照网上的教程慢慢试了,我也没有什么好方法,cuda11应该也只支持最新版的tensorflow和pytorch,可能还需要经过简单的修改才可以使用我上传的代码,加油啊。
7、关于电脑配置
在深度学习方面,电脑配置自然是越高越好,但是不是所有小伙伴都非常有钱,所以我还是有一个最低的配置推荐。
先从我的电脑配置出发,这是我的电脑的主要配置:
处理器 英特尔 Core i5-9300H @ 2.40GHz 四核
内存 24 GB ( 威刚 DDR4 2666MHz / 记忆科技 DDR4 2666MHz )
主硬盘 镁光 MTFDHBA512TCK ( 512 GB / 固态硬盘 )
显卡 Nvidia GeForce GTX 1660 Ti ( 6 GB / 联想 )
推荐的最低配置:
深度学习需要关注的配置就4个点,我个人认为他们的重要顺序为:
显卡GPU > 内存 > 硬盘 > 处理器
显卡的重要程度自然不必多说,大多数运算在显卡上完成,我个人认为入门深度学习最少也需要6GB的显卡,4GB只能非常勉强的使用。
内存也是非常重要的,因为数据在读取后会保存在内存中,如果内存过小有些时候会导致程序被杀死,我个人认为入门深度学习最少也需要16GB的内存,最好可以提升到32GB。
硬盘也是相对比较重要的,因为数据保存在硬盘上,如果硬盘读取速度过慢会导致网络读取图片的速度过慢,训练速度就很慢,我个人认为入门深度学习最少也需要一个128GB的固态用于存放数据集。
我把CPU放在最后并不是因为他不重要,而是大多数CPU都能满足条件,我的CPU是Core i5-9300H,作为一个笔记本标压CPU,它也工作的非常好。CPU在深度学习中主要负责数据的读取和处理,只要不是在网络当中运行的,使用的都是CPU来处理。在多线程迸发读取数据进行训练的时候,CPU经常会满载。我个人认为入门深度学习需要一个运算能力大于i3 9100F的CPU就够了,锐龙和Intel都可以,至少要4核4线程以上。
8、关于GPU和CPU的利用问题
GPU利用问题问的同学非常多,但是其实都是一个主题,就是我到底有没有用GPU训练。
查看是否用GPU训练的非常简单,打开cmd,输入nvidia-smi。如果用了Memory,而且 GPU-Util Compute M不是0那就意味着用到GPU了。
这里的CUDA Version指的是驱动对应的Version不是实际的,参考意义不大。
nvidia-smi
CPU利用问题问的同学也非常多,但是其实也都是一个主题,即,为什么我的CPU利用率100%(或者说怎么这么高)了。
有用CPU才正常,读取图片、数据预处理、矩阵运算、文本处理、文件处理等都要用到CPU,那CPU当然利用率高了。这和玩游戏是一样的,主要靠GPU不表示不用CPU。
9、关于预训练权重问题
预训练权重问题一般就两个:
第一个是:我要怎么不使用预训练权重啊?
这个问题很好解决,直接把载入预训练权重的代码注释了就行。但是伴随着的就是效果非常差,因为没有预训练权重,网络主干部分提取到的特征非常差,特征差,预测效果跟随着也就差。
所以除非各位同学手上有一排卡,而且有较强的动手能力知道怎么训练COCO或者Imagenet,不然不要动主干。因为哪怕你改主干改的天花乱坠,也不会有任何提升,反而效果非常非常差。
如果要动主干,请把主干限制在已有预训练权重的主干上。keras的主干权重可以参考https://github.com/keras-team/keras-applications,pytorch的主干权重可以参考torchvision库。
第二个是:up,我修改了网络,预训练权重还能用吗?
修改了主干的话,基本上预训练权重是不能用的,要么就自己判断权值里卷积核的shape然后自己匹配,要么只能自己预训练去了;如果修改了网络的后半部分的话,前半部分的主干部分的预训练权重还是可以用的,如果是pytorch代码的话,需要自己修改一下载入权值的方式,判断shape后载入,具体代码参考汇总博客。如果是keras代码,直接by_name=True,skip_mismatch=True即可。
10、待续未完
这个专栏还是会不定期更新的,因为问问题的人越来越多,我本身也越来越忙,没有时间每天花两小时逐一回复。还是希望各位能自主解决问题,看看问题汇总,查查百度啥的。
作者:Bubbliiiing https://www.bilibili.com/read/cv10239076 出处:bilibili