
1. 從“快”與“慢”的視角理解視頻理解在計算機視覺領域處理圖像的任務大家已經非常熟悉了從分類到檢測再到分割模型架構和訓練方法都相對成熟。但當我們把目光轉向視頻事情就變得復雜起來。視頻不僅僅是連續圖像的堆疊它包含了隨時間演變的動態信息這種動態信息是理解動作、行為和事件的關鍵。早期的視頻識別方法比如簡單地用2D卷積網絡逐幀處理或者使用3D卷積網絡處理視頻片段雖然取得了一定進展但往往面臨一個核心矛盾計算效率與時間建模精度之間的權衡。想象一下你正在觀看一場足球比賽。要理解“進球”這個動作你需要捕捉兩種信息一是球員踢球的瞬間姿態、球的飛行軌跡這些是快速變化的細節二是整個進攻陣型的移動、球員之間的相對位置變化這些是相對緩慢演變的宏觀信息。如果我們的模型只關注每一幀的細節“快”信息可能會忽略動作的連貫性如果只關注長時間間隔的宏觀變化“慢”信息又會丟失決定性的關鍵幀細節。這正是視頻理解的核心挑戰。2018年Facebook AI Research (FAIR) 的Christoph Feichtenhofer等人提出的SlowFast網絡正是為了解決這一矛盾而誕生的。它不是一個單一的、復雜的網絡而是一個雙路徑Two-Stream架構靈感來源于人類視覺系統中對瞬時信息和持續信息分別處理的特性。這個設計非常直觀且有效迅速成為了視頻識別領域的里程碑式工作其思想影響了后續許多模型的設計。簡單來說SlowFast網絡用兩條并行的“路”來處理視頻一條“慢通道”以低幀率捕捉場景和動作的語義信息另一條“快通道”以高幀率捕捉快速變化的運動細節。兩條路的信息在網絡的深層進行融合最終做出判斷。今天我們就來深入拆解這篇經典論文《SlowFast Networks for Video Recognition》。我不會僅僅復述論文里的公式和圖表而是結合我實際復現和調參的經驗帶你理解其設計精髓、實現細節以及在實際項目中應用時可能遇到的“坑”和技巧。無論你是剛接觸視頻理解的新手還是希望優化現有模型的研究者相信這篇筆記都能給你帶來一些啟發。2. SlowFast網絡的核心設計哲學雙路徑與時空不對稱SlowFast網絡最核心、最巧妙的設計就在于其“雙路徑”和“時空不對稱”的思想。理解這一點是理解整個模型的關鍵。2.1 為什么是“雙路徑”而不是“單路徑”在SlowFast之前主流的方法可以粗略分為兩類基于2D CNN的方法例如TSNTemporal Segment Networks從視頻中稀疏地采樣幾幀分別用2D CNN提取特征最后在時間維度上做池化或使用時序模塊如Non-local進行融合。這種方法參數少、計算快但對時間維度的建模能力較弱更像是“圖像分類的集合”。基于3D CNN的方法例如I3DInflated 3D ConvNets將2D卷積核“膨脹”為3D直接在時空立方體上進行卷積。這種方法能同時建模空間和時間信息但計算量和參數量巨大是2D的k倍k為時間卷積核大小。SlowFast的作者認為視頻中的信息在時間維度上天然是不均勻的。大部分語義信息場景、物體、人的姿態變化緩慢而表征運動的細節信息肢體快速擺動、物體位移變化迅速。用一個統一的采樣率和網絡結構去處理這兩種不同性質的信息要么犧牲效率要么犧牲精度。因此雙路徑設計是一種“分而治之”的策略。讓“慢路徑”專心處理高空間分辨率、低時間分辨率的語義信息讓“快路徑”專心處理低空間分辨率、高時間分辨率的運動信息。兩者分工明確最后再匯總達到“112”的效果。2.2 “慢”與“快”的具體含義四個關鍵設計參數論文中通過四個關鍵參數來量化“慢”和“快”時間采樣率Temporal Sampling Rate, α這是最核心的參數。假設輸入視頻片段的總時間跨度為T秒我們從中采樣τ幀。對于慢路徑采樣幀數為τ對于快路徑采樣幀數為ατ。α 1通常設置為8。這意味著快路徑處理的時間分辨率是慢路徑的8倍。例如慢路徑每秒采樣2幀τ2快路徑每秒就采樣16幀ατ16。快路徑因此能捕捉到更細微的幀間變化。通道數比例Channel Ratio, β慢路徑通常使用標準的、通道數較多的網絡如ResNet作為主干。快路徑為了控制計算量其通道數被設計為慢路徑的β倍β 1通常設置為1/8。也就是說如果慢路徑某層有256個通道快路徑對應層只有32個通道。這是因為運動信息相比語義信息被認為是一種“低維”特征可以用更少的通道來表征。這是模型輕量化的關鍵。時間維度融合策略兩條路徑的信息不能孤立處理必須在網絡的特定階段進行融合。SlowFast采用了“橫向連接Lateral Connection”的方式將快路徑的特征融合到慢路徑中。具體操作是對快路徑的特征進行一個時間維度上的卷積通常是一個5×1×1的3D卷積將其時間分辨率降采樣到與慢路徑一致同時進行通道變換然后與慢路徑的特征相加。空間分辨率在最初的設計中快路徑的輸入空間分辨率如高度H和寬度W是慢路徑的1/2通過池化實現。這是因為快速變化的運動信息對精細的空間細節依賴較小。但在后續研究和實踐中這個設計有時會被調整或省略因為降低分辨率確實會損失一些空間信息。這四者共同構成了SlowFast的“時空不對稱”特性快路徑高時間分辨率α大、低通道容量β小、可能較低的空間分辨率慢路徑低時間分辨率、高通道容量、高空間分辨率。實操心得α和β是兩個最重要的超參數。α決定了模型對快速運動的敏感度。對于動作幅度大、變化劇烈的數據集如Something-Something V1/V2α8甚至16效果很好但對于以場景和人物交互為主、動作相對緩慢的數據集如Kineticsα4有時也能取得不錯的效果且計算更省。β直接影響模型大小和速度。β1/8是一個很好的平衡點如果你想進一步壓縮模型可以嘗試β1/16但精度損失需要評估。3. 網絡架構的逐層拆解與實現細節知道了設計思想我們來看看SlowFast網絡具體長什么樣。論文中以ResNet-50為基礎構建了SlowFast我們以此為例進行拆解。3.1 輸入預處理與路徑分離假設我們有一個視頻。標準的處理方式是先確定一個時間跨度例如2秒然后從這個跨度內采樣幀。慢路徑輸入從這2秒內以較低的幀率例如每秒采樣4幀抽取τ8幀圖像。這8幀圖像空間分辨率較高例如224x224。快路徑輸入從同樣的2秒內以較高的幀率慢路徑的α倍例如α8即每秒采樣32幀抽取ατ64幀圖像。這64幀圖像的空間分辨率通常降為112x112即慢路徑的1/2。至此我們得到了兩個輸入張量Slow Path Input:(Batch, 3, 8, 224, 224)-(B, C, T, H, W)Fast Path Input:(Batch, 3, 64, 112, 112)3.2 骨干網絡與橫向連接兩條路徑各自使用一個3D ResNet作為骨干網絡。但注意快路徑的ResNet是“瘦身”版的。具體來說每個Stage的瓶頸塊Bottleneck中中間卷積層的通道數會按比例β減少。以ResNet-50的Stage1conv2_x為例慢路徑輸入通道64經過1x1x1卷積升維到128再經過3x3x3卷積最后1x1x1卷積降維回256。這是一個標準的Bottleneck。快路徑輸入通道8因為β1/8 64/88經過1x1x1卷積升維到16再經過3x3x3卷積最后1x1x1卷積降維回32。通道數大幅減少。橫向連接Lateral Connection是信息融合的橋梁。它發生在每個Stage即ResNet的conv2_x, conv3_x, conv4_x, conv5_x結束之后在下一個Stage開始之前。具體操作如下快路徑在完成一個Stage后輸出特征圖其形狀為(B, C_fast, T_fast, H_f, W_f)。其中T_fast是快路徑當前的時間步數隨著網絡加深時間維度可能會被池化。對這個特征圖應用一個時間維度的卷積。論文中使用的是5x1x1的3D卷積步長為(時間步長, 1, 1)。這個時間步長是關鍵它負責將快路徑的時間分辨率T_fast降低到與慢路徑當前的時間分辨率T_slow一致。例如快路徑初始T64慢路徑T8時間步長就是8。同時這個卷積還將快路徑的通道數C_fast變換到與慢路徑的通道數C_slow相匹配通常是通過輸出通道數設置為2C_slow或C_slow具體看設計。將變換后的快路徑特征與慢路徑的特征進行逐元素相加Element-wise Addition。融合后的特征作為慢路徑下一個Stage的輸入同時快路徑也繼續獨立地進行前向傳播。實現注意點這個時間卷積的核大小和步長需要精心設計。5x1x1的核能在時間維度上融合一定鄰域的信息避免直接下采樣帶來的信息損失。在PyTorch中你可以使用nn.Conv3d(in_channelsC_fast, out_channels2*C_slow, kernel_size(5,1,1), stride(時間步長,1,1), padding(2,0,0))來實現。padding(2,0,0)保證了時間維度的尺寸變化是由stride決定的而不是kernel。3.3 頭部Head設計與預測經過四個Stage和三次橫向連接融合后兩條路徑分別得到各自的特征。慢路徑特征(B, 2048, T_slow_final, H_final, W_final)例如(B, 2048, 8, 7, 7)快路徑特征(B, 256, T_fast_final, H_final, W_final)例如(B, 256, 8, 7, 7)注意時間維度已通過最后的池化對齊在頭部通常進行以下操作時空全局平均池化Global Average Pooling over Time and Space對兩個特征張量分別在時間、高度、寬度三個維度上取平均值。這樣每個特征圖都被池化成一個一維向量。慢路徑向量(B, 2048)快路徑向量(B, 256)特征拼接Concatenation將兩個向量在通道維度上進行拼接得到(B, 2048256) (B, 2304)的聯合特征向量。全連接分類器將這個聯合特征輸入一個全連接層有時會先加一個Dropout層防止過擬合輸出對應動作類別的分數。3.4 消融實驗帶來的啟示論文中大量的消融實驗Ablation Study驗證了每個設計選擇的有效性這些結論對我們調參至關重要雙路徑的必要性只有慢路徑或只有快路徑的模型性能都顯著低于雙路徑模型。這證明了信息互補的有效性。α和β的影響增大α更高的時間分辨率對捕捉快速運動有益尤其是在Something-Something這類需要區分細微時序順序的數據集上。減小β更少的快路徑通道能大幅降低計算量FLOPs而精度損失相對較小這證明了運動信息的“低維”特性。橫向連接的位置實驗表明在網絡的多個階段進行融合如論文中的每個ResNet Stage后比僅在最后融合效果更好。早期融合能讓慢路徑更早地接收到運動線索的引導。快路徑輸入分辨率將快路徑的輸入空間分辨率減半能在幾乎不影響精度的情況下節省大量計算。這是一個非常劃算的優化。4. 復現與訓練從理論到實踐的關鍵步驟看懂結構只是第一步真正把它跑起來并得到好結果中間有很多細節。這里我結合自己使用PyTorch復現的經驗分享幾個關鍵環節。4.1 數據準備與預處理視頻數據預處理是視頻模型訓練的第一道坎處理不好會極大影響模型收斂和最終性能。幀采樣策略這是SlowFast訓練的核心。你需要實現兩種采樣率。對于每個訓練樣本視頻片段先隨機選擇一個起始點。慢路徑采樣以較慢的幀間隔如total_frames / τ在片段內均勻采樣τ幀。快路徑采樣以較快的幀間隔慢路徑間隔的1/α在同一個片段內采樣ατ幀。關鍵點快慢路徑的采樣必須在時間上對齊即它們覆蓋的是視頻中完全相同的時間段只是采樣密度不同。這保證了信息的一致性。數據增強除了常見的隨機裁剪、水平翻轉外對于視頻時序上的增強也很重要。時序抖動Temporal Jittering在采樣時給起始點加上一個小的隨機偏移增加數據的多樣性。多尺度裁剪Multi-scale Crop訓練時使用隨機尺寸的裁剪如[160, 224]測試時使用多個固定尺寸的裁剪并取平均這是提升精度的標準操作。顏色增強亮度、對比度、飽和度的隨機調整。幀解碼效率直接實時從視頻文件解碼高幀率如64幀是IO瓶頸。最佳實踐是預處理將所有視頻統一解碼成圖像序列如jpg格式存儲在SSD上。雖然占用大量磁盤空間但訓練時的讀取速度會快幾個數量級。也可以折中使用LMDB等鍵值數據庫存儲。4.2 模型初始化與優化策略3D網絡的參數初始化比2D更需要技巧因為參數量巨大容易訓練不穩定。參數初始化論文采用了一種非常有效的初始化策略——從預訓練的2D ImageNet模型“膨脹”初始化。對于所有3D卷積核(t, h, w, in_c, out_c)將其中心的時間片(t//2, h, w, in_c, out_c)用預訓練的2D卷積核(h, w, in_c, out_c)的值填充其余時間片的參數初始化為0。這相當于讓3D卷積在初始時退化為2D卷積繼承了強大的空間特征提取能力同時時間維度從零開始學習。這是訓練成功的關鍵。對于快路徑由于通道數少其卷積層無法直接從ImageNet預訓練模型對應層膨脹而來。論文的處理是將預訓練2D模型對應層的通道進行求和或平均來初始化減少后的通道。例如預訓練層有256個通道快路徑對應層需要32個通道就將每8個通道的參數取平均作為新通道的初始化值。優化器與學習率通常使用SGD with Momentum。由于模型較大batch size通常不會設得太大如每GPU 8或16個樣本。學習率策略常用余弦退火Cosine Annealing或帶熱重啟的余弦退火。初始學習率一般在0.01到0.1之間需要根據你的batch size調整線性縮放規則lr base_lr * batch_size / 256。訓練技巧梯度裁剪Gradient Clipping對于很深的3D網絡梯度爆炸風險依然存在設置一個梯度范數閾值如20或40進行裁剪是穩妥的做法。標簽平滑Label Smoothing在分類損失中使用標簽平滑可以防止模型對訓練標簽過于自信提升泛化能力通常能帶來零點幾個百分點的穩定提升。長時訓練視頻模型通常需要更長的訓練周期。在Kinetics-400上訓練90到100個Epoch是常見的。4.3 推理與部署考量訓練好的模型如何用于實際推理或部署時空測試Spatial-Temporal Testing為了提升測試精度通常采用多裁剪Multi-crop和多片段Multi-clip的策略。空間上對輸入視頻幀在多個位置和尺度進行裁剪例如1個全尺寸、3個標準尺寸各取3個裁剪共10個裁剪。時間上從整個視頻中均勻采樣多個片段例如10個片段。將每個片段的每個裁剪輸入模型得到預測分數最后將所有分數平均作為視頻的最終預測。這能顯著提升穩定性但計算量是單次推理的數十倍。模型輕量化與加速原始的SlowFast尤其是Slow路徑為ResNet-101時計算量依然可觀。在實際部署中可以考慮使用更輕的主干將Slow路徑的ResNet-50/101替換為MobileNetV3、EfficientNet等輕量級網絡的3D版本。調整α和β降低α或進一步降低β在精度和速度間尋找新的平衡點。知識蒸餾用一個大而慢的SlowFast模型作為教師去指導一個小而快的學生模型訓練。TensorRT/OpenVINO等推理引擎將模型轉換為這些引擎支持的格式利用層融合、量化INT8等技術進行極致加速。5. 超越原論文后續發展與實戰調參經驗SlowFast網絡開創的雙路徑思想影響深遠后續出現了許多改進工作和變體。了解這些能幫助我們在實際項目中做出更合適的選擇。5.1 重要的改進方向與變體X3DExpand, Expand, Expand, then Deepen同樣是FAIR的工作可以看作是SlowFast思想的極致化和系統化。X3D不再固定α和β而是提出了一種漸進式擴展Progressive Expansion的模型縮放范式從一個非常小的3D網絡開始系統地沿著時間、空間、深度、寬度等維度擴展尋找最優的模型配置。X3D系列模型在精度和效率的權衡上達到了新的高度提供了從微型到大型的一系列模型非常實用。MViTMultiscale Vision Transformers將Transformer引入視頻領域并借鑒了SlowFast的多尺度思想。MViT在網絡的深層逐漸減少時間維度和空間維度的分辨率同時增加通道維度這種“時空下采樣通道上采樣”的結構與SlowFast的“快慢路徑”有異曲同工之妙并且在多項基準上取得了SOTA結果。TimeSformer另一種基于Transformer的視頻模型提出了“分解式時空注意力”將空間注意力和時間注意力分開計算大大降低了計算復雜度。它雖然沒有顯式的快慢路徑但其“分而治之”處理時空信息的思路是相通的。5.2 針對不同數據集的調參經驗不同的視頻數據集有其獨特的偏重盲目套用Kinetics上的最優參數可能效果不佳。Kinetics-400/600/700這類數據集動作類別多且許多動作的區分度依賴于場景和物體。因此慢路徑空間語義信息非常重要。可以適當使用更深的慢路徑主干如ResNet-101甚至可以考慮在ImageNet-21K上預訓練。α4或8都工作良好。Something-Something V1/V2這個數據集專注于手部與物體的短時交互動作定義高度依賴于時序順序例如“推開某物”和“拉近某物”。對于這類數據快路徑運動信息至關重要。需要增大α如8或16讓模型能看到更密集的幀間變化。同時可以嘗試增強快路徑的容量稍微增大β如從1/8調到1/4或者使用更強的時序建模模塊如在融合后加入Non-local block或Transformer層。Charades, AVA這些是長視頻、多標簽的數據集。SlowFast通常作為特征提取器后面接更復雜的時序聚合模型如LSTM、Transformer或檢測頭。此時可能需要調整SlowFast的輸入片段長度T并關注特征提取的效率和表達能力。5.3 實際項目中常見的“坑”與解決方案內存溢出OOM這是訓練3D模型最常見的問題。快路徑的高幀率64幀是內存消耗大戶。解決方案使用梯度檢查點Gradient Checkpointing這是一種用時間換空間的技術只保留部分中間激活在反向傳播時重新計算可以顯著降低顯存占用。PyTorch中可以使用torch.utils.checkpoint。此外降低批處理大小batch size、使用混合精度訓練AMP也是有效手段。訓練不收斂或震蕩檢查初始化確保3D卷積核是從預訓練的2D模型正確膨脹初始化的。這是收斂的基礎。調整學習率如果使用了大batch size學習率需要按線性縮放規則增大但過大也會導致震蕩。可以嘗試更 warmup 輪數。檢查數據預處理確保快慢路徑的采樣在時間上是對齊的。錯誤的采樣會導致兩條路徑學習到矛盾的信息。精度低于預期驗證數據增強過于激進的數據增強如大幅度的顏色抖動、劇烈的裁剪可能破壞視頻的時空連續性對需要精細時序建模的任務有害。嘗試不同的融合方式原論文是“快路徑融合到慢路徑”。可以嘗試雙向融合或者更復雜的融合操作如 concatenation 后接卷積而非簡單的相加。加入額外的時序模塊在SlowFast網絡輸出的特征后加入一個輕量的時序關系模塊如TSMTemporal Shift Module或一個簡單的Transformer編碼器有時能帶來驚喜。SlowFast網絡以其清晰優雅的設計和強大的性能為視頻理解提供了一個堅實的基線模型。它的價值不僅在于其本身的精度更在于它揭示的“時空信息分治處理”的核心思想。在實際工作中我們很少會從零開始訓練一個巨大的SlowFast但理解其原理能幫助我們更好地使用基于它構建的預訓練模型或者將其思想遷移到我們自己的定制化模型中。無論是作為特征提取器還是作為新模型的靈感來源SlowFast都值得你花時間去深入理解和實踐。