華錄杯數(shù)據(jù)湖大賽:車道線識(shí)別 Top5方案
點(diǎn)擊上方“AI算法與圖像處理”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
比賽名稱:2020中國(guó)華錄杯·數(shù)據(jù)湖算法大賽—定向算法賽(車道線識(shí)別)
比賽鏈接:https://dev.ehualu.com/dev/home/competition/competitionDetail?competitionId=1&source=DC
文章內(nèi)容:決賽第五名方案,成績(jī)?yōu)?9.55
代碼框架:使用PaddleSeg動(dòng)態(tài)圖和AI Stdudio,低代碼量快速迭代打比賽。
分享鏈接:https://aistudio.baidu.com/aistudio/projectdetail/1248023
賽題說明
競(jìng)賽任務(wù)
要求參賽者利用提供的訓(xùn)練數(shù)據(jù),設(shè)計(jì)一個(gè)車道線檢測(cè)和分類模型,來檢測(cè)測(cè)試數(shù)據(jù)中車道線的具體位置和類別。

數(shù)據(jù)集描述
本次賽題數(shù)據(jù)集包括x張手機(jī)拍攝的道路圖片數(shù)據(jù),并對(duì)這些圖片數(shù)據(jù)標(biāo)注了車道線的區(qū)域和類別,其中標(biāo)注數(shù)據(jù)以灰度圖的方式存儲(chǔ)。
標(biāo)注數(shù)據(jù)是與原圖尺寸相同的單通道灰度圖,其中背景像素的灰度值為0,不同類別的車道線像素分別為不同的灰度值,加上背景共有20類。


評(píng)審規(guī)則
與通常的圖像分割任務(wù)一樣,采用 mIoU 來評(píng)估結(jié)果。對(duì)于每一類,利用預(yù)測(cè)圖像和真值圖像,
數(shù)據(jù)分析
圖像觀察
觀察圖像數(shù)據(jù),發(fā)現(xiàn)圖像的上方一半?yún)^(qū)域是拍攝的建筑、天空等非路面信息,這些區(qū)域的像點(diǎn)都屬于背景類別。這部分區(qū)域不必訓(xùn)練和預(yù)測(cè)。設(shè)定訓(xùn)練圖像尺寸為1280X360
類別統(tǒng)計(jì)
利用PaddleSeg提供的工具,檢查數(shù)據(jù)時(shí)發(fā)現(xiàn)各個(gè)類別數(shù)據(jù)不均衡,而且多個(gè)類別為零,選擇忽略。
Doing?label?pixel?statistics:?
(label?class,?total?pixel?number,?percentage)?=?
[(0,?17982127059,?0.9762),?
(1,?104617183,?0.0057),?
(2,?9012630,?0.0005),?
(3,?121541931,?0.0066),?
(4,?8284314,?0.0004),?
(5,?2283958,?0.0001),?
(6,?5635328,?0.0003),?
(7,?4816484,?0.0003),?
(8,?27060729,?0.0015),?
(9,?24371550,?0.0013),?
(10,?8857308,?0.0005),?
(11,?308858,?0.0),?
(12,?1328788,?0.0001),?
(13,?5940530,?0.0003),?
(14,?1795084,?0.0001),?
(15,?632607,?0.0),?
(16,?621556,?0.0),?
(17,?307548,?0.0),?
(18,?178659,?0.0),?
(19,?110066696,?0.006)]
數(shù)據(jù)集 數(shù)據(jù)集是將初賽和復(fù)賽數(shù)據(jù)整合起來,9:1劃分訓(xùn)練集和驗(yàn)證集
數(shù)據(jù)增強(qiáng)
采用隨機(jī)尺度縮放、隨機(jī)變形等增強(qiáng)方式
方案思路
思路來源
英偉達(dá)的分層多尺度注意機(jī)制論文(https://arxiv.org/pdf/2005.10821.pdf),小尺度的物體(細(xì)桿、人)的分割效果,在高分辨率的圖像(2.0x)上分割效果更好;而道路則在低分辨率(0.5x)的圖像上分割效果更好。
2.端到端模型設(shè)計(jì)
一個(gè)Backbone,多個(gè)分割頭早期融合,多尺度訓(xùn)練和融合預(yù)測(cè)
實(shí)現(xiàn)方式
提取特征的backbone
采用HRNet 通過并行多個(gè)分辨率的分支,加上不斷進(jìn)行不同分支之間的信息交互,同時(shí)達(dá)到強(qiáng)語義信息和精準(zhǔn)位置信息的目的。

使用了PaddleSeg HRNet_W48預(yù)訓(xùn)練模型(https://bj.bcebos.com/paddleseg/dygraph/hrnet_w48_ssld.tar.gz)
語義頭

注意力頭

代碼說明
模型
模型是在FCN基礎(chǔ)上修改為FCN2,源文件為/home/aistudio/PaddleSeg/dygraph/paddleseg/models/fcn2.py
在FCN分割頭基礎(chǔ)增加OCR分割頭
融合FCN和OCR分割頭的結(jié)果:
模型初始化時(shí):
FCN分割頭:self.head = FCNHead(num_classes, backbone_indices, backbone_channels,channels)
增加了OCR分割頭:self.Ohead = OCRHead(num_classes,backbone_channels)
前向計(jì)算時(shí):
HrNet特征提?。篺eat_list = self.backbone(x)
FCN分割:logit_list = self.head(feat_list)
Ocr分割:logit_list1 = self.Ohead(feat_list)
兩個(gè)分割頭的結(jié)果平均融合:avg_logit=(logit_list[0]+logit_list1[0])/2
訓(xùn)練過程
配置文件為/home/aistudio/PaddleSeg/dygraph/benchmark/fcn2.yml
單尺度訓(xùn)練過程分為三次:
第一次,參數(shù)為
iters:?40000
learning_rate:0.01 ??
decay:
??type:?poly
??power:?0.9
??end_lr:?0.0
optimizer:sgd,
crop_size:?[1280,?360]
預(yù)訓(xùn)練模型為https://bj.bcebos.com/paddleseg/dygraph/hrnet_w48_ssld.tar.gz,單卡需要二十個(gè)小時(shí)左右。
第二次,參數(shù)為
iters:?40000
learning_rate:0.01 ??
decay:
??type:?poly
??power:?0.9
??end_lr:?0.0
optimizer:sgd,
crop_size:?[1280,?360]
預(yù)訓(xùn)練模型為第一次訓(xùn)練輸出的best_model中的模型,單卡需要二十個(gè)小時(shí)左右;
最后一次,參數(shù)為
iters:?10000
learning_rate:0.001 ??
decay:
??type:?poly
??power:?0.9
??end_lr:?0.0
optimizer:sgd,
crop_size:?[1280,?360]
預(yù)訓(xùn)練模型為第二次訓(xùn)練輸出的best_model中的模型,單卡需要十個(gè)小時(shí)左右。
由于時(shí)間關(guān)系,兩個(gè)尺度的訓(xùn)練未完成,分別是用crop_size: [1280, 540]和crop_size: [1280,720],訓(xùn)練也可按如上過程進(jìn)行。復(fù)賽B榜提交的結(jié)果是單模型的結(jié)果。
運(yùn)行說明
AiStudio環(huán)境 python 3.7 PaddlePaddle 2.0.0rc PaddleSeg 0.6
代碼在/home/aistudio/PaddleSeg/dygrap目錄下,數(shù)據(jù)在/home/aistudio/data目錄下。
本NoteBook可以直接運(yùn)行訓(xùn)練,也可以生成版本后,通過創(chuàng)建任務(wù)進(jìn)行訓(xùn)練。
使用腳本任務(wù)進(jìn),訓(xùn)練、評(píng)估和預(yù)測(cè)三步不可同時(shí)進(jìn)行,導(dǎo)入任務(wù)執(zhí)行結(jié)果,預(yù)測(cè)結(jié)果輸出。
#解壓數(shù)據(jù)集。數(shù)據(jù)集是將初賽和復(fù)賽數(shù)據(jù)整合起來
!unzip?/home/aistudio/data/data61166/Dataset.zip?-d?/home/aistudio/data/
#使用PaddleSeg動(dòng)態(tài)圖,安裝動(dòng)態(tài)圖環(huán)境
%cd?/home/aistudio/PaddleSeg/dygraph
!export?PYTHONPATH=`pwd`
!pip?install?-r?requirements.txt
#切分?jǐn)?shù)據(jù)集。生成訓(xùn)練集文件列表、驗(yàn)證集文件列表、測(cè)試集文件列表
import?numpy?as?np
import?os
base?=?'/home/aistudio/data/Dataset/'
with?open('/home/aistudio/data/Dataset/labels.txt',?'w')?as?f:
????for?i?in?range(20):
????????f.write(str(i)+'\n')
imgs?=?os.listdir(base+'train/')
np.random.seed(5)
np.random.shuffle(imgs)
val_num?=?int(0.1?*?len(imgs))
with?open(os.path.join('/home/aistudio/data/Dataset/train.txt'),?'w')?as?f:
????for?pt?in?imgs[:-val_num]:
????????img?=?base+'train/'+pt
????????ann?=?base+'train_label/'+pt.replace('.jpg',?'.png')
????????info?=?img?+?'?'?+?ann?+'\n'
????????f.write(info)
with?open(os.path.join('/home/aistudio/data/Dataset/val.txt'),?'w')?as?f:
????for?pt?in?imgs[-val_num:]:
????????img?=?base+'train/'+pt
????????ann?=?base+'train_label/'+pt.replace('.jpg',?'.png')
????????info?=?img?+?'?'?+?ann?+?'\n'
????????f.write(info)
with?open(os.path.join('/home/aistudio/data/Dataset/test.txt'),?'w')?as?f:
????for?pt?in?os.listdir(base+'testB/'):
????????img?=?base+'testB/'+pt
????????info?=?img?+??'\n'
????????f.write(info)
#訓(xùn)練
!export?CUDA_VISIBLE_DEVICES=0
!python?train.py?--config?/home/aistudio/PaddleSeg/dygraph/benchmark/fcn2.yml?--do_eval?--save_interval?5000?--save_dir?/home/aistudio/PaddleSeg/dygraph/output/fcn2?>fcn2-train-1122.log
#評(píng)估
!export?CUDA_VISIBLE_DEVICES=0
!python?val.py?--config?/home/aistudio/PaddleSeg/dygraph/benchmark/fcn2.yml?--model_path?/home/aistudio/PaddleSeg/dygraph/output/model.pdparams?>val.log
#預(yù)測(cè)?PaddleSeg/dygraph/paddleseg/core/predict.py?在原版本修改了,只輸出單通道灰度圖
#訓(xùn)練結(jié)束后,根據(jù)模型所在路徑,修改后進(jìn)行預(yù)測(cè)。
#復(fù)賽結(jié)果所用模型在/home/aistudio/PaddleSeg/dygraph/output/model.pdparams
!export?CUDA_VISIBLE_DEVICES=0
!python?predict.py?--config?/home/aistudio/PaddleSeg/dygraph/benchmark/fcn2.yml?--model_path?/home/aistudio/PaddleSeg/dygraph/output/model.pdparams?--image_path?/home/aistudio/data/Dataset/testB?--save_dir?/home/aistudio/PaddleSeg/dygraph/output/fcn2-1120/result
#多尺度預(yù)測(cè)融合。因多尺度訓(xùn)練未完成,無需執(zhí)行此步
#多尺度訓(xùn)練結(jié)束后,根據(jù)模型所在路徑,進(jìn)行多尺度預(yù)測(cè)融合
!export?CUDA_VISIBLE_DEVICES=0
!python?mul_pred.py?--config?/home/aistudio/PaddleSeg/dygraph/benchmark/fcn2.yml?--model_path?/home/aistudio/PaddleSeg/dygraph/output/model.pdparams?--image_path?/home/aistudio/data/Dataset/testB?--save_dir?/home/aistudio/PaddleSeg/dygraph/output/fcn2-1120/mp_result
總結(jié)
單模型多分割頭早期融合效果較好,還做過一個(gè)Gcnet和ANN融合的版本Gcnet2,相應(yīng)的模型和配置文件與上面fcn2的目錄相同,在本數(shù)據(jù)集也有一定的提升。
多尺度預(yù)測(cè)方法有待進(jìn)一步驗(yàn)證。復(fù)賽提交的結(jié)果只是Fcn2的結(jié)果,因?yàn)闀r(shí)間所限,多尺度訓(xùn)練沒有完成。在其他數(shù)據(jù)集上測(cè)試過,有一定的提升效果。
這是圖像分割7日打卡營(yíng)學(xué)習(xí)后,參加的第一個(gè)正式比賽,全程使用AI Studio和PaddleSeg。
非常感謝百度的老師們和開發(fā)者。

下載1:何愷明頂會(huì)分享
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風(fēng)格指南
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!
下載3 CVPR2020 在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):CVPR2020,即可下載1467篇CVPR?2020論文 個(gè)人微信(如果沒有備注不拉群!) 請(qǐng)注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱
覺得不錯(cuò)就點(diǎn)亮在看吧

