# 深度学习期末作业 **Repository Path**: zhuyijingml/deep_learning ## Basic Information - **Project Name**: 深度学习期末作业 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-05-02 - **Last Updated**: 2022-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 深度学习期末作业 本项目为深度学习期末作业——商品识别 使用数据集有旷视科技发布的RPC数据集以及信也科技杯商品识别数据集 数据集:[RPC数据集](https://rpc-dataset.github.io/), [竞赛数据集](https://ai.ppdai.com/mirror/goToMirrorDetailSix?mirrorId=26) ## (1)代码来源 yolov5: https://github.com/ultralytics/yolov5 yolov5-mobilenet: https://github.com/jylink/yolov5-mobilenetv3 mmdetection: https://github.com/open-mmlab/mmdetection pyretri: https://github.com/PyRetri/PyRetri ## (2)使用算法 目标检测:yolov5, cascade-rcnn, faster-rcnn 图像检索:resnet50, resnet101, PCA, KNN等 ### 深度学习作业使用算法: 1) **复现RPC数据集中旷视科技使用算法** [paper](https://arxiv.org/abs/1901.07249),[参考代码](https://isrc.iscas.ac.cn/gitlab/research/acm-mm-2019-ACO) 复现结果:论文使用显著性检测算法Salient Object Detection获取训练集mask,然后进行复制粘贴模拟多目标检测,再使用CycleGAN渲染添加阴影以达到真实场景的效果。但是论文使用数据集极大100多K,因时间和设备限制,所以暂未完整复现论文结果。 2) **使用yolov5进行目标检测** 我们小组结果:数据集过于庞大,所以只使用验证集进行训练,测试集划分为测试集以及验证集,yolov5-mobilenetv3s(视频展示使用模型)算法中验证集mAP为0.75。 yolov5s, yolov5m, yolov5l, yolov5-mobilenetv3目标检测算法最终mAP值(测试集,验证集)在0.7~0.85之间。 yolov5-mobilenetv3s速度:CPU上实时检测(FPS在30帧以上) yolov5-mobilenetv3s优势:检测速度快,可以进行实时检测 yolov5-mobilenetv3s不足:精度低,其他场景下效果差;实际零售收银场景也不应该是视频实时检测,只收集一帧或者某几帧图像,但是为了实时检测,这里才有了效果较差的单阶段目标检测模型;而且实际场景中目标检测数据集标注大,零售商品多,可能随时增加新的商品,容易导致重新标注以及重新训练模型的问题,所以纯目标检测通用性不强。 3) **信也科技杯商品数据集** 数据集特点:有专门的目标检测训练集、图像检索商品库;类别差异大,类间差异小,有点类似于细粒度图像分类;测试集部分类别不存在与训练集中,但是训练集有专门的商品库,可以使用类似于人脸识别或者RE-ID方式进行图像匹配。 使用方法:目标检测(即检测又分类),目标检测(检测前景)+图像检索(图像匹配,以图搜图) 最终方法:目标检测+图像检索;纯目标检测算法官方不允许 4) **使用yolov5进行目标检测(检测+分类)** 数据处理:将训练集train中的a_images目标检测训练集图像分为训练集以及验证集,比例为5:1;关闭马赛克数据增强,图像缩放等数据增强操作;训练500个epoch(还未完全收敛,还有非常缓慢的提升趋势) 使用模型:yolov5s, yolov5m, yolov5l, yolov5x, yolov5m6 结果指标:验证集mAP为mAP0.5:0.9;竞赛提交结果mAP0.75,[评价指标](https://ai.ppdai.com/mirror/goToMirrorDetailSix?mirrorId=26&tabindex=1) 模型|验证集mAP|提交结果 --|:--:|--: yolov5s|0.3~0.45|0.3~0.4 yolov5m|0.4~0.65|0.3~0.56 yolov5m6|0.6~0.75|0.68 其他模型训练时间太长,GPU资源不足以支撑训练(每个模型最终epoch:120/500),所以最后未提交 提交最优结果:0.69 结果分析:损失值主要是分类损失占比大,对于一些相似商品yolov5分类效果不好 5) **Cascade-RCNN进行目标检测(检测+分类)** 数据处理:train数据集中的a_images, b_images(商品库)两个数据集作为训练集;test中b_images(测试集商品库——有标注信息)作为验证集 使用模型:Faster-RCNN+ResNet101; Cascade-RCNN+ResNet50; Cascade-RCNN+ResNet101; Cascade-RCNN+ResNeXt101; 训练配置:GPU为2*2080Ti;训练epoch均为15;工具包为mmdetection;其中cascade-rcnn+resnet101经过多次调参; 结果指标:验证集mAP指标太大,不予展示;竞赛提交结果mAP0.75,[评价指标](https://ai.ppdai.com/mirror/goToMirrorDetailSix?mirrorId=26&tabindex=1) 模型|训练集train文件|提交结果 --|:--:|--: Fa-R101|a_images|0.87 Ca-R50|a_images|0.87 Ca-R101|a+b_images|0.87~0.9 Ca-X101|a+b_images|0.9 提交最优结果:0.9 结果分析:损失值主要是分类损失占比大;但最终效果还是比较好,将所有有标注的数据集进行训练指标可能还会提升(还未尝试);随着backbone深度加深,最终指标提升约为1~2个点; 6) **yolov5s(前景检测)+图像检索** 数据处理:train中的a_images划分训练集验证集(4:1)用于训练检测器;train中的b_images按照bbox坐标抠图训练ResNet分类模型用于图像检索特征提取;test中b_images也抠图,用于制作商品库(相当于人脸识别中的人脸库); 使用方法:yolov5s只进行检测,不分类(检测出是商品这一类就行),将检测后的商品抠图(缩放成[224,224]大小)送入检索模型进行检索; 图像检索:使用ResNet模型提取商品库特征并进行编码(哈希编码, PCA等)制作商品库;将检测后裁剪的图像进行特征提取编码;计算query和gallery之间的余弦相似度;重排序输出最匹配结果。 使用算法:yolov5s, yolov5s6, ResNet50, ResNet101 提点方法:使用更强的检测模型(yolov5s6 > yolov5s);使用更深的主干网络(ResNet101 > ResNet50);Imagenet上的模型在b_images上进行微调(微调模型提升非常明显) 评价指标:竞赛提交结果 检测速度:单卡2080Ti上一张图像处理时间0.5~5秒(和模型以及图像目标个数有关) *表格中最后指标所用ResNet模型均在训练集上进行了微调* 算法|检测速度|提交结果 --|:--:|--: v5s+R50|0.2~2s|0.72 v5s+R101|0.5~3s|0.82 v5s6+R50|0.8~3.5|0.74 v5s6+R101|1~5s|0.85 算法不足:速度慢;CPU上速度更慢; 算法优势:使用更好的检测模型和特征提取模型,mAP值还可以提升;随时增加新的商品,没有重新标注以及重新训练模型的问题,将新数据图像加入商品检索库即可; 参考资料:多篇图像检索论文[从里面找](https://arxiv.org/abs/2012.00641),知乎,CSDN等。 https://zhuanlan.zhihu.com/p/146156685,https://zhuanlan.zhihu.com/p/77429436,https://zhuanlan.zhihu.com/p/363012578,https://zhuanlan.zhihu.com/p/36768010 7) **提升精度** 1. 放弃纯目标检测算法(检测+分类),不符合要求 2. 将yolov5s目标检测算法替换为Cascade-RCNN或其他效果更好的网络 3. 引入视觉注意模块,提升ResNet网络在细粒度图像上的特征提取效果;或者使用其他带有注意力机制的网络 4. 使用细粒度分类网络作为特征提取网络 5. 特征融合,融合不同阶段特征图(融合细节信息以及语义信息),从而提升特征提取效果 6. 使用近年来性能较优的基于内容的图像检索算法 7. 比赛即将结束(6.25),这段时间上述方法大概率不能实现 8) **提升速度** 1. 使用更轻量级的目标检测算法(pp-yolo, pp-yolo2, 基于mobilenet主干网络的检测算法) 2. 图像检索阶段特征提取模型替换为轻量级网络(mobilenetv3, efficientnet-b0, shufflenet等网络) 3. 使用速度和精度比较折中的检索算法;优化检索算法 4. 将query和gallery维度调小(512 -> 128甚至更小) 5. 图像裁剪尺寸和特征提取尺寸调小([224,224] -> [112,112]甚至更小) 6. 使用上述方法使图像检索可以在cpu上调用摄像头进行实时检测,效果大概率不好 7. 课程已经结束,这段时间大概率不会去实现上述算法 9) **算法实现** 1. 将数据集转换为coco格式或者voc格式;yolov5的txt格式,详情见https://github.com/ultralytics/yolov5 2. [yolov5算法实现](https://gitee.com/li_tian_peng/deep_learning/tree/master/yolov5),配置文件根据自己的需要进行更改 3. 安装mmdetection,安装使用见https://github.com/open-mmlab/mmdetection,修改配置文件,训练自己的数据集 4. 安装pyretri进行图像检索,安装使用见https://github.com/PyRetri/PyRetri,修改配置文件,实现检索算法 5. 融合yolov5和pyertri两个文件夹,实现检测+检索