DeepLearning 深度学习-个人体会

DeepLearning 深度学习-个人体会

  • DeepLearning 深度学习-个人体会
    • 第一部分是我对深度学习的理解
    • 第二部分是基于Paddle的瓶底OCR识别项目介绍

DeepLearning 深度学习-个人体会

第一部分是我对深度学习的理解

  因为是内部交流,所以第一部分我想先说说自己对深度学习的理解。就我目前在XX公司工作手头的项目来说,现在主要工作有两个,一个是泡罩,一个是Cap,其实Cap有很多可以深挖的内容适用于深度学习,比如一些铝盖凹坑的检测,或者边缘黑点的检测。但今天这里我并不想对Cap进行展开说明,我想先就自己手头的泡罩项目做个深挖。泡罩板检测主要分为片剂泡罩板检测和胶囊泡罩板检测,而片剂泡罩板针对片剂边缘的小缺角等一直是行业难题,以前的碗灯+同轴的方案从图像根源就拍不到缺陷。所以这就引出了深度学习在工业应用方面的第一个问题:图像质量。好的图像图像质量我们不论使用传统算法或者深度学习其实都有解决的可能性。而就连目标区域都无法拍到的情况我们应该先从方案着手,解决好图像质量问题,才具备深度学习的可能性。再回到刚才说的片剂缺角问题,我尝试变换方案,将缺角缺陷尽可能的拍到,就有了以下的对比图:
DeepLearning 深度学习-个人体会_第1张图片
  所以从图中可以看到,缺陷在新方案下还是比较明显,但是介于当时项目要求很急,所以这个药板使用传统算法已经已解决。
但是之后使用同样方案下,其他客户现场的片剂药片本身的提取分割就成了难点,如下图:
DeepLearning 深度学习-个人体会_第2张图片
可以看到后面几种药片本身片剂的分割就成了难点,所以后续的检测就无从谈起,所以我猜测是不是使用深度学习其实就变的非常合适,那么在图像质量相对优质的情况下什么时候使用时候使用深度学习更合适?我认为,前段时间来公司做一个技术交流的创视徐总说的一句话让我印象深刻:人眼一秒能判断的东西就适合用深度学习。起初我觉得这句话说的太不负责任了,但是仔细想想还真的就是这么回事,人眼一下能区分猫和狗,人眼一下能判断出上图中的片剂是否有缺损,人眼一眼能判断出男人和女人,美丽和丑陋等等这些,所以这些都适合用深度学习,而人眼一眼有的时候无法分辨出缺角的具体面积是多少,所以这类问题就不适合用深度学习。当然其实这句话也有很多局限性,和片面性。那么我觉得是这样,就我们目前的项目来说:不能按项目来分到底适不适合用深度学习,而应该将深度学习作为我们处理图像的一个工具手段,有针对性的解决现在的难题,可能就是这个项目中的一类缺陷,可能就是这个项目中的定位环节。
  片剂缺角我已经用深度学习跑过了,自己用paddlepaddle在AI Studio上使用了ResNet50模型,使用了迁移学习的方法进行Step1和Step2两步,其中在FC全连接层使用了L1正则化进行数据规模不统一这件事的处理,另外我对片剂的图像进行了数据增加,在原有图像数量上进行了扩充,因为好品图像很多,但是缺陷图像由于收集困难所以图片很少,必须做了数据增强,主要是旋转和反转增强。
  优化算法使用了SGD随机梯度下降,关于优化器这里其实Adam是工业上用的最多的,如果后续我要部署到自己的工控机和实际真的做预测的时候,还是Adam会好一些,但是要追求精度还是SGD更好。SGD的学习率设置我使用了衰减的方式,就是随着轮数的增加,这个学习率会越来越小,这是让一开始的时候我们学习率大一点加快速度,而后面要小一些,防止震荡,提高精度,其实说白了训练的过程就是求解w和b的过程,一般分类任务使用softmax分类函数配合交叉熵损失函数这样的方式。在反向传播时使用偏导数的概念进行逐一求解,求的就是w和b的偏导数。最终确定ResNet50(使用resnet其实是这样的,深度学习真正走上舞台是2012年,从LeNet解决手写体Mnist到AlexNet再到VGG,其实我前面说的那几种模型真的没有太多的质变,因为基本都是加卷积加池化,都在抖一些小聪明,搞一些层间归一化BN或者弄Dropout这些,是为了防止过拟合哈。我们发现一个规律就是层数越多好像效果越好,但是多到一个量级的时候,效果反而变差了,因为会导致过拟合,最终的Acc反而低了,如何解决这个问题呢?牛逼的何凯明大佬横空出世,发明了Resnet。其实就是残差网络,怎么理解呢,就是原来在反向传播过程中所有的偏导数都是相乘的,当层数特别多的时候,就是维数爆炸,这时候就过容易出现梯度消失,也就是反而学不到东西了,残差网络的核心其实就是把反向传播中的相乘变成隔层相加,最终解决了层数太多学不到这个事。所以ResNet觉对是跨时代的。我使用ResNet50的原因有2,第一是因为resnet50是50层,层数不算多也不算少,太少可能还不如直接使用一个VGG19这样的效果好,太多是因为我样本规模还没有足以支撑起101层这个模型,很容易过拟合导致泛化能力差。其实101,50我都试过。101还有个弊端就是minibatch设置的不能太大,在Ai studio上当图像的大小是200x200的时候,使用GPU(V100) 101模型每次只能设置成20左右,超过这个数就不行了,其实minibatch是这样,每次我们同时放进去的越多,肯定效果越好,因为模型会对一个minibatch数量的图像进行同步处理,这样综合信息的能力就强,学到的东西就更有效。说了半天这里都在解释自己为什么选择ResNet50这个模型,第二个原因这是中国人发明的。)模型中的所有参数,而检测也就是预测过程其实就是正向传播,将这些w和b参数代入其中,最终预测类别。过程其实就是这样,但这其实很多内容是需求自己实际做训练,看训练的cost和acc图知道内部规律。片剂这个项目的最终的效果只能说还可以,后续主要还是要扩充真实的缺陷数据集,以下是我现在使用的数据集:
DeepLearning 深度学习-个人体会_第3张图片
  接下来这里我再说说自己对各种框架的感受,是这样的,我自己真正搭建和使用过的框架就两个,排去halcon自带的库函数(halcon的深度学习我看的不多,因为我觉得其灵活性较差,而且看不到源码,对于深度学习这种本来就是个黑盒子的东西理解上非常不方便,而且halcon的深度学习收费,价钱不低,所以最初我在做选择的时候就直接Pass)。一个是caffe,一个是Paddle。caffe也就是贾扬清博士搞得那个框架,caffe是我学习深度学习初期的时候使用的框架,个人觉得入手难度一般吧,不算简单,虽然是国人写的框架,但文档可都是英文的,有问题一般只能百度搜答案。我用caffe只是简单地跑过一两个小项目,当时对模型的概念很模糊,也不知道CaffeNet什么的到底是啥,自己用Lenet跑过深度学习中的“Hello World”Mnist数据集。而paddle就真的不一样了,我觉得paddle好的地方首先这是我们国人第一个开源的框架,而且社区资源也在慢慢丰富,文档也是中文,这大大降低了学习一门知识的成本,每天白天都要处理手头的工作,处理各个现场,所剩下学习DL的时间真的不多。所以哪个更容易掌握,更方便学习,就用哪个!百度这块有个优点就是各种资源和版本迭代奇快,而且一直在优化,做的越来越好,就像Ai studio,从一开始不知道怎么用,到现在眼看着他更新换代了两次,这点不得不服百度。最最最重要的还是:这是我们中国人第一个深度学习框架。这点真的很重要!
  再说说我深度学习学习过程吧,其实这是一个很新很新很新的概念,AI概念很早了,AI概念中包括了机器学习概念,机器学习里面包括的才是深度学习,我研究生的时候用的事SVM+Hog特征的方式解决交通标志检测和识别。当时很多概念很模糊,现在回头看看,那都是历史了,真的想像大牛一样发论文,那真的要看“花书”和“西瓜书”这类基础的图书,但我个人觉得就我们目前做的事情来看,完全没必要这样学习!因为这些书一般情况下是很难自己从头啃下来的,我们做工程的和做学术研究的不太一样,我们需要用最效率的方式解决最能创造价值的事情。站在巨人肩膀上,进行新知识的学习,就像SVM分类器现在都没人用了,基本分类任务都用SoftMax,很多东西都被那些大佬验证过,趟过的我们没必要再趟一次。现在的框架真的蛮多,很多人在工程中使用tensor flow,而Caffe2现在也在和pytorch做融合,都在往更优的方面发现,但是我相信Paddle以后做的也会很棒。模型也是这个道理,完全没必要什么自己搭建模型,你自己搭建的模型再牛逼,也不可能有Cvpr这些获奖大牛设计出来的model好,其实Model内部我们都不用改,直接知道怎么调用大神的模型就好。这里我再夸一下Paddle,paddle真正意义上做到了官方提供CV模型,我们做视觉的无论检测还是识别,直接用官方模型就好,最多就是迁移学习的时候冻结的层稍微改改即可。我们需要做什么:我们需要首先学会调用模型,懂得基本的调参,做一条调参狗也是需要资本的,要自己多试多练习多跑才能对其中的一些参数影响有一个宏观概念。我自己从当时答题免费获得的12小时算力卡不知道怎么用到现在已经使用了几百小时的时间做训练。是需要一定时间积累的。下图是我的AI studio使用情况:
DeepLearning 深度学习-个人体会_第4张图片
  其次我们自己练习训练在Ai studio上做蛮合适的,后期部署再用服务器。预测在自己电脑上做最好,虽然未来预测阶段也可能在云端,但现阶段预测我基本都是在自己电脑上做。目前我们应该先在自己电脑上写python代码做预测,我个人觉得,想玩深度学习,还是要掌握基本的python代码,至少要会阅读,会简单的修改。会使用PyCharm这样的IDE。一开始其实我也不会,自己看看视频,然后有问题请教百度。学python的目的只有一个,就是实现起来真的快。
  其他的事情就是针对自己手头有可能使用深度学习的项目进行自我摧残,自己逼自己用深度学习搞一些事情,在这个过程中会发现很多很多知识的匮乏,很多东西可以学,从最简单的“LabelImage”和“LabelMe”图像制作软件的学习到IDE“PyCharm”的学习,从AI Studio的学习到自己查看Paddle的API函数。最近我在做的事情是做一个简单的python写的界面,用于调用目前我的这些python程序,实现训练和简单预测,往自己的现有的项目中添加C++程序是后面的事。因为自己百度还在搞1.5.1 fluid的C++版本。我们等等就好。另外自己用pyQt5写的一个简单界面如下,只是一个学习过程,包括了一些控件的界面布置等内容,还做了python代码的exe打包生成:
DeepLearning 深度学习-个人体会_第5张图片
  因为前段时间我们公司要做一个深度学习小组,课题是瓶底的OCR检测,我自己还没有实现YoloV3(you only look once,其实就是单步的检测模型)或者是Faster Rcnn(这是个经典的两步走模型,所谓的两步走其实第一步做的是生成定位框,第二步又回归到本质,就是识别。而单步其实就是不需要进行定位框生成,直接对图像进行全卷积,从而从最终卷积后的图像反推出位置坐标。)所以我没做OCR上的缺陷检测这件事,这件事相当相当相当的难,索性还不如退一步,我先使用自己的程序做一个瓶底OCR识别,判断出到底是哪一类,没准对后续王X的检测有一定帮助。
  第一部分最后我做一个简单的总结:
(1)深度学习也需要相对高质量的图像。
(2)人眼一秒能判断的东西就适合用深度学习。不能按项目来分到底适不适合用深度学习,而应该将深度学习作为我们处理图像的一个工具手段,有针对性的解决现在的难题,可能就是这个项目中的一类缺陷,可能就是这个项目中的定位环节。
(3)要使用Paddle框架,支持国人,相信国人,相信中国。
(4)要会基本的一些深度学习周边知识,比如python,PyCharm,AI studio,pyQt5等使用方法。基本的例如pip操作什么的要掌握。

第二部分是基于Paddle的瓶底OCR识别项目介绍

  就像我上面介绍片剂项目一样,其中一些细节部分上文有提到,感兴趣的可以再认真阅读一下,我这里先说说这个这个项目背景。
  这个项目是我同事王鑫手里的一个项目,我从云端下载下来他的数据集(我泡罩的片剂数据集大家感兴趣也可以下载,除了片剂缺角数据集我还上传了泡罩批号OCR检测项目的图像,后来这个项目我放弃了,改变了一下自己的学习思路,泡罩OCR检测加识别相当有难度,目前比较好的方式就是fasterrcnn+crnn,等积累的更多以后,我肯定要再反过头来试试这个项目,相当有挑战性。),而另一部分正好是分类任务,所以于是就有了下面这些内容。
DeepLearning 深度学习-个人体会_第6张图片
  这些都是王X提供的数据集,一共是14类,其中包括数字和字母。
  这次我没有使用数据增强是因为王X这次提供的数据比较好,有些类别的数量不是很多,但也够用。我把王X已经归好类的文件夹中的前面一大部分数据用于训练,每一类中的最后十张做成test数据集,当然train数据集中肯定没有包含test中的图像。
DeepLearning 深度学习-个人体会_第7张图片
  所以最终测试图像是14X10=140张。也基本可以评估这个模型的泛化能力了。
  另外我把所有图像都改成jpg的了,原因是百度AI studio上不支持板bmp格式的直接查看。而JPG可以直接从文件夹中双击查看,这很方便。
DeepLearning 深度学习-个人体会_第8张图片
  数据量不统一的事情其实ResNet50模型内部就已经做了Bn,Batch Normalization,这是个很重要的概念。现在我们深度学习默认都是要使用Bn的。这里我不展开说了。同样我在Fc的时候做了正则化,目的主要是防止过拟合,提高泛化能力,因为这种小样本数据集很容易学着学着模型的cost就很小了,而acc很大,但是一到检测用的测试图时就玩完。
  程序部分我还是使用了迁移学习,记住,往后我们基本所有的事情都要使用迁移学习,这是啥意思?其实就是resnet如果我们使用我们现在仅有的一点点数据集训练出一个好的模型需要很久,而直接使用人家已经搞好的一个模型,在他们的基础上我们再进行迁移,效率大大提高。这个概念就厉害了,因为最开始的模型都是在做一些卷积啥的,其实提取的就是图像的一些边缘特征等等这些所有图像共有的特性。我自己在Step1上冻结了resnet网络中fc全连接层前面的所有层,然后进行模型训练,然后在Step2上使用整个网络在刚才练好的那个模型的基础上进行重新训练,这步就把自己的图像(Bottom-OCR)放进Resnet中从第一层开始到第50层全部学习,我这里优化器使用的是SDG,原因在上文讲过。然后使用了衰变方式进行学习率的更替。这样不仅训练速度快,最后的精度还高。这个项目Step2最后的Cost和Acc图我自己画出来了。如下所示:
DeepLearning 深度学习-个人体会_第9张图片
一共搞了200轮,一轮就是一次迭代,一次迭代就是把训练所有数据搞一遍,而每次放进去的batch数量不能太大,因为即使是百度AI Studio上使用的特斯拉V100,在输入图像尺寸比较大的时候,batch_size也不能过大,否则训练不了,我这里设置成了32。
DeepLearning 深度学习-个人体会_第10张图片
最后我使用CSV的方式将所有的Test图像喂给训练好的模型,得到了一个excel表,最终可以统计出我要的识别率。
DeepLearning 深度学习-个人体会_第11张图片
里面有文件夹名称,分到的类别,是否分对。
最后我得到的结果是140张图138张分类正确。正确率是**:98.6%。**想要整套代码的和我已经处理好的数据集的可以私我。
我这里特意看了一下分类错误的两个图:
DeepLearning 深度学习-个人体会_第12张图片
这是大概“C”的图像。可以看到确实有点像。
类别:
DeepLearning 深度学习-个人体会_第13张图片

你可能感兴趣的:(图像处理,VisualDL,深度学习)