PyTorch自動駕駛視覺感知算法實戰(zhàn) 劉斯坦
定 價:119 元
叢書名:計算機前沿技術叢書
《PyTorch自動駕駛視覺感知算法實戰(zhàn)》全面介紹了自動駕駛系統(tǒng)中深度學習視覺感知的相關知識,包括深度神經(jīng)網(wǎng)絡和深度卷積神經(jīng)網(wǎng)絡的基本理論,深入講解了自動駕駛中常用的目標檢測、語義、實例分割和單目深度估計四種視覺感知任務。《PyTorch自動駕駛視覺感知算法實戰(zhàn)》對自動駕駛工程實踐中很重要但經(jīng)常被忽略的知識進行了全面總結,包括多任務模型的損失平衡、Ubuntu操作系統(tǒng)、Anaconda和Docker等環(huán)境配置工具、C 開發(fā)環(huán)境搭建、神經(jīng)網(wǎng)絡壓縮、模型導出和量化、TensorRT推理引擎等和部署相關的技術。《PyTorch自動駕駛視覺感知算法實戰(zhàn)》各個任務都由PyTorch實現(xiàn),模型部署的代碼則提供C 實現(xiàn),并附帶一個中等規(guī)模的自動駕駛數(shù)據(jù)集用于示例。所有代碼都公開在Github公開源碼倉庫上,很多代碼可以直接用于生產(chǎn)環(huán)境,且提供了商業(yè)友好的代碼許可證。《PyTorch自動駕駛視覺感知算法實戰(zhàn)》適用于具備基本機器學習知識,有志于從事自動駕駛算法工作的學生,也適用于剛邁入職場,面對各種陌生技術無所適從的初級工程師。同時,本書也可供中高級算法工程師作為案頭常備書籍,以便查閱。
《PyTorch自動駕駛視覺感知算法實戰(zhàn)》融合了資深開發(fā)工程師多年一線工作經(jīng)驗,對自動駕駛涉及的主要視覺任務進行了深入講解;對自動駕駛工程實踐中很重要,但經(jīng)常被忽略的知識進行了全面總結;附帶一個中等規(guī)模的自動駕駛數(shù)據(jù)集便于讀者上手實踐。內(nèi)容循序漸進、由淺入深,詳盡的代碼、圖文講解。書中操作部分配有二維碼視頻,使讀者身臨其境,迅速、深入地掌握各種經(jīng)驗和技巧。
2012年,多倫多大學Geoffrey Hinton教授指導的學生Alex Krizhevsky發(fā)表了AlexNet深度卷積神經(jīng)網(wǎng)絡模型,在ImageNet圖像識別任務上大幅超越第二名,開啟了深度學習的新紀元。同年,筆者于慕尼黑工業(yè)大學畢業(yè),彼時,筆者選修了Daniel Cremers教授開設的多門課程,醉心于學習凸優(yōu)化、微分幾何等經(jīng)典計算機視覺的理論知識,對卷積神經(jīng)網(wǎng)絡一無所知,絲毫感覺不到一個人工智能的偉大時代就此揭開帷幕。25年前,也是在慕尼黑工業(yè)大學計算機系,Jrgen Schmidhuber教授指導的學生Sepp Hochreiter發(fā)表了論文LSTM(Long Short-Term Memory),他們也決然無法預料,被SVM等機器學習方法打敗的仿生人工智能,居然會在幾十年后忽然起死回生,迎來爆發(fā)式發(fā)展。從2012年AlexNet的發(fā)表到今天,不過10年有余,卷積神經(jīng)網(wǎng)絡和相關硬件的發(fā)展可謂一日千里。筆者在自動駕駛視覺感知領域從業(yè)五年,深感這個領域教育資源的發(fā)展遠遠跟不上學術界和工業(yè)界的發(fā)展。該領域涉及的知識龐雜,既廣又深:知識廣度方面,從最優(yōu)化理論,常用模型的特點,到使用C 編寫高性能、高可靠性的程序和對各種神經(jīng)網(wǎng)絡加速芯片的了解,都屬于自動駕駛感知算法工程師技術棧的覆蓋范圍;知識深度方面,工程師要對卷積神經(jīng)網(wǎng)絡的數(shù)學理論有足夠深入的理解,而不應止步于調(diào)參的范圍。也就是說,一個自動駕駛算法工程師,不但要有深厚的數(shù)學基礎,掌握凸優(yōu)化和統(tǒng)計學,還要熟悉高性能嵌入式軟件的編寫,這是一個橫跨學術界和工業(yè)界的多面手職業(yè)。尤其是自動駕駛行業(yè)一日千里,很多工程師只能在工作中邊干邊學,一路走來可謂磕磕絆絆,如果能有一本書全面覆蓋自動駕駛感知算法工程師的能力圈,那職業(yè)之路走起來就會順暢很多。筆者就是出于這個目的,根據(jù)自己的職業(yè)經(jīng)驗和理論知識,編寫了本書。本書特點考慮到上文提及的自動駕駛感知算法工程師的種種職業(yè)特點,本書的內(nèi)容將會兼顧計算機視覺學術界的最新研究成果和自動駕駛的工程實踐。兼顧細節(jié)與理論深度學習的很多算法用公式或語言來描述會困難重重,用示意圖來表現(xiàn)則是一目了然。對算法和模型的細節(jié),筆者繪制了大量的三維示意圖進行講解,爭取讓讀者一看就懂。但光有細節(jié)是不夠的,深度學習算法工程師常被取笑為調(diào)參俠煉丹師。這是因為卷積神經(jīng)網(wǎng)絡被認為是一個巨大的黑盒(Black Box),其運作規(guī)律難以為人類所理解。誠然,深度學習的理論仍在構建之中,尚不完善,但學術界從未停止過對深度學習的理解。已經(jīng)有大量學術成果能加深人們對卷積神經(jīng)網(wǎng)絡各種現(xiàn)象的理解,本書將吸收這些成果對神經(jīng)網(wǎng)絡的運作進行解釋。例如,ResNet的有效性,除了原論文中的解釋,還有其他學者也對其進行了研究,產(chǎn)生了新的理解,這些研究也被納入到本書中來。總之,筆者爭取讓讀者知其然,也知其所以然,超越調(diào)參俠的職業(yè)定位。注重動手實踐本書除了對理論進行深入淺出的講解,也注重將理論落到實處。深度學習一個很大的特點是一看就懂,一做就懵。理論很熟悉了,但實際操作起來會遇到各種各樣的小問題。這是因為算法工程師應能將數(shù)學符號和代碼中的數(shù)據(jù)結構連接起來,這是這個職業(yè)所需要的獨特能力。本書對重要的模型細節(jié)都展示了代碼示例,對代碼中各個張量的維度,各維度的含義都有詳細的注釋和講解。對于復雜的模型,筆者直接在公式下方展示代碼,盡量做到讓讀者從公式中的符號輕松地落實到代碼中的變量中。提供迷你數(shù)據(jù)集自動駕駛視覺感知任務的另一個特點是任務多而雜,每個任務往往都有一些通用的數(shù)據(jù)集。例如,深度估計有KITTI數(shù)據(jù)集,語義分割有Cityscape,目標檢測有nuScenes等。學習的時候往往會遇到的一個問題是每一個任務都要下載一個巨大無比的數(shù)據(jù)集,并專門寫接口。如果要進行多任務訓練,往往需要nuScenes等巨型數(shù)據(jù)集,而且標注還不全面。如果只用于學習的目的,雜亂而龐大的數(shù)據(jù)集無疑大大增加了學習的時間和經(jīng)濟成本。為此筆者特意自制了一個方便學習的迷你數(shù)據(jù)集。數(shù)據(jù)集采集于德國慕尼黑一片安靜的城區(qū),場景類似于KITTI,僅包含7000多幀圖像。筆者使用當時精度最高的目標檢測和語義分割網(wǎng)絡對這個迷你數(shù)據(jù)集進行標注,并逐幀對標注的偽真值進行后期處理,盡量獲得高質(zhì)量的標注數(shù)據(jù)。數(shù)據(jù)集是一個連續(xù)的視頻,筆者還對相機進行了標定,故可以用于無監(jiān)督深度估計任務。強調(diào)模型部署落地正如上文所說,要成為一個優(yōu)秀的算法工程師,其工作內(nèi)容不僅是調(diào)參那么簡單,另一塊重要的工作內(nèi)容就是將模型部署到生產(chǎn)環(huán)境。對于互聯(lián)網(wǎng)行業(yè)的算法工程師來說,模型部署可能相對簡單,有成熟的工具鏈支持,但自動駕駛的模型部署就復雜得多了。首先自動駕駛系統(tǒng)運行的硬件平臺往往不是常見的x86平臺,自動駕駛系統(tǒng)的模型部署,其實已經(jīng)屬于嵌入式軟件開發(fā)了。其次,自動駕駛系統(tǒng)實時性高,吞吐率需要達到10FPS(Frame-Per-Second)或更高,同時需要運行的神經(jīng)網(wǎng)絡模型很多,而硬件平臺上的神經(jīng)網(wǎng)絡加速器往往算力有限。因此,為了將神經(jīng)網(wǎng)絡模型部署到算力有限的硬件平臺,并達到實時性要求,需要結合硬件的特點對模型進行設計和壓縮。模型的部署涉及模型壓縮、模型導出、Nvidia芯片的模型量化和模型推理、C 的開發(fā)等知識,都是深度學習課堂上不會涉及的工程實踐內(nèi)容。這些工程實踐知識是非常重要的,但超出了很多長期在Ubuntu和Python開發(fā)環(huán)境下的讀者的舒適區(qū)。本書將全面覆蓋相關知識,幫助讀者更輕松地擴大自己的舒適區(qū),為將來的工作做好準備。 本書內(nèi)容第1章講解卷積神經(jīng)網(wǎng)絡的理論基礎,用簡潔的篇幅介紹了神經(jīng)網(wǎng)絡和卷積神經(jīng)網(wǎng)絡的基礎知識。包括反向傳播的推導、神經(jīng)網(wǎng)絡的各種網(wǎng)絡層、常用的損失函數(shù)、正則化、優(yōu)化器和學習率調(diào)整方法等。第2章介紹深度學習開發(fā)的常用工具,從顯卡和操作系統(tǒng)的概念,到Python開發(fā)中用到的常用工具。例如,pip包管理器、Anaconda虛擬環(huán)境以及NumPy和OpenCV 兩個常用的庫。最后配合示例代碼著重講解PyTorch的使用,示例代碼將實現(xiàn)一個簡單的卷積神經(jīng)網(wǎng)絡并進行訓練。第3章講解卷積神經(jīng)網(wǎng)絡中主干網(wǎng)絡的概念。本章首先介紹主干網(wǎng)絡在卷積神經(jīng)網(wǎng)絡中的位置和作用,以及對比學習等主干網(wǎng)絡預訓練技術。之后會對最常用的幾種主干網(wǎng)絡的特點和使用場景進行講解。最后通過示例代碼展示如何加載TorchVision中的主干網(wǎng)絡模型。第4章介紹自動駕駛系統(tǒng)中最經(jīng)典的一個任務目標檢測。本章首先講解目標檢測算法中的幾個基本概念,如錨框、極大值抑制、一階段和兩階段算法等。隨后以FasterRCNN為例介紹兩階段網(wǎng)絡,以Yolo為例講解一階段網(wǎng)絡,以CenterNet為例講解無錨框網(wǎng)絡。最后講解Yolo的PyTorch示例代碼。第5章聚焦于自動駕駛系統(tǒng)中和圖像分割有關的兩個任務:語義分割和實例分割。本章講解語義分割的網(wǎng)絡結構、損失函數(shù)、常用精度指標等基礎知識。也會涉及實際工作中需要解決的問題,尤其會介紹語義分割模型的幾種信息融合方法和設計思路。本章5.3節(jié)介紹三個實例分割算法,特別是會介紹一種半監(jiān)督的實例分割算法。最后介紹計算機視覺領域最常用的框架OpenMMLab的系統(tǒng)結構和使用方法。第6章的內(nèi)容是近幾年來新出現(xiàn)的自動駕駛感知任務單目深度估計。本章首先介紹多視圖三維幾何理論,然后講解單目深度估計的無監(jiān)督訓練方法,最后結合實際工作中會遇到的若干難點提出一些解決方案。第7章分為兩部分,第一部分介紹多任務網(wǎng)絡的結構和設計思路,著重介紹多任務網(wǎng)絡訓練時的損失平衡問題及其基于不確定度的損失平衡方案;第二部分介紹神經(jīng)網(wǎng)絡的壓縮,以通道剪枝為例介紹L1正則化增加網(wǎng)絡稀疏度和可微通道剪枝的網(wǎng)絡壓縮方法。最后通過示例代碼講解如何用PyTorch實現(xiàn)網(wǎng)絡壓縮。第8章講解神經(jīng)網(wǎng)絡模型的部署,包括C 開發(fā)環(huán)境的搭建,LibTorch和TensorRT這兩個神經(jīng)網(wǎng)絡推理庫。最后介紹模型量化的相關理論知識和工程實踐,并對FP32精度模型和INT8精度模型進行精度與推理速度對比。本書代碼資源本書強調(diào)動手實踐,筆者為本書的出版制作了一個迷你數(shù)據(jù)集,并為大部分內(nèi)容編寫了代碼。代碼均以MIT許可證開源,既可用于學習,也可直接應用于日常工作中。開源代碼托管于代碼庫https://github.com/vision-adas/code。開源代碼的具體內(nèi)容詳見代碼庫的README頁面,迷你數(shù)據(jù)集的下載鏈接也公布于此。代碼庫中代碼包括:1)目標檢測和語義分割多任務網(wǎng)絡模型的全套訓練代碼。2)無監(jiān)督單目深度估計的全套訓練代碼。3)多任務模型的網(wǎng)絡壓縮代碼。4)將模型導出為onnx、pt和TensorRT格式的模型導出代碼。5)在目標硬件上使用LibTorch和TensorRT部署模型的C 示例代碼。6)配置代碼環(huán)境所需的Dockerfile。 致謝筆者長年在知乎論壇的深度學習社區(qū)參與討論,很多對深度學習的理解都來自于社區(qū)討論。網(wǎng)友的批評指正和提問都是對筆者的鞭策,而關注者的認可也在激勵筆者不斷進步,特此對網(wǎng)友們表示感謝。本書成書于疫情期間,父母對筆者長年不回國探親報以極大的寬容和理解,長時間的專注讓本書得以完成。筆者的小伙伴楊丹青對本書的第1章進行了審閱,對行文提出了很多有價值的建議,更要感謝她對筆者疏于陪伴的諒解。
劉斯坦,本科畢業(yè)于上海交通大學,碩士畢業(yè)于德國慕尼黑工業(yè)大學。深度學習資深工程師,從事無人駕駛智能感知系統(tǒng)的研發(fā)工作。在德國相關領域從業(yè)超過十年,負責無人駕駛系統(tǒng)中多個神經(jīng)網(wǎng)絡模型在量產(chǎn)車的落地以及中國地區(qū)的本地化。劉斯坦對深度學習的各個領域不但有著全景式的理解,還具備從數(shù)學理論到部署產(chǎn)品線的知識縱深。這種即廣又深全面覆蓋的知識面,相信能為讀者帶來更開闊的視野。
前言第1章 卷積神經(jīng)網(wǎng)絡的理論基礎1.1神經(jīng)網(wǎng)絡回顧1.1.1神經(jīng)網(wǎng)絡模型1.1.2神經(jīng)網(wǎng)絡的訓練反向傳播算法1.1.3神經(jīng)網(wǎng)絡的擬合能力和泛化能力1.2什么是卷積神經(jīng)網(wǎng)絡1.2.1什么是卷積運算1.2.2通道(Channel)和三維卷積1.2.3為什么需要深度網(wǎng)絡1.2.4什么是批次(Batch)1.3卷積神經(jīng)網(wǎng)絡的組成細節(jié)1.3.1卷積神經(jīng)網(wǎng)絡的輸入層1.3.2神經(jīng)網(wǎng)絡的輸出層1.3.3卷積層和轉(zhuǎn)置卷積層1.3.4激活層1.3.5歸一化層1.3.6上采樣層和下采樣層1.3.7池化層1.3.8跳躍、空間注意力等特殊的連接方式1.3.9構建一個復雜的卷積神經(jīng)網(wǎng)絡1.4卷積神經(jīng)網(wǎng)絡的訓練1.4.1常用損失函數(shù)1.4.2常用的正則化方法1.4.3常用的優(yōu)化器1.4.4常用的訓練學習率調(diào)整方法第2章 深度學習開發(fā)環(huán)境及常用工具庫2.1硬件和操作系統(tǒng)2.1.1顯卡2.1.2操作系統(tǒng)2.2Python開發(fā)環(huán)境管理2.2.1Anaconda虛擬環(huán)境的管理2.2.2Python的包管理器pip2.3常用的Python包2.3.1NumPyPython科學計算庫2.3.2OpenCVPython圖像處理庫2.4GPU加速的深度學習和科學計算庫PyTorch2.4.1GPU加速的科學計算功能2.4.2PyTorch的自動求導功能2.4.3PyTorch的優(yōu)化器2.4.4PyTorch的數(shù)據(jù)加載2.4.5用PyTorch搭建神經(jīng)網(wǎng)絡2.4.6常用的輔助工具2.4.7搭建一個神經(jīng)網(wǎng)絡并進行訓練第3章 神經(jīng)網(wǎng)絡的特征編碼器主干網(wǎng)絡3.1什么是神經(jīng)網(wǎng)絡的主干網(wǎng)絡3.1.1神經(jīng)網(wǎng)絡的元結構3.1.2神經(jīng)網(wǎng)絡的主干網(wǎng)絡及有監(jiān)督預訓練3.1.3主干網(wǎng)絡的自監(jiān)督預訓練3.2流行的主干網(wǎng)絡3.2.1簡單直白的主干網(wǎng)絡類VGG網(wǎng)絡3.2.2最流行的主干網(wǎng)絡ResNet系列網(wǎng)絡3.2.3速度更快的輕量級主干網(wǎng)絡MobileNet系列3.2.4自由縮放的主干網(wǎng)絡RegNet系列3.3使用TorchVision模型庫提供的主干網(wǎng)絡3.3.1構建和加載模型3.3.2修改主干網(wǎng)絡獲取多尺度特征圖3.3.3不同主干網(wǎng)絡和預訓練模型的訓練對比第4章 目標檢測網(wǎng)絡識別車輛4.1目標檢測基本概念4.1.1Anchor4.1.2NMS4.1.3目標檢測網(wǎng)絡的類別4.2以Faster RCNN為代表的兩階段檢測方法4.2.1RPN網(wǎng)絡4.2.2ROI網(wǎng)絡4.2.3使用TorchVision模型庫中的Faster RCNN4.3以Yolo為代表的一階段檢測方法4.3.1YoloV3的整體結構4.3.2Yolo的訓練4.3.3類Yolo的一階段檢測網(wǎng)絡4.4以CenterNet為代表的Anchor-Free方法4.4.1CenterNet的整體結構4.4.2用高斯模糊和Focal Loss訓練CenterNet4.4.3YoloX網(wǎng)絡4.5Yolo的PyTorch實現(xiàn)4.5.1樣本選擇算法的實現(xiàn)4.5.2Yolo層的實現(xiàn)4.5.3構造損失函數(shù)4.5.4NMS的實現(xiàn)第5章 語義分割與實例分割逐像素分類5.1語義分割5.1.1語義分割的網(wǎng)絡構架和損失函數(shù)5.1.2評價語義分割質(zhì)量的指標5.1.3使用OHEM和類別權重解決樣本不均衡問題5.1.4語義分割的關鍵信息融合5.2使用PyTorch訓練一個語義分割模型5.2.1語義分割的數(shù)據(jù)加載5.2.2加載Lite R-ASPP語義分割模型進行訓練5.2.3計算混淆矩陣5.2.4計算mIoU5.3實例分割分辨行人和車輛5.3.1以Mask-RCNN為代表的兩階段實例分割方法5.3.2以SOLO為代表的單階段實例分割方法5.3.3基于CondInst的半監(jiān)督實例分割方法BoxInst5.4安裝及使用OpenMMLab以MMDetection為例5.4.1安裝和配置MMDetection5.4.2MMDetection介紹5.4.3SOLO代碼解析第6章 單目深度估計重建三維世界6.1計算機三維視覺基礎知識6.1.1相機模型6.1.2什么是深度圖6.1.3相機運動模型6.2單目深度估計的網(wǎng)絡構架6.2.1深度圖預測網(wǎng)絡6.2.2基于相對視差的深度圖輸出編碼6.2.3基于有序回歸的深度圖輸出編碼6.2.4相機運動估計網(wǎng)絡6.3無監(jiān)督學習的機制6.3.1無監(jiān)督學習系統(tǒng)構架6.3.2將深度圖反投影為點云的PyTorch實現(xiàn)6.3.3從相鄰幀采集RGB值并重投影的PyTorch實現(xiàn)6.3.4無監(jiān)督單目深度推斷的損失函數(shù)6.4可能存在的問題及解決方案6.4.1用圖像梯度圖解決邊緣模糊問題6.4.2用圖像一致性掩膜解決移動物體問題6.4.3用速度損失解決尺度問題第7章 通過控制網(wǎng)絡結構提高速度和精度7.1使用多任務網(wǎng)絡構架提高速度和精度7.1.1多任務網(wǎng)絡的設計7.1.2多任務網(wǎng)絡的任務平衡問題7.2用PyTorch搭建一個語義分割和目標檢測雙任務網(wǎng)絡7.2.1多任務數(shù)據(jù)加載7.2.2多任務網(wǎng)絡的搭建7.2.3多任務損失的平衡7.3壓縮神經(jīng)網(wǎng)絡提高推理速度7.3.1什么是神經(jīng)網(wǎng)絡壓縮7.3.2幾種常見的通道剪枝方法7.3.3在訓練中使用L1正則化壓縮權重7.3.4使用可微通道加權進行通道剪枝7.3.5網(wǎng)絡壓縮的流程7.4用PyTorch實現(xiàn)可微網(wǎng)絡壓縮7.4.1用PyTorch構造可微通道選擇層7.4.2利用通道選擇層確定壓縮方案7.4.3對PyTorch模型進行壓縮并對比運行速度第8章 導出和部署神經(jīng)網(wǎng)絡模型8.1配置開發(fā)環(huán)境8.1.1Docker的使用8.1.2配置C 開發(fā)環(huán)境8.2使用LibTorch部署PyTorch模型8.2.1導出TorchScript模型8.2.2將LibTorch加入CMake項目8.2.3將輸入圖像轉(zhuǎn)換為Tensor8.2.4加載TorchScript模型并進行推理8.3用TensorRT部署模型