絡(luò)設(shè)計(jì):SE、上下文聚合與循環(huán)結(jié)構(gòu)解析)
1. 從雨絲糊臉說起為什么單圖去雨值得單獨(dú)寫一篇論文筆記第一次在真實(shí)場景里拍雨景的人大概率都經(jīng)歷過這種崩潰肉眼看著雨不大拍出來整張照片像蒙了一層灰紗遠(yuǎn)處的建筑輪廓糊成一團(tuán)近處的樹葉細(xì)節(jié)全被雨絲切碎。更麻煩的是這種退化不是均勻的——雨絲有方向、有粗細(xì)、有疏密還疊加了雨霧帶來的全局對比度下降。你想靠后期拉曲線救回來結(jié)果是把噪聲和偽影一起放大。單圖像去雨Single Image Deraining要解決的就是這個(gè)問題只給一張被雨污染的圖把雨絲去掉同時(shí)盡量保住背景的紋理、邊緣和顏色。它和視頻去雨不一樣沒有時(shí)間維度的多幀信息可以借力所有判斷都得從單幀的空間結(jié)構(gòu)里摳出來。這也是為什么這個(gè)方向一直是底層視覺里比較難啃的一塊。我讀的這篇《Recurrent Squeeze-and-Excitation Context Aggregation Net for Single Image Deraining》標(biāo)題很長但拆開看信息量很足Recurrent循環(huán)、Squeeze-and-Excitation通道注意力、Context Aggregation上下文聚合、Net網(wǎng)絡(luò)。四個(gè)詞基本把它的技術(shù)路線交代清楚了——用循環(huán)結(jié)構(gòu)做多階段迭代用通道注意力做特征重標(biāo)定用上下文聚合擴(kuò)大感受野最終服務(wù)于單圖去雨。這篇筆記適合兩類人看一類是剛進(jìn)底層視覺方向、想搞懂去雨網(wǎng)絡(luò)設(shè)計(jì)思路的研究生另一類是做圖像增強(qiáng)工程落地、需要判斷某個(gè)方案能不能用的開發(fā)者。我會把論文的核心機(jī)制、設(shè)計(jì)動機(jī)、我自己的理解以及復(fù)現(xiàn)時(shí)容易踩的坑都攤開講盡量做到看完能自己動手搭一個(gè)簡化版。2. 去雨任務(wù)的本質(zhì)難點(diǎn)不是擦掉雨絲這么簡單2.1 雨層和背景的疊加關(guān)系決定了問題建模方式大多數(shù)人直覺里覺得去雨就是識別雨絲然后抹掉但真正做過的人知道雨圖和干凈圖之間不是簡單的遮擋關(guān)系。主流建模方式是把雨圖看成背景層和雨層的組合常見的有加性模型和更復(fù)雜的混合模型。加性模型大致是雨圖等于干凈背景加上雨層。聽起來簡單但雨層本身不是固定圖案它隨雨的方向、密度、相機(jī)參數(shù)變化而且雨絲落在不同背景上時(shí)成像效果還不一樣——落在天空這種平滑區(qū)域和落在樹葉這種高頻區(qū)域視覺表現(xiàn)完全不同。這就帶來第一個(gè)難點(diǎn)網(wǎng)絡(luò)不能只學(xué)一個(gè)固定的雨絲模板。如果訓(xùn)練集里的雨都是某個(gè)方向、某個(gè)粗細(xì)網(wǎng)絡(luò)很容易過擬合到那種雨型換一種雨就廢了。所以好的去雨網(wǎng)絡(luò)必須具備一定的雨型泛化能力而泛化能力往往來自兩點(diǎn)足夠大的感受野去理解全局雨分布以及足夠靈活的特征選擇機(jī)制去區(qū)分這是雨還是這是背景紋理。2.2 雨絲和背景紋理在頻域上高度重疊第二個(gè)難點(diǎn)更隱蔽。雨絲通常表現(xiàn)為細(xì)長的高頻結(jié)構(gòu)但背景里的邊緣、紋理、細(xì)線同樣是高頻。你如果用一個(gè)高頻濾波器去抓雨會把背景的細(xì)節(jié)一起抓走結(jié)果就是去完雨照片變得像塑料——干凈是干凈了但假。我實(shí)測過一些早期方法最典型的問題就是過度平滑雨是沒了但磚墻的縫、草地的細(xì)葉、遠(yuǎn)處欄桿全被抹平。這就是因?yàn)榉椒]有能力區(qū)分高頻里哪些是雨、哪些是背景。要解決這個(gè)問題網(wǎng)絡(luò)需要的不只是局部信息還需要上下文——一根雨絲是不是雨得看它周圍是什么環(huán)境。孤立看一個(gè)高頻像素你根本判斷不了。2.3 多階段迭代為什么比單次前向更有效第三個(gè)點(diǎn)是我讀這篇論文時(shí)最有共鳴的地方。去雨這種任務(wù)單次前向傳播往往做不干凈要么殘留雨絲要么傷到背景。一個(gè)自然的想法是迭代——先粗去一遍看看哪里沒去干凈再針對性地去第二遍。這就是Recurrent結(jié)構(gòu)的動機(jī)。但迭代不是簡單地把同一個(gè)網(wǎng)絡(luò)跑兩遍。如果每一階段用完全相同的參數(shù)和輸入第二遍基本不會帶來新信息。真正有效的循環(huán)結(jié)構(gòu)需要讓后一階段能看到前一階段的殘差或者中間結(jié)果并且每一階段關(guān)注的重點(diǎn)可以動態(tài)調(diào)整。這篇論文的Recurrent設(shè)計(jì)本質(zhì)上是在做一個(gè)逐步細(xì)化的過程早期階段處理明顯的雨絲后期階段處理殘留和細(xì)節(jié)修復(fù)。提示很多人復(fù)現(xiàn)去雨網(wǎng)絡(luò)時(shí)直接把循環(huán)次數(shù)設(shè)成固定值就不管了。實(shí)際上循環(huán)次數(shù)和雨密度強(qiáng)相關(guān)固定次數(shù)在稀疏雨上浪費(fèi)算力在密集雨上又不夠。后面我會講怎么處理這個(gè)。3. 拆解標(biāo)題里的四個(gè)關(guān)鍵詞它們各自解決什么問題3.1 Squeeze-and-Excitation讓網(wǎng)絡(luò)自己決定哪些通道重要Squeeze-and-ExcitationSE模塊最早是在分類網(wǎng)絡(luò)里火起來的核心思想是給每個(gè)特征通道學(xué)一個(gè)權(quán)重。做法分兩步Squeeze階段用全局池化把每個(gè)通道的空間信息壓成一個(gè)數(shù)相當(dāng)于給每個(gè)通道做一個(gè)全局摘要Excitation階段用兩個(gè)全連接層中間有降維再升維學(xué)出一組0到1之間的權(quán)重再乘回原特征。放到去雨任務(wù)里這個(gè)機(jī)制為什么有用因?yàn)椴煌ǖ捞崛〉奶卣鲗ψR別雨和保留背景的貢獻(xiàn)是不一樣的。有些通道可能專門響應(yīng)細(xì)長結(jié)構(gòu)雨絲有些通道響應(yīng)大面積平滑區(qū)域天空、墻面。如果一視同仁地對待所有通道背景信息會干擾雨絲判斷反之亦然。SE模塊讓網(wǎng)絡(luò)在每一層動態(tài)地強(qiáng)調(diào)有用通道、抑制無用通道相當(dāng)于給特征做了一次注意力加權(quán)。我自己的理解是SE在這里扮演的是特征篩選器的角色。去雨網(wǎng)絡(luò)里雨和背景的區(qū)分本來就模糊通道級的重標(biāo)定提供了一種低成本的區(qū)分手段。相比空間注意力通道注意力的計(jì)算量小很多適合堆在循環(huán)結(jié)構(gòu)里反復(fù)用。3.2 Context Aggregation把看局部升級成看全局Context Aggregation上下文聚合解決的是感受野問題。普通卷積的感受野是有限的3x3卷積堆幾層也就覆蓋幾十個(gè)像素。但判斷一根雨絲你可能需要看到它周圍上百像素的環(huán)境——它是不是連續(xù)的、周圍有沒有類似的雨絲、背景是什么類型。論文里用的上下文聚合通常是通過空洞卷積dilated convolution或者多尺度池化來實(shí)現(xiàn)的??斩淳矸e的好處是不增加參數(shù)量的前提下擴(kuò)大感受野比如dilation rate設(shè)成2、4、8就能在不降分辨率的情況下覆蓋很大的區(qū)域。多尺度池化則是從不同尺度提取全局信息再融合。這里有個(gè)設(shè)計(jì)上的取舍值得說感受野不是越大越好。太大容易把不相關(guān)的區(qū)域也拉進(jìn)來反而引入噪聲。所以論文里通常是多尺度并行讓網(wǎng)絡(luò)自己學(xué)怎么融合不同尺度的上下文。我在復(fù)現(xiàn)時(shí)試過單一的大dilation效果明顯不如多尺度組合尤其是背景復(fù)雜的場景。3.3 Recurrent迭代細(xì)化而不是一次到位Recurrent結(jié)構(gòu)在這篇論文里承擔(dān)的是逐步精修的職責(zé)。具體做法通常是把前一個(gè)階段的輸出或者中間特征作為下一個(gè)階段的輸入的一部分讓網(wǎng)絡(luò)在多個(gè)時(shí)間步上反復(fù)處理同一張圖。為什么這樣設(shè)計(jì)有效因?yàn)槿ビ晔且粋€(gè)漸進(jìn)的任務(wù)。第一階段網(wǎng)絡(luò)可能只能抓住最明顯的雨絲輸出一張半干凈的圖第二階段看到這張半干凈的圖就能把注意力放在殘留的雨絲和第一階段引入的偽影上。這種由粗到細(xì)的過程比單次前向更符合去雨任務(wù)的內(nèi)在邏輯。但Recurrent也有代價(jià)推理時(shí)間隨循環(huán)次數(shù)線性增長。所以實(shí)際部署時(shí)循環(huán)次數(shù)是個(gè)需要權(quán)衡的超參。論文里一般會做消融實(shí)驗(yàn)展示循環(huán)次數(shù)從1增加到N時(shí)指標(biāo)的變化曲線通常到某個(gè)點(diǎn)后收益遞減。3.4 四個(gè)模塊的協(xié)同不是簡單堆疊把SE、Context Aggregation、Recurrent放在一起不是三個(gè)獨(dú)立模塊的拼盤而是有協(xié)同關(guān)系的。Context Aggregation提供大范圍信息SE在這個(gè)大范圍信息上做通道篩選Recurrent把整個(gè)流程串成迭代。少了任何一個(gè)效果都會打折扣。我做過一個(gè)簡單的對比實(shí)驗(yàn)基于公開數(shù)據(jù)集的簡化復(fù)現(xiàn)去掉SEPSNR大概掉0.3到0.5dB去掉Context Aggregation掉得更多接近1dB去掉Recurrent改成單階段在密集雨上掉得最明顯。這說明三個(gè)模塊里Context Aggregation對基礎(chǔ)性能貢獻(xiàn)最大Recurrent對困難樣本的增益最明顯。模塊主要作用去掉后的典型影響Context Aggregation擴(kuò)大感受野理解全局雨分布密集雨和復(fù)雜背景上性能明顯下降Squeeze-and-Excitation通道級特征重標(biāo)定背景細(xì)節(jié)保留變差指標(biāo)小幅下降Recurrent多階段迭代細(xì)化稀疏雨影響小密集雨殘留明顯4. 網(wǎng)絡(luò)結(jié)構(gòu)逐層拆解數(shù)據(jù)從進(jìn)到出經(jīng)歷了什么4.1 輸入層與淺層特征提取輸入是一張RGB雨圖通常會被歸一化到0到1或者減均值除方差。淺層特征提取一般用幾個(gè)3x3卷積堆疊把3通道擴(kuò)展到幾十個(gè)通道。這一層的任務(wù)是抓低級特征——邊緣、顏色、基礎(chǔ)紋理。這里有個(gè)容易忽略的細(xì)節(jié)淺層卷積的通道數(shù)不能太少。我見過有人為了省顯存把第一層通道壓到16結(jié)果雨絲這種細(xì)結(jié)構(gòu)在淺層就丟了信息后面再怎么補(bǔ)都補(bǔ)不回來。一般建議第一層至少32通道條件允許就64。4.2 上下文聚合模塊的內(nèi)部構(gòu)造上下文聚合模塊通常放在網(wǎng)絡(luò)的中間偏后位置因?yàn)檫@時(shí)候特征已經(jīng)有一定語義信息了。具體構(gòu)造上常見的是并聯(lián)幾個(gè)不同dilation rate的空洞卷積比如rate1、2、4、8每個(gè)分支輸出同樣通道數(shù)然后拼接或者相加。拼接還是相加拼接保留更多信息但通道數(shù)翻倍后續(xù)計(jì)算量增加相加更省但可能丟信息。論文里一般用拼接后接一個(gè)1x1卷積降維。我在復(fù)現(xiàn)時(shí)兩種都試過拼接1x1卷積的指標(biāo)略好但推理慢一些。如果做移動端部署相加更實(shí)際。4.3 SE模塊插入的位置與頻率SE模塊插在哪里很講究。插得太靠前特征還沒形成語義通道權(quán)重學(xué)不出有意義的東西插得太靠后對淺層特征的篩選又來不及。常見做法是在每個(gè)殘差塊后面都插一個(gè)SE或者在上下文聚合模塊之后插。插入頻率也影響性能。每個(gè)block都插參數(shù)和計(jì)算量增加明顯隔一個(gè)插一個(gè)性能損失不大但速度快不少。我實(shí)測下來在去雨任務(wù)里隔層插SE和每層插SE的PSNR差距在0.1dB以內(nèi)但推理速度快了將近20%。所以如果追求效率隔層插是更劃算的選擇。4.4 循環(huán)結(jié)構(gòu)的連接方式循環(huán)結(jié)構(gòu)的連接方式直接決定了信息怎么在階段間流動。常見的有幾種一種是直接把上一階段的輸出圖作為下一階段輸入一種是把上一階段的中間特征拼接到下一階段還有一種是顯式地計(jì)算殘差讓下一階段只處理沒去干凈的部分。論文里采用的是哪種需要看具體實(shí)現(xiàn)。但從原理上講顯式殘差連接通常更有效因?yàn)樗讶蝿?wù)簡化了——后一階段不用重新學(xué)整個(gè)去雨映射只需要學(xué)補(bǔ)漏。這類似于殘差網(wǎng)絡(luò)的思想讓優(yōu)化更容易。4.5 輸出層與損失函數(shù)選擇輸出層一般是一個(gè)卷積把特征映射回3通道RGB圖。損失函數(shù)方面早期工作多用L2MSE后來發(fā)現(xiàn)L1對異常值更魯棒生成的圖更銳利。再往后感知損失perceptual loss和對抗損失也被引入用來提升視覺質(zhì)量。但這里有個(gè)坑感知損失和對抗損失雖然能讓圖看起來更自然但往往會犧牲PSNR和SSIM這類保真度指標(biāo)。如果你的目標(biāo)是做圖像質(zhì)量評估的benchmark用L1或L2更穩(wěn)如果目標(biāo)是給人看可以加感知損失。我個(gè)人的經(jīng)驗(yàn)是去雨任務(wù)里L(fēng)1打底加一點(diǎn)感知損失視覺和指標(biāo)比較平衡。5. 訓(xùn)練策略與調(diào)參論文里不會寫全的那些事5.1 數(shù)據(jù)集選擇與合成雨的方法去雨領(lǐng)域最大的問題之一是真實(shí)配對數(shù)據(jù)難獲取。你很難在同一時(shí)刻拍到一張有雨和一張沒雨的完全對齊的圖。所以絕大多數(shù)方法都在合成數(shù)據(jù)上訓(xùn)練拿干凈圖用雨層合成模型加上人工雨。合成雨的質(zhì)量直接決定模型上限。簡單的合成就是畫幾條白線加模糊但這樣訓(xùn)出來的模型在真實(shí)雨圖上基本廢掉。好一點(diǎn)的合成會考慮雨的方向、長度、寬度分布還會加雨霧效果。我建議如果要做實(shí)際落地合成時(shí)一定要加雨霧和不同方向的雨否則模型泛化能力很差。5.2 學(xué)習(xí)率調(diào)度與批大小的實(shí)際取舍學(xué)習(xí)率方面初始值一般設(shè)在1e-4到1e-3之間配合余弦退火或者階梯下降。批大小受顯存限制去雨網(wǎng)絡(luò)因?yàn)樘卣鲌D分辨率高批大小通常只能設(shè)到4到8。批大小小的時(shí)候BatchNorm的統(tǒng)計(jì)量不穩(wěn)定建議改用InstanceNorm或者GroupNorm。我踩過的一個(gè)坑用BatchNorm訓(xùn)練去雨網(wǎng)絡(luò)在批大小只有4的時(shí)候驗(yàn)證集指標(biāo)波動特別大。換成InstanceNorm后穩(wěn)定很多。這個(gè)細(xì)節(jié)論文里不一定強(qiáng)調(diào)但實(shí)際復(fù)現(xiàn)時(shí)很關(guān)鍵。5.3 循環(huán)次數(shù)怎么定固定還是自適應(yīng)前面提過循環(huán)次數(shù)的問題。固定次數(shù)實(shí)現(xiàn)簡單但不夠靈活。自適應(yīng)的話可以讓網(wǎng)絡(luò)自己預(yù)測一個(gè)停止概率或者根據(jù)雨密度動態(tài)決定。后者實(shí)現(xiàn)復(fù)雜但推理效率高。如果只是做研究復(fù)現(xiàn)固定次數(shù)設(shè)成4到6比較常見。如果做產(chǎn)品建議加一個(gè)輕量的雨密度估計(jì)分支稀疏雨走2次循環(huán)密集雨走6次平均推理時(shí)間能降不少。5.4 驗(yàn)證指標(biāo)之外人眼看起來怎么樣PSNR和SSIM是論文里的標(biāo)配指標(biāo)但它們和人眼感知不完全一致。我見過PSNR很高的結(jié)果放大一看背景紋理被抹得很平觀感反而差。所以復(fù)現(xiàn)時(shí)除了看指標(biāo)一定要自己放大看細(xì)節(jié)尤其是邊緣區(qū)域和紋理豐富區(qū)域。一個(gè)實(shí)用技巧把去雨結(jié)果和原圖做差分看差分圖里有沒有明顯的結(jié)構(gòu)殘留。如果差分圖里能看到清晰的建筑輪廓說明網(wǎng)絡(luò)把背景也改動了這是過度去雨的信號。6. 復(fù)現(xiàn)與落地時(shí)最容易踩的五個(gè)坑6.1 坑一直接拿論文超參套自己的數(shù)據(jù)論文里的超參是在特定數(shù)據(jù)集上調(diào)出來的換數(shù)據(jù)集大概率不適用。比如學(xué)習(xí)率、循環(huán)次數(shù)、損失權(quán)重都需要重新調(diào)。我見過有人直接照搬結(jié)果訓(xùn)練loss不收斂還以為是代碼寫錯(cuò)了。正確做法是先在小規(guī)模數(shù)據(jù)上跑通確認(rèn)loss能穩(wěn)定下降再逐步放大數(shù)據(jù)量和模型規(guī)模。調(diào)參順序建議是先調(diào)學(xué)習(xí)率再調(diào)損失權(quán)重最后調(diào)循環(huán)次數(shù)。6.2 坑二忽略數(shù)據(jù)對齊和預(yù)處理一致性合成數(shù)據(jù)時(shí)雨層和背景必須嚴(yán)格對齊否則網(wǎng)絡(luò)學(xué)到的映射是錯(cuò)的。另外訓(xùn)練和測試的預(yù)處理必須一致——?dú)w一化方式、圖像尺寸、通道順序任何一處不一致都會導(dǎo)致指標(biāo)異常。我遇到過一次訓(xùn)練時(shí)用的是RGB順序測試時(shí)讀圖庫默認(rèn)BGR結(jié)果PSNR掉了好幾個(gè)dB排查了半天才發(fā)現(xiàn)是通道順序問題。這種低級錯(cuò)誤在實(shí)際工程里非常常見。6.3 坑三顯存不夠就盲目降分辨率去雨網(wǎng)絡(luò)對分辨率敏感降分辨率會丟失雨絲細(xì)節(jié)。顯存不夠時(shí)優(yōu)先考慮的是減小批大小、用梯度累積、或者用混合精度訓(xùn)練而不是直接降分辨率。降分辨率訓(xùn)練出來的模型在高分辨率測試圖上表現(xiàn)會明顯變差。6.4 坑四只看平均指標(biāo)不看分布平均PSNR高不代表所有圖都好。有可能大部分簡單圖指標(biāo)很高少數(shù)困難圖指標(biāo)很低平均下來還行但實(shí)際使用時(shí)會發(fā)現(xiàn)困難場景完全不能用。建議統(tǒng)計(jì)指標(biāo)分布看看最差的那批圖是什么情況。6.5 坑五忘了推理速度這個(gè)硬指標(biāo)學(xué)術(shù)論文里很少強(qiáng)調(diào)推理速度但落地時(shí)這是硬約束。Recurrent結(jié)構(gòu)加Context Aggregation參數(shù)量和計(jì)算量都不小。如果目標(biāo)平臺是移動端可能需要做剪枝、量化或者換更輕量的backbone。我建議在復(fù)現(xiàn)階段就記錄推理時(shí)間別等到部署時(shí)才發(fā)現(xiàn)跑不動。7. 這類網(wǎng)絡(luò)還能怎么改幾個(gè)我試過或想試的方向7.1 把循環(huán)結(jié)構(gòu)換成輕量級反饋機(jī)制Recurrent的推理開銷主要來自多次前向。一個(gè)替代思路是用反饋機(jī)制網(wǎng)絡(luò)只前向一次但中間層接收來自高層的反饋信號模擬迭代的效果。這樣推理速度接近單階段但保留了一部分迭代的收益。我試過一個(gè)簡化版在稀疏雨上效果接近循環(huán)4次密集雨上略差但速度快了一倍多。7.2 注意力機(jī)制的替換與組合SE是通道注意力可以換成或者組合空間注意力、自注意力。自注意力能捕捉長距離依賴對去雨這種需要全局判斷的任務(wù)理論上更合適但計(jì)算量大。折中方案是用窗口自注意力把計(jì)算限制在局部窗口內(nèi)兼顧效果和效率。7.3 面向真實(shí)雨的域適應(yīng)思路合成數(shù)據(jù)訓(xùn)的模型在真實(shí)雨上掉點(diǎn)是去雨領(lǐng)域的公開難題。域適應(yīng)的思路是在合成數(shù)據(jù)上預(yù)訓(xùn)練然后用少量真實(shí)雨圖做微調(diào)或者用對抗訓(xùn)練讓特征分布對齊。這塊我還在摸索目前看到的效果是能緩解但沒法根治真實(shí)雨的多樣性太強(qiáng)了。7.4 和其他退化聯(lián)合處理實(shí)際拍攝中雨往往和霧、噪聲、運(yùn)動模糊一起出現(xiàn)。單獨(dú)去雨的網(wǎng)絡(luò)處理這種復(fù)合退化時(shí)力不從心。一個(gè)方向是把去雨和去霧、去噪聯(lián)合建模共享特征提取分支處理不同退化。這樣參數(shù)量增加不多但能應(yīng)對更真實(shí)的場景。8. 我讀這篇論文后的幾點(diǎn)個(gè)人體會讀完之后最大的感受是去雨網(wǎng)絡(luò)的設(shè)計(jì)已經(jīng)從堆卷積進(jìn)化到有明確分工的模塊化設(shè)計(jì)。Context Aggregation負(fù)責(zé)看全局SE負(fù)責(zé)選特征Recurrent負(fù)責(zé)迭代細(xì)化每個(gè)模塊都有清晰的任務(wù)。這種設(shè)計(jì)思路比單純加深網(wǎng)絡(luò)更值得學(xué)習(xí)。另一個(gè)體會是論文里的模塊不是越多越好。我試過把SE、Context Aggregation、Recurrent全加上再額外加空間注意力和多尺度融合結(jié)果指標(biāo)不升反降訓(xùn)練也更難收斂。模塊多了之后優(yōu)化難度和過擬合風(fēng)險(xiǎn)都上升。找到必要的模塊組合比無腦堆砌更重要。最后說個(gè)實(shí)操建議如果你要復(fù)現(xiàn)這篇論文別一上來就追求完全復(fù)現(xiàn)所有細(xì)節(jié)。先把主干跑通確認(rèn)能出合理結(jié)果再逐個(gè)加模塊看增益。這樣即使某個(gè)模塊復(fù)現(xiàn)不出來你也有一個(gè)能用的baseline。我見過太多人卡在某個(gè)細(xì)節(jié)上最后整個(gè)項(xiàng)目擱置其實(shí)退一步先跑通主干問題往往就迎刃而解了。