我本人很喜歡物理學家費曼先生,尤其是他的科學精神,我的治學過程受他的啟發很大。當我涉足一個新的知識領域時,只有當我能夠完全推導出這個知識領域的知識框架時,才會認為自己已經學會並掌握了這個知識。
在我第一次投入物件辨識領域時,首要建立的就是這一領域的知識系統。然而,我發現如此熱門的領域竟然連一本較為系統的、理論與實踐相結合的入門書都沒有。雖然能夠在網上搜尋到很多帶有「物件辨識」字眼的技術圖書,可是讀上幾章就發現前半部分充斥著太多機器學習和深度學習的基礎概念和公式,等熬過閱讀這些基礎內容的時間,充滿期待地去讀後半部分時,卻又覺得好料太少,大多時候只停留在對某個流行的物件辨識框架已開源程式碼的講解,以大量篇幅介紹怎麼訓練原始程式碼,怎麼測試開源程式碼,又怎麼在自己的資料集上使用開源程式碼。當我想了解設計一個物件辨識網路的方法、製作訓練所需的正樣本的原理及其實現方法、損失函數的原理、一個物件辨識框架的邏輯的時候,我就迷失在了這些文字的汪洋大海裡。
相反,在很多技術大神的部落格文章和一些技術討論區中,我逐步掌握了一些工作的技術核心,學習了他們架設網路的技術路線、製作正負樣本的數學原理、各種損失函數的效果和物件辨識框架的內在邏輯等知識。在有了這些技術基礎後,透過不斷地模仿和思考,我也逐漸寫出了一套自己的物件辨識專案程式,這對我日後去閱讀新的物件辨識論文、開展前端工作、上手開源程式碼都帶來了很大的幫助。這不僅讓我掌握了一些微觀上的操作細節,也讓我對物件辨識領域有了巨觀上的把握。
但是,當我再回顧自己這段學習的心路歷程時,還是覺得這樣的學習方式,諸如選擇適合初學者的論文、選擇通俗易懂又全面的科普文章等,具有太多的偶然性。如果遲遲沒有找到合適的文章,那就不能理解什麼是YOLO檢測器,什麼又是Detection with Transformers框架。同時,大多數開源程式碼的上手難度較高,「九曲十八彎」的巢狀結構封裝往往讓初學者剛上手就迷失在了一次又一次的程式跳躍裡,更不用說要將一堆堆零散的知識串聯成一個可以印刻在大腦裡的認知框架。
在我寫下這段文字時,深度學習仍舊是以實踐為主,它的重要分支—物件辨識也依舊是以實踐為主的研究領域,但很多相關圖書往往只停留在基礎知識的講解上,所使用的程式也是網上現成的開源程式碼,這對初學者來說通常是不友善的。
在某個閒暇的傍晚,我仰靠在實驗室的椅子上,思索著剛看完的論文,正被其中雲山霧繞般的複雜理論所困擾,那一刻,燦爛的夕陽照亮了灰白的天花板,一切都被溫暖的橘色所籠罩,煥發出鮮活的色彩。我坐直身子,凝視著窗外遠處被柔和的夕陽所點綴的大樓,心曠神怡。忽然間,我萌生了寫一系列我所認可的物件辨識科普文章的念頭,其中既包括對經典論文的解讀,又包括原理層面的講解,最重要的是提供一套可複現的程式,讓讀者能夠從撰寫程式的角度進一步加深對物件辨識的理解,最終將那些我所認為的偶然性都變成必然性。
於是,我開始在知乎( 編按:中國大陸的文章撰寫分享網站) 上寫相關的文章。那時候,我對YOLO很感興趣,這也是物件辨識領域最熱門的物件辨識架構,因而我選擇透過寫YOLO相關的科普文章來講解我所了解的物件辨識領域的基礎知識。
漸漸地,隨著自己對YOLO的認識、對物件辨識領域認識的不斷加深,我寫的科普文章越來越多,內容也越來越詳細。同時,隨著我程式功底的提升,與科普文章書附的程式實現也越來越豐富。我對自己的科普工作有3 點要求:相關論文必須讀透、科普內容必須翔實、程式實現必須親自動手。尤其是第三點,在我看來,是很多科普文章所缺乏的,這些文章最多就是放上已有的開源程式碼來補充內容。或許,正是因為很多讀者能夠在我的科普文章中既習得了感興趣的技術原理,又獲得了一份可以運行的、可讀性較高的程式,理論與實踐相結合,避免了紙上談兵,所以讀者對我的一些文章舉出了積極評價和讚賞。
在這兩年時間中,我堅持跟進物件辨識領域的技術發展,在業餘時間裡動手實現每一個感興趣的模組甚至是整個網路架構,配合自己的程式做深度的論文講解,因此我寫出的科普文章越來越多,還建立了以YOLO為核心的物件辨識入門知乎專欄。儘管在如今這個講究「快」的時代,一點一點學習基礎知識可能不如直接在現有工作的基礎上做一些「增量式改進」來得實在,但我還是堅持自己的理念,繼續進行這方面的科普工作。
如今,在人民郵電出版社編輯的賞識下,我有幸能夠將這些年來的科普文章整理成一本技術圖書,對我來說,這是對我科普工作的一大肯定。我很希望本書能夠填補該領域中入門圖書的空白,為初學者提供一個較好的入門資料。
同時,也由衷地希望這本書能夠抛磚引玉,引來更多的專業人士撥冗探討,引導後人。
那麼, 回到這本書所要涉獵的技術領域: 什麼是物件辨識(object detection)?
在電腦視覺領域中,物件辨識是一個十分基礎的電腦視覺問題,是影像分類(image classification)這個相對簡單且更基礎的任務的諸多下游任務中的重要分支。在影像分類任務中,我們設計一個分類器(classifier)模型,期望這個分類器能夠辨識出給定影像的類別,例如輸入一張有關貓的影像,我們希望分類器能夠判別出輸入影像中的物件是一隻貓。
不過,儘管能夠辨識出「貓」這一類別,但對其所處的空間位置卻幾乎是不知道的。因此,影像分類任務有著明顯的局限性。不同於影像分類任務,在物件辨識任務中,我們需要設計一個檢測器(detector)模型,期望這個檢測器能夠辨識出影像中我們所感興趣的物件,這裡對「辨識」的定義既包括辨識出每個物件的類別,又要定位出每個物件在影像中的位置。舉例來說,輸入一張影像,我們希望檢測器能夠辨識出影像中的「貓」和「電視機」,並採用邊界框的形式來標記物件在影像中所處的空間位置。
乍一看,這樣的任務對人類來說是一件易如反掌的事情,多數人幾乎不需要經過相關的培訓和訓練,即可辨識和定位出現於我們視野中的物體。然而,就是這麼一個對人類來說再簡單不過的任務,對電腦而言,卻是十分困難的。
直到21 世紀初,隨著深度學習中的卷積神經網路(convolutional neuralnetwork, CNN)技術的興起,物件辨識才獲得了長足的發展。儘管在此之前,已經出現了一批基於傳統人工視覺特徵(如HOG特徵)的方法,然而物件辨識在真正意義上的突破還是從深度學習時代開始的。
物件辨識發展至今,可以說是百家爭鳴,百花齊放,不同的演算法有著不同的特色和優勢,倘若我們一一講來,將會是一本長篇且有趣的整體說明類別圖書。但同時也會使這本書變得厚重無比,成為長期放於書架、與塵土作伴的「大部頭」。這並不是我的初衷。
不論是哪一個科學領域,總會有幾個代表性的工作時常被人提起。在物件辨識領域中, YOLO(You Only Look Once)便是這樣的工作之一。YOLO 是一個具有里程碑意義的存在,以在GPU上的即時檢測速度和簡潔的網路架構兩大特點而一鳴驚人,打破了R-CNN系列工作的神話,結束了基於two-stage方法的檢測框架的統治時代,掀開了基於深度學習的物件辨識領域的新篇章,建立了新的物件辨識範式,為這一領域注入了新鮮的、更具有潛在研究價值的新模式。在後續許多出色的工作中,我們都能夠看到YOLO的影子。
時至今日,YOLO網路已從最開始的YOLOv1發展出YOLOv2、YOLOv3和YOLOv4等多個版本。在GitHub上,由非YOLO官方團隊實現的YOLOv5也備受研究者的青睞,以及由曠視科技公司發佈的YOLOX再度將YOLO工作推向了新的高峰。2022 年,美團公司發佈的工業部署友善型的YOLOv6和YOLOv4的作者團隊新推出了YOLOv7,再一次刷新了YOLO系列的性能上限。隨著這些優秀的研究者們不斷致力於最佳化和改善YOLO框架,YOLO幾乎成了物件辨識任務的代名詞,是當前物件辨識社區較活躍,也是較受歡迎的工作。或許終有一天,YOLO將被這個時代所拋棄,但在物件辨識發展史中,YOLO所築下的里程碑將永遠屹立。
正因如此,我斗膽選擇以YOLO為核心,寫下這本以「入門物件辨識」為宗旨的技術圖書。本書可能是第一本以實踐為出發點來講解YOLO網路的教學類別圖書,也是一本對初學者較友善的物件辨識入門書。同時,請允許我以這麼一本基礎書來為各位讀者抛磚引玉。
本書的組織結構
本書包含四大部分,共13章。以下是本書各章內容的簡介。第1部分是「背景知識」,涉及第1章、第2章的內容。
■第1章,「物件辨識架構淺析」。詳略得當地介紹了自深度學習時代以來的物件辨識的發展簡史,以簡略的筆墨向讀者鋪開這一技術發展的畫冊。在這一章中,作者列出了若干經典的物件辨識框架,如R-CNN系列和YOLO系列,說明了當前物件辨識領域的兩大技術流派:兩階段和單階段。同時,介紹了當前流行的物件辨識架構,包含主幹網絡、頸部網路和檢測頭三大部分,這為以後的改進和最佳化工作提供了較為清晰的路線和準則。物件辨識發展得已較為成熟,由於篇幅有限,作者無法將每一部分的所有工作都羅列出來,因此只能挑選其中極具代表性的工作介紹。在了解了相關原理後,建議讀者循序漸進地去了解更多的相關工作,豐富知識系統。
■第2章,「常用的資料集」。介紹了物件辨識領域常用的兩大資料集:PASCAL VOC資料集和MS COCO資料集,其中,MS COCO資料集是最具挑戰性的、當下諸多論文中必不可少的重要資料集之一。了解這些資料集的基本情況,是入門物件辨識領域的基本功之一,有助讀者開展後續工程或學術方面的工作。
第2部分是「學習YOLO框架」,涉及第3章~第8章的內容。
■第3章,「YOLOv1」。詳細講解經典的YOLOv1工作,包括網路結構、檢測原理、訓練中的標籤分配策略、訓練模型的策略以及前向推理的細節。透過本章的學習,讀者將正式邁過物件辨識領域的門檻,對物件辨識任務建立基本的認識,掌握基於YOLO框架的檢測技術路線,這有助開展後續的學習和研究工作。
■第4章,「架設YOLOv1網路」。在第3章所學習的YOLO相關知識的基礎上,透過對YOLOv1的網路結構做適當的改進,著手撰寫相關的網路結構的程式。本章的程式實現環節將有助提升讀者對物件辨識框架的認識,使其對如何基於現有的深度學習框架架設物件辨識網路有一定的基本了解。
■第5章,「訓練YOLOv1網路」。本章進一步撰寫YOLOv1的專案程式,在第4章的基礎上,本章主要撰寫讀取資料、前置處理資料、架設模型、實現標籤匹配、實現訓練和測試程式以及視覺化檢測結果等諸多程式實現內容。透過學習本章,讀者將對如何架設一個物件辨識框架並實現訓練和測試等必要的功能有一個較為清晰的認識。這些認識也將對讀者日後開展深入研究、快速掌握其他開源程式碼的架構起著很大的作用。
■第6章,「YOLOv2」。介紹了自YOLOv1之後的新一代YOLOv2網路,著重介紹了 YOLOv2所採用的各種改進和最佳化方式,有助讀者了解包括批次歸一化層、先驗框、多尺度訓練等在內的關鍵技術。這些技術都是當前主流的物件辨識框架中不可或缺的部分。同時,還對YOLOv2做了一次複現,有助讀者從程式實現的角度進一步加深對YOLOv2的認識,同時鞏固架設物件辨識專案的程式能力。
■第7章,「YOLOv3」。介紹了YOLOv3檢測框架的技術原理和細節。自YOLOv3開始,YOLO系列工作的整體面貌就基本確定下來:強大的主幹網絡和多尺度檢測架構。這兩點在後續的每一代YOLO檢測器中都能清晰展現。同時,也講解了 YOLOv3的程式實現,完成對複現的YOLOv3的訓練和測試。
■第8章,「YOLOv4」。介紹了YOLOv4檢測框架的技術原理和細節,著重介紹了相較於YOLOv3的諸多改進。同時,也講解了複現YOLOv4的相關程式實現,進一步引導讀者從實現的角度加深對YOLOv4的認識和理解,幫助讀者鞏固和強化對一個完整的物件辨識專案程式的認知和實現能力。
第3部分是「較新的YOLO 框架」,涉及第9 章、第10 章的內容。
■第9章,「YOLOX」。介紹了新一代的YOLO框架,講解了YOLOX對YOLOv3的改進以及新型的動態標籤分配,並動手實現了一款較為簡單的YOLOX檢測器。
■第10章,「YOLOv7」。介紹了YOLOv7檢測框架的技術原理,主要介紹了YOLOv7所提出的高效網路架構的實現細節,並動手實現了一款較為簡單的YOLOv7檢測器。
第4 部分是「其他流行的物件辨識框架」,涉及第11章、第12章和第13章的內容。
■第11章,「DETR」。介紹了掀起Transformer在電腦視覺領域中的研究浪潮的DETR,講解了DETR的網路結構,並透過講解相關的開源程式碼來展現DETR的技術細節。
■第12章,「YOLOF」。介紹了新型的單級物件辨識網路,講解了YOLOF獨特的網路結構特點和所提出的標籤匹配,並透過程式實現的方式複現了YOLOF,進一步增強讀者的程式能力。
■第13章,「FCOS」。介紹了掀起無先驗框檢測架構研究浪潮的FCOS檢測器,填補了前文對於無先驗框技術框架的空白,加深了讀者對無先驗框檢測架構的理解和認識。FCOS 是這一架構的經典之作,也是常用的基準線模型,同時,無先驗框技術框架也是當下十分受歡迎的框架。
本書特色
1. 較為全面的YOLO 系列內容解讀
本書以YOLO 系列為核心,圍繞這一流行的通用物件辨識框架來開展本書的技術講解、程式實現和入門知識科普等工作。本書翔實地講解了自YOLOv1 到YOLOv4 的發展狀況和相關技術細節。儘管在本書完稿時,YOLOv4 已經算是「古董」了,但即使是這樣一個「古董」,最新的YOLO 檢測器也沒跳出YOLOv4 的技術框架,無非是在每一個模組中採用了最新的技術,但其基本架構是一模一樣的。因此,在學習YOLOv4 後,就能在巨觀上對YOLO 框架的發展有足夠清晰的認識,同時在微觀上了解和掌握相關的技術細節,為日後讀者自學更新的YOLO 檢測器做足了相關知識儲備,也為後續的改進和最佳化夯實了基礎。書中也提供了大量圖片以幫助讀者更加直觀地理解YOLO 系列。
2. 作者撰寫的開源程式碼
完整、可複現的開源程式碼是本書最大的亮點。本書不僅詳細地講解了YOLO 系列所涉及的理論知識,更是在此基礎上撰寫了大量的相關程式。正所謂「紙上得來終覺淺,絕知此事要躬行」,只有透過閱讀程式、撰寫程式和偵錯程式,才能對YOLO 具備更加全面的認識,而這些認識又會為入門物件辨識領域提供大量的正回饋。本書的絕大多數程式是由作者親手撰寫,部分實現也參考了現有的開源程式碼,而非簡單地借用或套用已開放原始碼的 YOLO 專案程式作為範例,或投機取巧地解讀YOLO 開放原始碼專案。每一次程式實現環節都對應一份完整的物件辨識專案程式,而非零散的程式區塊,其目的是讓讀者能夠一次又一次地建立起對完整的物件辨識專案的認識。本書的諸多經驗和認識都是建立在作者撰寫的大量豐富程式的基礎上,使得讀者既能夠在閱讀此書時對YOLO 建立起一個基礎認識,同時又能夠透過閱讀、模仿、撰寫和偵錯程式建立起對YOLO 的理性認識。
3. 經典工作的解讀和程式實現
除YOLO 之外,本書還講解了流行的物件辨識框架(如DETR、YOLOF 和FCOS),同時,也提供了由作者撰寫的完整的專案程式,以便讀者閱讀、複現和偵錯。透過學習這些YOLO 之外的工作,有助讀者將從YOLO 專案中學到的知識橫向地泛化到其他檢測框架中,進一步加深對物件辨識的認識,同時還能夠縱向地摸清、看清物件辨識領域的發展趨勢,掌握更多的技術概念,為後續的「踐行」做足準備。
本書目標讀者
本書主要具有一定神經網路基礎知識、了解深度學習導向的基本概念、想要踏踏實實地夯實物件辨識基礎知識的初學者。同時,對於在工作中對YOLO 框架有一定涉獵,但缺乏對相關技術的了解和掌握,並打算學習相關技術、掌握基礎概念的演算法工程師和軟體工程師也同樣適用。
本書採用自底向上、由淺入深、理論與實踐相結合的講解方式,幫助讀者建立起較為紮實的物件辨識知識系統,有助開展後續的研究工作。
閱讀本書需具備的基礎知識
由於本書不會去講解過多的機器學習和深度學習的基本概念,因此希望讀者在閱讀此書時,已經具備了一些機器學習、神經網路、深度學習和電腦視覺領域相關的基礎知識。同時,我們也希望讀者具備Python 語言、NumPy 函數庫和PyTorch 深度學習框架使用基礎,以及對流行的電腦開放原始碼函數庫OpenCV 的基本操作有所了解和使用經驗。
另外,為了能夠順利偵錯本書提供的開源程式碼,還需要讀者對Ubuntu 作業系統具有一些操作經驗。儘管本書的大多數程式也能在Windows 系統下正常運行,但不排除極個別的操作只能在Ubuntu 系統下運行。同時,讀者最好擁有一片性能不低於GTX 1060 型號的顯示卡,其顯示記憶體容量不低於3GB,並且具備安裝CUDA、cuDNN 和Anaconda3 的能力,這些硬體和軟體是運行本書程式的必要條件。
致謝
感謝我的導師李瑞峰對我這些年的博士課題研究的支持和指導,感謝我的父親和母親的支持,也感謝我所在實驗室的師兄、師弟和師妹的支持。沒有你們的支持,就不會有這本書,是你們給予了我創作的動機、勇氣和決心,是你們的支援賦予了我工作的最大意義。
感謝人民郵電出版社的傅道坤編輯在本書的創作過程中提供指導、審閱書稿並回饋大量積極的修改建議,感謝人民郵電出版社的單瑞婷編輯在本書的審閱和校對階段所付出的努力和不辭辛勞的幫助,也感謝人民郵電出版社的陳聰聰編輯的賞識以及楊海玲編輯提供的幫助和支援。
感謝人民郵電出版社的工作人員為科技圖書的普及做出的貢獻。 |