社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

fasterrcnn深度学习口罩检测

机器学习AI算法工程 • 2 年前 • 294 次点击  


向AI转型的程序员都关注了这个号👇👇👇

机器学习AI算法工程   公众号:datayx


FasterRCNN原理详解


以下是fasterRCNN的结构图,下面进行详细的过程梳理:




当我们输入一张图片,首先传达给backbone网络进行特征提取,backbone的选择不是唯一的,可以使用resnet50,101等等,其目的就是为了得到图像的大小较小,但却很深的特征层


举个例子,当输入图像的形状是600x600x3时,经过backbone会得到一个特征层形状为38x38x1024,注意,输入的图像应进行归一化处理


使用这个特征层进行3x3卷积,滤波器个数为512,得到一个38x38x512的特征层,以38x38为大小,获得38x38=1444个锚点,每个锚点会有9个框,注意现在这个框是对于共享特征层而言的,下图表示在特征层中心位置这个锚点对应的9个先验框



RPN在第一张图中由3x3卷积,两个1x1卷积组成,其目的是进行粗略筛选出建议框,类似fastRCNN中使用图像处理算法提起建议框的作用



一般来说RPN默认做的一步就是把特征图上的所有先验框38x38x9个全部表示出来;之后,把38x38x512这个特征层上的每一个位置点(总共38x38个)分别进行两个1x1的卷积,第一个卷积有9个滤波器,代表了9个先验框中包含物体的概率(分类),第二个卷积有9x4个滤波器,代表9个先验框,每一个框进行调整的参数(左上角坐标x,y和右下角坐标x,y(回归))



因此,目前RPN输出有两个数组,第一个是(38x38,9),代表先验框包含物体概率,第二个是(38x38,9x4),代表先验框调整的位置信息,注意,目前没有排除任何一个先验框,每个都参与了计算



下一步就需要进行删除没有用的先验框了,留下的叫建议框一般设置为300个,我们已知每个先验框都含有一个概率大小,我们将这个值与一个设置的置信度进行比较,包含物体的置信度一般取0.5,当概率小于0.5,删除这个先验框;下一步化简继续,考虑到框的重叠,进行一下非极大抑制,即NMS



插入一个说明:


NMS:去除重复的边框


将所有候选框的得分进行排序,选中最高分及其所对应的BBox:



遍历其余的框,如果它和当前最高得分框的重叠面积大于一定的阈值,我们将其删除

从没有处理的框中继续选择一个得分最高的,重复上述过程最后得到:



然后把剩下的先验框结合(38x38,9x4)中的位置调整信息,获得初步调整位置的框,映射回到原图,删除超出边界的框,此时还没结束,将剩余的框按照置信度即它的概率大小进行排序,选择最高的前300个,目前便得到了初步筛选出的300个建议框,还是注意,这300个建议框的大小是针对共享特征层而言的;



将这300个建议框与共享特征层求交集,获得300个小特征层,即形状为(300,mxn,1024),即300个mxn大小,深度或者通道数为1024的特征层集合,m,n代表了各个建议框的宽和高,每个建议框的宽和高都是不一样的,但是我们可以使用RoIpooling层进行池化,获得300个固定大小为14x14,1024的特征层



此处插入RoIpooling的过程:将一个宽和高为mxn的特征层(深度为d),等分成设置的(14x14份,通道数d不变,为了满足等分时取整,需要进行量化),然后在每个小区域内进行池化即可得到(14x14,d)的固定特征层


举个例子:


1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800x800,最后一层特征图feature map大小:25x25


2)假定原图中有一region proposal,大小为665x665,这样,映射到特征图中的大小:665/32=20.78,即20.78x20.78,如果你看过Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20x20


3)假定pooled_w=7,pooled_h=7,即pooling后固定成7x7大小的特征图,所以,将上面在 feature map上映射的20x20的 region proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86x2.86,此时,进行第二次量化,故小区域大小变成2x2


4)每个2x2的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49个小区域就输出49个像素值,组成7x7大小的feature_map



现在得到了固定大小的特征层,且总计300个,因此整体看来这个张量形状为(300,14,14,1024),在后面计算上,可以并行地计算每一个特征层,我们现在为了方便理解,就只从300个特征层中选出1个进行计算过程上的浏览:



现在选出了一个特征层:(14,14,1024),对这个特征层进行卷积,使用到了残差网络50的最后一个stage,即conv_block->identity_block->identity_block,输出特征层形状为(7,7,2048),进行一次平均池化得到特征层(1,1,2048),将这个特征层reshape展开成一个向量,此时便可以直接进行全连接层处理,这里的全连接层计算也分成了2个分支,一个是预测类别,一个回归得到边框进一步调整的4个参数信息



对于分类分支,如果有20类物体,就要对应21个神经元,多出的这一个属于背景类别



对于回归分支,就有20x4个神经元,分别对应每一类下边框调整的4个位置参数



我们绘制边框时,只需要索引分类分支中得到概率最大的那个类别,选出这个类别对应的4个参数信息就可以了,这里注意,背景类别不用绘制



到这里还没有结束,经过一波计算,我们得到了num个(num<300, 因为背景不算)经过精细调整的边框,以及对应的num个物体,对剩下num个物体,进行一次置信度筛选,因为它对应的概率可能仅为0.6,这会导致结果判断出现错误,所以从num个物体中选择置信度大于0.9的物体,到这里依然还没结束;


因为实验证明,到目前还是避免不了有边框重叠现象,比如:



所以对此,再次进行NMS,得到最终结果:



到这里,fasterRCNN的一个过程其实就已经梳理完成了,模型确实比较大,但是它的精度是不容置疑的。下面我们开始进入模型训练部分



项目代码 获取方式:

关注微信公众号 datayx  然后回复 RCNN 即可获取。



训练我们自己的FasterRCNN

注意一个必要的点,训练fasterRCNN必须使用VOC格式的数据集,因此,我会先从VOC格式数据集制作入手,再进入训练的部分



使用labelimg制作我们自己的VOC数据集

首先安装labelimg,即 pip install labelimg,等待安装完成后,在Terminal中打开labelimg:




打开左边的Open Dir,即选中数据集中图片文件的路径;

打开Change Save Dir,选择xml标注文件的保存路径;

现在窗口中会显示我们需要编辑的图片:


选择Create\nRectBox,直接在图片上选出真实框,每次画好一个真实框后,需要输入这个框的类别名称,选好框后状态变成:



选择左边的Save,此时标记生成XML文件保存到Change Save Dir设置的路径下,XML文件内容如下:



然后一张一张图片的标记,每张图片对应一个XML文件,这就生成了训练数据集


在实际训练中,为了方便生成器读取,我们需要生成一个txt文件,行数量就是训练集中的图片数量,列数量各自不同,第一列均是图片的绝对存储路径,后面的列依次表示成:


类别编码 框的4个位置信息;类别编码 框的4个位置信息…


训练的时候读这个txt即可



FasterRCNN训练详解

训练fasterRCNN时,必须先确保有VOC格式的数据集


首先,将fasterrcnn网络框架构建好,并加载预训练权重减少不必要的训练时间



训练需要分成两部分:


1.先训练RPN,即训练边框初步回归分支与判断是否包含物体分支,使网络具有提取建议框的能力;注意到,在这一阶段训练,每个位置点的9个先验框是人为事先分配好的;


2.利用提取出的建议框,与共享特征层求交,训练网络最后的分类分支与边框精细回归分支。


关于正负样本要注意,伴随着训练,正负样本分别出现在3个不同的阶段内:


第一阶段是RPN的先验框是否包含物体(包含具体物体的先验框为正样本,包含背景为负样本),分别随机选择128个正负样本训练,可以达到初步预测出建议框的目的;


第二阶段是判断建议框与真实框的重合度,(可以线性回归的是正样本,必须非线性回归的是负样本),可以线性回归的意思是上一阶段选出的建议框与真实框IOU比较大,则认为可以线性回归到真实框,同样分别随机选择128个正负样本训练,这样训练可以使网络获得更少的建议框,也方便用线性回归方式进行准确调整;


第三阶段是最终选出的建议框中,所含物体的类别,多个二分类构成的多分类,这里的正负样本就是分解出的一个个二分类样本



现在开始训练流程说明:


太多的图片导致内存不能容纳,所以借助数据生成器提供源源不断的批量数据,数据生成器读取图片的时候,会对图片进行随机的光照补强等图像增强操作,目的是为了使数据集多样化,提高网络的泛化能力


读取数据集之后,数据生成器会返回两类数据:


增强后的图片,真实边框的坐标信息


在共享特征层上获得所有先验框,每个先验框与每个真实框计算一次iou,iou大于0.7的设置为正样本,小于0.3的设置为负样本,在两个值中间的框要忽略,不加入训练


此处插入iou:将两个框按照如下方式计算,即为iou



将正负样本分批传给RPN训练,损失函数为RPN的分类损失与回归损失之和,分类只有两类:包含物体类,背景类;优化器为Adam,学习率为1e-5





在这个epoch内的一次训练中,RPN完成了一代训练,现在要使用RPN对生成器提供的新一批数据预测出粗略的建议框,将这些建议框再次与真实框计算求出iou,当iou大于0.6时,认为两个框比较相似,用线性回归到真实框是可以实现的,如果iou小于0.6,必须按照非线性回归才可以调整到真实框,但这已经不是我们要计算的任了,所以大于0.6的为正样本,小于0.6的为负样本,此时又得到了一次正负样本,将正负样本传入训练,现在RPN具有了提取理论上可以支持线性回归的建议框。



因此在这里,又出现了一次分类损失函数,和回归损失函数,函数的形式与上面的一样,只是计算的对象变成:


分类的目标是可线性回归的框和必须非线性回归的框,回归的计算只考虑可以线性回归的框;


这个epoch中的一次训练还没有结束,现在使用RPN再次预测一批数据,获得了更加合理的建议框,将建议框映射到共享特征层大小上,截取特征层的每一个区域,现在就把这些截取出来的特征层们看做“一个一个的原图片经过特征提取网络(resnet或者VGG)获得的特征层”,我们要做的就是预测它们分别对应的标签,分类使用交叉熵损失;除此之外,在训练分类的同时,训练4个位置回归的参数,目的是对建议框进行更加细致的调整。





前面说过网络的训练分两个阶段,第一阶段训练RPN,第二阶段才训练最后的分类层(分类层包括分类分支,回归分支)


因此训练RPN的综合损失函数为提取出合理的建议框到roipooling层之前的损失函数之和:分成4个损失,2个分类损失,2个回归损失;


提取出合理的建议框后,就开始训练分类层,后面的损失函数之和就是分类层的综合损失,只有2个损失,1个分类损失,1个回归损失


在很多个epoch后,损失减小,训练结束,权重保存到.h5文件


使用labelimg标注口罩数据及后得到训练结果,使用tensorboard查看计算图:



fasterRCNN整体比较庞大,只展示出部分

损失函数之和的减小过程为:


平均的检测准确率为:

使用训练好的权重进行测试:



机器学习算法AI大数据技术

 搜索公众号添加: datanlp

长按图片,识别二维码




阅读过本文的人还看了以下文章:


TensorFlow 2.0深度学习案例实战


基于40万表格数据集TableBank,用MaskRCNN做表格检测


《基于深度学习的自然语言处理》中/英PDF


Deep Learning 中文版初版-周志华团队


【全套视频课】最全的目标检测算法系列讲解,通俗易懂!


《美团机器学习实践》_美团算法团队.pdf


《深度学习入门:基于Python的理论与实现》高清中文PDF+源码


《深度学习:基于Keras的Python实践》PDF和代码


特征提取与图像处理(第二版).pdf


python就业班学习视频,从入门到实战项目


2019最新《PyTorch自然语言处理》英、中文版PDF+源码


《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码


《深度学习之pytorch》pdf+附书源码


PyTorch深度学习快速实战入门《pytorch-handbook》


【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》


《Python数据分析与挖掘实战》PDF+完整源码


汽车行业完整知识图谱项目实战视频(全23课)


李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材


笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!


《神经网络与深度学习》最新2018版中英PDF+源码


将机器学习模型部署为REST API


FashionAI服装属性标签图像识别Top1-5方案分享


重要开源!CNN-RNN-CTC 实现手写汉字识别


yolo3 检测出图像中的不规则汉字


同样是机器学习算法工程师,你的面试为什么过不了?


前海征信大数据算法:风险概率预测


【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类


VGG16迁移学习,实现医学图像识别分类工程项目


特征工程(一)


特征工程(二) :文本数据的展开、过滤和分块


特征工程(三):特征缩放,从词袋到 TF-IDF


特征工程(四): 类别特征


特征工程(五): PCA 降维


特征工程(六): 非线性特征提取和模型堆叠


特征工程(七):图像特征提取和深度学习


如何利用全新的决策树集成级联结构gcForest做特征工程并打分?


Machine Learning Yearning 中文翻译稿


蚂蚁金服2018秋招-算法工程师(共四面)通过


全球AI挑战-场景分类的比赛源码(多模型融合)


斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)


python+flask搭建CNN在线识别手写中文网站


中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程



不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124001
 
294 次点击