一、概念介绍
目标检测算法主要可以分为两类:two-stage detector和one-stage detector。
Two-Stage:例如Faster-RCNN算法。第一级专注于proposal的提取,第二级对提取出的proposal进行分类和精确坐标回归。两级结构准确度较高,但因为第二级需要单独对每个proposal进行分类/回归,速度较慢。
One-Stage:例如SSD,YOLO算法。此类算法摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构。
one-stage detector准确率不如two-stage detector的主要原因是正负样本不均衡,one-stage detector在得到特征图后,会产生密集的目标候选区域,而这些大量的候选区域中只有很少一部分是真正的目标,这样就造成了机器学习中经典的训练样本正负不平衡的问题。论文[1]提出了Focal Loss来对最终的Loss进行校正。
二、网络结构
下图是RetinaNet的网络结构,整个网络相对Faster-RCNN简单了很多,主要由ResNet+FPN+2xFCN子网络构成。
上面提到的Focal Loss就是应用到类别分类的子网络中class subnets,损失函数可写作:
是不同类别的分类概率, 是个大于0的值, 是个[0,1]间的小数, 和 都是固定值,不参与训练。
无论是前景类还是背景类, 越大,权重 就越小。当某样本类别比较明确些,可以通过设置权值使其对整体loss的贡献就比较少;而若某样本类别不易区分,则使其对整体loss的贡献就相对偏大。这样得到的loss最终将集中精力去诱导模型去努力分辨那些难分的目标类别,于是就有效提升了整体的目标检测准度。
和 的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。论文[1]中给出 、 时,ResNet-101+FPN作为backbone的结构有最优的性能
三、Retinanet实践
可以订阅ModelArts的Retinanet算法来入门和熟悉Retinanet在目标检测中的使用流程。
3.1 准备数据集
在AI Gallery的数据中搜索“检测”,就能搜索到适合目标检测算法的训练集,可以点击helmet训练集。
点击“下载”进入下一步。
下载方式可以选择“对象存储服务(OBS)”和“ModelArts数据集”两种方式,都是将训练集下载到OBS桶内,所以目标位置都需要填写到OBS桶内的文件夹。当选择“ModelArts数据集”时可以给数据集命名,后面训练可以通过名称选择数据集。
下载好的数据集是默认训练验证集切分比例为1.00,要输入到AI Gallery的Yolov5算法中需要进行切分。在“数据管理”的“数据集”中选择对应数据名称的“发布”。
可以选择切分比例为0.8。
3.2 订阅Retinanet算法
在算法中选择物体检测-RetinaNet_ResNet50,订阅后前往控制台。
进入控制台后会有不同版本的Retinanet,可以选择当前最新版本并创建训练作业。
3.3 训练Retinanet模型
创建训练作业后只需要填写数据输入和模型输出train_url,超参数据可以选择默认值,也可以根据实际情况修改,创建完毕后点击“提交”。超参数据修改可参考:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=d965a19d-62e6-4a07-bb02-3db57ccf9c98
训练完毕后可看训练作业的评估结果,以及精度评估和敏感度分析。
3.4 在线推理部署
点击训练作业中的“创建模型”。
选择“从训练中选择”-“训练作业”后就能根据已经训练好的训练作业来导入模型。
在“部署上线”的“在线服务”中点击“部署”。
选择刚才导入的模型进行部署。
就能上传本地文件来进行预测。