当前位置: 附加器 >> 附加器优势 >> RetinaNet模型构建面罩检测器雷
字幕组双语原文:如何使用RetinaNet模型构建面罩检测器
英语原文:HowtobuildaFaceMaskDetectorusingRetinaNetModel!
翻译:雷锋字幕组(李珺毅)
介绍
目标检测是计算机视觉中一个非常重要的领域,对于自动驾驶、视频监控、医疗应用和许多其他领域都是十分必要的。
我们正在努力应对一场规模空前的大流行。全球各地的研究人员都在疯狂地尝试开发COVID-19的疫苗或治疗方法,而医生们正努力防止这一流行病席卷整个世界。另一方面,许多国家发现了社交距离,戴口罩和手套是稍微抑制这种情况的一种方法。
最近我有了一个想法,用我的深度学习知识来帮助一下现在的情况。在本文中,我将向您介绍RetinaNet的实现,而不需要什么背景知识和相关工作。
最重要的是什么?我们将使用RetinaNet建立一个口罩探测器来帮助我们应对这一持续的流行病。您可以推断相同的想法,为你的智能家居构建一个启用ai的解决方案。这个人工智能解决方案将只对戴着口罩和手套的开启大楼的大门。
随着无人机的成本随着时间的推移而降低,我们看到了航拍数据的激增。因此,您可以使用这个RetinaNet模型在航空图像甚至卫星图像中检测不同的对象,如汽车(自行车、汽车等)或行人,以解决不同的业务问题。
所以,你可以看到对象检测模型的应用是无穷无尽的。
目录
1.RetinaNet是什么
2.RetinaNet的需求
3.RetinaNet网络结构
-1.主干网络
-2.目标分类自网络
-3.目标回归自网络
4.Focalloss损失函数
5.使用RetianNet模型建立口罩检测器
-1.获取数据
-2.建立数据集
-3.模型训练
-4.模型测试
6.备注
RetianNet是什么:
RetinaNet是最好的单阶段目标检测模型之一,它已被证明可以很好地处理密集和小规模的物体。因此,它已成为我们在航空和卫星图像中使用的流行目标检测模型。
RetianNet的需求:
RetinaNet是由FacebookAI研究公司引入来解决密集检测问题的。在处理极端的前景-背景类时,需要用它来弥补YOLO和SSD等单镜头对象检测器的不平衡和不一致性。
RetinaNet的网络结构:
从本质上讲,RetinaNet是由以下基本分组成的:
1.主干网络(自下而上的边路和具有侧连接的自上而下的路径)
2.目标分类子网络
3.目标回归子网络
为了更好地理解,让我们分别理解架构的每个组件
1.主干网络
1.自底向上路径:自底向上路径(例如,ResNet)用于特征提取。因此,它计算不同比例的特征地图,而不考虑输入图像的大小。
2.具有横向连接的自顶向下路径:自顶向下路径从更高的金字塔层次上采样空间上较粗糙的特征图,横向连接将具有相同空间大小的自顶向下和自底向上的层合并在一起。较高层次的特征图往往具有较小的分辨率,但语义上更强。因此,更适合于检测较大的物体;相反,来自较低级特征图的网格单元具有高分辨率,因此更擅长检测较小的对象(参见图64)。因此,通过自上而下的路径及其与路径的自下而上的横向连接的组合,这些操作不需要太多额外的计算,因此生成的特征图的每个级别在语义和空间上都可以很强。因此,该体系结构是规模不变的,并且可以在速度和准确性方面提供更好的性能。
2.目标分类子网络
每个FPN层都附加一个全卷积网络(FCN)进行对象分类。如图所示,该子网包含3*3个卷积层,个滤波器,然后是3*3个卷积层,K*A滤波器,因此输出的featuremap大小为W*H*KA,其中W和H与输入特征图的宽度和高度成比例,K和A分别为对象类和锚盒的数量。
最后采用Sigmoid层(不是softmax层)进行对象分类。
而最后一个卷积层之所以有KA滤波器是因为,如果从最后一个卷积层得到的featuremap中的每个位置都有很多锚盒候选区域,那么每个锚盒都有可能被分类为K个类。所以输出的特征图大小将是KA通道或过滤器。
3.目标回归子网络
回归子网络与分类子网络并行附着在FPN的每个特征图上。回归子网络的设计与分类子网络相同,只是最后一个卷积层大小为3*3,有4个filter,输出的featuremap大小为W*H*4A。
最后一个卷积层有4个过滤器的原因是,为了定位类对象,回归子网络为每个锚定盒产生4个数字,这些数字预测锚定盒和真实框锚盒之间的相对偏移量(根据中心坐标、宽度和高度)。因此,回归子网的输出特征图具有4A滤波器或通道。
FocalLoss损失函数
FocalLoss(FL)是Cross-EntropyLoss(CE)的改进版本,它通过为困难的或容易错误分类的示例(即具有嘈杂纹理或部分对象或我们感兴趣的对象的背景)分配更多权重来尝试处理类不平衡问题,并简化简单的示例(即背景对象)。
因此,“FocalLoss”减少了简单示例带来的损失贡献,并提高了纠正错误分类的示例的重要性。焦点损失只是交叉熵损失函数的扩展,它将降低简单示例的权重,并将训练重点放在困难样本上。
所以为了实现这些研究人员提出了-
1-pt代表交叉熵损失,可调聚焦参数≥0。RetinaNet物体检测方法使用焦距损失的α平衡变体,其中α=0.25,γ=2效果最佳。
所以focalloss的定义是:
对于γ∈[0,5]的几个值,可以看到FocalLoss,请参见图1。我们将注意到聚焦损耗的以下特性:
1.当示例分类错误且pt小时,调制因子接近1并且不影响损失。
2.当pt→1时,因子变为0,并且可以很好地权衡分类良好的示例的损失。
3.Focallossγ平滑地调整了简单示例的权重。随着γ的增加,调制因子的作用也同样增加。(经过大量实验和试验,研究人员发现γ=2最有效)
注意:-当FL=0时,FL等于CE。如图蓝色曲线所示
直观地看,调制因子减小了简单例的损耗贡献,扩展了例的低损耗范围。
你可以在这篇文章中读到关于Focalloss的详细信息(链接到我的focalloss文章),在这篇文章中我讨论了交叉熵演变成focalloss,focalloss的需要,focalloss和交叉熵的比较
最重要的是,我用了几个例子来解释为什么focalloss比交叉熵好。
现在让我们看看用Python实现RetinaNet来构建口罩检测器。
使用RetianNet模型建立口罩检测器
获取数据
任何深度学习模型都需要大量的训练数据才能在测试数据上得到好的结果。在这篇文章中(链接到我的Web文章),我谈到了为您的深度学习项目收集大量图像的Web方法。
创建数据集
我们首先使用LabelImg工具为训练和验证数据集创建注释。这个优秀的注释工具允许您快速注释对象的边框,以训练机器学习模型。
您可以在anaconda命令提示符中使用下面的命令来安装它
您可以使用如下所示的labelmg工具对每个JPEG文件进行注释,它将生成带有每个边框坐标的XML文件。我们将使用这些xml文件来训练我们的模型。
模型训练
第一步:克隆安装keras-retinaNet代码仓库
第二步:导入所需要的包
第三步:导入图片和xml文件
第三步:编写一个可以在训练集上显示边界框的函数
注意:最好从一个预先训练好的模型开始,而不是从头开始训练一个模型。我们将使用已经在Coco数据集上预先训练好的ResNet50模型。
第四步:训练RetinaNet模型
注意:如果您正在使用谷歌Colab,您可以使用下面的代码片段来训练您的模型。
但如果你重新训练你的本地JupyterNotebook或不同的IDE训练,然后你可以从命令提示符下面的命令
让我们解释一下传递给脚本train.py的每个参数。
1.freeze-backbone:冻结主干层,当我们使用小数据集时特别有用,以避免过拟合
2.random-transform:随机变换数据集以获得数据增强
3.weights:使用一个预先训练好的模型(您自己的模型或者Fizyr发布的模型)初始化模型
4.batch-size:训练批量大小,值越高,学习曲线越平滑
5.step:迭代的步数
6.epochs:迭代的次数
7.csv:上面的脚本生成的注释文件
第五步:加载训练好的模型
模型测试
第六步:使用模型进行预测
引用