方案詳解)
簡(jiǎn)介基于YOLOv5與霍夫變換的車道線檢測(cè)Python項(xiàng)目將深度學(xué)習(xí)目標(biāo)檢測(cè)與傳統(tǒng)圖像處理相結(jié)合YOLOv5負(fù)責(zé)車輛等目標(biāo)識(shí)別霍夫變換完成車道線提取車道線部分無(wú)需額外的數(shù)據(jù)集訓(xùn)練有效降低學(xué)習(xí)與使用門檻。面向計(jì)算機(jī)視覺(jué)方向的在校學(xué)生、教師及企業(yè)開(kāi)發(fā)人員適用于課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)、項(xiàng)目初期演示或自動(dòng)駕駛感知相關(guān)入門實(shí)踐具備一定Python與OpenCV基礎(chǔ)即可上手。項(xiàng)目代碼已經(jīng)過(guò)測(cè)試運(yùn)行成功功能可用資源共125個(gè)文件壓縮包約710KB以Python源碼53個(gè)py、YOLOv5模型配置48個(gè)yaml、Shell運(yùn)行腳本、Markdown說(shuō)明文檔及Dockerfile為主另含Jupyter Notebook教程與測(cè)試圖片目錄結(jié)構(gòu)清晰便于按模塊閱讀和二次開(kāi)發(fā)。目前已有98人學(xué)習(xí)下載。除完整項(xiàng)目源碼外還提供容器環(huán)境配置與運(yùn)行腳本下載后可按README指引快速?gòu)?fù)現(xiàn)若運(yùn)行遇到問(wèn)題可聯(lián)系作者遠(yuǎn)程教學(xué)。讀者可重點(diǎn)關(guān)注霍夫變換檢測(cè)流程與YOLOv5目標(biāo)檢測(cè)的協(xié)作方式。整體方案兼顧深度學(xué)習(xí)與傳統(tǒng)視覺(jué)適合作為車道線檢測(cè)入門、課設(shè)與畢設(shè)拓展的參考實(shí)現(xiàn)。1. 為什么 YOLOv5 和霍夫變換會(huì)同時(shí)出現(xiàn)在一個(gè)車道線檢測(cè)項(xiàng)目里拿到這個(gè)標(biāo)題多數(shù)人的第一反應(yīng)是YOLOv5 做目標(biāo)檢測(cè)霍夫變換做直線檢測(cè)這兩者不是替代關(guān)系嗎實(shí)際上在這個(gè)項(xiàng)目里它們是串聯(lián)的——YOLOv5 負(fù)責(zé)在復(fù)雜道路環(huán)境中定位車道線的大致區(qū)域霍夫變換負(fù)責(zé)在該區(qū)域內(nèi)精確提取車道線的直線輪廓。純霍夫方案在光照突變、路面陰影、車道線磨損時(shí)會(huì)大量誤檢純 YOLOv5 直接輸出線條又缺少像素級(jí)幾何信息無(wú)法為車輛橫向控制提供準(zhǔn)確的曲率和截距。兩段式方案的好處在于檢測(cè)框縮小了霍夫的搜索空間霍夫的輸出又彌補(bǔ)了錨框沒(méi)有幾何精度的短板。這個(gè)組合適合做自動(dòng)駕駛視覺(jué)感知的入門項(xiàng)目也常見(jiàn)于本科畢設(shè)——工程上夠完整又能在論文里分別講清楚深度學(xué)習(xí)和經(jīng)典圖像處理兩條線的原理。這個(gè)項(xiàng)目實(shí)測(cè)跑通不難難的是把檢測(cè)精度調(diào)到能連續(xù)處理視頻而不抖動(dòng)。2. 車道線檢測(cè)里的 YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)、數(shù)據(jù)標(biāo)注與訓(xùn)練調(diào)參2.1 為什么先要 YOLOv5 而不是直接用霍夫變換處理全圖車道線檢測(cè)任務(wù)里霍夫變換本身只需要一行cv2.HoughLinesP()就能跑起來(lái)但純圖像處理方案有一個(gè)致命短板它沒(méi)有「語(yǔ)義」概念。路邊沿、護(hù)欄接縫、橋面伸縮縫、前車陰影邊緣在邊緣圖里和車道線一樣都是直線段霍夫會(huì)一視同仁地輸出。YOLOv5 在這個(gè)項(xiàng)目里的角色不是「檢測(cè)車道線本身」而是先框出車道線可能存在的路面區(qū)域相當(dāng)于給后續(xù)的霍夫變換加了一個(gè)語(yǔ)義門控。YOLOv5 在 COCO 上預(yù)訓(xùn)練過(guò)的權(quán)重對(duì)車輛、行人、交通標(biāo)志有很好的響應(yīng)但車道線不在 COCO 的 80 個(gè)類別里所以要用自己的數(shù)據(jù)集做微調(diào)。標(biāo)題里說(shuō)「基于 YOLOv5」通常意味著兩件事第一用 YOLOv5 訓(xùn)練一個(gè)只檢測(cè)車道線的模型第二拿這個(gè)模型跑出 anchor box在每個(gè)框的 ROI 內(nèi)部再用霍夫變換提取直線。第二種方案的檢測(cè)目標(biāo)不是「線」而是「線所在的條帶狀區(qū)域」標(biāo)注框比逐像素分割省事得多。2.2 數(shù)據(jù)集準(zhǔn)備標(biāo)注車道線區(qū)域框而不是標(biāo)注線如果用 YOLOv5 檢測(cè)車道線標(biāo)注策略和普通目標(biāo)檢測(cè)有區(qū)別。車道線是細(xì)長(zhǎng)條目標(biāo)標(biāo)注框形狀接近 1:3 甚至 1:5 的長(zhǎng)條矩形框不能只框住線的像素要把線周邊的路面紋理也包含進(jìn)去。原因是后續(xù)的霍夫變換需要在框內(nèi)做邊緣檢測(cè)如果框太緊Canny 會(huì)把車道線像素裁掉一半框略大一些反而降低了邊緣斷裂的概率。標(biāo)注工具推薦 labelImg 或者 labelme導(dǎo)出為 YOLO 格式的 txt每行是class x_center y_center width height四個(gè)坐標(biāo)值都?xì)w一化到 0~1。類別按需要定義最常見(jiàn)的是兩類left_lane和right_lane。如果訓(xùn)練數(shù)據(jù)里有摩托車道分隔線或者應(yīng)急車道線可以加第三類extra_lane。標(biāo)注時(shí)注意別把路面裂縫圈進(jìn)來(lái)裂縫的像素特征和車道線在局部邊緣圖上非常相似類別混淆會(huì)讓訓(xùn)練 loss 不降。數(shù)據(jù)集目錄結(jié)構(gòu)一般這樣組織dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── lane.yamllane.yaml內(nèi)容train: dataset/images/train val: dataset/images/val nc: 2 names: [left_lane, right_lane]2.3 訓(xùn)練命令與超參數(shù)調(diào)整YOLOv5 官方倉(cāng)庫(kù)的train.py可以直接用來(lái)訓(xùn)練命令常見(jiàn)寫法是python train.py --data lane.yaml --cfg yolov5s.yaml --weights yolov5s.pt \ --batch-size 16 --epochs 100 --img-size 640 --device 0幾個(gè)參數(shù)的選擇邏輯--cfg yolov5s.yamls 是 small 版本depth_multiple0.33、width_multiple0.50參數(shù)量約 7.2M。車道線檢測(cè)任務(wù)簡(jiǎn)單、目標(biāo)形狀單一不需要上 yolov5l 或 yolov5xs 足夠而且推理速度快。如果要在 Jetson 這類邊緣設(shè)備上跑可以進(jìn)一步用yolov5n。--img-size 640這個(gè)值影響小目標(biāo)召回。車道線在畫(huà)面里是細(xì)長(zhǎng)條如果輸入降到 320靠近消失點(diǎn)的車道線會(huì)縮小到 2~3 個(gè)像素寬特征基本丟失。640 是精度和速度的平衡點(diǎn)顯存夠且對(duì)遠(yuǎn)距離檢測(cè)有要求可以試 960。--batch-size 16取決于顯存8G 顯存用 16 比較穩(wěn)再大容易 OOM。--epochs 100遷移學(xué)習(xí)微調(diào)100 epoch 通常夠收斂配合早停機(jī)制看 val loss 不再下降就可以停。YOLOv5 的超參數(shù)在data/hyps/hyp.scratch.yaml里車道線檢測(cè)這種小而單一的目標(biāo)有兩個(gè)值得動(dòng)lr0: 0.01 # 初始學(xué)習(xí)率 anchor_t: 4.0 # 錨框長(zhǎng)寬比閾值anchor_t默認(rèn) 4.0 表示錨框的長(zhǎng)寬比超過(guò) 4 倍就會(huì)被判定為不匹配。車道線的錨框長(zhǎng)寬比經(jīng)常到 5~8訓(xùn)練時(shí)如果發(fā)現(xiàn) loss 下降緩慢可以把這個(gè)值調(diào)到 5.0 或 6.0讓錨框在自動(dòng)聚類時(shí)能容納更極端的長(zhǎng)條形狀。lr0若是用yolov5s.pt做遷移0.01 是穩(wěn)妥起點(diǎn)數(shù)據(jù)量小幾千張可以降到 0.005 防止震蕩。訓(xùn)練結(jié)束后看runs/train/exp/weights/best.pt的 PR 曲線車道線檢測(cè)的 mAP0.5 一般能到 0.9 以上mAP0.5:0.95 會(huì)因?yàn)?IOU 閾值嚴(yán)格而偏低這是正常的不用強(qiáng)求。3. 霍夫變換在車道線檢測(cè)中的作用原理、參數(shù)與 ROI 設(shè)計(jì)3.1 從檢測(cè)框到候選直線圖像預(yù)處理YOLOv5 輸出的檢測(cè)框只是車道線的粗略位置框里的內(nèi)容還是原始圖像塊。要在框內(nèi)提取精確的直線走的是經(jīng)典視覺(jué)管線將 ROI 區(qū)域從原圖中裁剪出來(lái)轉(zhuǎn)灰度圖高斯模糊去除路面紋理噪聲核大小(5, 5)即可太大會(huì)把車道線邊緣也抹平Canny 邊緣檢測(cè)提取邊緣像素對(duì)邊緣圖做霍夫變換累加投票將直線坐標(biāo)映射回原圖坐標(biāo)系這一步的關(guān)鍵在 Canny 的高斯模糊路面是紋理豐富的區(qū)域——瀝青顆粒、小石子、輪胎痕跡在邊緣檢測(cè)里都會(huì)產(chǎn)生響應(yīng)。不對(duì)圖像做平滑霍夫變換會(huì)在投票階段被大量偽邊緣干擾threshold參數(shù)很難設(shè)置。平滑后 Canny 雙閾值推薦low50, high150這是一個(gè)對(duì)白天城市道路和高速公路都較穩(wěn)的區(qū)間。3.2 HoughLines 與 HoughLinesP 的區(qū)別OpenCV 提供兩個(gè)霍夫變換接口車道線檢測(cè)基本只用概率版本import cv2 import numpy as np def detect_lane_lines(image): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred cv2.GaussianBlur(gray, (5, 5), 0) edges cv2.Canny(blurred, 50, 150) lines cv2.HoughLinesP( edges, rho1, thetanp.pi / 180, threshold40, minLineLength60, maxLineGap80 ) return linesHoughLines返回的是極坐標(biāo)參數(shù)(ρ, θ)需要自己換算成線段端點(diǎn)HoughLinesP直接輸出起點(diǎn)和終點(diǎn)坐標(biāo)(x1, y1, x2, y2)省去反變換。兩者的核心數(shù)學(xué)原理相同圖像空間的一個(gè)點(diǎn)映射到參數(shù)空間是一條正弦曲線多個(gè)共線點(diǎn)在參數(shù)空間會(huì)相交于同一(ρ, θ)累加器統(tǒng)計(jì)交點(diǎn)峰值峰值超過(guò)閾值的(ρ, θ)就是一條直線。3.3 四個(gè)關(guān)鍵參數(shù)的設(shè)置依據(jù)參數(shù)作用車道線場(chǎng)景推薦值調(diào)試方向rho參數(shù)空間 ρ 的分辨率像素11 即可分辨率過(guò)粗會(huì)丟失斜率精度theta參數(shù)空間 θ 的分辨率弧度np.pi/1801 度精度要求高可設(shè)np.pi/360計(jì)算量翻倍threshold累加器投票閾值越小直線越容易被檢出30~50虛線車道線建議降低到 30實(shí)線可提高到 60minLineLength最小線段長(zhǎng)度濾除碎短線60~100圖像尺寸 640 時(shí) 60 合適高清圖按比例放大maxLineGap同一直線上允許的最大斷裂間距40~80虛線車道線斷裂間距大建議不低于 60這里最值得強(qiáng)調(diào)的坑是threshold和maxLineGap的配合。虛線車道線每段長(zhǎng)約 3 米在畫(huà)面中表現(xiàn)為 40~70 像素的短線段如果threshold設(shè)得過(guò)高短線段投票數(shù)不夠直接被濾掉如果設(shè)低路面紋理形成的雜線也會(huì)混進(jìn)來(lái)。經(jīng)驗(yàn)做法是先從threshold30起步觀察誤檢多就調(diào)高漏檢多就調(diào)低不要同時(shí)改多個(gè)參數(shù)驗(yàn)證一個(gè)現(xiàn)象。3.4 ROI 掩膜把搜索限制在合理路面區(qū)域霍夫變換里還有一個(gè)常被忽視的參數(shù)——ROI。直接對(duì)整幀圖像做霍夫地平線以上的天空、路邊的樹(shù)木、前方車輛的輪廓都會(huì)產(chǎn)生大量線段。最常用的做法是做一個(gè)三角形或梯形 mask覆蓋車輛前方路面的扇形區(qū)域def apply_roi_mask(edges, img_shape): mask np.zeros(img_shape[:2], dtypenp.uint8) h, w img_shape[:2] # 梯形頂點(diǎn)底邊占滿圖像寬度頂邊收窄到畫(huà)面中央?yún)^(qū)域 roi_vertices np.array([[ (0, h), (w, h), (int(w * 0.6), int(h * 0.5)), (int(w * 0.4), int(h * 0.5)) ]], dtypenp.int32) cv2.fillPoly(mask, roi_vertices, 255) masked_edges cv2.bitwise_and(edges, mask) return masked_edges梯形 mask 的四個(gè)頂點(diǎn)參數(shù)是車道線檢測(cè)里最需要標(biāo)定的數(shù)值它取決于攝像頭的安裝角度和俯仰角。如果攝像頭裝在擋風(fēng)玻璃中上部int(h * 0.5)這個(gè)頂邊高度基本適用如果裝在車頂消失點(diǎn)位置更低要把頂邊高度調(diào)到h * 0.6左右。有人推薦用動(dòng)態(tài)計(jì)算消失點(diǎn)來(lái)替代固定梯形這個(gè)方向可以做但放在霍夫預(yù)處理階段有點(diǎn)過(guò)重——固定梯形在光線穩(wěn)定場(chǎng)景下表現(xiàn)足夠好。4. 兩段式車線檢測(cè) pipeline 的完整實(shí)現(xiàn)與驗(yàn)證4.1 先跑通單幀檢測(cè)從 YOLOv5 框到霍夫直線的完整數(shù)據(jù)流前兩章分別講了兩條線的原理這一章把它們串成可運(yùn)行的決策流。項(xiàng)目源碼里通常包含一個(gè)核心檢測(cè)腳本用 YOLOv5 的 PyTorch Hub 接口加載權(quán)重對(duì)每一幀圖像執(zhí)行檢測(cè)、過(guò)濾、霍夫提取。下面的代碼展示了最小可運(yùn)行的版本import cv2 import numpy as np import torch class LaneDetector: def __init__(self, weights_path, devicecpu): self.model torch.hub.load(ultralytics/yolov5, custom, pathweights_path, force_reloadFalse) self.model.conf 0.45 self.model.iou 0.5 self.device device def get_lane_regions(self, frame): results self.model(frame) boxes results.xyxy[0].cpu().numpy() # 過(guò)濾出類別為車道線的檢測(cè)框兼容不同訓(xùn)練類別的 ID lane_boxes boxes[boxes[:, 5] 1] return lane_boxes def detect_lanes(self, frame): lane_boxes self.get_lane_regions(frame) h, w frame.shape[:2] all_lines [] for box in lane_boxes: x1, y1, x2, y2 [int(v) for v in box[:4]] roi frame[y1:y2, x1:x2] if roi.size 0: continue gray cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) blurred cv2.GaussianBlur(gray, (5, 5), 0) edges cv2.Canny(blurred, 50, 150) lines cv2.HoughLinesP(edges, rho1, thetanp.pi / 180, threshold30, minLineLengthmax(20, int(0.1 * (y2 - y1))), maxLineGap80) if lines is not None: for line in lines: lx1, ly1, lx2, ly2 line[0] all_lines.append(( lx1 x1, ly1 y1, lx2 x1, ly2 y1 )) return all_lines這段代碼的關(guān)鍵思路是霍夫變換的線段坐標(biāo)用框內(nèi)局部坐標(biāo)系計(jì)算結(jié)果映射回原圖坐標(biāo)時(shí)統(tǒng)一加上(x1, y1)相對(duì)偏移。minLineLength這里按框的高度動(dòng)態(tài)計(jì)算這樣近處大的檢測(cè)框允許更長(zhǎng)的線段遠(yuǎn)處的小框不會(huì)被過(guò)長(zhǎng)的閾值全部濾掉。4.2 引入幾何約束過(guò)濾誤檢斜率、截距與左右分類霍夫變換返回的直線里依然會(huì)混入護(hù)欄、路沿、前車輪廓等干擾線段。比調(diào)參更有效的一層過(guò)濾是幾何約束在圖像坐標(biāo)系下車道線不會(huì)出現(xiàn)在某些斜率和位置組合上。def filter_and_classify(lines, width, height): left_lanes [] right_lanes [] for line in lines: x1, y1, x2, y2 line dx x2 - x1 dy y2 - y1 if dx 0: continue slope dy / dx # 圖像坐標(biāo)系 y 軸向下車道線的斜率特征 # 左車道線為負(fù)斜率從左上到右下右車道線為正斜率 if abs(slope) 0.3: continue # 按線段中心點(diǎn)橫坐標(biāo)除以圖像寬度簡(jiǎn)單區(qū)分左右 center_x (x1 x2) / 2 if center_x width / 2 and slope 0: left_lanes.append(line) elif center_x width / 2 and slope 0: right_lanes.append(line) return left_lanes, right_lanesabs(slope) 0.3過(guò)濾掉接近水平的線段這類線段大概率來(lái)自路面接縫或車輛底盤陰影。斜率閾值的單位不是角度而是像素比值圖像寬高比不同這個(gè)值要微調(diào):1920x1080 的畫(huà)面里 0.3 大致對(duì)應(yīng) 16 度左右的傾角。濾完后按線段質(zhì)心位置做左右分類分類后每側(cè)往往會(huì)留下多條重疊線段用均值合并成一條車道線比最小二乘擬合更穩(wěn)。4.3 項(xiàng)目源碼結(jié)構(gòu)參考與離線驗(yàn)證方法一個(gè)完整的課設(shè)或畢設(shè)項(xiàng)目源碼目錄通常這樣組織project/ ├── weights/ │ └── best.pt # 訓(xùn)練好的 YOLOv5 權(quán)重 ├── utils/ │ ├── preprocessing.py # 圖像預(yù)處理、ROI 掩膜 │ ├── lane_filter.py # 斜率過(guò)濾、左右分類 │ └── visualization.py # 畫(huà)線、畫(huà)框、輸出標(biāo)注視頻 ├── detect.py # 單幀檢測(cè)入口 ├── detect_video.py # 視頻流檢測(cè)入口 ├── train_yolov5.sh # 訓(xùn)練腳本 └── README.md驗(yàn)證階段不要直接用車載視頻看效果先準(zhǔn)備一段標(biāo)注了車道線的測(cè)試視頻跑完檢測(cè)后輸出標(biāo)注結(jié)果視頻逐幀檢查兩類典型問(wèn)題。第一類問(wèn)題是高頻閃爍某幾幀漏檢導(dǎo)致車道線消失。問(wèn)題大概率出在 YOLOv5 的置信度閾值上把self.model.conf從 0.45 降到 0.3 可以緩解。第二類問(wèn)題是線段跳動(dòng)車道線在連續(xù)幀間左右橫跳問(wèn)題出在霍夫參數(shù)太寬松、同一側(cè)車道線檢出了互相競(jìng)爭(zhēng)的線段這時(shí)把threshold提高 10并把合并策略從簡(jiǎn)單均值改成帶滑窗的指數(shù)平滑。帶時(shí)間維度的滑動(dòng)平均是視頻穩(wěn)定最有效的手段class LaneSmoother: def __init__(self, alpha0.6): self.alpha alpha self.left_avg None self.right_avg None def update(self, left_lines, right_lines): # 每個(gè)時(shí)刻的左右車道線取該側(cè)線段均值再套 EMA for side, lines in [(left, left_lines), (right, right_lines)]: if len(lines) 0: continue avg np.mean(lines, axis0) if getattr(self, side _avg) is None: setattr(self, side _avg, avg) else: prev getattr(self, side _avg) smoothed self.alpha * prev (1 - self.alpha) * avg setattr(self, side _avg, smoothed) return self.left_avg, self.right_avg平滑系數(shù)alpha0.6的意思是當(dāng)前幀權(quán)重 40%、歷史權(quán)重 60%數(shù)字越大線越穩(wěn)但延遲越高壓彎道時(shí)會(huì)出現(xiàn)線條跟不上路況的「滯后感」一般不超過(guò) 0.7。5. 彎道處理、曲線擬合與評(píng)估指標(biāo)霍夫直線檢測(cè)的邊界和出路5.1 把直線換成二次曲線擬合霍夫變換輸出的是直線這一天然限制決定了它在彎道上的表現(xiàn)——曲率大的彎道會(huì)被擬合成折線視覺(jué)上像鋸齒。把霍夫輸出的線段端點(diǎn)收集起來(lái)?yè)Q用最小二乘擬合二次多項(xiàng)式可以覆蓋緩彎場(chǎng)景。做法如下取霍夫線段的兩個(gè)端點(diǎn)作為采樣點(diǎn)以 y 為自變量、x 為因變量擬合x(chóng) a * y^2 b * y c這樣擬合出來(lái)的曲線在圖像底部和中部與車道線貼合只在消失點(diǎn)附近偏差增大。P 階數(shù)提到 3 以上意義不大還會(huì)放大遠(yuǎn)端抖動(dòng)。def fit_curve(points, height): ys points[:, 1].astype(np.float64) xs points[:, 0].astype(np.float64) coeffs np.polyfit(ys, xs, 2) plot_y np.linspace(int(height * 0.5), height, 100) plot_x np.polyval(coeffs, plot_y) return np.column_stack((plot_x, plot_y))擬合前對(duì)霍夫線段做一次「遠(yuǎn)端截?cái)唷垢€(wěn)??拷c(diǎn)附近車道線變得非常細(xì)霍夫檢測(cè)到的邊緣位置誤差很大直接用這些采樣點(diǎn)擬合會(huì)明顯偏曲。常見(jiàn)做法是只取圖像下半部分兩側(cè)線段參與擬合上半部分用外推補(bǔ)全。5.2 在公開(kāi)數(shù)據(jù)集上評(píng)估檢測(cè)效果項(xiàng)目源碼提供的檢測(cè)結(jié)果最終要變成量化指標(biāo)。車道線檢測(cè)的評(píng)估指標(biāo)和通用目標(biāo)檢測(cè)不同主流數(shù)據(jù)集的評(píng)估方法如下指標(biāo)計(jì)算方式本項(xiàng)目的參考基線Accuracy預(yù)測(cè)像素與真實(shí)標(biāo)注像素的匹配度正常光照下 0.85 以上FP誤檢預(yù)測(cè)了不在標(biāo)注內(nèi)的車道線像素每幀越低越好FN漏檢標(biāo)注中有但未預(yù)測(cè)出的車道線像素陰影、遠(yuǎn)距離下會(huì)明顯升高IoU預(yù)測(cè)區(qū)域與真實(shí)區(qū)域的交并比0.5 左右即可認(rèn)可TuSimple 數(shù)據(jù)集的評(píng)估腳本計(jì)算每個(gè)點(diǎn)附近的匹配情況對(duì)準(zhǔn)確定義是「預(yù)測(cè)點(diǎn)與標(biāo)注點(diǎn)距離小于某個(gè)閾值視為正確」。如果項(xiàng)目文檔里沒(méi)有附帶評(píng)估腳本可以用一段樸素實(shí)現(xiàn)跑個(gè)大概把預(yù)測(cè)的車道線畫(huà)成 2 像素寬的 mask標(biāo)注也畫(huà)成 mask然后逐點(diǎn)比對(duì)除以標(biāo)注像素總數(shù)就是近似 accuracy。注意要在光照條件和訓(xùn)練集接近的幀上評(píng)估畢設(shè)里最常見(jiàn)的錯(cuò)誤是拿夜間場(chǎng)景測(cè)試白天訓(xùn)練的模型然后得出「識(shí)別率低」的結(jié)論——這不是模型問(wèn)題是任務(wù)定義沒(méi)劃清楚。5.3 超越霍夫語(yǔ)義分割作為后續(xù)擴(kuò)展方向霍夫變換在處理直線、虛線、簡(jiǎn)單彎道時(shí)表現(xiàn)足夠但遇到實(shí)線虛線混合、道路施工改道、強(qiáng)逆光場(chǎng)景時(shí)參數(shù)怎么調(diào)都有瓶頸。后續(xù)如果要擴(kuò)展項(xiàng)目深度思路是顯式引入反向透視變換把畫(huà)面投影到鳥(niǎo)瞰圖再做霍夫或者直接替換成語(yǔ)義分割網(wǎng)絡(luò)如 ENet、LaneNet逐像素分類出車道線。前者工程改動(dòng)小只是多一步相機(jī)標(biāo)定和單應(yīng)性矩陣計(jì)算后者效果更好但數(shù)據(jù)標(biāo)注成本翻倍。這個(gè)項(xiàng)目標(biāo)題的價(jià)值在于用最少的算力把經(jīng)典圖像處理和深度學(xué)習(xí)串成一條完整鏈路——霍夫變換的正確用法是解決局部幾何提取問(wèn)題而不是和深度模型比拼語(yǔ)義理解能力。把這個(gè)定位想清楚后續(xù)每一層優(yōu)化才不會(huì)被帶偏方向。本文還有配套的精品資源點(diǎn)擊獲取