境下復現(xiàn)Faster R-CNN完整教程:TensorFlow+PyCharm實戰(zhàn))
很多人一聽到Faster R-CNN第一反應就是“必須得有GPU”否則根本跑不起來。實際上我在Windows上用CPU完整復現(xiàn)過TensorFlow版本的Faster R-CNN配合PyCharm做調(diào)試不僅代碼能跑通訓練和推理也都能正常出結(jié)果只是速度慢一些而已。這篇帖子就圍繞Faster-RCNN-tf-windows-python-pycharm這條技術(shù)路線把我在CPU環(huán)境下復現(xiàn)代碼的完整過程講清楚包括環(huán)境怎么搭、源碼怎么讀、參數(shù)怎么調(diào)、坑在哪里希望能給你省下幾天的排查時間。1. 復現(xiàn)之前必須先弄明白這個模型到底在做什么1.1 Faster R-CNN的三大網(wǎng)絡塊和各自職責Faster R-CNN是一個典型的兩階段目標檢測模型但它的“兩階段”不是指兩個獨立的網(wǎng)絡在串聯(lián)跑而是同一個骨干網(wǎng)絡提取特征后分叉出兩條分支。我用一個容易理解的方式來拆解骨干網(wǎng)絡負責從原始圖片里抽取特征。當年比較流行的選擇是VGG16輸入圖片會被歸一化到固定尺寸例如短邊600像素、長邊1000像素以內(nèi)經(jīng)過一系列卷積和池化后得到一個大為縮小但通道加深的特征圖。這個特征圖可以看作一種“濃縮版畫面”保留了物體的空間位置信息和語義信息。RPN區(qū)域提議網(wǎng)絡在這張?zhí)卣鲌D上滑動小窗口為每個位置生成9個不同尺寸和比例的錨框然后判斷這些錨框里是否包含前景物體并粗調(diào)錨框的位置。它輸出的是一批可能包含物體的候選區(qū)域通常有幾百到兩千個。檢測頭負責對RPN給出的候選區(qū)域做最終分類和坐標精修。由于候選區(qū)域的尺寸各不相同ROI Pooling層會把每個候選區(qū)域內(nèi)的特征統(tǒng)一池化成相同尺寸比如7×7然后送入全連接層輸出具體的類別概率和精確的邊框坐標。這三個模塊合在一起才是完整的Faster R-CNN。訓練時損失函數(shù)也分為RPN的分類損失、RPN的回歸損失、檢測頭的分類損失、檢測頭的回歸損失四部分。理解了這條鏈路你后面讀源碼時就不會迷失在文件堆里。1.2 為什么TensorFlow實現(xiàn)特別適合作為復現(xiàn)目標深度學習框架層出不窮但TensorFlow 1.x時代積累下來的Faster R-CNN工程代碼對學習而言仍然有不可替代的價值因為它的工程結(jié)構(gòu)非常完整數(shù)據(jù)集處理、網(wǎng)絡定義、訓練循環(huán)、測試腳本、可視化工具都分得清清楚楚。你跟著代碼走一遍等于把目標檢測的完整工程鏈學了一遍。相比PyTorch風格的實現(xiàn)TensorFlow 1.x的靜態(tài)圖模式有一個特點先構(gòu)建計算圖再在Session里喂數(shù)據(jù)執(zhí)行。這個特點在CPU平臺上反而有一個好處——每一步算子執(zhí)行情況非常明確計算圖的每個節(jié)點都能通過TensorBoard可視化檢查你甚至能清楚地看到每個張量在哪個環(huán)節(jié)被創(chuàng)建、在哪個環(huán)節(jié)被消耗。另外社區(qū)里傳播很廣的那份經(jīng)典TensorFlow實現(xiàn)對CPU環(huán)境沒有太多性能上的惡意要求默認配置的batch size就是1這意味著顯存和內(nèi)存壓力都很小CPU機器完全扛得住。1.3 這種方式適合誰、不適合誰我的結(jié)論很明確如果你是想快速刷榜、處理海量數(shù)據(jù)或者參加比賽CPU復現(xiàn)Faster R-CNN不是好選擇訓練速度會讓你崩潰。但如果你是為了理解目標檢測的原理、完成課程設計、做畢業(yè)設計或者要在小規(guī)模自定義數(shù)據(jù)集上驗證算法可行性這套方案完全可以應付。CPU復現(xiàn)的另一個合適場景是代碼級調(diào)試。在GPU環(huán)境下每一步操作都很快反而沒有耐心去逐行追蹤數(shù)據(jù)流在CPU上你被迫等待節(jié)奏放慢你可以用PyCharm的斷點功能在每一個關鍵環(huán)節(jié)停下來觀察張量形狀和數(shù)值這種學習效果是GPU跑一千次也換不來的。2. Windows環(huán)境搭建版本組合是成敗的關鍵2.1 一份經(jīng)過驗證的依賴清單與版本組合復現(xiàn)老代碼最頭疼的事情是版本匹配。TensorFlow 1.x的代碼在TensorFlow 2.x下有一堆API會被移除直接跑必然報錯例如tf.Session、tf.placeholder等。所以我的第一原則是代碼用什么時代的API環(huán)境就匹配什么時代。以下是一套我在Windows 10 64位系統(tǒng)上實際驗證過的組合軟件推薦版本說明Python3.6.8TensorFlow 1.13.1在Python 3.6下支持最穩(wěn)定TensorFlow1.13.1 CPU版帶MKL加速CPU推理速度比早期版本好一些PyCharmCommunity版即可調(diào)試功能夠用numpy1.16.4與TensorFlow 1.13兼容良好scipy1.2.1太高版本會找不到部分模塊opencv-python4.1.x用于圖片讀取和結(jié)果可視化cython0.29.x編譯部分C擴展代碼easydict1.9訪問配置字典用點號方式pillow6.2.0圖片處理matplotlib3.x可視化loss曲線重點提醒一下不要為了“追求新版本”去裝最新的Python或TensorFlow這會踩進一堆莫名其妙的坑里。很多老項目代碼里的寫法只認這些老接口。如果你的某個基礎庫版本不得不上調(diào)一定要逐個測試兼容性不能想當然。2.2 PyCharm項目結(jié)構(gòu)、解釋器設置與編譯擴展拿到代碼后我是這樣組織目錄的Faster-RCNN-TF/ ├── experiments/ # 訓練腳本和日志輸出 ├── lib/ # 核心代碼庫 │ ├── datasets/ # 數(shù)據(jù)集讀取 │ ├── networks/ # 網(wǎng)絡結(jié)構(gòu)定義 │ ├── fast_rcnn/ # 訓練配置、測試接口 │ ├── utils/ # 工具函數(shù) ├── data/ # 數(shù)據(jù)和預訓練權(quán)重 │ ├── VOCdevkit2007/ # 自定義數(shù)據(jù)集 │ ├── pretrain_model/ # VGG16預訓練權(quán)重 ├── tools/ # 訓練、測試、demo入口 ├── output/ # 訓練日志與模型保存在PyCharm里打開這個目錄然后進入Settings里的Project Interpreter選擇你安裝好的Python 3.6環(huán)境。這里有一個關鍵點代碼里有幾個Cython擴展模塊第一次使用前必須編譯否則運行時會提示找不到某些子模塊。編譯的方式是在終端里進入對應目錄執(zhí)行python setup.py build_ext --inplace這一步需要系統(tǒng)里有可用的C編譯工具。Windows上通常要裝Visual C Build Tools或者Visual Studio的C組件。裝完之后如果環(huán)境變量沒刷新生效重新打開一個終端再試。編譯完成以后其他代碼就能直接import這些擴展模塊了。如果這一步編譯失敗99%的情況是C編譯工具沒裝全而不會是你的Python環(huán)境有問題。2.3 準備訓練數(shù)據(jù)最省心的方式是跑通一個小數(shù)據(jù)集很多人在復現(xiàn)項目時喜歡直接拿完整的大型數(shù)據(jù)集去訓練結(jié)果一下就跑好幾個小時期間問題還不斷。我的建議是先構(gòu)造一個極小的自定義數(shù)據(jù)集只包含200到300張圖片、兩三個類別把整個流程徹底跑通再考慮用更多數(shù)據(jù)。數(shù)據(jù)集的組織方式按照PASCAL VOC的目錄結(jié)構(gòu)來data/VOCdevkit2007/ ├── VOC2007/ │ ├── Annotations/ # 存放XML標注文件 │ ├── JPEGImages/ # 存放圖片 │ ├── ImageSets/ │ │ └── Main/ # 存放train.txt、val.txt等列表文件XML標注文件的格式也必須符合VOC規(guī)范里面要包含object節(jié)點每個object節(jié)點里有name、bndbox坐標等信息。如果你的原始標注是其他格式可以用腳本轉(zhuǎn)換這個是常規(guī)操作網(wǎng)上有大量參考腳本按自己的文件格式改一改就行。生成train.txt、val.txt時每行只寫圖片的文件名前綴不包含擴展名。例如lane_001 lane_002 ...2.4 預訓練權(quán)重沒有它在CPU上從頭訓會非常痛苦Faster R-CNN的骨干網(wǎng)絡按慣例使用ImageNet上預訓練過的VGG16權(quán)重初始化。沒有這個預訓練權(quán)重在CPU上從零開始訓練收斂速度會慢到讓你懷疑人生。預訓練權(quán)重文件的放置路徑一般在data/pretrain_model/vgg_16.ckpt注意下載時要確認文件格式是ckpt格式而不是別的格式。下載好之后放到指定目錄并在配置文件中確認權(quán)重路徑指向正確。實際操作時我建議訓練前先跑一次代碼流程確認權(quán)重真的被加載了而不是加載了空白參數(shù)。怎么確認呢可以在初始化Session的地方打印一兩層卷積層的變量名和值范圍看到數(shù)值接近ImageNet訓練出的合理范圍就沒問題了。3. 源碼閱讀先用放大鏡看數(shù)據(jù)流再按啟動鍵3.1 訓練入口腳本train.py里到底發(fā)生了什么tools目錄下通常會有一個train_net.py或train.py命令行參數(shù)包括GPU設備選擇、訓練權(quán)重路徑、數(shù)據(jù)集名稱、最大迭代次數(shù)等。即便你是CPU環(huán)境GPU相關參數(shù)也要留在代碼里不動因為程序內(nèi)部統(tǒng)一走配置文件讀取沒有GPU也不會主動調(diào)用CUDA。訓練入口做的事情按順序拆開看是這樣加載配置文件包括學習率、步長、batch size等超參數(shù)。構(gòu)建數(shù)據(jù)集對象讀取標注信息生成一個包含每張圖片路徑和標注框的roidb列表。構(gòu)建網(wǎng)絡結(jié)構(gòu)加載預訓練權(quán)重。創(chuàng)建訓練Session往數(shù)據(jù)讀取隊列里喂數(shù)據(jù)。循環(huán)調(diào)用sess.run執(zhí)行訓練和定期保存模型。你可以在讀取標注信息之后、訓練循環(huán)之前先打印一下roidb的長度和第一條內(nèi)容確認數(shù)據(jù)讀對了再往后走。3.2 數(shù)據(jù)集與roidb的創(chuàng)建過程標注信息如何變成訓練信號這部分是代碼閱讀的重點。lib/datasets目錄下的pascal_voc.py文件里有一個類它的任務是解析XML標注文件把標簽名稱映射成類別編號并將所有標注框信息整理成一張“信息表”也叫做roidb。roidb里的每一條記錄包含圖片路徑、圖片尺寸、標注框坐標、標注框?qū)念悇e標簽以及一個非常重要的字段是否包含困難樣本。訓練過程中的很多預處理邏輯都是圍繞這個表進行的。接下來訓練管線會循環(huán)從roidb里取數(shù)據(jù)對圖片做隨機裁剪、翻轉(zhuǎn)、亮度調(diào)整等操作同時對應地調(diào)整標注框坐標。理解了這個流程你就理解了一個關鍵點數(shù)據(jù)增強不是隨便亂做而是要把圖片的變換同步應用到標注框上否則你訓練出的模型就是“訓練集上有效、測試集上失靈”的廢模型。3.3 網(wǎng)絡核心VGGnet_train與VGGnet_test的使用邏輯在lib/networks目錄下你會看到訓練網(wǎng)絡和測試網(wǎng)絡兩個類。它們共享相同的卷積層但尾部分支不同訓練版網(wǎng)絡會額外組裝損失層把RPN和檢測頭兩部分損失算出來測試版網(wǎng)絡則只輸出候選區(qū)域、類別概率和框坐標不計算損失。讀這兩個文件時我最在意的部分是Anchor的生成邏輯。特征圖上的每個像素點對應9個Anchor這些Anchor的坐標映射回原圖時可能超出圖片邊界因此代碼里有一個過濾邏輯把所有超出邊界的Anchor剔除。留下來的Anchor和真實標注框做IoU計算高于正樣本閾值的作為前景低于負樣本閾值的作為背景中間模棱兩可的直接忽略。這里有一個很多人想不明白的細節(jié)為什么RPN訓練時只隨機采樣一部分Anchor參與損失計算答案是前景框數(shù)量遠少于背景框如果全部參與計算模型會嚴重偏向預測“沒有物體”。代碼里的標準做法是從前景Anchor中采樣一小批從背景Anchor中采樣一小批湊成一個小batch這樣正負樣本比例不至于太失衡。3.4 為什么必須先理解數(shù)據(jù)流再跑訓練在CPU上一次完整的迭代可能就要零點幾秒到一兩秒跑幾萬步等于熬幾個小時。如果你對數(shù)據(jù)流和損失函數(shù)的組裝邏輯不清楚訓練中途發(fā)現(xiàn)loss不降或者激增根本無從排查。我的經(jīng)驗是正式訓練前先用PyCharm的調(diào)試模式運行20次迭代每迭代斷點查看一次輸入圖片的shape、標簽值、RPN loss值、檢測頭loss值??吹竭@些數(shù)值都是合理的有限數(shù)字再放手讓它整夜跑。這一步最多消耗你半小時但能讓你后面少走幾十小時的彎路。4. CPU訓練實操配置、跑批與日志判讀4.1 動手改參數(shù)哪些可以動哪些最好別動開始訓練前我會打開lib/fast_rcnn/config.py文件逐個核對這些配置項MAX_ITERS總迭代次數(shù)。默認可能是70000CPU環(huán)境建議先改成2000跑通流程確認沒問題后再改回來。LEARNING_RATE初始學習率默認0.001不用動。BATCH_SIZE默認1保留。CPU想提高吞吐可以試2但相應地數(shù)據(jù)結(jié)構(gòu)調(diào)整會比較復雜新手不建議動。DISPLAY每多少步打印一次日志默認20可以改成1方便觀察。SNAPSHOT_ITERS每多少步保存一次模型默認10000CPU環(huán)境建議改成1000防止中途意外中斷導致白跑。還有一個容易被忽略的參數(shù)是NUM_CLASSES它表示類別數(shù)加背景如果你的數(shù)據(jù)只有兩類物體那這里就填3。這個數(shù)字和數(shù)據(jù)集配置、網(wǎng)絡輸出維度是一一對應的填錯會直接導致維度不匹配或者訓練結(jié)果詭異。訓練命令參考python tools/train_net.py --weight data/pretrain_model/vgg_16.ckpt --imdb voc_2007_trainval --iters 2000 --cfg experiments/cfgs/faster_rcnn_end2end.yml第一次跑看到命令行輸出中每隔一段出現(xiàn)如下這樣的日志就說明流程是通的Step 20, image: 1, total_loss: 1.845, rpn_loss_cls: 0.512, rpn_loss_box: 0.731, fast_rcnn_loss_cls: 0.412, fast_rcnn_loss_box: 0.1904.2 日志判讀怎么算正常怎么算有問題判斷訓練是否正常的標志不是單看total_loss降不降而是要看四個分量是否都在合理范圍內(nèi)波動。RPN分類損失正常會在0.2到0.7之間浮動最終往0.1附近收斂RPN回歸損失通常在1.0以內(nèi)緩慢下降檢測頭分類損失開始會比較高接近類別數(shù)的對數(shù)級別后期會降到0.2以下檢測頭回歸損失同樣呈下降趨勢。如果某個損失長期不變或者直接爆炸到NaN優(yōu)先檢查三樣東西學習率是否過大把數(shù)值頂?shù)揭绯鰳俗?shù)據(jù)里是否混入了空框或者坐標異常例如框?qū)捀邽?圖片歸一化時是否出現(xiàn)了除以零的情況。CPU上訓練還有一個特點因為每次迭代計算時間較長loss曲線的“瞬時抖動”會更明顯。不用看單步數(shù)值而是要看幾十步的平均趨勢。建議每100步記錄一次loss保存到txt里之后用matplotlib畫個平滑曲線比盯著終端日志有效得多。4.3 讓CPU跑得更聰明線程數(shù)與指令集優(yōu)化TensorFlow CPU版本如果安裝的是帶MKL加速的版本會自動利用CPU的指令集優(yōu)化。不過線程管理上可以稍微干預一下。在啟動訓練前我習慣在同一終端里先設置幾個環(huán)境變量再運行訓練腳本set OMP_NUM_THREADS8 set KMP_BLOCKTIME1 set KMP_AFFINITYgranularityfine,compact,1,0 set KMP_SETTINGS1如果不知道自己的CPU是幾核心先按物理核心數(shù)設置不要超過物理核心數(shù)。除了環(huán)境變量我還會在代碼里固定一下TensorFlow的線程配置config tf.ConfigProto( intra_op_parallelism_threads8, inter_op_parallelism_threads8, allow_soft_placementTrue )這樣TensorFlow在做矩陣運算時才會真正利用多核心。默認設置可能只占滿一部分核心CPU利用率上去了步數(shù)時間能縮短40%以上。4.4 收斂檢查用驗證集而不是訓練集給自己交代訓練時定期保存出來的model.ckpt文件是你在測試階段用來做推理的憑據(jù)。每5000步可以把模型保存一份然后用tools里的測試腳本對驗證集圖片做一次評估。測試命令參考python tools/test_net.py --weights output/vgg16/voc_2007_trainval/model.ckpt --imdb voc_2007_test測試腳本會對每張圖片推薦候選框并計算各類別的平均精確度。觀察這個mAP值的變化趨勢比盯訓練loss有用得多。你會發(fā)現(xiàn)一個規(guī)律訓練loss還在平穩(wěn)下降mAP可能已經(jīng)在某個水平橫盤了這就是過擬合的前兆這時候就需要考慮數(shù)據(jù)增強或增加訓練數(shù)據(jù)。5. 踩坑實錄我在CPU復現(xiàn)過程中遇到的高頻問題5.1 版本類問題編譯器版本導致的Cython擴展報錯第一次運行demo腳本時我遇到了找不到lib.utils.cython_nms模塊的錯誤。編譯的時候Cython是裝上了但編譯產(chǎn)物沒有被正確放到位。排查過程是這樣的第一步確認是否已經(jīng)執(zhí)行過build_ext --inplace。第二步檢查編譯產(chǎn)物文件是否存在例如在lib/utils目錄下應該有一個cython_nms.pyd文件。第三步確認pyd文件名和import語句里的名字是否完全一致包括大小寫和末尾下劃線。這類問題大多在Windows上才會遇到因為Linux下的編譯產(chǎn)物是.so文件名稱匹配規(guī)則會寬松一些。解決方法很干脆重新編譯把生成的pyd文件放在正確目錄下不要改文件名。5.2 pycocotools裝不上怎么辦很多Faster R-CNN實現(xiàn)的評估腳本依賴pycocotools這個包。在Windows上安裝它需要編譯C擴展如果你沒有完整的開發(fā)工具鏈pip install pycocotools會直接報錯一大片紅字。我當時沒有專門去裝編譯鏈而是繞開了這個依賴。具體做法是在代碼中找到import pycocotools的地方然后把它替換成等價的簡單評估邏輯。因為我的驗證集中類別數(shù)量很少直接用自定義函數(shù)計算IoU和平均精確度就可以了。這個評估邏輯只影響最終評估指標的計算不參與訓練和推理完全可以替換。如果你不打算繞開它那就在安裝Visual C Build Tools之后重新打開終端再安裝。注意是重開終端不是直接在舊終端里繼續(xù)否則編譯器路徑可能沒有及時生效。5.3 圖片尺寸問題導致的內(nèi)存崩潰CPU環(huán)境下內(nèi)存相對充足但如果輸入圖片分辨率特別大比如超過2000×2000預處理階段放縮后特征圖依然很大加上RPN要為每個位置生成9個Anchor內(nèi)存占用會迅速攀升程序不會報錯而是直接卡死或者被系統(tǒng)直接結(jié)束掉。排查辦法是在配置里明確設置最長邊像素值測試階段不要使用超大尺寸圖片推理。另外demo代碼里有時會寫一個長邊上限例如1000但我發(fā)現(xiàn)具體實現(xiàn)里存在一次預處理和一次后處理兩處尺寸控制只改一處是不夠的兩處要同時修改。5.4 訓練不收斂的一個隱蔽元兇Anchor標定異常有一次我訓練了3000步RPN分類損失始終在0.7以上徘徊檢測頭分類損失也沒降多少??磁渲谩⒖磳W習率都沒問題后來逐條檢查roidb發(fā)現(xiàn)問題出在標注框上。我的數(shù)據(jù)里有一小部分圖片的標注框因為標注工具精度問題寬度或高度只有1像素。這樣的框和Anchor計算IoU時幾乎永遠匹配不上正面標簽導致模型學不到任何有效信息。它們是“沉默的壞數(shù)據(jù)”不會讓你報錯只會悄悄拉低訓練質(zhì)量。解決辦法是訓練前加一個預處理步驟把所有面積過小的標注框過濾掉或者直接把這些標注同步縮放后再重新生成標注文件。清洗數(shù)據(jù)之后loss曲線肉眼可見地下去了。5.5 顯存錯誤在CPU上也會出現(xiàn)雖然你沒有GPU顯存但TensorFlow 1.x代碼里很多默認配置包含per_process_gpu_memory_fraction之類與顯存相關的字段。如果這個字段的值配置不合法即使在沒有GPU的機器上也會拋出與顯存相關的異常。遇到這類錯誤不要慌定位到config文件里和GPU顯存相關的設置把它改小或者改為自動分配即可。另外所有device_count相關的配置也可以顯式設置為0明確告訴TensorFlow我們不使用GPU設備。6. 復現(xiàn)成功之后從跑通到能二次開發(fā)6.1 換骨干網(wǎng)絡從VGG16到自定義網(wǎng)絡跑通VGG16版本后你可以把這套工程擴展到更輕量的骨干網(wǎng)絡比如MobileNet或自己設計的小型卷積網(wǎng)絡。修改時有三處必須同步改骨干網(wǎng)絡的構(gòu)建函數(shù)、RPN輸入特征圖的通道數(shù)、ROI Pooling后全連接層的輸入維度。很多人改第一個地方忘了后兩處導致維度不匹配的報錯。我的建議是先不動完整工程而是在lib/networks下新建一個網(wǎng)絡文件復制原來的訓練網(wǎng)絡類只替換卷積池化部分然后讓RPN部分直接復用原邏輯。這樣改動范圍可控出了問題也容易回退。6.2 封裝一個批量推斷腳本tools里的demo.py一次只能處理單張圖片后續(xù)做驗證時會覺得很不方便。我后來寫了一個批量鏡像腳本讀入一個文件夾下所有圖片依次調(diào)用detect接口把每個目標的類別、置信度、坐標寫進CSV文件。這個腳本不涉及網(wǎng)絡內(nèi)部結(jié)構(gòu)只調(diào)用現(xiàn)成的檢測函數(shù)因此不依賴具體網(wǎng)絡實現(xiàn)以后換模型腳本依然能復用。批量推斷時要注意圖片讀取方式保持一致盡量都用cv2的BGR通道讀取預測之后再把結(jié)果輸出出來避免RGB和BGR通道順序顛倒造成的檢測效果驟降。6.3 把模型導出成推理格式TensorFlow 1.x訓練好的ckpt文件只能在配套的Python環(huán)境下使用。如果你想把它部署到服務端或嵌入式平臺需要額外做格式的轉(zhuǎn)換與整理。這個步驟在我復現(xiàn)時沒有做但對有部署需求的人值得提前了解把模型里的權(quán)重和計算圖固化到一個自包含文件里部署時就不需要重新依賴訓練代碼環(huán)境。實際操作手法上先加載訓練好的Session然后把需要輸出的張量節(jié)點類別、坐標、候選框標記為輸出節(jié)點最后調(diào)用凍結(jié)工具導出即可。凍結(jié)過程比想象中簡單難點在于搞清楚哪些節(jié)點是真正的輸出否則導出的模型可能在服務端GraphDef里缺了關鍵分支?;氐轿业膹同F(xiàn)過程我最想強調(diào)的是用CPU跑Faster R-CNN圖的不是速度而是把整條管線徹底讀懂。每一步都慢反而每一步都有充足時間確認Solidity。等你把網(wǎng)絡結(jié)構(gòu)、數(shù)據(jù)流、Anchor機制、損失函數(shù)這四個點都吃透再用GPU跑別的模型會明顯感覺學習曲線平滑很多。如果你也打算在本機復現(xiàn)一次我的最后一條實操建議是不要一開始就追求跑滿7萬步。先配好環(huán)境、跑通數(shù)據(jù)、調(diào)整完參數(shù)、用demo腳本跑出一張帶框的檢測圖完成這一步再決定要不要熬長訓。前置流程全部驗證無誤之后長訓只是時間問題不會再有方向性問題。