天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

一、前言

竞赛页面

团队名BugFlow,最终排名35/2157

虽然成绩一般,但是作为一支目标检测领域的新手队伍,仅仅有一块1070显卡,从零开始拿到这个排名,也算有一些经验可以拿出来分享,包括一些针对这个比赛我们想出的一些idea,算是抛砖引玉吧,期待能够和排名靠前的大佬多多交流。

源码下载

二、框架选择

这个比赛实际上就是一个目标检测比赛,初赛要求对图像中的违禁品出现的位置进行检测,复赛在有效检测目标的同时要求输出高质量的实例分割。

对于框架选择,如我们的队名BugFlow一样,由于我们队伍的成员都是以tensorflow作为工具的,我们最初选择的框架是google开源的Tensorflow Object Detection API, 无奈训练效果一直不理想。后面果断切换了FaceBook开源的Detectron, 成绩一下就上升不少,也是体会了一回判教一时爽,一直判教一直爽的感觉。

所以这里不得不说一下,一个好的目标检测框架真的是事半功倍,从我们组的经历来说,Detectron无论从准确性、易用性还是扩展性来说都是一个不错的框架。不知道排名前5的大佬使用的是什么框架,望赐教!很想学习一下~

三、解决方案概述

3.1 模型选择

复赛我们的选择的是 End-to-End Mask R-CNN 作为的baseline, backbone 选择的是 resnet101-FPN

之所以选择FPN结构是因为本竞赛中,待检测违禁品的尺度大小不一,且包含很多小物体,我们认为feature pyramid networks能够更好的解决这个问题。

3.2 数据增强

在我训练分类网络的经验中,在合理的范围内尽可能的进行丰富的数据增强能够大幅提升模型的性能。

显然,这个技能同样能应用于目标检测中,唯一的问题时,在变换图像的同时,需要同时对 bounding box 或 mask 进行相应的变换。当然,这仅仅是一个稍有难度的编程任务,难不倒大家的。

需要注意的是,Detectron自带了水平翻转的数据增强。

我们的数据增强文件实现在/path/to/project/code/second_round_pyfile/data_augmentation_position_bak.py,其中实现了水平、竖直翻转,放大(相当于crop操作),缩小这四个最基本的数据增强方法。

此外,我们还尝试了两种独特的数据增强,一种是类似于随机拼接两种图的增强,一种是随机贴图的增强,效果如下:

随机拼接两种图的效果示例:
pinjie

随机使用违禁品进行贴图的示例:
pinjie

遗憾的是,虽然这两种方法表面上极大的丰富了样本集的规模,但并没有取得很好的效果,我们认为这可能和一定程度的破坏了样本原有的数据分布有关。最终我们也没有使用这两种方法。

3.3 使用二分类网络辅助

比赛的过程中,我们发现有两个类型,蓝色小电池和大个的绿色铁壳打火机,特征不太清晰,很容易混淆。

如果单纯使用mask rcnn,模型会变得相对激进,将很多长相相似的物体误判为违禁品,造成成绩很低。

因此,为了权衡这个问题,我们考虑使用一个二分类网络,首先对待检测图片进行判别,若认为包含违禁品,再交给mask rcnn模型进行预测。

有了这个想法之后,我直接使用之前积累的Keras实现的resnet50 demo进行验证。

经过阈值的调试后,二分类能够达到100%召回,98%准确率。这样,大概率不会漏掉含违禁品的图片的情况下,mask rcnn 虚警的概率大大的降低了,成绩也提高了很多。

3.4 预处理

我们还对数据集进行了简单的分析,发现我们的目标场景的图片的像素值普遍偏高,类似下面这样:

pinjie

因此我们认为可以对数据进行预处理,大体思路是对像素值进行调整,使其更均匀的分布在0-255的范围内。

为此,我设计了3种不同的预处理方法,其中最简单的一个就是类似下图的一个简单映射:

pinjie

它达到的效果类似下面这样:

pinjiepinjie

三种预处理的效果示例:

原图:
pinjie

预处理1:
pinjie

预处理2:
pinjie

预处理3:
pinjie

其中,通过不断地尝试和提交测试分数,我们发现预处理1对于二分类的accuracy提升有明显帮助,预处理3对mask rcnn的性能有微弱提升(也可能是随机因素导致,还不敢确定)

至此,我已经将我们认为所有可能值得分享的信息介绍了,还望排名靠前的大佬不吝赐教~~~

对于大多数伙伴,读到这里就可以了~

如果你对我们代码的详细信息甚至复现感兴趣,请继续往下看,我简单的介绍一下。

四、安装

我们代码的运行环境及主要依赖为:

Ubuntu/Centos + CUDA9 + CUDNN7 + NCCL + Anaconda2 + Keras2.2.4 + PyTorch

初赛我们使用的显卡是可怜的NVIDIA GTX1070,复赛有了阿里云代金卷使用的是P100

运行如下命令,自动安装依赖环境及深度学习框架

$ cd /path/to/project/code/install
$ ./install_requirements.sh

详见project/code/README.md,若由于各种没有考虑到的情况安装不能顺利进行,还请大家简单分析安装脚本自行安装环境。

五、复现

初赛时还处于摸索阶段,成绩也只有89名,初赛的复现就不做介绍了。大家有兴趣可以看下初赛提交时我们编写的 ROUND1_README,我们对如何复现我们的结果进行了说明。

复赛阶段的代码位于project/code/second_round_pyfile中,相应的运行脚本位于project/code/second_round_shell中,我们对这些脚本进行了编号,简单的阅读确定参数并依次执行即可~

pinjie

六、联系方式

参加比赛也是一个交流的过程,本人现在作业帮的反作弊团队担任算法工程师,期待和各位算法从业者进行技术上的交流~

加好友、技术交流、内推请联系我,本人邮箱anshengmath@163.com。

此外,我们团队一位靠谱的小伙伴正在打算找博导,希望大家帮忙推荐呀,他的联系方式zhaoyh@ncepu.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息摘要算法之三:SHA256算法分析与实现

前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之。 1、SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-…

focal loss的几种实现版本(Keras/Tensorflow)

起源于在工作中使用focal loss遇到的一个bug,我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试,我发现了这样一个奇怪的现象,几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的。 通过仔细的比对和思考&#xff0c…

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处…

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根…

借助百度识图爬取数据集

背景 一个能够实际应用的深度学习模型,背后的数据集往往都花费了大量的人力财力,通过聘用标注团队对真实场景数据进行标注生产出来,大多数情况不太可能使用网络来源的图片。但在项目初期的demo阶段,或者某些特定的场合下&#xf…

通过printf从目标板到调试器的输出

最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章,自我感觉很有启发,特此翻译此文并推荐给各位同仁。当然限于个人水平,有不当之处恳请指正。原文网址:https://blog.seg…

小心使用tf.image.resize_images,填坑经验分享给你

上上周,我在一个项目上线前对模型进行测试时出现了问题,这个问题困扰了我近两周,终于找到了问题根源,做个简短总结分享给你,希望对大家有帮助。 问题描述: 线上线下测试结果不一致,且差异很大…

PID控制器开发笔记之十:步进式PID控制器的实现

对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定。为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法。 1、步进式PID的基本思想 所谓步进式PID算法,实际就是在设定值发生阶跃…

AutoML 与 Bayesian Optimization 概述

1. AutoML 概述 AutoML是指对于一个超参数优化任务(比如规定计算资源内,调整网络结构找到准确率最高的网络),尽量减少人为干预,使用某种学习机制,来调节这些超参数,使得目标问题达到最优。 这…

使用Eclipse进行Makefile项目

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处恳请指正。原文网址:https://m…

C语言学习及应用笔记之一:C运算符优先级及使用问题

C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多。这些运算符有单目运算符、双目运算符以及三目运算符,又涉及到左结合和右结合的问题,真…

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文,一篇关于使用FreeRTOS进行性能和运行分析的文章,本人觉得很有启发,特将其翻译过来以备参考。当然限于个人水平,有描述不当之处恳请指正。原文网址:https://m…

生成微信公众号对应二维码的两种简单方法

方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?usernameName 其中Name替换为对应公众号的微信号 例如,我们打算生成公众号 AI算法联盟 的二维码 只需首先关注这个公众号 在其详细信息中,查找到微信号信息:AIReport…

在Amazon FreeRTOS V10中使用运行时统计信息

在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考。原文网址:https://mcuoneclipse.com/2018/08/02/tutorial-using-…

github无法加载图片的解决办法

最近发现我的github上面项目README里面的图片全裂了,一直以为是github最近服务器不稳定。今天通过简单的查询,发现原来这个问题可以解决,但是不能永久有效,之后还会用到,因此记录在这里, 也分享给大家。 解…

C语言学习及应用笔记之二:C语言static关键字及其使用

C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。 一般来说static关键字的常见用法有三种:一是用作局…

μCUnit,微控制器的单元测试框架

在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文,一篇关于微控制器单元测试的文章,有很高的参考价值,特将其翻译过来以备学习。原文网址:https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-fram…

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合&#xff0c…

Modbus协议栈开发笔记之七:Modbus ASCII Slave开发

与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave。对于Modbus ASCII从站来说,需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令&a…

Modbus协议栈开发笔记之八:Modbus ASCII Master开发

这一节我们来封装Modbus ASCII Master应用,Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用,而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数,以便在开发具体应用时调用。 对于ASCII主站我们主…