天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享
天池競(jìng)賽-津南數(shù)字制造算法挑戰(zhàn)賽【賽場(chǎng)二】解決方案分享
一、前言
競(jìng)賽頁面
團(tuán)隊(duì)名BugFlow,最終排名35/2157
雖然成績(jī)一般,但是作為一支目標(biāo)檢測(cè)領(lǐng)域的新手隊(duì)伍,僅僅有一塊1070顯卡,從零開始拿到這個(gè)排名,也算有一些經(jīng)驗(yàn)可以拿出來分享,包括一些針對(duì)這個(gè)比賽我們想出的一些idea,算是拋磚引玉吧,期待能夠和排名靠前的大佬多多交流。
源碼下載
二、框架選擇
這個(gè)比賽實(shí)際上就是一個(gè)目標(biāo)檢測(cè)比賽,初賽要求對(duì)圖像中的違禁品出現(xiàn)的位置進(jìn)行檢測(cè),復(fù)賽在有效檢測(cè)目標(biāo)的同時(shí)要求輸出高質(zhì)量的實(shí)例分割。
對(duì)于框架選擇,如我們的隊(duì)名BugFlow一樣,由于我們隊(duì)伍的成員都是以tensorflow作為工具的,我們最初選擇的框架是google開源的Tensorflow Object Detection API, 無奈訓(xùn)練效果一直不理想。后面果斷切換了FaceBook開源的Detectron, 成績(jī)一下就上升不少,也是體會(huì)了一回判教一時(shí)爽,一直判教一直爽的感覺。
所以這里不得不說一下,一個(gè)好的目標(biāo)檢測(cè)框架真的是事半功倍,從我們組的經(jīng)歷來說,Detectron無論從準(zhǔn)確性、易用性還是擴(kuò)展性來說都是一個(gè)不錯(cuò)的框架。不知道排名前5的大佬使用的是什么框架,望賜教!很想學(xué)習(xí)一下~
三、解決方案概述
3.1 模型選擇
復(fù)賽我們的選擇的是 End-to-End Mask R-CNN 作為的baseline, backbone 選擇的是 resnet101-FPN
之所以選擇FPN結(jié)構(gòu)是因?yàn)楸靖?jìng)賽中,待檢測(cè)違禁品的尺度大小不一,且包含很多小物體,我們認(rèn)為feature pyramid networks能夠更好的解決這個(gè)問題。
3.2 數(shù)據(jù)增強(qiáng)
在我訓(xùn)練分類網(wǎng)絡(luò)的經(jīng)驗(yàn)中,在合理的范圍內(nèi)盡可能的進(jìn)行豐富的數(shù)據(jù)增強(qiáng)能夠大幅提升模型的性能。
顯然,這個(gè)技能同樣能應(yīng)用于目標(biāo)檢測(cè)中,唯一的問題時(shí),在變換圖像的同時(shí),需要同時(shí)對(duì) bounding box 或 mask 進(jìn)行相應(yīng)的變換。當(dāng)然,這僅僅是一個(gè)稍有難度的編程任務(wù),難不倒大家的。
需要注意的是,Detectron自帶了水平翻轉(zhuǎn)的數(shù)據(jù)增強(qiáng)。
我們的數(shù)據(jù)增強(qiáng)文件實(shí)現(xiàn)在/path/to/project/code/second_round_pyfile/data_augmentation_position_bak.py,其中實(shí)現(xiàn)了水平、豎直翻轉(zhuǎn),放大(相當(dāng)于crop操作),縮小這四個(gè)最基本的數(shù)據(jù)增強(qiáng)方法。
此外,我們還嘗試了兩種獨(dú)特的數(shù)據(jù)增強(qiáng),一種是類似于隨機(jī)拼接兩種圖的增強(qiáng),一種是隨機(jī)貼圖的增強(qiáng),效果如下:
隨機(jī)拼接兩種圖的效果示例:
隨機(jī)使用違禁品進(jìn)行貼圖的示例:
遺憾的是,雖然這兩種方法表面上極大的豐富了樣本集的規(guī)模,但并沒有取得很好的效果,我們認(rèn)為這可能和一定程度的破壞了樣本原有的數(shù)據(jù)分布有關(guān)。最終我們也沒有使用這兩種方法。
3.3 使用二分類網(wǎng)絡(luò)輔助
比賽的過程中,我們發(fā)現(xiàn)有兩個(gè)類型,藍(lán)色小電池和大個(gè)的綠色鐵殼打火機(jī),特征不太清晰,很容易混淆。
如果單純使用mask rcnn,模型會(huì)變得相對(duì)激進(jìn),將很多長(zhǎng)相相似的物體誤判為違禁品,造成成績(jī)很低。
因此,為了權(quán)衡這個(gè)問題,我們考慮使用一個(gè)二分類網(wǎng)絡(luò),首先對(duì)待檢測(cè)圖片進(jìn)行判別,若認(rèn)為包含違禁品,再交給mask rcnn模型進(jìn)行預(yù)測(cè)。
有了這個(gè)想法之后,我直接使用之前積累的Keras實(shí)現(xiàn)的resnet50 demo進(jìn)行驗(yàn)證。
經(jīng)過閾值的調(diào)試后,二分類能夠達(dá)到100%召回,98%準(zhǔn)確率。這樣,大概率不會(huì)漏掉含違禁品的圖片的情況下,mask rcnn 虛警的概率大大的降低了,成績(jī)也提高了很多。
3.4 預(yù)處理
我們還對(duì)數(shù)據(jù)集進(jìn)行了簡(jiǎn)單的分析,發(fā)現(xiàn)我們的目標(biāo)場(chǎng)景的圖片的像素值普遍偏高,類似下面這樣:
因此我們認(rèn)為可以對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,大體思路是對(duì)像素值進(jìn)行調(diào)整,使其更均勻的分布在0-255的范圍內(nèi)。
為此,我設(shè)計(jì)了3種不同的預(yù)處理方法,其中最簡(jiǎn)單的一個(gè)就是類似下圖的一個(gè)簡(jiǎn)單映射:
它達(dá)到的效果類似下面這樣:
三種預(yù)處理的效果示例:
原圖:
預(yù)處理1:
預(yù)處理2:
預(yù)處理3:
其中,通過不斷地嘗試和提交測(cè)試分?jǐn)?shù),我們發(fā)現(xiàn)預(yù)處理1對(duì)于二分類的accuracy提升有明顯幫助,預(yù)處理3對(duì)mask rcnn的性能有微弱提升(也可能是隨機(jī)因素導(dǎo)致,還不敢確定)
至此,我已經(jīng)將我們認(rèn)為所有可能值得分享的信息介紹了,還望排名靠前的大佬不吝賜教~~~
對(duì)于大多數(shù)伙伴,讀到這里就可以了~
如果你對(duì)我們代碼的詳細(xì)信息甚至復(fù)現(xiàn)感興趣,請(qǐng)繼續(xù)往下看,我簡(jiǎn)單的介紹一下。
四、安裝
我們代碼的運(yùn)行環(huán)境及主要依賴為:
Ubuntu/Centos + CUDA9 + CUDNN7 + NCCL + Anaconda2 + Keras2.2.4 + PyTorch
初賽我們使用的顯卡是可憐的NVIDIA GTX1070,復(fù)賽有了阿里云代金卷使用的是P100
運(yùn)行如下命令,自動(dòng)安裝依賴環(huán)境及深度學(xué)習(xí)框架
$ cd /path/to/project/code/install $ ./install_requirements.sh詳見project/code/README.md,若由于各種沒有考慮到的情況安裝不能順利進(jìn)行,還請(qǐng)大家簡(jiǎn)單分析安裝腳本自行安裝環(huán)境。
五、復(fù)現(xiàn)
初賽時(shí)還處于摸索階段,成績(jī)也只有89名,初賽的復(fù)現(xiàn)就不做介紹了。大家有興趣可以看下初賽提交時(shí)我們編寫的 ROUND1_README,我們對(duì)如何復(fù)現(xiàn)我們的結(jié)果進(jìn)行了說明。
復(fù)賽階段的代碼位于project/code/second_round_pyfile中,相應(yīng)的運(yùn)行腳本位于project/code/second_round_shell中,我們對(duì)這些腳本進(jìn)行了編號(hào),簡(jiǎn)單的閱讀確定參數(shù)并依次執(zhí)行即可~
六、聯(lián)系方式
參加比賽也是一個(gè)交流的過程,本人現(xiàn)在作業(yè)幫的反作弊團(tuán)隊(duì)擔(dān)任算法工程師,期待和各位算法從業(yè)者進(jìn)行技術(shù)上的交流~
加好友、技術(shù)交流、內(nèi)推請(qǐng)聯(lián)系我,本人郵箱anshengmath@163.com。
此外,我們團(tuán)隊(duì)一位靠譜的小伙伴正在打算找博導(dǎo),希望大家?guī)兔ν扑]呀,他的聯(lián)系方式zhaoyh@ncepu.cn
總結(jié)
以上是生活随笔為你收集整理的天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 协议簇:TCP 解析: 连接断开
- 下一篇: centos 7 nginx hhvm