# RetinaNet-Pytorch **Repository Path**: ig__wxz/RetinaNet_Pytorch ## Basic Information - **Project Name**: RetinaNet-Pytorch - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-07-28 - **Last Updated**: 2024-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RetinaNet-Pytorch 源代码连接:https://github.com/yhenon/pytorch-retinanet 代码阅读连接:https://gitee.com/ig__wxz/paper_notes/blob/master/Detection/损失函数/%5B分类损失%5DFocal_Loss%20(RetinaNet).md 代码安装修改连接:https://gitee.com/ig__wxz/linux_problem_summary/blob/master/AI/Anaconda/Pytorch代码安装/RetinaNet.md #### 功能 - **网络模块** | 名称 | 方法 | | :----------: | :--------------------------------: | | 骨架 | ResNet50、MobileNet v2 | | 特征融合 | FPN、BiFPN | | 检测头 | Head、depth_header | | 回归损失 | L2、IoU、DIoU、CIoU | | 分类损失 | Focal Loss | | 样本分配策略 | ATSS、PAA | | 数据增强 | 旋转、镜像、噪声、平滑、裁剪、缩放 | | 分支 | IoU预测分支、置信度预测分支 | ### 修改记录 - **2021.4.6** (1)EfficientDet - **2021.3.5** (1) 剪枝模型部署测试 640x640输入图片,pytorch模型从10M剪枝到8M,最后4.9M的.wk模型,加上双分支。 pytorch测试 5.07GMAdd 、2.58GFlops。 初始化耗时: | sys+vb | vdec+vpss | load wk | nnie+soft | total | | ------ | ------------- | ------- | --------- | ------- | | 6.1ms | 7.5+0.6+7.1ms | 658.6ms | 3.2+0.1ms | 683.3ms | 单线程+NNIE×1: | read jpg | jpg->bgr | NNIE+soft | total | fps | pure fps | | -------- | -------- | --------- | ----- | ---- | -------- | | 4.6 | 4.6+0.8 | 31.3+0.25 | 39.8 | 25.1 | 31.6 | 3线程+NNIE×2: | | time | FPS | | ----------- | ------ | ---- | | NNIE×1 pure | 31.7ms | 31.5 | | NNIE×1 | 39.9ms | 25.1 | | NNIE×2 | 18.6ms | 53.7 | - **2021.1.20** (1) 完成了backbone剪枝代码,包括代价计算+剪枝+训练,代价计算参考2017NVIDIA的论文。 下面是裁剪前和裁剪后的backbone直方图,红色是被裁剪部分。在红外小车数据集上,AP:93.4%→95.2%;AR:91.2%→93.8%;mAP:26.8%→61.9%。 之所以精度提升这么多,是因为anchor与原模型的anchor不一致导致初始模型位置预测偏大。但也侧面说明裁剪后的网络效果不错。 backbone_hist backbone_hist1 (2) 完成了EfficientDe的剪枝代码,包括backbone、bifpn、head,分支含有IoU预测分支和置信度预测分支。并在17所船只数据集的模型上初步测试,将10M大小的模型裁剪到8M。 (3) 将裁剪后的模型在hisi上部署,完成了相应的pytorch代码、caffe代码、hisi代码。640×640的输入,FPS从25→31。 hisi上的量化会明显降低检测精度,bbox框的不准确,同时会增加漏检,调低得分阈值也没用。后续可尝试修改模型权重,将偏离中心过远的点调小,然后fineturn,以减小量化误差。 - **2020.12.31** (1) 实现全自动合并BN的pytorch代码. 目前网上找到的大都是基于指定结构的bn自动合并方式或者重塑网络结构的bn合并方法,然而检测网络实现复杂,实现方式多样,上述两个方法耗时耗力、缺乏泛化能力。 为实现全自动的bn合并,这里采用基于计算图的合并方式,只要保证以下几点即可: 1. 必须是torch常规的nn.Conv2d和nn.BatchNorm2d层; 2. 网络前向推理时,bn必须与其匹配的conv近似相邻,中间不能有其他conv或bn; 3. 同一个conv有且仅能与一个bn匹配,若无法满足此要求,可参考代码中对head合并bn的部分; 4. 合并需用到gpu前向推理。 (2) 增加了一个他人写的给vgg16训练和剪枝的代码,并做了相关注释。 (3) 训练监控车辆的**感想**: 现象:用1000张同一位置、角度拍摄的马路车辆图片和200张游戏中的车辆图片作为训练集训练,在游戏图片中无法检测到车辆,而在实拍图片中效果尚可。其主要原因在于二者图片车辆特征有着明显差异,几乎没有共特的特性。进一步的说,是由于数据集过于单一,导致在实拍数据中过拟合了,网络只学习到了实拍车辆的特征,而没学到游戏车辆的特征(底层纹理特征都没学到)。 问:检测网络怎么学特征的? 当一个特征图的某个特征点被认为是正样本时,其梯度所控范围都将被增强,这部分梯度既包含目标的特征区域,又包含背景区域。当其他特征点出现相似背景的负样本时,背景区域的特征又将被抑制,一加一减,网络就学到了目标区域的特征了,网络低层卷积也更倾向于提取和目标相关的底层特征。 问:GT位置精确度的重要性? 挺重要的,但更重要是标注的一致性。GT位置标注的精准关系到特征点的选择。特征点偏离目标中心会使网络学习更多背景特征,但这其实是不用担心的,因为背景的底层纹理特征会在负样本中逐渐被抑制掉。由于冗余检测的方式,中心点附近的特征点也都会是正样本,不会给回归带来太大负担。 后续数据集收集标注应注意: 1. **确保数据的多样性**,坚决不要相似的图片,只是目标发生简单平移的图片也要剔除。重复的图片只会增加图片过拟合的成都,数据增强已经足够保证一幅图片的多样性了,不需要再增加重复的图片。 2. **保证数据标注风格的一致性**,先少量标注下训个网络,让网络再来标注后续数据。标注风格不一致会导致网络学习多余的信息,增加网络负担。实际影响有多大,可能和样本选择方法有关系,不易量化分析。 3. **不同域的图片酌情取舍**,游戏中的车辆是可以增加网络智能程度,但游戏中的车辆和实拍车辆从底层特征上就有较大差异,加入他们固然可以帮助网络学习更全面的车辆知识,但这对实际应用并无易处。实际应用默认无关场景不会出现,就要对特定场景进行过拟合,不充足的额外图片只会让网络高不成低不就,降低实际应用中的得分结果。 - **2020.12.20** (1) 在MobileNet v2中训练中增加了对残差连接的drop。 总共17个倒残差层,每个层有一定概率不计算卷积结果,直接输出=输入。这个概率随着层的变深,线性增加,最终增加到0.2的概率。参考EfficientDet,在训练分类网络时,对输出的1024个特征也有Dropout,其余时候无drop。 (2) 增加了网络梯度可视化的功能,参见代码`tools/visualization/vis_grad.py`。可生成如下图片: total_20200002 (3) 增加了删除`__pycache__.py`的代码。 - **2020.12.13** (1) 在回归检测头中增加了IoU预测分支,撰写了二值交叉熵的IoU预测损失。 给我的感受是,这个IoU预测分支在诸如舰船这类无重叠的小目标中意义并不大,因为这类任务回归难度很小,所有的正样本都可以回归的很好,难点在于分类的准确度,会出现误检或漏检的情况。 IoU分支可能更适合于复杂场景下大目标的检测,诸如VOC、coco数据集中,此类数据集目标较大,分类任务难度较低,而回归框之间差异较大。 (2) 重写了IoU预测分支相关的后处理过程、coco/AP测试函数、可视化代码。 (3) 封装了加载优化器函数和自适应加载模型参数函数. 找到了MobileNet v2有些卷积参数没有梯度的原因. (4) 海思3559A上**512x512输入**、**MobileNet v2+3xBiFPN+3xdhead(reg+cls)** 单类别+单NNIE耗时测试: 双核NNIE预估为**63FPS** | MobileNet v2 | 3xBiFPN | 3xdhead | soft | time(ms) | FPS | | :----------: | :-----: | :-----: | :---: | :------: | :----: | | √ | | | | 11.481 | | | √ | √ | | | 19.516 | | | √ | √ | √ | | 23.642 | | | √ | √ | √ | √ | 23.842 | 41.943 | | 11.481 | 8.035 | 4.126 | 0.200 | | | - **2020.12.3** (1) 增加了对AIR-SARShip-2.0数据集处理的代码`/tools/SAR_dataset/tiff2jpg.py`和`/tools/SAR_dataset/point_xml2xml.py`. (2) 修复了验证/测试依旧会占用GPU 0显存的bug. (3) 增加了大幅面图片检测的代码``/tools/SAR_dataset/detect_broad_img.py`,支持显示/保存json/保存检测结果. - **2020.11.26** (1) 增加了EfficientDet模型部署到Hi3559A的相关代码,放于`/tools/2caffe`中,详见`EfficientDet部署.md` (2) 增加自适应分配方法PAA,以及配套的检测器`Mblv2_BiFPN_3dphead_PAA`,该检测器IoU预测部分尚未完成,也不准备完成了. 一个显存为12G的GPU中可容纳20batch的512x512 ATSS模型,但却只能容纳10个batch的PAA. 另一方面,ATSS模型用2个gpu训练6.4w张图一个batch,需要30min;但用3个gpu训练paa需要160min. paa提升也不大,操作还复杂,要优化代码挺耗时间的.遂先放着. (3) 增加训练/测试对gpu选择.gpu必须要从小到大按顺序,否则会无法创建线程? (4) 增加切块代码`tools/voc2coco/clip_coco.py`,可将大尺寸coco数据集按要求切成小块。 (5) 增加显示代码`tools/vocc2coco/show_coco.py`,显示coco数据集的gt。 - **2020.10.29** (1) 修复了coco验证精度一直为0的问题,cliper()输出的scale并非按照原始图片大小,导致比较两个json文件时,图片大小不一样. (2) 完成对数据集中的统计工作,可对1或2个json进行统计,[`每个类别数量`,`每个类别的分布情况`,`每个anchor对应的GT分布情况`].代码位于`tools/k_mean/data_analysis.py` (3) 完成针对遥感船只检测的测试函数,统计AP0.1和AR0.1,并自动搜索最佳类别阈值.代码位于`retinanet/ship_eval.py`,在`coco_validation.py`中调用. (4) 将coco数据集中的部分类别选出,生成voc-xml数据集的形式.代码位于`tools/coco2voc/coco_part2voc.py` (5) 增加旋转数据增强,使用时按如下顺序.代码位于`retinanet/dataloader.py`的`class Rotater`中. ``` [Resizer(), Rotater(), Noiser(), Normalizer(), Cliper(only_resize=False)] ``` (6) 增加两个新的网络,Mobilenet v2+FPN+depthwise_head和Mobilenet v2+BiFPN+depthwise_head. 也就是说,增加了深度可分离卷积的检测头模块和BiFPN模块.代码参考EfficientDet. 之前写的深度可分离卷积检测头效果差的原因是初始化方式不妥. - **2020.10.20** (1) 增加了k-mean可视化及样本分布统计;尝试优化k-mean方法,增加对每个样本的权重,解决聚类中心的尺寸普遍偏大的问题,效果并不理想。 (2) 增加数据增广方法,包括随机裁剪、缩放、平滑、噪声;增加带标签的可视化观察处理效果。 (3) 考察遥感舰船数据集,并从两个输入尺寸展开了训练(进行中)。 (4) 完成了原始模型各种超参数的调试,结果存于result里,包括4被学习率、Atss多anchor、batch数影响、检测头不共享权重、k均值的anchor。 - **2020.10.13** (1) 增加k-mean代码,将anchor用聚类中心代替. (2) 可手动设置每层学习率,并将回归检测头的学习率翻了一倍.