優(yōu)化與實(shí)戰(zhàn)調(diào)優(yōu))
簡介本資源是一個(gè)面向自動(dòng)駕駛與計(jì)算機(jī)視覺初學(xué)者及進(jìn)階開發(fā)者的圖像語義分割實(shí)戰(zhàn)項(xiàng)目聚焦車道線識(shí)別這一典型應(yīng)用場(chǎng)景解決真實(shí)道路圖像中細(xì)長目標(biāo)分割精度低、邊界模糊等核心問題。項(xiàng)目基于PyTorch實(shí)現(xiàn)UNet主干并融合殘差連接與FPN特征金字塔結(jié)構(gòu)進(jìn)行創(chuàng)新改進(jìn)顯著提升多尺度特征表達(dá)與邊緣定位能力配套完整項(xiàng)目說明書含原理圖解與代碼逐行注釋、可直接運(yùn)行的訓(xùn)練/推理腳本及標(biāo)準(zhǔn)化數(shù)據(jù)處理流程。壓縮包共2000個(gè)文件含1463張標(biāo)注清晰的PNG掩碼圖、529張JPG原始道路圖像以及4個(gè)核心Python模塊、2個(gè)配置說明文本、1份Word項(xiàng)目說明書和1個(gè)Markdown使用指南整體大小為140.07MB。已有70人學(xué)習(xí)下載讀者可即刻獲得從數(shù)據(jù)組織、模型訓(xùn)練、指標(biāo)可視化到車道線結(jié)果導(dǎo)出的端到端解決方案無需額外調(diào)試即可復(fù)現(xiàn)高IoU分割效果。1. 項(xiàng)目概述從車道線識(shí)別到模型架構(gòu)的深度思考在自動(dòng)駕駛的感知任務(wù)里車道線檢測(cè)一直是個(gè)既基礎(chǔ)又充滿挑戰(zhàn)的活兒。說它基礎(chǔ)是因?yàn)檫@是車輛理解道路結(jié)構(gòu)、實(shí)現(xiàn)車道保持和路徑規(guī)劃的前提說它挑戰(zhàn)是因?yàn)楝F(xiàn)實(shí)場(chǎng)景太復(fù)雜了——光照變化、陰影遮擋、路面磨損、新舊標(biāo)線混雜還有雨雪天氣的干擾都讓傳統(tǒng)的圖像處理方法力不從心。這幾年基于深度學(xué)習(xí)的語義分割技術(shù)成了解決這個(gè)問題的利器它能給圖像中的每個(gè)像素都打上標(biāo)簽告訴你“這是車道線”還是“背景”。我這次折騰的項(xiàng)目核心目標(biāo)就是構(gòu)建一個(gè)魯棒性更強(qiáng)、精度更高的車道線語義分割模型。直接拿現(xiàn)成的UNet來用當(dāng)然可以但實(shí)測(cè)下來面對(duì)一些復(fù)雜場(chǎng)景尤其是遠(yuǎn)處模糊的、或者被部分遮擋的車道線標(biāo)準(zhǔn)UNet的細(xì)節(jié)恢復(fù)能力還是有點(diǎn)吃力。所以我決定在經(jīng)典的UNet骨架上動(dòng)點(diǎn)“手術(shù)”把Residual殘差結(jié)構(gòu)和FPN特征金字塔網(wǎng)絡(luò)的思想融合進(jìn)去。這可不是簡單的模塊堆砌而是為了解決UNet在深層特征提取和跨尺度特征融合上的固有短板。簡單來說就是讓網(wǎng)絡(luò)既能“看得深”理解復(fù)雜的上下文又能“看得清”恢復(fù)精細(xì)的邊界。最終這個(gè)改進(jìn)后的模型在多個(gè)公開和自建的車道線數(shù)據(jù)集上表現(xiàn)都挺亮眼誤檢和漏檢率明顯下降尤其是在惡劣光照下的表現(xiàn)比基線模型穩(wěn)了不少。2. 核心架構(gòu)解析為什么是UNet Residual FPN2.1 基石重溫經(jīng)典UNet的得與失UNet之所以在生物醫(yī)學(xué)圖像分割后能迅速火遍各種語義分割任務(wù)全靠它那個(gè)對(duì)稱的編碼器-解碼器Encoder-Decoder結(jié)構(gòu)和跳躍連接Skip Connection。編碼器負(fù)責(zé)下采樣像用不同網(wǎng)眼的篩子一樣逐步提取從邊緣、紋理到高級(jí)語義的層層特征但這個(gè)過程會(huì)損失空間細(xì)節(jié)。解碼器則負(fù)責(zé)上采樣把壓縮的語義信息逐步“放大”回原圖尺寸。而跳躍連接就像在編碼器和解碼器對(duì)應(yīng)的層級(jí)之間搭了座橋把編碼器里保留的細(xì)節(jié)特征直接“抄送”給解碼器幫助它更好地恢復(fù)物體的精確邊界。但是用久了就會(huì)發(fā)現(xiàn)UNet的幾個(gè)痛點(diǎn)梯度問題與特征退化當(dāng)網(wǎng)絡(luò)變得更深這是提升性能的常見手段時(shí)標(biāo)準(zhǔn)的卷積堆疊容易導(dǎo)致梯度消失或爆炸使得訓(xùn)練困難。更麻煩的是網(wǎng)絡(luò)深度增加到一定程度性能可能不升反降這就是特征退化并非過擬合。特征融合的“粗暴”UNet的跳躍連接是簡單的通道拼接Concatenation。來自編碼器的淺層特征細(xì)節(jié)多語義弱和解碼器的深層特征語義強(qiáng)細(xì)節(jié)粗直接拼在一起模型需要自己費(fèi)力地去學(xué)習(xí)和協(xié)調(diào)這兩種不同“分辨率”和“信息密度”的特征效率不高有時(shí)會(huì)導(dǎo)致融合不充分。多尺度目標(biāo)處理能力有限車道線有近處清晰寬闊的也有遠(yuǎn)處細(xì)小模糊的。標(biāo)準(zhǔn)UNet雖然通過不同層捕獲了多尺度信息但其融合方式對(duì)于極端尺度變化的目標(biāo)如遠(yuǎn)處極細(xì)的車道線的感知能力仍有優(yōu)化空間。2.2 第一劑補(bǔ)藥融入Residual Block殘差塊為了解決深度網(wǎng)絡(luò)的訓(xùn)練難題和特征退化問題我引入了ResNet的核心思想——?dú)埐顚W(xué)習(xí)。具體來說就是把編碼器和解碼器里的普通卷積塊替換成殘差塊。一個(gè)基礎(chǔ)的殘差塊結(jié)構(gòu)是輸入x經(jīng)過兩層卷積通常配以批歸一化和ReLU激活得到輸出F(x)然后與原始的輸入x相加得到最終輸出 H(x) F(x) x。這里的“相加”是關(guān)鍵它建立了一條恒等映射Identity Mapping的捷徑。這么做的核心好處緩解梯度消失梯度可以通過加法捷徑更直接地反向傳播讓超深網(wǎng)絡(luò)的訓(xùn)練成為可能。在我們的改進(jìn)UNet里這意味著我可以放心地增加網(wǎng)絡(luò)深度比如使用更深的預(yù)訓(xùn)練骨干網(wǎng)絡(luò)如ResNet-34/50作為編碼器以提取更豐富的特征而不必太擔(dān)心訓(xùn)練崩潰。避免特征退化網(wǎng)絡(luò)至少能學(xué)會(huì)一個(gè)恒等變換保證性能不會(huì)比淺層網(wǎng)絡(luò)差讓增加深度真正帶來收益。提升特征復(fù)用模型更容易學(xué)習(xí)輸入與輸出之間的殘差變化部分這通常比學(xué)習(xí)一個(gè)完整的映射更簡單、更高效。在實(shí)際代碼中我通常不會(huì)從頭構(gòu)建殘差塊而是直接使用PyTorch的torchvision.models中的ResNet作為編碼器替換掉UNet原來的簡單編碼器。這樣一舉兩得既引入了殘差結(jié)構(gòu)又利用了在ImageNet上預(yù)訓(xùn)練的權(quán)重能加速收斂并提升模型泛化能力。2.3 第二劑補(bǔ)藥引入FPN特征金字塔網(wǎng)絡(luò)如果說Residual解決了“挖得深”的問題那么FPN就是為了解決“融得好”的問題。FPN最初是為目標(biāo)檢測(cè)設(shè)計(jì)的用于在不同尺度上檢測(cè)不同大小的目標(biāo)。我把它借鑒到語義分割中特別是UNet的跳躍連接部分來優(yōu)化多尺度特征的融合。標(biāo)準(zhǔn)UNet是“一對(duì)一”的跳躍連接第n層編碼器特征直接送給第n層解碼器。而FPN的思想是“一對(duì)多”和“自上而下”的融合。我的融合方案如下自上而下的路徑從編碼器最深層語義信息最強(qiáng)的特征圖開始通過上采樣如雙線性插值或轉(zhuǎn)置卷積使其空間尺寸翻倍。橫向連接將上采樣后的深層特征與編碼器對(duì)應(yīng)層級(jí)的淺層特征經(jīng)過一個(gè)1x1卷積來調(diào)整通道數(shù)使其與深層特征通道一致進(jìn)行逐元素相加。迭代融合這個(gè)相加后得到的融合特征一方面作為當(dāng)前層級(jí)的輸出另一方面繼續(xù)上采樣與更淺一層的編碼器特征相加如此迭代直到最淺層。為什么相加比拼接好對(duì)于特征融合相加操作是一種更緊湊、計(jì)算量更小的方式。它要求融合前的特征圖在語義和尺度上已經(jīng)對(duì)齊而FPN通過1x1卷積調(diào)整通道和上采樣對(duì)齊空間尺寸正好滿足了這一點(diǎn)。相加鼓勵(lì)網(wǎng)絡(luò)直接融合信息而拼接則需要后續(xù)的卷積層來自主學(xué)習(xí)如何整合在計(jì)算效率和融合效果上相加往往更具優(yōu)勢(shì)尤其是在處理多尺度特征時(shí)。這樣每一層解碼器接收到的就不再是單一的、來自同層編碼器的“粗糙”細(xì)節(jié)特征而是一個(gè)已經(jīng)融合了深層語義和當(dāng)前尺度細(xì)節(jié)的“強(qiáng)化”特征。這使得模型對(duì)于不同粗細(xì)、不同清晰度的車道線都有了更強(qiáng)的特征表示能力。2.4 整體架構(gòu)視圖最終的模型架構(gòu)你可以理解為一個(gè)以ResNet為骨干的編碼器一個(gè)融合了FPN思想的多尺度特征融合模塊以及一個(gè)對(duì)稱的上采樣解碼器。編碼階段輸入圖像經(jīng)過ResNet骨干網(wǎng)絡(luò)得到多個(gè)層級(jí)的特征圖例如C1, C2, C3, C4, C5尺寸遞減通道數(shù)遞增語義增強(qiáng)。FPN融合階段從C5開始上采樣并與調(diào)整通道后的C4相加得到P4P4上采樣與C3相加得P3依此類推得到P2。P2到P5這些特征圖融合了從細(xì)到粗的多尺度信息。解碼與輸出階段將P2到P5這些融合后的特征通過跳躍連接提供給解碼器的對(duì)應(yīng)層。解碼器再進(jìn)行一系列的上采樣和卷積操作逐步恢復(fù)分辨率。最后通過一個(gè)1x1卷積將通道數(shù)映射為類別數(shù)如車道線/背景輸出分割圖。注意這里有一個(gè)關(guān)鍵的實(shí)現(xiàn)細(xì)節(jié)。ResNet骨干網(wǎng)絡(luò)的下采樣倍數(shù)可能和原始UNet預(yù)設(shè)的不一致例如ResNet通常有5次下采樣最終特征圖是輸入的1/32。我們需要在解碼器部分通過適當(dāng)次數(shù)的上采樣來回原圖尺寸并確保FPN橫向連接時(shí)編碼器特征和上采樣特征的尺寸能嚴(yán)格對(duì)齊。3. 實(shí)戰(zhàn)從數(shù)據(jù)準(zhǔn)備到模型訓(xùn)練全流程3.1 數(shù)據(jù)集處理與增強(qiáng)策略車道線分割的數(shù)據(jù)集常用的有TuSimple、CULane等。但公開數(shù)據(jù)集往往和實(shí)際應(yīng)用場(chǎng)景有差距所以我通常會(huì)混合使用公開數(shù)據(jù)和自己標(biāo)注的數(shù)據(jù)。數(shù)據(jù)預(yù)處理要點(diǎn)標(biāo)簽制作語義分割需要像素級(jí)的標(biāo)簽。通常車道線標(biāo)注為白色像素值255背景為黑色0。需要將其轉(zhuǎn)換為單通道的灰度標(biāo)簽圖或者更常見的轉(zhuǎn)換為one-hot編碼格式例如使用torch.nn.functional.one_hot。圖像歸一化將輸入圖像從[0, 255]的像素值范圍歸一化到[0, 1]或根據(jù)ImageNet的均值和標(biāo)準(zhǔn)差進(jìn)行歸一化這對(duì)使用預(yù)訓(xùn)練ResNet骨干至關(guān)重要能加速訓(xùn)練收斂。尺寸調(diào)整將所有圖像和標(biāo)簽統(tǒng)一縮放到固定的網(wǎng)絡(luò)輸入尺寸如512x256或640x320。保持寬高比很重要畸變太嚴(yán)重會(huì)影響模型對(duì)車道線曲率的判斷。數(shù)據(jù)增強(qiáng)是提升模型魯棒性的關(guān)鍵尤其是在數(shù)據(jù)量不足的情況下。我常用的增強(qiáng)組合包括幾何變換隨機(jī)水平翻轉(zhuǎn)對(duì)車道線任務(wù)非常有效因?yàn)榈缆穲?chǎng)景常具有對(duì)稱性、小角度的隨機(jī)旋轉(zhuǎn)模擬車輛輕微偏航、隨機(jī)裁剪和縮放。顏色變換隨機(jī)調(diào)整亮度、對(duì)比度、飽和度模擬不同光照和天氣條件。加入隨機(jī)高斯噪聲模擬傳感器噪聲。模擬遮擋隨機(jī)在圖像上放置一些矩形塊模擬車輛、樹木陰影遮擋讓模型學(xué)會(huì)在信息不全的情況下推斷車道線?;旌显鰪?qiáng)使用MixUp或CutMix將兩張圖像按比例混合可以迫使模型學(xué)習(xí)更魯棒的特征。一個(gè)使用albumentations庫的增強(qiáng)管道示例import albumentations as A from albumentations.pytorch import ToTensorV2 train_transform A.Compose([ A.Resize(height360, width640), # 統(tǒng)一尺寸 A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), A.HueSaturationValue(hue_shift_limit10, sat_shift_limit20, val_shift_limit10, p0.5), A.Blur(blur_limit3, p0.1), # 模擬運(yùn)動(dòng)模糊 A.Normalize(mean(0.485, 0.456, 0.406), std(0.229, 0.224, 0.225)), # ImageNet統(tǒng)計(jì)量 ToTensorV2(), ])3.2 損失函數(shù)與評(píng)價(jià)指標(biāo)的選擇分割任務(wù)中車道線像素前景和背景像素?cái)?shù)量通常極不平衡車道線只占很少一部分所以損失函數(shù)的選擇直接影響模型是否“偏向”背景。交叉熵?fù)p失CrossEntropy Loss最基礎(chǔ)的選擇。但普通的交叉熵對(duì)類別不平衡不敏感。因此必須使用帶權(quán)重的交叉熵?fù)p失。權(quán)重的計(jì)算通常是類別的逆頻率即背景像素多權(quán)重小車道線像素少權(quán)重大。這能迫使模型更關(guān)注難分的車道線像素。# 假設(shè)背景為0類車道線為1類 class_weights torch.tensor([0.1, 0.9]) # 示例權(quán)重需根據(jù)數(shù)據(jù)集計(jì)算 criterion nn.CrossEntropyLoss(weightclass_weights)Dice Loss / Focal LossDice Loss直接優(yōu)化Dice系數(shù)對(duì)類別不平衡非常魯棒。它衡量的是預(yù)測(cè)區(qū)域和真實(shí)區(qū)域的交集大小特別適合像車道線這種“細(xì)長型”目標(biāo)的分割。def dice_loss(pred, target, smooth1e-6): pred torch.sigmoid(pred) # 如果是二分類 intersection (pred * target).sum() union pred.sum() target.sum() return 1 - (2. * intersection smooth) / (union smooth)Focal Loss在交叉熵的基礎(chǔ)上為難以分類的樣本預(yù)測(cè)概率低的樣本分配更大的權(quán)重讓模型更專注于難例。對(duì)于車道線邊緣那些模糊的像素點(diǎn)特別有效。 我通常會(huì)將帶權(quán)重的交叉熵?fù)p失和Dice Loss結(jié)合起來使用例如總損失 交叉熵?fù)p失 λ * Dice損失取長補(bǔ)短在實(shí)踐中效果通常比單一損失更好。評(píng)價(jià)指標(biāo)IoU交并比分割任務(wù)的核心指標(biāo)。計(jì)算預(yù)測(cè)的車道線區(qū)域和真實(shí)區(qū)域的交集與并集之比。Pixel Accuracy像素精度整體分類正確的像素比例。在不平衡數(shù)據(jù)上參考價(jià)值有限。F1-Score精確率和召回率的調(diào)和平均能綜合衡量模型性能。推理速度FPS對(duì)于自動(dòng)駕駛實(shí)時(shí)應(yīng)用這是硬性指標(biāo)。需要在精度和速度間取得平衡。3.3 模型訓(xùn)練技巧與超參數(shù)調(diào)優(yōu)優(yōu)化器與學(xué)習(xí)率AdamWAdam with decoupled weight decay是目前的首選它比Adam更不容易過擬合。初始學(xué)習(xí)率一般設(shè)得較小如3e-4或1e-4。學(xué)習(xí)率調(diào)度策略至關(guān)重要。我常用CosineAnnealingLR余弦退火或ReduceLROnPlateau當(dāng)驗(yàn)證集指標(biāo)不再提升時(shí)降低學(xué)習(xí)率。配合Warmup訓(xùn)練初期線性增加學(xué)習(xí)率能穩(wěn)定訓(xùn)練初期。批次大小Batch Size在GPU內(nèi)存允許的情況下盡量使用較大的批次大小如16, 32這能使梯度估計(jì)更穩(wěn)定。如果內(nèi)存不夠可以使用梯度累積Gradient Accumulation來模擬大批次的效果。骨干網(wǎng)絡(luò)微調(diào)如果使用預(yù)訓(xùn)練的ResNet通常凍結(jié)骨干網(wǎng)絡(luò)的前幾層這些層學(xué)習(xí)的是通用邊緣、紋理特征只微調(diào)后面的層以及我們新增的FPN和解碼器部分。訓(xùn)練一段時(shí)間后再解凍全部網(wǎng)絡(luò)進(jìn)行微調(diào)這能有效利用預(yù)訓(xùn)練知識(shí)并防止災(zāi)難性遺忘。早停Early Stopping持續(xù)監(jiān)控驗(yàn)證集損失或IoU。當(dāng)其在連續(xù)多個(gè)epoch如10或15個(gè)內(nèi)沒有改善時(shí)就停止訓(xùn)練并回滾到驗(yàn)證集指標(biāo)最好的那個(gè)模型權(quán)重。這是防止過擬合最簡單有效的方法。3.4 一個(gè)簡化的模型定義代碼框架以下是使用PyTorch定義核心模型結(jié)構(gòu)的簡化示例展示了ResNet骨干、FPN融合和解碼器的結(jié)合思路import torch import torch.nn as nn import torchvision.models as models class ResidualFPNUNet(nn.Module): def __init__(self, num_classes2, backboneresnet34, pretrainedTrue): super(ResidualFPNUNet, self).__init__() # 1. 編碼器使用預(yù)訓(xùn)練ResNet backbone_model getattr(models, backbone)(pretrainedpretrained) self.encoder1 nn.Sequential(backbone_model.conv1, backbone_model.bn1, backbone_model.relu) self.encoder2 backbone_model.layer1 self.encoder3 backbone_model.layer2 self.encoder4 backbone_model.layer3 self.encoder5 backbone_model.layer4 # 編碼器各層輸出通道數(shù) c1, c2, c3, c4, c5 64, 64, 128, 256, 512 # 以resnet34為例 # 2. FPN 橫向連接與融合 # 對(duì)編碼器特征進(jìn)行1x1卷積調(diào)整通道數(shù)以進(jìn)行融合 self.lateral4 nn.Conv2d(c4, 256, 1) self.lateral3 nn.Conv2d(c3, 256, 1) self.lateral2 nn.Conv2d(c2, 256, 1) # 自上而下的上采樣路徑 self.upsample nn.Upsample(scale_factor2, modebilinear, align_cornersTrue) # 3. 解碼器定義示例需根據(jù)實(shí)際設(shè)計(jì) self.decoder4 self._make_decoder_block(256 256, 256) # 融合了C5和 lateral4 self.decoder3 self._make_decoder_block(256 256, 128) # 融合了P4和 lateral3 self.decoder2 self._make_decoder_block(128 256, 64) # 融合了P3和 lateral2 self.decoder1 self._make_decoder_block(64 c1, 32) # 最終分類頭 self.final_conv nn.Conv2d(32, num_classes, kernel_size1) def _make_decoder_block(self, in_channels, out_channels): return nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue), nn.Conv2d(out_channels, out_channels, 3, padding1), nn.BatchNorm2d(out_channels), nn.ReLU(inplaceTrue), ) def forward(self, x): # 編碼器前向傳播 e1 self.encoder1(x) # /2 e2 self.encoder2(e1) # /4 e3 self.encoder3(e2) # /8 e4 self.encoder4(e3) # /16 e5 self.encoder5(e4) # /32 # FPN 特征融合 p5 e5 p4 self.lateral4(e4) self.upsample(p5) p3 self.lateral3(e3) self.upsample(p4) p2 self.lateral2(e2) self.upsample(p3) # 解碼器前向傳播簡化示意需與編碼器尺寸匹配 d4 self.decoder4(torch.cat([self.upsample(p5), p4], dim1)) d3 self.decoder3(torch.cat([self.upsample(d4), p3], dim1)) d2 self.decoder2(torch.cat([self.upsample(d3), p2], dim1)) d1 self.decoder1(torch.cat([self.upsample(d2), e1], dim1)) out self.final_conv(d1) out nn.functional.interpolate(out, sizex.shape[2:], modebilinear, align_cornersTrue) return out4. 訓(xùn)練過程中的常見問題與調(diào)優(yōu)實(shí)錄4.1 損失震蕩或不收斂現(xiàn)象訓(xùn)練損失曲線像鋸齒一樣上下劇烈波動(dòng)或者一直居高不下。排查與解決檢查學(xué)習(xí)率這是最常見的原因。學(xué)習(xí)率設(shè)置過高。立即嘗試將學(xué)習(xí)率降低一個(gè)數(shù)量級(jí)例如從1e-3降到1e-4并使用學(xué)習(xí)率預(yù)熱。檢查數(shù)據(jù)與標(biāo)簽確認(rèn)數(shù)據(jù)加載和預(yù)處理過程是否正確。打印幾張樣本和對(duì)應(yīng)的標(biāo)簽圖看圖像是否被正確歸一化標(biāo)簽的像素值是否是對(duì)應(yīng)的類別ID如01。一個(gè)常見的錯(cuò)誤是標(biāo)簽圖像素值被錯(cuò)誤地縮放了。檢查損失函數(shù)確認(rèn)損失函數(shù)的輸入是否符合要求。交叉熵?fù)p失要求輸入是未經(jīng)過Softmax的logits模型原始輸出而標(biāo)簽是類別索引LongTensor。如果對(duì)輸出先做了Softmax再輸入交叉熵會(huì)導(dǎo)致梯度問題。梯度裁剪如果懷疑是梯度爆炸可以在優(yōu)化器步驟之前加入梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)。4.2 模型過擬合現(xiàn)象訓(xùn)練集損失持續(xù)下降IoU很高但驗(yàn)證集損失早早就停止下降甚至上升驗(yàn)證集IoU遠(yuǎn)低于訓(xùn)練集。排查與解決增強(qiáng)數(shù)據(jù)增強(qiáng)這是對(duì)抗過擬合的第一道防線。檢查并加強(qiáng)你的數(shù)據(jù)增強(qiáng)策略確保其多樣性和強(qiáng)度足夠。可以嘗試加入更復(fù)雜的增強(qiáng)如CutMix、GridMask等。正則化Dropout在解碼器的卷積層之間或全連接層如果有后加入Dropout層隨機(jī)丟棄一部分神經(jīng)元。權(quán)重衰減確保你在優(yōu)化器如AdamW中設(shè)置了合理的權(quán)重衰減參數(shù)如1e-4。Label Smoothing在計(jì)算交叉熵?fù)p失時(shí)使用標(biāo)簽平滑將硬標(biāo)簽0或1稍微軟化如0.9和0.1可以防止模型對(duì)訓(xùn)練數(shù)據(jù)過于自信。簡化模型如果數(shù)據(jù)量確實(shí)很小考慮使用更輕量級(jí)的骨干網(wǎng)絡(luò)如ResNet18代替ResNet50或者減少解碼器的通道數(shù)。早停嚴(yán)格使用早停策略保存驗(yàn)證集上性能最好的模型。4.3 預(yù)測(cè)結(jié)果噪聲多邊界不清晰現(xiàn)象模型輸出的分割圖有很多孤立的噪聲點(diǎn)或者車道線邊界毛毛糙糙不夠平滑連續(xù)。排查與解決后處理這是最直接有效的方法。對(duì)模型輸出的概率圖進(jìn)行后處理。閾值化設(shè)定一個(gè)置信度閾值如0.5高于閾值的視為車道線。連通域分析使用cv2.connectedComponentsWithStats過濾掉面積過小的連通域噪聲點(diǎn)。形態(tài)學(xué)操作使用開運(yùn)算先腐蝕后膨脹去除小噪聲使用閉運(yùn)算先膨脹后腐蝕連接斷開的車道線。損失函數(shù)嘗試使用對(duì)邊界更敏感的損失函數(shù)如邊界損失Boundary Loss或結(jié)合Dice Loss它們能促使模型產(chǎn)生更連貫的區(qū)域預(yù)測(cè)。模型層面在解碼器末端或最終輸出前加入一個(gè)小的條件隨機(jī)場(chǎng)CRF后處理層或者使用注意力機(jī)制讓模型更關(guān)注物體邊界區(qū)域。不過這會(huì)增加計(jì)算復(fù)雜度。4.4 小目標(biāo)遠(yuǎn)處車道線檢測(cè)效果差現(xiàn)象近處的車道線分割得很好但圖像上半部分遠(yuǎn)處的細(xì)小車道線經(jīng)常丟失或斷裂。排查與解決驗(yàn)證FPN的有效性這正是引入FPN要解決的核心問題之一。檢查你的FPN融合部分代碼是否正確實(shí)現(xiàn)。確保深層特征在上采樣后與淺層特征確實(shí)進(jìn)行了有效的融合相加??梢酝ㄟ^可視化不同層級(jí)P2, P3, P4, P5的特征圖觀察它們是否包含了不同尺度的信息。注意力機(jī)制在FPN融合路徑或解碼器中加入空間注意力或通道注意力模塊如SE Block, CBAM讓網(wǎng)絡(luò)自適應(yīng)地給重要特征分配更高權(quán)重這有助于模型聚焦于那些難以識(shí)別的細(xì)小目標(biāo)。多尺度訓(xùn)練/測(cè)試在訓(xùn)練時(shí)隨機(jī)將圖像縮放到不同尺寸再輸入網(wǎng)絡(luò)可以增強(qiáng)模型對(duì)尺度變化的魯棒性。在測(cè)試時(shí)也可以使用多尺度輸入并取平均預(yù)測(cè)結(jié)果測(cè)試時(shí)增強(qiáng)TTA能穩(wěn)定提升小目標(biāo)檢測(cè)精度但會(huì)成倍增加推理時(shí)間。4.5 推理速度慢無法滿足實(shí)時(shí)性現(xiàn)象模型精度達(dá)標(biāo)但單張圖片推理時(shí)間過長FPS低于實(shí)時(shí)要求如30 FPS。排查與解決模型輕量化更換骨干網(wǎng)絡(luò)將ResNet50/101替換為更輕量的網(wǎng)絡(luò)如MobileNetV3、ShuffleNetV2或EfficientNet-Lite。這些網(wǎng)絡(luò)為移動(dòng)和嵌入式設(shè)備設(shè)計(jì)在精度損失不大的情況下大幅減少參數(shù)量和計(jì)算量。深度可分離卷積將標(biāo)準(zhǔn)卷積替換為深度可分離卷積這是MobileNet的核心能極大減少計(jì)算量。你可以嘗試將解碼器中的部分標(biāo)準(zhǔn)卷積塊改為深度可分離卷積塊。通道剪枝訓(xùn)練完成后對(duì)模型中不重要的通道進(jìn)行剪枝移除冗余參數(shù)。減少輸入分辨率這是提升速度最直接的方法但會(huì)損失細(xì)節(jié)信息。需要在速度和精度之間做權(quán)衡??梢試L試從640x360降到320x180。優(yōu)化推理引擎使用TorchScript將模型轉(zhuǎn)換為腳本模式或者使用ONNX導(dǎo)出模型并用TensorRT或OpenVINO等推理框架進(jìn)行加速優(yōu)化利用GPU/CPU的硬件特性能獲得顯著的性能提升。量化將模型從FP32精度量化到INT8精度可以大幅減少模型大小和內(nèi)存占用提升推理速度。PyTorch提供了方便的量化API。但量化可能會(huì)帶來輕微的精度損失需要仔細(xì)校準(zhǔn)。5. 項(xiàng)目部署與后續(xù)優(yōu)化方向模型訓(xùn)練完成并驗(yàn)證通過后工作只完成了一半。將其部署到實(shí)際環(huán)境如車載計(jì)算單元并持續(xù)優(yōu)化才是項(xiàng)目產(chǎn)生價(jià)值的關(guān)鍵。部署考量環(huán)境適配目標(biāo)部署平臺(tái)是NVIDIA Jetson系列、華為MDC還是其他嵌入式AI芯片需要根據(jù)平臺(tái)支持的框架TensorRT, CANN等轉(zhuǎn)換模型格式。預(yù)處理/后處理集成將數(shù)據(jù)歸一化、圖像縮放等預(yù)處理步驟以及閾值化、濾波等后處理步驟全部集成到推理流水線中封裝成獨(dú)立的服務(wù)或庫。性能 profiling在目標(biāo)硬件上對(duì)推理流水線進(jìn)行性能分析找出瓶頸是模型計(jì)算慢還是數(shù)據(jù)搬運(yùn)慢針對(duì)性優(yōu)化。后續(xù)優(yōu)化方向模型蒸餾用訓(xùn)練好的大模型教師模型去指導(dǎo)一個(gè)更小、更快的小模型學(xué)生模型訓(xùn)練讓小模型在速度提升的同時(shí)盡可能逼近大模型的精度。領(lǐng)域自適應(yīng)如果模型在一個(gè)數(shù)據(jù)集源域如晴天城市道路上訓(xùn)練但要應(yīng)用到另一個(gè)場(chǎng)景目標(biāo)域如鄉(xiāng)村夜路性能會(huì)下降??梢允褂脽o監(jiān)督或半監(jiān)督的領(lǐng)域自適應(yīng)技術(shù)讓模型適應(yīng)新環(huán)境減少數(shù)據(jù)重新標(biāo)注的成本。時(shí)序信息利用車道線在視頻序列中是連續(xù)的。可以引入LSTM或3D卷積利用前后幀的信息進(jìn)行分割能有效處理單幀中的遮擋和模糊問題提升穩(wěn)定性。多任務(wù)學(xué)習(xí)讓一個(gè)模型同時(shí)完成車道線分割、車輛檢測(cè)、可行駛區(qū)域分割等多個(gè)任務(wù)。這些任務(wù)共享底層特征可以互相促進(jìn)提升整體感知效率更適合資源受限的嵌入式平臺(tái)。這個(gè)基于UNet融合Residual和FPN的車道線分割項(xiàng)目從架構(gòu)改進(jìn)到實(shí)戰(zhàn)調(diào)優(yōu)每一步都充滿了權(quán)衡與選擇。我個(gè)人的體會(huì)是沒有一勞永逸的“銀彈”模型最好的模型永遠(yuǎn)是那個(gè)最貼合你具體業(yè)務(wù)場(chǎng)景、數(shù)據(jù)分布和性能約束的模型。動(dòng)手實(shí)現(xiàn)、不斷實(shí)驗(yàn)、分析失敗案例比空談理論要重要得多。最后分享一個(gè)小心得在訓(xùn)練初期每隔幾個(gè)epoch就可視化一下模型在驗(yàn)證集上的預(yù)測(cè)結(jié)果直觀感受模型“學(xué)”到了什么、在哪里“犯錯(cuò)”這種反饋對(duì)于調(diào)整模型結(jié)構(gòu)和訓(xùn)練策略有著不可替代的價(jià)值。本文還有配套的精品資源點(diǎn)擊獲取