最后更新:2020-04-15 10:59:02 手机定位技术交流文章
机器心脏报告
项目作者:zylo117
参与:浣熊X,贾敏,兔子
效率检测很难再现,再现是一个陷阱。在这个Github项目中,开发人员zylo117已经打开了源代码PyTorch版本的高效检测器,比原来的快20多倍。现在,该项目已被列入Github趋势热门名单。

去年11月,谷歌大脑提出了一种新的目标检测器,名为高效检测器,它兼顾了准确性和模型效率,并获得了新的SOTA结果。不久前,该团队开发出了高效的TensorFlow实现代码。
这样有效的效率能更有效吗?最近,一些开发人员在GitHub上打开了“PyTorch版本的高效检测”。这个版本的性能接近原始版本,但是比官方的张量流快了近26倍。

目前,该项目已在GitHub上获得957颗星,最近收集了近300颗。
地理信息中心地址:https://github.com/zylo117
高效检测简介
近年来,当面临广泛的资源限制(例如,3B到300亿次浮点运算)时,构建具有精确性和效率的可扩展检测体系结构以优化目标检测器已经成为一个重要问题。基于单相检测器范式,谷歌大脑团队的研究人员研究了主干网络、特征融合和包围盒/类别预测网络的设计选择,发现了两大挑战,并提出了相应的解决方案:
挑战1:有效的多尺度特征融合。研究者提出了一种简单有效的加权双向特征金字塔网络。该模型引入可学习的权重来学习不同输入特征的重要性,同时重复应用自顶向下和自底向上的多尺度特征融合。
挑战2:模型缩放。受近期研究的启发,研究者提出了一种目标检测器的复合标度方法,即统一扩展所有主干网络、特征网络和包围盒/类别预测网络的分辨率/深度/宽度。
谷歌大脑团队的研究人员发现,高效网络比以前使用的主干网络更高效。因此,研究人员将高效网骨干网与双向网络和复合标度相结合,开发了一种新型的目标检测器高效检测器,它比以前的目标检测器具有更好的精度,同时参数数量和触发器比它们少一个数量级。
下图显示了高效检测器的整体架构,大致遵循单相检测器模式。谷歌大脑团队的研究人员将使用在ImageNet数据集上预先训练的高效网作为骨干网络,以BiFPN作为特征网络,接受来自骨干网络的7级特征{P3、P4、P5、P6、P7},并重复应用自上而下和自下而上的双向特征融合。然后将融合后的特征输入到包围盒/类别预测网络中,分别输出目标类别和包围盒预测结果。

下图显示了几个模型在COCO数据集上的性能比较。在相似的精度限制下,效率因子的浮点运算量只有约洛夫三的1/28,视网膜神经网络的1/30和全国神经系统功能规划网络的1/19。所有的数字都是由一个单一的模型在一个单一的尺度上获得的。可以看出,效率DET的计算量小于其他检测器,但准确率优于后者,其中效率D7获得了当前的最佳性能。

关于更详细的介绍,请参考“机器的心脏”一文:比现在的SOTA小4倍,计算量小9倍,以及谷歌最新的目标探测器——高效探测器
“家”是第一生产力
今年1月,当他的家人为这个国家做出贡献时,这个项目的作者开始尝试各种版本的“高效”游戏。在此期间,他经历了许多磨难,流下了一些苦涩的眼泪。然而,结果非常好,而且这也是第一个接近纸质结果的全网的PyTorch版本。
让我们先看看项目作者的测试结果和EfficientDet提供的官方代码。第一张图片显示了官方代码的检测效果,第二张图片显示了项目作者的检测效果。项目作者的实现实际上是通过汽车的前挡风玻璃检测到车内的人?!!这一惊人的检测结果值得目前的高效检测的高排名。


接下来,让我们看看目标检测算法在coco数据集上的排名。基于高效检测技术构建了多个屠宰单的目标检测网络。文字中的数字:

来自带代码的纸张
前五名李包揽了前四名,突邦的潜力不言而喻,难怪各种炼金术士都渴望一试。然而,实现效率检测的难度似乎与其受欢迎程度成“正比”。许多炼金术士表达了“困难的训练”、“尚未训练”和“谁复制谁被困住”。该项目的作者还表示,“由于谷歌没有发布官方知识库,它只能给人以力量,实现基于纸质内容的东西真的不容易”。
用PyTorch版本的高效D0到D7度三天假。
项目作者的重现结果与论文中的不完全一致,但与其他类似的重现项目相比,它们非常接近(详见项目链接)。

值得注意的是,这个项目的处理速度比原来快了20多倍。
那么为什么以前没有人复制过效率测试的结果呢?哪些具体细节需要注意?
“民间”效率的选择
作者尝试了前后两个GitHub项目,但效果并不理想。首先,采用恒星数量最高的那一个。同时,它也可能表明恒星越高,它就越合适。
对于第一项,作者说:“因为EfficientDet的特征之一是BiFPN,它将融合由主干输出的任何两个相邻层的特征,但是由于两个层的宽度和高度不同,将进行上采样或合并以确保它们的宽度和高度一致。然而,作者没有意识到他不知道从主干中提取哪个特征。他认为脊柱有问题。他改变了别人的步幅,随意地挑了几层,迫使脊柱输出他想要的大小。”
“网络结构改变后,预先训练的分量基本上被取消了,所以作者也发现训练不能继续下去了。”至此,第一个项目已经结束。同时,作者还提供了一个链接,用于将正式参数与试验项目作者修改后的参数进行比较。有兴趣的朋友可以浏览参考链接。
对于第二个项目,虽然star不到前者的一半,但它显然比前者更可靠。据笔者介绍,第二个项目至少得到了D0论文成果的支持,回购也为coco提供了31.4mAP的预处理权重,但实际运行后,笔者得到了24mAP,社区范围一般在20-22之间。
那么这个结果的原因是什么呢?经过反复思考和测试,笔者总结出以下7点,并对7点简历做了适当的调整,在目前的项目中取得了良好的效果。
经过许多波折后的答案
对于第二个测试项目的恢复,作者说有7个关键点需要特别注意:
第二个项目的BN实施存在问题:BatchNorm有一个称为动量的参数,用于调整新旧平均值之间的比率,从而调整移动平均值的计算方法。
深度分离nv2d的错误实现。
误解了maxpool2d、kernel_size和stride的参数。
缩减信道卷积后不执行BN。
主干功能抽头错误
Conv和pooling没有使用相同的填充。
没有对BiFPN过程的正确理解。

从项目作者智虎的账号,详情请参考参考链接。
作者还说,有一个非常关键的一点,“鸡贼官方没有说有两个独立的P4_0”。
简而言之,智虎博客详细介绍了各种重复出现的通知,在此不再赘述。作者认为对炼金术士有一定的参考价值,感兴趣的人可以直接查看原博客。
同时,机器的心脏也测量了这个项目。
项目测量
试验
我们在P100 GPU和Ubuntu 18.04系统上测试了这个项目。
首先在本地克隆项目,然后切换到相关目录:
!吉特·克隆https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch
导入操作系统
OS . chdir(‘又一个——另一个——高效的——Pytorch’)
安装以下相关环境:
!pip安装pycocootools numpy opencv-python tqdm tensorboard tensorboard x pyyaml
!pip安装焊炬==1.4.0
!pip安装torchvision==0.5.0
项目作者为我们提供了Python脚本效率检测副本,用于推断测试。该脚本读取存储在权重文件夹中的网络权重,推断测试文件夹中的图片,然后将测试结果保存在同一文件夹中。首先,我们使用以下命令下载预培训模型:
!mkdir权重
os.chdir('weights ')
!另一个-高效-Pytorch/releases/download/1.0/efficent det-d0 . PTH
然后,把要检测的图片放在测试文件夹下。不要忘记将efficiency det _ test.py中相应图像的名称更改为我们要检测的图片的名称,并运行efficiency det _ test.py脚本来检测图片中的对象。输出结果如下:

让我们首先用曾经爆炸的共享自行车来测试一下效果,它现在已经变成了一个“共享自行车墓地”。下图分别显示了使用该项目的原始图像和测试结果。


效果非常好。照片中的大多数人和密集排列在水平和垂直方向的共享自行车都被发现了。接下来,我们将使用中国常见的交通堵塞场景进行测试。车辆、非机动车和行人纵横交错的场景,可以说是一个非常复杂的场景。从测试结果可以看出,基本上所有的行人、车辆、背包、包和其他物体都被很好地检测到了。


最后,当然,我们将不得不在“开放国家”和乘坐火车的场景中对其进行测试,以便在出现广场恐惧症时保持谨慎。尽管旗帜被检测为风筝(这种问题在许多目标检测算法中很容易出现),但总体检测效果可以说是惊人的。它能检测出图片中的大部分字符,其精确度可与-DBFace相媲美,后者是一种高精度的人脸检测方法,此前曾被机器的心脏报道过。应该注意的是,DBFace是一种用于人脸检测的特殊方法,而该项目实现了一般的对象检测。


培养
同时,该项目的作者还提供了培训效率测试的相关代码。我们只需要准备训练数据集,设置类似于下面代码的训练参数,然后运行train.py进行训练。
#创建一个yml文件{your_project_name}。“项目”文件夹下的yml
#按照“coco.yml”修改它
#例如
项目名称:coco
train_set: train2017
val_set: val2017
num _ GPU:4 # 0表示使用cpu,N表示使用GPU
#均值和标准差,实际上这部分应该保持不变,只要你的数据集和coco相似。
平均值:[0.485,0.456,0.406]
标准:[0.229,0.224,0.225]
#这是可可主播,如有必要请更换
anchors_scales: '[2 ** 0,2 ** (1.0 / 3.0),2 ** (2.0 / 3.0)]
锚比率:“[(1.0,1.0),(1.4,0.7),(0.7,1.4)]
#按照标注顺序从数据集中的所有标签中选择对象。
#其索引必须与数据集的category_id匹配。
# category_id是一个索引,
#例如,这里的“car”索引是2,而的category_id是3
[‘人’,‘自行车’,‘汽车’,...]
coco数据集的培训代码如下:
#从头开始培训coco的效率det-d0
batchsize 12
#这需要时间和改变
每几个小时的超参数数。
#如果你有几个月可以消磨,那就去做吧。
#这不像一个人会实现
#比报纸上的得分高。
#最初的几个时代将会相当不稳定,
#从头开始训练是很正常的。
python train.py -c 0 - batch_size 12
定制数据集培训:
#自定义数据集上的train efficientdet-d1
batchsize 8,学习率1e-5
python train . py-Cbatch _ size lr1e-5
项目作者强烈建议根据预培训的重要性对网络进行培训:
# train efficientdet-d2在具有预先设定权重的自定义数据集上
batchsize 8,学习率1e-5,持续10个时期
python train . py-Cbatch _ size lr1e
num _ epoch 10
-load _ weights/path/to/your/weights/efficient det-D2 . PTH
#有了可可饮料,你甚至可以冻结脊柱,只训练头部
#加快培训并帮助融合。
python train . py-Cbatch _ size lr1e
num _ epoch 10
-load _ weights/path/to/your/weights/efficient det-D2 . PTH
-只有头部正确
项目作者智虎文章:https://zhuanlan.zhihu.com/p/129016081
本文由 在线网速测试 整理编辑,转载请注明出处。