與畢設(shè)指南)
簡介本資源為面向畢業(yè)設(shè)計、課程設(shè)計及論文寫作的人流量檢測方向參考文檔適合計算機視覺、深度學習初學者及高校師生使用。文檔以MobileNet-SSD輕量級檢測模型為核心系統(tǒng)介紹從數(shù)據(jù)集構(gòu)建、模型訓練到行人檢測與追蹤的完整流程并給出公園、文化廣場及傳染病疫情期間疏散人群等典型應用場景。內(nèi)容同時涵蓋網(wǎng)絡(luò)結(jié)構(gòu)細節(jié)、開發(fā)環(huán)境配置與實驗驗證結(jié)果可作為項目開發(fā)、論文撰寫或答辯準備的有力參照。資源包共1個文件為docx格式約224KB便于直接閱讀與引用。目前已有81人學習下載適合希望系統(tǒng)掌握輕量級目標檢測落地思路的讀者進一步研讀。1. 從選題到落地人流量檢測方法在畢設(shè)論文里到底要做什么“基于深度學習的人流量檢測方法”這個選題放在畢設(shè)或課設(shè)里目標不是訓練一個能畫框的目標檢測器而是形成一條“輸入視頻幀、輸出人數(shù)”的完整鏈路。很多人選完題直接去跑YOLO跑完才發(fā)現(xiàn)密集場景下計數(shù)偏差大得沒法寫進論文換個角度把任務定義成密度回歸人流量檢測會順手很多。這篇筆記按一個三周能跑通主線、一周補實驗的課程設(shè)計節(jié)奏來講先選技術(shù)路線再做數(shù)據(jù)集再用PyTorch訓練和評估最后給出一組避坑經(jīng)驗。適合想把深度學習畢設(shè)做成完整閉環(huán)、GPU預算又有限的讀者。2. 先定技術(shù)路線檢測、密度估計還是多任務2.1 三種主流做法怎么選計數(shù)任務不是檢測任務的子集目標檢測給的是每個人頭的邊界框把框的數(shù)量數(shù)出來就得到人數(shù)這個邏輯在稀疏場景沒問題但人流密集時會出現(xiàn)兩個連鎖問題一是NMS會把兩個重疊行人的框壓成一個二是低置信度行人被置信度閾值直接濾掉。地鐵車廂、校門口早高峰這類密集小目標場景漏檢率一點就會被放大到10%以上論文里很難解釋。密度估計換了一條路不判斷“這里有幾個人”而是為每個頭部點生成一個高斯核讓模型去回歸整個密度分布最后對密度圖積分得到總?cè)藬?shù)。多任務方案則把兩條路合并在檢測分支基礎(chǔ)上增加密度圖分支兩個輸出互相約束精度更高但工程量和訓練難度也更高。我一般會先問自己畢設(shè)的核心創(chuàng)新點到底放在哪里。如果放在應用驗證檢測方案足夠如果放在方法改進密度圖是性價比最高的起點。另一個差異在標注成本。檢測方案需要畫完整邊界框密度圖方案只需要點標注頭部中心。點標注的速度大約比框標注快三分之一到一半對時間緊張的畢設(shè)來說這是實打?qū)嵉膬?yōu)勢。推理階段檢測要做NMS后處理密度圖是純卷積推理更容易壓到視頻流的實時幀率。這些差異都可以寫進論文的需求分析和方案對比章節(jié)比空泛地寫“深度學習技術(shù)具有優(yōu)勢”要有說服力。2.2 密度圖方案的理論閉環(huán)高斯核如何把點標注變成回歸目標密度圖的核心思路是假設(shè)第i個行人頭部中心坐標為x_i人群分布可以用delta函數(shù)疊加為F(x)Σδ(x-x_i)。這個離散點序列沒法直接作為回歸目標于是把它與二維高斯核做卷積得到密度圖D(x)ΣG_σi(x-x_i)其中G_σi是標準差為σi的二維高斯核。式子里隱含著一個關(guān)鍵性質(zhì)對全圖積分密度圖的累積和等于總?cè)藬?shù)。也就是說訓練階段用MSE讓預測密度圖逼近真實密度圖評估階段直接對預測密度圖求和兩個環(huán)節(jié)用的是同一個數(shù)學信號閉環(huán)非常干凈。人群稀疏時固定一個σ就夠了通常取3到5個像素。密集場景下固定σ會出問題遠處人頭在圖像里只有十幾個像素近處人頭占幾十個像素同一個σ必然顧此失彼。這時候要用MCNN提出的幾何自適應高斯核對每個頭部點求它到最近k個頭部點的平均距離d_i取σ_iβ*d_iβ一般取0.3k取3或4。這樣遠處密集人群的核自動變小近處稀疏人群的核變大與透視關(guān)系基本匹配。自適應核這部分內(nèi)容寫進論文的數(shù)據(jù)預處理小節(jié)時可以作為一條明確的“方法改進點”。2.3 選型對照表與論文寫作的切入角度方案計數(shù)精度標注成本訓練難度論文展開空間適用場景目標檢測稀疏場景高密集場景下降快需要邊界框標注中低偏工程復現(xiàn)商場出入口、校園道路密度回歸密集場景穩(wěn)定稀疏場景也可用只要頭部點標注中高高可在核函數(shù)/網(wǎng)絡(luò)結(jié)構(gòu)上改進地鐵站、景區(qū)、集會檢測密度多任務綜合最好兩個輸出互相糾錯框點標注高高可設(shè)計聯(lián)合損失需要位置和數(shù)量同時輸出如果選密度圖方案論文的章節(jié)建議按“密度圖生成方法 → 網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計 → 實驗對比 → 場景驗證”來排。這個結(jié)構(gòu)更接近學術(shù)論文的敘事方式指導老師也更愿意接受。對比實驗至少要挑1到2個公開方法在同一個測試集上重跑而不是直接抄原論文里的數(shù)字因為數(shù)據(jù)劃分不同直接抄數(shù)字在答辯時經(jīng)不起問。你還可以把“檢測方案在密集幀的NMS丟框問題”作為對比實驗的一個觀察點用幾組數(shù)據(jù)說明為什么密度圖方案更適合人流量檢測。3. 數(shù)據(jù)先行行人數(shù)據(jù)集的采集、標注與密度圖生成3.1 公開數(shù)據(jù)集與自建數(shù)據(jù)怎么搭配公開人群計數(shù)數(shù)據(jù)集里ShanghaiTech Part_A/Part_B是最常用的組合Part_A是密集人群Part_B是稀疏街景兩者交叉驗證能看出方法在不同密度下的表現(xiàn)。UCF-QNRF的規(guī)模更大、密度更高適合用來寫泛化性實驗Mall數(shù)據(jù)集是室內(nèi)固定攝像頭視角適合做場景化驗證。下載后先確認標注格式因為有的是MAT文件有的是JSON有的是XML不統(tǒng)一。自建數(shù)據(jù)建議抽幀標注不要每幀都標。每隔10幀抽一幀每幀標出所有可見頭部中心500到1000個行人量級就夠用了。自采數(shù)據(jù)的價值不在數(shù)量而在“場景驗證”論文里寫“對自采視頻人工抽樣核對10幀平均誤差在10%以內(nèi)”比單純在公開數(shù)據(jù)集上報一個MAE更有落地感。標注時有三條清洗原則人物頭部小于10像素的不標遮擋超過80%的不標圖像邊界上只有半個頭且沒有完整輪廓的不標。這些原則要寫進論文的數(shù)據(jù)處理部分能增加可信度。3.2 用Python把XML標注轉(zhuǎn)成密度圖腳本與參數(shù)如果你的標注工具輸出的是Pascal VOC格式XML每個object是person的bndbox而密度估計需要的是頭部中心點。這里有一個通用做法取bbox上部大約15%處作為頭部點位置因為行人框中心往往落在軀干上直接取中心會把身體部分算進頭部引入計數(shù)偏差。下面的腳本把XML解析成點坐標列表再生成密度圖。import os import cv2 import numpy as np import xml.dom.minidom as minidom def parse_xml_heads(xml_path): 解析VOC標注XML返回頭部中心點坐標列表 [(x, y), ...] dom minidom.parse(xml_path) objs dom.getElementsByTagName(object) points [] for obj in objs: bndbox obj.getElementsByTagName(bndbox)[0] xmin float(bndbox.getElementsByTagName(xmin)[0].firstChild.data) ymin float(bndbox.getElementsByTagName(ymin)[0].firstChild.data) xmax float(bndbox.getElementsByTagName(xmax)[0].firstChild.data) ymax float(bndbox.getElementsByTagName(ymax)[0].firstChild.data) # 頭部中心點取框頂部偏下一點而不是框中心 cx (xmin xmax) / 2.0 cy ymin (ymax - ymin) * 0.15 points.append((cx, cy)) return points def make_density_map(shape, points, sigma4.0): 將點標注展開為密度圖返回與圖像形狀一致的float32矩陣 density np.zeros(shape[:2], dtypenp.float32) h, w shape[:2] radius int(sigma * 3) for x, y in points: if not (0 x w and 0 y h): continue x_lo max(0, int(x) - radius) x_hi min(w, int(x) radius 1) y_lo max(0, int(y) - radius) y_hi min(h, int(y) radius 1) xs np.arange(x_lo, x_hi, dtypenp.float32) ys np.arange(y_lo, y_hi, dtypenp.float32) gx np.exp(-(xs - x) ** 2 / (2 * sigma ** 2)) gy np.exp(-(ys - y) ** 2 / (2 * sigma ** 2)) density[y_lo:y_hi, x_lo:x_hi] np.outer(gy, gx) return density邏輯說明腳本把二維高斯核拆成行向量和列向量的外積比逐像素meshgrid更快也更省內(nèi)存。每個頭部點的高斯值只疊加到一個局部窗口內(nèi)窗口半徑取3倍sigma因為高斯核在3倍標準差外貢獻已經(jīng)可以忽略。多個點距離較近時密度值自然疊加因此密度圖積分仍然等于人數(shù)。參數(shù)說明sigma4適合攝像頭離人群中等距離的場景俯視攝像頭建議sigma2左右平視近距場景可以取5到6。radius取int(sigma*3)控制局部窗口大小。如果你的標注是純頭部點而不是行人框直接把parse_xml_heads換成讀取點坐標即可后面流程完全一樣。3.3 增廣必須做同步變換翻轉(zhuǎn)、裁剪、縮放的三條規(guī)則密度圖不是分類標簽它是一張數(shù)值分布圖增廣時最容易出錯的是只改圖像不改密度圖。我見過有人只對圖像做隨機翻轉(zhuǎn)訓練時loss還在下降測試計數(shù)卻明顯偏差因為模型一直在擬合一對不一致的目標。正確做法是圖像和密度圖永遠做同一個幾何變換三條規(guī)則要同時遵守。第一條隨機翻轉(zhuǎn)時圖像鏡像密度圖也要鏡像。第二條隨機裁剪時裁同一個區(qū)域。第三條縮放時要特別注意積分修正。如果直接對密度圖做resize需要乘一個面積修正系數(shù)否則積分會變。下面這段代碼演示了縮放同步def sync_resize(img, density, size): h, w img.shape[:2] new_w, new_h size scale min(new_w / w, new_h / h) img cv2.resize(img, (int(w * scale), int(h * scale))) density cv2.resize(density, (int(w * scale), int(h * scale)), interpolationcv2.INTER_LINEAR) # 密度圖resize后像素數(shù)量變了要乘修正系數(shù)保證積分等于人數(shù) density density / (scale ** 2) return img, density縮放系數(shù)scale是新尺寸與舊尺寸的比值。如果圖像縮小一半scale等于0.5密度圖每個像素代表的人數(shù)需要增大到原來的4倍代碼里用除以scale的平方來修正。更省事的做法是先把圖像resize到統(tǒng)一尺寸再基于原始點坐標和更新后的sigma直接生成密度圖這樣完全繞開積分修正問題。我一般推薦后者邏輯更清晰也不會在訓練階段引入額外誤差。4. 用PyTorch訓練一個人流密度回歸模型網(wǎng)絡(luò)、參數(shù)與評估4.1 一個顯存友好的MCNN變體網(wǎng)絡(luò)MCNN是經(jīng)典的人群計數(shù)模型用三列不同卷積核尺寸并行提取特征。完整版包含多次池化和上采樣顯存占用偏高。如果只有4G顯存可以在保留多列結(jié)構(gòu)的前提下做簡化去掉全連接層、減小通道數(shù)、把特征融合改成1x1卷積最后用雙線性上采樣恢復到原圖尺寸。import torch import torch.nn as nn import torch.nn.functional as F class SimpleMCNN(nn.Module): def __init__(self): super(SimpleMCNN, self).__init__() # 三列不同感受野分別對應小頭、肩部、小群體尺度 self.branch1 nn.Sequential( nn.Conv2d(3, 20, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.Conv2d(20, 24, kernel_size3, padding1), nn.ReLU(inplaceTrue) ) self.branch2 nn.Sequential( nn.Conv2d(3, 20, kernel_size5, padding2), nn.ReLU(inplaceTrue), nn.Conv2d(20, 24, kernel_size5, padding2), nn.ReLU(inplaceTrue) ) self.branch3 nn.Sequential( nn.Conv2d(3, 20, kernel_size7, padding3), nn.ReLU(inplaceTrue), nn.Conv2d(20, 24, kernel_size7, padding3), nn.ReLU(inplaceTrue) ) self.merge nn.Sequential( nn.Conv2d(72, 24, kernel_size1), nn.ReLU(inplaceTrue), nn.Conv2d(24, 1, kernel_size1) ) # 將特征圖恢復到與輸入密度圖一致的尺寸 self.upsample nn.Upsample(scale_factor2, modebilinear, align_cornersFalse) def forward(self, x): b1 self.branch1(x) b2 self.branch2(x) b3 self.branch3(x) feat torch.cat([b1, b2, b3], dim1) out self.merge(feat) out self.upsample(out) return out邏輯說明三個分支的卷積核大小分別取3、5、7模擬小、中、大三種感受野。branch1適合捕捉單個人頭輪廓branch3能覆蓋小群體的上下文信息。三個輸出在通道維拼接后用1x1卷積做融合參數(shù)量比原始MCNN小很多。forward最后的上采樣是為了讓輸出分辨率與輸入一致計算損失時不需要再做插值對齊。參數(shù)說明分支里的通道數(shù)直接決定顯存占用量。把20和24改成16和20大約能再省20%顯存代價是計數(shù)精度略微下降。如果輸入是512x512這個模型在4G顯存的顯卡上可以跑batch_size1輸入降到384x384能跑batch_size4。4.2 訓練腳本與關(guān)鍵超參數(shù)從環(huán)境配置到出曲線環(huán)境配置是新手的第一個坎。建議用conda建一個Python 3.8環(huán)境再按自己電腦的CUDA版本從PyTorch官網(wǎng)復制對應的安裝命令。沒有獨立顯卡也能跑只是耗時長一些把圖像resize到512x512、batch_size設(shè)為1即可。數(shù)據(jù)加載器要同時輸出圖像和密度圖圖像歸一化到0到1之間密度圖保持float32。訓練主循環(huán)里優(yōu)化器用Adam學習率從1e-4起步損失用MSELoss。這是密度回歸里最穩(wěn)的一組初始配置。如果loss在前幾個epoch不下降優(yōu)先檢查密度圖是不是有大量全零區(qū)域背景像素會把loss主導住這時要給密度圖加一個小常數(shù)再參與計算或者檢查預處理階段是否把密度圖讀丟了。model SimpleMCNN().cuda() criterion nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr1e-4) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor0.5, patience3) for epoch in range(40): model.train() total_loss 0.0 for img, density in train_loader: img, density img.cuda(), density.cuda() pred model(img) loss criterion(pred, density) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() mae, mse evaluate(model, val_loader) scheduler.step(mae) print(fepoch {epoch:02d}, loss {total_loss/len(train_loader):.6f}, fMAE {mae:.2f}, MSE {mse:.2f})參數(shù)說明batch_size建議為1因為密度圖是稠密預測顯存隨圖面積增長。想要大batch效果可以用梯度累積每8步做一次optimizer.step等價于batch_size8的效果。ReduceLROnPlateau會在驗證MAE連續(xù)3輪不降時把學習率乘以0.5這是密度回歸任務里比較實用的調(diào)節(jié)方式。如果想在損失函數(shù)上做文章可以加一個計數(shù)一致性損失把預測密度圖積分得到的預測人數(shù)與真實人數(shù)做L1損失。代碼上就是count_loss torch.abs(pred.flatten(1).sum(dim1) - density.flatten(1).sum(dim1)).mean() loss criterion(pred, density) 0.01 * count_loss0.01這個權(quán)重要調(diào)小因為密度圖的逐像素MSE數(shù)值通常比總?cè)藬?shù)誤差大一到兩個數(shù)量級。這個自定義損失可以獨立成為論文里的一節(jié)答辯時能講出設(shè)計動機。4.3 MAE與MSE公式、代碼與論文描述MAE和MSE是人群計數(shù)論文里最核心的兩個指標。MAE反映平均計數(shù)偏差MSE反映計數(shù)誤差的波動程度。先算每個樣本預測人數(shù)與真實人數(shù)之差MAE是誤差絕對值的平均MSE是誤差平方均值再開根號。def evaluate(model, val_loader): model.eval() pred_counts, gt_counts [], [] with torch.no_grad(): for img, density in val_loader: img img.cuda() pred model(img) # flatten(1)把每個樣本展平成 H*W沿dim1求和得到單幀人數(shù) pred_count pred.flatten(1).sum(dim1).cpu().numpy() gt_count density.flatten(1).sum(dim1).numpy() pred_counts.extend(pred_count) gt_counts.extend(gt_count) pred_counts np.array(pred_counts) gt_counts np.array(gt_counts) mae np.mean(np.abs(pred_counts - gt_counts)) mse np.sqrt(np.mean((pred_counts - gt_counts) ** 2)) return mae, mse邏輯說明密度圖的積分等于人數(shù)所以對預測輸出做flatten(1)后沿通道和空間維度求和直接得到每幀的預測人數(shù)。評估階段必須用model.eval()并包在torch.no_grad()里否則計算圖會占滿顯存跑幾個batch就OOM。論文結(jié)果表建議按“數(shù)據(jù)集、方法、MAE、MSE”四列展示。要特別注意MAE和MSE的差異如果MAE小但MSE偏大說明大多數(shù)幀誤差小但有少數(shù)密集幀計數(shù)明顯偏離這時候可以挑幾幀誤差最大的圖片在論文里做案例分析解釋原因。這個分析過程本身就是一個加分項。5. 人流量檢測避坑指南5個翻車現(xiàn)場與排查思路以下是做這個題目最容易踩的五個坑按我遇到頻率從高到低排。每一條都按“現(xiàn)象、原因、解決”展開排查時可以對照。5.1 密度圖高斯核選錯模型學到的是模糊背景而不是人頭現(xiàn)象訓練了幾十輪預測密度圖看起來是一大片模糊色塊預測人數(shù)只有真實值的三成左右。原因所有頭部點共用同一個固定σ而攝像頭是平視角度近處人頭占幾十像素遠處人頭只占幾個像素固定核不可能同時表示兩種尺度。解決改成幾何自適應高斯核先為每個頭部點計算k近鄰平均距離再按σ_i0.3*d_i生成密度圖。如果不想一開始就做自適應至少把圖像按透視關(guān)系分成上下兩區(qū)分別用兩個σ值。這條修改在論文里可以寫成“基于局部幾何自適應的密度圖生成”有理論依據(jù)也有實驗對比。5.2 增廣不同步訓練loss在降驗證指標卻在漂現(xiàn)象訓練損失一路下降驗證MAE卻居高不下而且預測人數(shù)表現(xiàn)出系統(tǒng)性偏高或偏低。原因代碼里只對圖像做了翻轉(zhuǎn)或裁剪密度圖還是變換前的舊目標模型被迫在同一個輸入上擬合兩個不一致的輸出。解決圖像和密度圖永遠走同一個變換入口。我習慣用一個固定隨機種子在同一個函數(shù)里對兩者依次做翻轉(zhuǎn)和裁剪確保操作一致。具體做法是先用random.seed生成種子再對圖像和密度圖分別調(diào)用cv2.flip和cv2.resize。5.3 圖像resize后sigma沒跟著縮放現(xiàn)象訓練集MAE還不錯一到測試集就明顯變差預測密度圖邊緣發(fā)糊。原因為了加速訓練把圖像縮到512x512但密度圖用的還是原圖尺寸下的σ4核在縮小后的圖上覆蓋范圍偏大人頭周圍的密度被過度擴散。解決先確定輸入尺寸再按縮放比例更新σ??s放系數(shù)scale等于新尺寸除以原尺寸σ_new等于σ_old乘以scale。如果按“先resize后生成密度圖”的流程做這個坑可以完全繞開。注意多個尺寸變換時要保證每個階段σ都跟著變化否則越到后面偏差越大。5.4 視角漂移訓練集和測試集根本不是同一個場景現(xiàn)象在ShanghaiTech Part_A上訓練的模型直接到Part_B上測試MAE漲了一倍。原因Part_A是密集人群Part_B是稀疏街景攝像頭俯仰角和行人像素范圍都不一樣深度學習模型對視角非常敏感這是領(lǐng)域偏移問題不是模型bug。解決要么在訓練集里混合多視角數(shù)據(jù)做成多源訓練要么做目標場景微調(diào)。微調(diào)時用目標場景的幾十幀標注數(shù)據(jù)把整個模型以1e-5的學習率再訓20個epoch效果通常很明顯。論文里可以把“跨場景泛化測試微調(diào)恢復”單獨寫成實驗小節(jié)比只報一個數(shù)據(jù)集的結(jié)果更有說服力。5.5 論文創(chuàng)新點寫“我用了YOLO”會在答辯時被問住現(xiàn)象答辯老師問“你選YOLO是什么依據(jù)和密度圖方法比優(yōu)勢在哪”回答不上來。原因把工程選型當成了方法創(chuàng)新而畢設(shè)論文要求的是方法層面的比較和取舍。解決即使主線是密度回歸也要在論文里放一個對照實驗用YOLOv5做人數(shù)統(tǒng)計與密度圖方法在密集幀和稀疏幀上分別對比MAE。分析時指出YOLO的NMS在密集幀會壓制相鄰框密度圖方法沒有NMS后處理因此計數(shù)更穩(wěn)。這樣一來“面向密集場景的密度回歸方案選型與優(yōu)化”就成了你的創(chuàng)新點而不是“我調(diào)用了某個模型”。6. 給畢設(shè)加分消融實驗與真實場景驗證的收尾技巧6.1 一次消融實驗的設(shè)計模板消融實驗的目的是證明網(wǎng)絡(luò)結(jié)構(gòu)和數(shù)據(jù)預處理里的每個設(shè)計都有作用。最省事的做法是拿訓練好的模型作為基線依次做三個改動把三個卷積分支去掉一個、把1x1融合層替換成直接相加、把自適應σ換回固定σ。每次只改一個變量重新訓練并記錄MAE和MSE做成一張兩列指標的表。配置MAEMSE三分支1x1融合自適應σ12.418.9去掉三分支中的branch314.121.31x1融合改為直接相加15.623.5自適應σ改回固定σ416.825.1表格里的數(shù)字只是示例要替換成你自己實驗的結(jié)果。消融實驗不用做太多組三到四組足夠說明問題答辯時也不容易把自己繞暈。每組實驗在論文里配一小段解釋說明改動后精度下降是因為丟失了哪種尺度信息。6.2 用一段監(jiān)控視頻做端到端驗證最后一步建議用一段自采視頻跑端到端驗證把每幀人數(shù)輸出成一條曲線和人工抽查的幾幀做對比。這段代碼很短但它能串起整個系統(tǒng)import cv2 import torch import numpy as np cap cv2.VideoCapture(demo.mp4) writer open(flow_curve.csv, w) with torch.no_grad(): while True: ret, frame cap.read() if not ret: break img cv2.resize(frame, (512, 512)) / 255.0 img torch.from_numpy(img).permute(2, 0, 1).unsqueeze(0).float().cuda() density model(img).squeeze().cpu().numpy() count float(density.sum()) frame_id int(cap.get(cv2.CAP_PROP_POS_FRAMES)) writer.write(f{frame_id},{count:.2f}\n) writer.close() cap.release()這段代碼直接把模型輸出變成時間序列你可以在論文里畫一張“幀號-人數(shù)”曲線再人工核對其中三幀誤差控制在10%以內(nèi)就能寫進實驗結(jié)論??梢暬糠挚梢园衙芏葓D用熱力圖疊加到原圖上選一個密集幀放對比圖視覺沖擊力比你貼十行表格都強。我自己做這個題目時第一次跑通模型后就把所有注意力放在“把loss降得更低”上結(jié)果答辯前才發(fā)現(xiàn)連MAE和MSE的分工都講不清楚。后來養(yǎng)成一個習慣任何模型實驗先記錄驗證指標的變化過程再去看loss曲線而不是只留一張訓練截圖。這個習慣幫我少走了很多彎路希望幫到你。本文還有配套的精品資源點擊獲取