域提議算法深度解析)
接觸圖像處理時(shí)間久了你會(huì)發(fā)現(xiàn)一個(gè)問題算法學(xué)了一大堆濾波、邊緣檢測(cè)、形態(tài)學(xué)操作、閾值分割都能寫可一旦丟一個(gè)真實(shí)項(xiàng)目過來——比如讓你檢測(cè)出一張街景照片里的所有行人——很多人就卡住了。問題不在于某個(gè)函數(shù)不會(huì)調(diào)而在于腦子里只有“像素操作”的碎片沒有把圖像處理這件事拆成有層次的體系。這篇深度篇第一篇我打算把兩件事徹底講透一是圖像處理的三個(gè)層次到底是怎么回事二是selective search這個(gè)在目標(biāo)檢測(cè)史上非常重要的算法它憑什么能從一張圖里“挑出”可能裝著目標(biāo)的區(qū)域。搞懂這兩件事你再看如今各種基于深度學(xué)習(xí)的檢測(cè)框架會(huì)順很多。1. 先把層次感建立起來圖像處理到底在“處理”什么1.1 從像素到語義三個(gè)層次的劃分依據(jù)很多人學(xué)圖像處理是直接從API入手的cv2.GaussianBlur會(huì)模糊、cv2.Canny會(huì)出邊緣、cv2.threshold會(huì)做二值化。但你有沒有想過這些操作其實(shí)是完全不同性質(zhì)的工作我習(xí)慣把圖像處理分成三個(gè)遞進(jìn)層次來看。底層像素層或者說預(yù)處理層。這個(gè)層次的操作對(duì)象是“單個(gè)像素及其鄰域”目標(biāo)是改善圖像本身的質(zhì)量或者突出某種像素級(jí)的特征。典型的操作包括高斯濾波、中值濾波、直方圖均衡化、形態(tài)學(xué)膨脹腐蝕、顏色空間變換。它的輸出仍然是一張圖像只是這張圖更容易被后續(xù)環(huán)節(jié)“讀懂”。中層結(jié)構(gòu)與特征層。到這個(gè)層次操作對(duì)象已經(jīng)不是像素了而是“像素組成的局部結(jié)構(gòu)”或者“有統(tǒng)計(jì)意義的特征”。邊緣線段、角點(diǎn)、紋理、超像素區(qū)域、梯度直方圖這些都是中層產(chǎn)物。它的輸出往往不是一張圖片而是一組有數(shù)學(xué)意義的結(jié)構(gòu)描述。比如 SIFT 特征點(diǎn)描述子比如 HOG 特征比如經(jīng)過分割得到的區(qū)域。高層語義層。這一層處理的對(duì)象是“物體”和“場(chǎng)景”。目標(biāo)是回答“圖里有什么、在哪里、是什么狀態(tài)”。目標(biāo)檢測(cè)、實(shí)例分割、場(chǎng)景分類、行為識(shí)別都屬于這一層。這三個(gè)層次不是孤立的而是嚴(yán)格的遞進(jìn)關(guān)系底層輸出是中層輸入中層輸出是高層輸入。你完全可以把它理解成一個(gè)工業(yè)流水線原料礦石底層——提取金屬材料中層——組裝成產(chǎn)品高層。1.2 三個(gè)層次的典型任務(wù)與代表算法我用一張表格把這幾個(gè)層次的關(guān)鍵信息拉通平時(shí)選技術(shù)方案時(shí)可以直接對(duì)照層次核心問題代表算法/操作典型應(yīng)用底層像素層這個(gè)像素/鄰域該如何調(diào)整高斯濾波、直方圖均衡、Canny邊緣、膨脹腐蝕、顏色空間轉(zhuǎn)換圖像增強(qiáng)、去噪、圖像預(yù)處理中層結(jié)構(gòu)層哪些像素組合成一個(gè)有意義的結(jié)構(gòu)SIFT/SURF、Felzenszwalb分割、HOG、selective search特征提取、超像素分割、候選區(qū)域生成高層語義層這個(gè)結(jié)構(gòu)代表什么對(duì)象SVM分類、R-CNN系列、YOLO、語義分割網(wǎng)絡(luò)目標(biāo)檢測(cè)、圖像識(shí)別、場(chǎng)景理解做傳統(tǒng)視覺項(xiàng)目的時(shí)候這三個(gè)層次往往要分別設(shè)計(jì)和調(diào)優(yōu)做深度學(xué)習(xí)項(xiàng)目的時(shí)候卷積網(wǎng)絡(luò)把部分層次內(nèi)化了但候選區(qū)域生成這種中層邏輯依然會(huì)以各種形式出現(xiàn)。1.3 為什么很多人學(xué)完OpenCV仍然不會(huì)做項(xiàng)目我接觸過不少初學(xué)者也帶過實(shí)習(xí)生我發(fā)現(xiàn)大家普遍卡在一個(gè)點(diǎn)上只會(huì)在底層像素層打轉(zhuǎn)。比如要檢測(cè)圖像里的螺絲缺陷新手的第一反應(yīng)通常是“調(diào)閾值、找輪廓”。但真實(shí)工況下光照不均勻、背景干擾多閾值怎么調(diào)都不穩(wěn)定。問題出在哪出在他沒有向上一個(gè)層次抽象——螺絲和背景的本質(zhì)區(qū)別可能不在灰度值上而在紋理梯度的一致性上也可能在于“區(qū)域”而不是“邊緣”上。selective search就是一個(gè)典型的“中層結(jié)構(gòu)”工具它要做的事是站在中層的角度去思考一張圖里哪些像素區(qū)域組合起來最有可能構(gòu)成一個(gè)完整目標(biāo)。2. selective search 為什么會(huì)出現(xiàn)從滑動(dòng)窗口到候選區(qū)域2.1 目標(biāo)檢測(cè)里的“暴力枚舉”困境在深度學(xué)習(xí)之前做目標(biāo)檢測(cè)最樸素的想法就是“把圖上所有可能的窗口都看一遍”——這就是滑動(dòng)窗口法。聽起來很直接但算一下復(fù)雜度你就明白了。假設(shè)輸入圖像是 1000×600 像素我們只考慮一個(gè) 100×100 的窗口步長(zhǎng)取 10 像素那么橫向要滑 (1000?100)/10 ≈ 90 次縱向要滑 (600?100)/10 ≈ 50 次總共 4500 個(gè)位置??雌饋磉€能接受但實(shí)際目標(biāo)檢測(cè)不可能只用一種固定尺度。一輛遠(yuǎn)處的汽車在圖上可能只有 50×50 像素近處的同一輛車可能占到 300×200 像素。你至少要覆蓋 10~20 種尺度每種尺度下還要考慮 2~3 種寬高比。這么一乘候選窗口數(shù)量輕松突破 50 萬。每個(gè)窗口都要送進(jìn)分類器提取特征一次哪怕只要 1 毫秒50 萬次就是 500 秒將近 10 分鐘。這還只是一張圖。這種“暴力枚舉”在工程上根本跑不動(dòng)。2.2 區(qū)域提議思想的誕生邏輯人眼看圖的時(shí)候從來不這么干。你不會(huì)從圖的左上角到右下角一行一行去“搜索”物體在哪里而是第一時(shí)間就被顏色差異、邊緣輪廓吸引到幾個(gè)局部區(qū)域上。這是底層視覺注意力機(jī)制在起作用。區(qū)域提議Region Proposal的核心思想就是模仿這種機(jī)制先用顏色、紋理、邊緣這類底層線索把圖像劃分成若干可能有目標(biāo)的區(qū)域然后只對(duì)這些區(qū)域?qū)?yīng)的矩形框做后續(xù)分類。這樣做的好處非常明顯候選框數(shù)量從幾十萬降到一兩千同時(shí)因?yàn)閰^(qū)域邊界基于圖像結(jié)構(gòu)產(chǎn)生對(duì)目標(biāo)的定位比固定窗口精準(zhǔn)得多。你可以這樣理解滑動(dòng)窗口是“閉著眼睛在圖上摸”區(qū)域提議是“先睜眼掃一遍找到幾個(gè)疑似有東西的地方”。2.3 selective search 在整個(gè)檢測(cè)流程中的位置selective search在這條流程里的位置正好卡在“圖像結(jié)構(gòu)”和“語義判斷”之間。以經(jīng)典的 R-CNN 目標(biāo)檢測(cè)流程為例輸入圖像 → 生成候選區(qū)域selective search→ 將每個(gè)候選區(qū)域裁剪并縮放到固定尺寸 → 用卷積網(wǎng)絡(luò)提取特征 → 用 SVM 分類 框回歸 → 非極大值抑制NMS去重 → 輸出最終檢測(cè)框注意關(guān)鍵一點(diǎn)selective search不負(fù)責(zé)識(shí)別任何目標(biāo)它只負(fù)責(zé)“建議”。它給你一堆矩形框告訴你“我覺得這些框里可能有東西”。后面的分類器才負(fù)責(zé)判斷框里到底是什么類別。這有個(gè)很微妙的后果如果某個(gè)目標(biāo)壓根沒有出現(xiàn)在候選框里就算后面的分類器再強(qiáng)也不可能把它找出來。所以在 R-CNN 那個(gè)時(shí)代檢測(cè)效果的上限往往不是由 CNN 決定的而是由selective search的召回率決定的。這件事直到今天依然有參考意義——你在設(shè)計(jì)任何檢測(cè)管線時(shí)都要先問一句我的候選區(qū)域生成環(huán)節(jié)有沒有可能把目標(biāo)漏掉3. selective search 的核心怎么“選出”那些可能裝目標(biāo)的框3.1 初始區(qū)域基于圖的分割selective search的起點(diǎn)是對(duì)圖像做一次“過分割”把圖像拆成很多小塊。它選用的是一種名叫 Felzenszwalb 的基于圖的分割算法。為什么偏偏選它因?yàn)閟elective search的后續(xù)步驟是“合并”而合并的前提是初始區(qū)域不能太大也不能太小。Felzenszwalb 算法的特點(diǎn)是速度快、對(duì)邊緣貼合度高。我當(dāng)時(shí)第一次看到它分割結(jié)果的時(shí)候印象最深的是它不會(huì)像普通閾值分割那樣產(chǎn)生一堆破碎噪聲也不會(huì)像某些超像素算法那樣把物體邊界抹得太平滑。這一步的產(chǎn)物是一張“區(qū)域標(biāo)簽圖”——圖像里每個(gè)像素都被分配了一個(gè)區(qū)域編號(hào)相鄰的像素如果顏色接近通常會(huì)被劃分到同一個(gè)初始區(qū)域。3.2 相似度怎么算四類互補(bǔ)策略有了初始區(qū)域之后算法要做的是從小到大不斷合并相鄰區(qū)域。但“能合”和“該合”不是一回事這就要靠相似度來把關(guān)。selective search用了四類相似度不是隨意選的四個(gè)角度各有分工。第一是顏色相似度。計(jì)算兩個(gè)區(qū)域在每個(gè)顏色通道上的顏色直方圖直方圖越接近說明顏色分布越像。它解決的是“同一塊區(qū)域顏色漸變”的情況比如天空和遠(yuǎn)處的湖面。第二是紋理相似度。算法會(huì)提取區(qū)域內(nèi)的紋理統(tǒng)計(jì)特征紋理相似才容易被合并。它解決的是“同一類材質(zhì)”的情況比如草地、樹木、磚墻這類區(qū)域內(nèi)部的顏色可能差距很大但紋理模式是一致的。第三是尺寸相似度。當(dāng)兩個(gè)區(qū)域都比較小的時(shí)候優(yōu)先合并避免大的區(qū)域慢慢吞掉旁邊的小區(qū)域。這個(gè)策略很聰明它保證了合并過程“盡量從局部到整體”不會(huì)一開始就出現(xiàn)一個(gè)超級(jí)大的區(qū)域把幾個(gè)目標(biāo)一起包進(jìn)去。第四是填充相似度。這個(gè)概念有點(diǎn)反直覺它衡量的是兩個(gè)區(qū)域能不能互相“補(bǔ)全”。如果區(qū)域 A 幾乎完全包含在區(qū)域 B 的包圍盒里說明 A 很可能是 B 內(nèi)部的子結(jié)構(gòu)兩者應(yīng)該合并。你看這四個(gè)角度其實(shí)是互補(bǔ)的顏色解決整體外觀紋理解決內(nèi)部結(jié)構(gòu)尺寸控制合并節(jié)奏填充處理嵌套關(guān)系。只用一個(gè)角度的算法往往不穩(wěn)定這就是為什么selective search的設(shè)計(jì)值得反復(fù)咀嚼——它不是在某個(gè)單一規(guī)則上做得很極端而是用多個(gè)互補(bǔ)規(guī)則把“區(qū)域合并”這個(gè)模糊問題拆解得足夠穩(wěn)。3.3 多樣化策略為什么要搞那么多顏色空間和相似度組合selective search的作者在做實(shí)驗(yàn)時(shí)發(fā)現(xiàn)一件尷尬的事不管你怎么調(diào)分割參數(shù)單次分割和單組相似度組合下總有一些目標(biāo)會(huì)被漏掉。原因也不難理解。自然圖像的內(nèi)容太復(fù)雜同一只貓?jiān)?RGB 空間里可能和背景顏色混雜但在 HSV 空間里飽和度對(duì)比卻非常明顯同一棟樓的紋理在普通灰度圖里雜亂無章站遠(yuǎn)了看卻是一個(gè)整體。于是作者引入了“多樣化”策略在不同的顏色空間里分別做分割和相似度計(jì)算同時(shí)使用不同的相似度組合方式相當(dāng)于讓“多個(gè)視角不同的專家”各自提一批候選框最后把所有的框匯總起來。每一路專家都可能漏掉某些目標(biāo)但幾路專家漏掉的目標(biāo)集合基本不重疊匯總后的召回率就上去了。代價(jià)也很直接計(jì)算量成倍增加。這也解釋了為什么selective search在 CPU 上跑一張圖要花幾秒鐘——它背后可能跑了多組分段的完整合并流程。3.4 層次合并的完整流程把上面這些東西串起來selective search的完整算法流程是這樣的用 Felzenszwalb 分割算法得到初始區(qū)域集合。計(jì)算所有相鄰區(qū)域兩兩之間的相似度相似度由顏色、紋理、尺寸、填充四部分組成。找到相似度最高的一對(duì)相鄰區(qū)域把它們合并成一個(gè)新區(qū)域。刪掉與這兩個(gè)舊區(qū)域相關(guān)的相似度記錄計(jì)算新區(qū)域與其鄰居的相似度。把新區(qū)域?qū)?yīng)的外接矩形加入候選框列表?;氐降谌街貜?fù)直到?jīng)]有任何區(qū)域可以合并。對(duì)候選框列表做重疊度去重得到最終的候選區(qū)域集合。這個(gè)過程本質(zhì)上是一個(gè)自底向上的層次聚類。我個(gè)人的經(jīng)驗(yàn)是只看文字描述會(huì)覺得抽象但一旦你把中間每一步的區(qū)域標(biāo)簽圖可視化出來就非常好懂了——你會(huì)看到分割圖上的小塊區(qū)域兩兩抱團(tuán)慢慢從小碎塊聚成中塊再到能把整個(gè)目標(biāo)輪廓包起來的大塊每一輪合并出來的外接矩形都被記錄下來當(dāng)候選框。4. 實(shí)操跑通 selective search 并調(diào)出可用的候選框4.1 環(huán)境與工具選擇實(shí)踐部分必須落地。目前用selective search主要有兩條路我兩個(gè)都試過區(qū)別還挺明顯。一是用 OpenCV 的擴(kuò)展模塊ximgproc里的selectiveSearchSegmentation類。安裝方式是pip install opencv-contrib-python然后通過cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()創(chuàng)建對(duì)象。它有switchToSelectiveSearchFast()和switchToSelectiveSearchQuality()兩個(gè)預(yù)設(shè)模式前者更快但候選框少后者慢但召回更好。二是用獨(dú)立的selectivesearchPython 庫pip install selectivesearch即可。底層依賴 OpenCV 和 scikit-image接口非常直觀適合做實(shí)驗(yàn)和可視化。我的建議是快速驗(yàn)證用selectivesearch庫工程集成用 OpenCV 的版本因?yàn)樗恍枰~外維護(hù)依賴而且可以通過setBaseImage和addImage靈活地做多策略擴(kuò)展。4.2 核心參數(shù)與調(diào)優(yōu)經(jīng)驗(yàn)如果你用的是selectivesearch庫核心調(diào)用就一行import selectivesearch # 讀入圖像建議先調(diào)整到合適尺寸 img cv2.cvtColor(cv2.imread(street.jpg), cv2.COLOR_BGR2RGB) # scale 控制分割粒度sigma 控制平滑程度min_size 控制最小區(qū)域面積 img_label, regions selectivesearch.selective_search( img, scale300, sigma0.8, min_size50 )返回的regions是一個(gè)列表每個(gè)元素是一個(gè)字典主要包含兩個(gè)字段rect是候選框的(x, y, w, h)size是該區(qū)域包含的像素?cái)?shù)量。我一般會(huì)先做一輪過濾把太小且沒有實(shí)際意義的區(qū)域扔掉candidates [] for r in regions: rect r[rect] # 去掉重復(fù)框和極小區(qū)域 if rect in candidates: continue if r[size] 200: continue candidates.append(rect)這里每個(gè)參數(shù)都直接影響最終候選框質(zhì)量我的調(diào)試經(jīng)驗(yàn)如下scale是分割粒度值越大初始區(qū)域越粗糙。如果你發(fā)現(xiàn)候選框里面目標(biāo)總是被拆成好幾個(gè)碎片試著把scale調(diào)大比如從 300 調(diào)到 400~500。反之如果背景區(qū)域太大或目標(biāo)框太粗糙就調(diào)小。sigma控制分割前的平滑程度它作用于高斯模糊。默認(rèn)的 0.8~1.0 通常夠用圖像噪聲大時(shí)可以稍微提高到 1.5但我很少動(dòng)它因?yàn)樗鼘?duì)最終結(jié)果的影響最不明顯。min_size控制初始分割時(shí)區(qū)塊的最小像素?cái)?shù)量。它太小會(huì)讓初始區(qū)域碎成渣候選框數(shù)量爆炸它太大又可能把小目標(biāo)直接抹掉。通常我會(huì)取 30~60再結(jié)合輸入分辨率調(diào)整——輸入圖越大這個(gè)值可以適當(dāng)大一點(diǎn)。4.3 與深度學(xué)習(xí)檢測(cè)模型配合時(shí)的注意點(diǎn)selective search當(dāng)年最經(jīng)典的用法是作為 R-CNN 的區(qū)域提議模塊?,F(xiàn)在雖然很少直接用了但只要你手里還有老代碼需要維護(hù)或者你想復(fù)現(xiàn)經(jīng)典論文下面這些配合細(xì)節(jié)仍然很有用。第一候選框數(shù)量要卡上限。R-CNN 訓(xùn)練時(shí)一般取 2000 個(gè)候選區(qū)域。不需要把selective search生成的所有框都送進(jìn)網(wǎng)絡(luò)因?yàn)榇罅靠蚴歉叨戎丿B的對(duì)訓(xùn)練沒有增益反而拖慢速度。你可以先按size排序保留重疊度不同的前 2000 個(gè)。第二正負(fù)樣本的 IoU 閾值要定好?;诤蜻x框和真實(shí)標(biāo)注框的交并比IoU一般 IoU 大于 0.5 的當(dāng)作正樣本IoU 小于 0.3 的當(dāng)作負(fù)樣本。注意這個(gè)問題在selective search時(shí)代就存在——它生成的框天然偏向“包含整個(gè)目標(biāo)的外接框”所以正樣本采樣比例通常要反復(fù)實(shí)驗(yàn)。第三記得做非極大值抑制之外的框去重。selective search本身會(huì)去重但不同參數(shù)組合和多策略模式可能生成多個(gè)高度重合的框。如果直接在可視化和評(píng)估階段使用會(huì)被重復(fù)計(jì)數(shù)。4.4 常見坑與性能優(yōu)化selective search最明顯的槽點(diǎn)是慢。我自己在一張 1000×600 的街景圖上跑默認(rèn)配置CPU 環(huán)境下大致需要 3~6 秒。這個(gè)速度在今天的檢測(cè)框架里幾乎不可接受。緩解辦法有幾個(gè)先把輸入圖縮放到寬邊不超過 600 像素。selective search對(duì)分辨率非常敏感縮放后速度能提升數(shù)倍候選框質(zhì)量損失其實(shí)不大。使用 OpenCV 版本的switchToSelectiveSearchFast()它內(nèi)部只使用有限組的顏色空間和相似度組合速度能到幾百毫秒級(jí)別適合先做驗(yàn)證。如果目標(biāo)是密集小物體不要把min_size調(diào)太大否則小目標(biāo)直接被合并沒了此時(shí)犧牲一點(diǎn)速度為代價(jià)保留更碎的初始區(qū)域。另外還有一個(gè)非常隱蔽的坑selective search的輸入圖像通道順序。用 OpenCV 讀圖默認(rèn)是 BGR而selectivesearch庫內(nèi)部是按 RGB 處理的。我見過很多人在這一步翻車候選框的位置倒是沒問題但分割效果莫名其妙差很多。直接讀圖后先cv2.cvtColor再傳給selective_search穩(wěn)定得多。5. 從 selective search 往后看區(qū)域提議技術(shù)的演進(jìn)5.1 EdgeBoxes 與 RPN 的對(duì)比區(qū)域提議這個(gè)思路后來延續(xù)了很久也出現(xiàn)了幾個(gè)重要變體。我把主流方案放在一起做過對(duì)比最有代表性的有三個(gè)selective search、EdgeBoxes、以及深度學(xué)習(xí)時(shí)代的 RPN。方法核心思路單張圖速度CPU/GPU特點(diǎn)selective search顏色/紋理/尺寸/填充多策略合并區(qū)域1~6 秒CPU通用性強(qiáng)召回率高速度慢EdgeBoxes根據(jù)邊緣密度和邊緣包圍度打分0.2~0.5 秒CPU速度快但紋理復(fù)雜場(chǎng)景下召回不如 selective searchRPNFaster R-CNN在卷積特征圖上直接回歸候選框并給出目標(biāo)性分?jǐn)?shù)約 10 毫秒GPU與檢測(cè)網(wǎng)絡(luò)端到端聯(lián)合訓(xùn)練速度和精度都大幅提升我當(dāng)時(shí)剛接觸 Faster R-CNN 時(shí)有一個(gè)很深的感觸RPN 之所以是革命性的不只是因?yàn)樗於撬选昂蜻x區(qū)域生成”從獨(dú)立的預(yù)處理變成檢測(cè)網(wǎng)絡(luò)內(nèi)部的一個(gè)模塊讓區(qū)域質(zhì)量和分類目標(biāo)共享同一個(gè)特征空間。這背后是一個(gè)更大的趨勢(shì)傳統(tǒng)視覺里層層解耦的 pipeline被深度學(xué)習(xí)逐步“折疊”進(jìn)一個(gè)可微分的端到端網(wǎng)絡(luò)里。但這不代表selective search失去了學(xué)習(xí)價(jià)值。恰恰相反你要想真正理解 RPN 的標(biāo)簽生成、錨點(diǎn)設(shè)計(jì)、正負(fù)樣本分配就必須知道selective search當(dāng)年是怎么解決“如何不讓目標(biāo)漏出候選框”這個(gè)問題的。5.2 在三個(gè)層次中重新定位selective search 的橋梁作用把目光拉回到文章最開始講的三個(gè)層次你會(huì)發(fā)現(xiàn)selective search的位置非常特殊。它的輸入是底層分割結(jié)構(gòu)——像素的區(qū)域標(biāo)簽本質(zhì)是顏色、紋理這些中層特征它的輸出卻是一組“疑似目標(biāo)的矩形框”這已經(jīng)一腳踩進(jìn)高層語義的地盤了。換句話說selective search是經(jīng)典視覺體系里“中層結(jié)構(gòu)”向“高層語義”過渡的典型代表。這件事給我們的啟發(fā)是圖像處理的層次之間不是非得嚴(yán)格串行。你可以用中層的分割結(jié)果直接推測(cè)高層的目標(biāo)假設(shè)也可以反過來用高層的檢測(cè)結(jié)果指導(dǎo)底層分割的參數(shù)。這就是各種“Active Contour”“顯著性驅(qū)動(dòng)分割”方法在做的事。5.3 后續(xù)擴(kuò)展方向如果你真的把selective search的源碼和原理啃透了能做延展的方向其實(shí)很多。一是在無標(biāo)注數(shù)據(jù)的場(chǎng)景里做自動(dòng)標(biāo)注工具。我試過用selective search生成候選區(qū)域配合一個(gè)弱分類器先自動(dòng)篩掉大部分背景框再人工確認(rèn)目標(biāo)框標(biāo)注效率能提升不少。這在數(shù)據(jù)清洗階段非常實(shí)用。二是把它的“多樣化策略”思想復(fù)用在你自己的算法里。比如你要做工業(yè)質(zhì)檢單一分割參數(shù)不穩(wěn)定你可以學(xué)selective search的做法并行跑多組參數(shù)匯總多個(gè)分割結(jié)果用投票或共識(shí)來抑制單參數(shù)過擬合。三是和現(xiàn)代分割模型結(jié)合?,F(xiàn)在很多無監(jiān)督目標(biāo)發(fā)現(xiàn)、開放世界檢測(cè)的工作其實(shí)仍然需要從圖像里找出“顯著性區(qū)域”再交給語言模型或檢測(cè)頭去判斷。這時(shí)候回顧selective search的底層邏輯能給你不少靈感。我在 R-CNN 時(shí)代做檢測(cè)實(shí)驗(yàn)幾乎每天都要等selective search那幾秒鐘。后來換了 Faster R-CNN再也不用等了但當(dāng)模型出現(xiàn)漏檢的時(shí)候我第一時(shí)間懷疑的依然是候選區(qū)域生成這邊有沒有把目標(biāo)“放走”。一個(gè)算法最值得留下的不是它的實(shí)現(xiàn)代碼有多精巧而是它逼著你去思考“目標(biāo)在圖像里以什么形式存在”這個(gè)根本問題。做圖像處理的人手里得有像素操作的手感腦子里得有層次結(jié)構(gòu)的視角這兩樣配齊了讀任何一種新方法都會(huì)快得多。