一、滑動窗口檢測器
一種用於目標檢測的暴力方法就是從左到右,從上到下滑動窗口,利用分類識別目標。為了在不同觀察距離處檢測不同的目標類型,我們可以使用不同大小和寬高比的窗口
得到窗口內的圖片送入分類器,但是很多分類器只取固定大小的圖像,所以這些圖像需要經過一定的變形轉換。但是,這不影響分類的准確率,因為分類器是可以處理變形后的圖像
將圖像變形轉換成固定大小
變形圖像塊被輸入CNN分類器中,提取4096個特征,使用SVM分類器識別類別和該邊界框的另一個線性回歸器
下面是偽代碼,我們創建很多窗口來檢測不同位置的不同目標。要提升性能,一個顯而易見的辦法就是減少窗口的數量
for window in windows patch = get_patch(image, window) results = detector(patch)
二、選擇性搜索
不使用暴力方法,而是用候選區域方法(region proposal method)創建目標檢測的感興趣區域(ROI)。在選擇性搜索(selective search,SS)中,我們可以先利用基於圖的圖像分割的方法得到小尺度的區域,然后一次次合並得到大的尺寸。考慮所有特征,例如顏色、紋理、大小等,同時照顧下計算復雜度。
在深入介紹Selective Search之前,先說明一下需要考慮的問題:
- 適應不同尺度(Capture All Scales):窮舉搜索(Exhaustive Selective)通過改變窗口大小來適應物體的不同尺度,選擇搜索(Selective Search)同樣無法避免這個問題。算法采用圖像分割(Image Segmentation)以及使用一種層次算法(Hierarchical Algorithm)有效地解決了這個問題
- 多樣化(Diversification):單一的策略無法應對多種類別的圖像,使用顏色、紋理、大小等多種策略對分割號的區域進行合並
- 速度快
選擇性搜索的具體算法(區域合並算法)
輸入:一張圖片 輸出:候選的目標位置集合 算法: 利用切分方法得到候選的區域集合R = {r1,r2,…,rn} 初始化相似集合S = ϕ foreach 遍歷鄰居區域對 (ri,rj) do 計算相似度s(ri,rj) S = S ∪ s(ri,rj) while S not=ϕ do 從s中得到最大的相似度s(ri,rj)=max(S) 合並對應的區域rt = ri ∪ rj 移除ri對應的所有相似度:S = S\s(ri,r*) 移除rj對應的所有相似度:S = S\s(r*,rj) 計算rt對應的相似度集合St S = S ∪ St R = R ∪ rt L = R中所有區域對應的邊框
首先通過基於圖的圖像分割方法初始化原始區域,就是將圖像分割成很多很多的小塊,使用貪心策略,計算每兩個相鄰區域的相似度,然后每次合並最相似的兩塊,直至最終只剩下一塊完整的圖片。然后這其中每次產生的圖像塊包括合並的圖像塊我們都保存下來,這樣就得到圖像的分成表示,那么如何計算兩個圖像塊的相似度呢?
三、保持多樣性的策略
區域合並采用了多樣性的策略,如果簡單采用一種策略很容易錯誤合並不相似的區域,比如只考慮紋理時,不同顏色的區域很容易被誤合並。選擇性搜索采用三種多樣性策略來增加候選區域以保證召回:
- 多種顏色空間,考慮RGB、灰度、HSV及其變種
- 多種相似度度量標准,既考慮顏色相似度,又考慮紋理、大小、重疊情況等
- 通過改變閾值初始化原始區域,閾值越大,分割的區域越少
1、顏色空間轉換
通過色彩空間轉換,將原始色彩空間轉換到多達八種色彩空間。也是為了考慮場景以及光照條件等,主要應用於圖像分割算法中原始區域的生成(兩個像素點的相似度計算時,計算不同顏色空間下的兩點距離)。主要使用的顏色空間有:(1)RGB,(2)灰度I,(3)Lab,(4)rgI(歸一化的rg通道加上灰度),(5)HSV,(6)rgb(歸一化的RGB),(7)C,(8)H(HSV通道的H)
2、區域相似度計算
我們在計算多種相似度的時候,都是把單一相似度的值歸一化到[0, 1]之間,1表示兩個區域之間相似度最大
-
顏色相似度
- 紋理相似度
- 有限合並小的區域
- 區域的合適度距離
- 合並上面四種相似度
四、給區域打分
通過上述步驟,我們可以得到很多區域,但是並不是每個區域作為目標的可能性都是相同的,我們要進行篩選。
做法:給予最先合並的圖片塊較大的權重,比如最后一塊完整圖像權重為1,倒數第二次合並的區域權重為2,以此類推。但是當我們策略很多,多樣性很多的時候,權重就會有太多的重合,這樣排序就不太方便。我們可以給他們乘以一個隨機數,然后對於相同的區域多次出現的也疊加下權重,畢竟多個方法都說你是目標,也是有理由的嘛。這樣我們就得到所有區域的目標分數,也就可以根據自己的需要選擇多少個區域了。
五、選擇性搜索性能評估
自然地,通過算法計算得到的包含物體的Bounding Boxes與真實情況(ground truth)的窗口重疊越多,那么算法性能就越好。這是使用的指標是平均最高重疊率ABO(Average Best Overlap)。對於每個固定的類別c,每個真實情況(ground truth)表示為,令計算得到的位置假設L中的每個值lj,那么 ABO的公式表達為:

上面結果給出的是一個類別的ABO,對於所有類別下的性能評價,很自然就是使用所有類別的ABO的平均值MABO(Mean Average Best Overlap)來評價。
1、單一策略評估
我們可以通過改變多樣性策略中的任何一種,評估選擇性搜索的MABO性能指標。采取的策略如下:
- 使用RGB色彩空間
- 采用四中相似度計算的組合方式
- 設置圖像分割的閾值k=50
2、多樣性策略組合
我們使用貪婪搜索算法,把單一策略進行組合,會獲得較高的MABO,但是也會造成計算成本的增加。
上圖中綠色邊框為對象的標記邊框,紅色邊框為我們使用'Quality' Selective Search算法獲得的Overlap最高的候選框。可以看到我們這個候選框和真實標記非常接近。
六、代碼實現
我們可以通過下面的命令直接安裝Selective Search包
pip install selectivesearch
然后從https://github.com/AlpacaDB/selectivesearch下載源碼,運行example\example.py文件。效果如下:
# -*- coding: utf-8 -*- from __future__ import ( division, print_function, ) import skimage.data import matplotlib.pyplot as plt import matplotlib.patches as mpatches import selectivesearch import numpy as np def main(): # 加載圖片數據 img = skimage.data.astronaut() ''' 執行selective search,regions格式如下 [ { 'rect': (left, top, width, height), 'labels': [...], 'size': component_size }, ... ] ''' img_lbl, regions = selectivesearch.selective_search( img, scale=500, sigma=0.9, min_size=10) #計算一共分割了多少個原始候選區域 temp = set() for i in range(img_lbl.shape[0]): for j in range(img_lbl.shape[1]): temp.add(img_lbl[i,j,3]) print(len(temp)) #286 #計算利用Selective Search算法得到了多少個候選區域 print(len(regions)) #570 #創建一個集合 元素不會重復,每一個元素都是一個list(左上角x,左上角y,寬,高),表示一個候選區域的邊框 candidates = set() for r in regions: #排除重復的候選區 if r['rect'] in candidates: continue #排除小於 2000 pixels的候選區域(並不是bounding box中的區域大小) if r['size'] < 2000: continue #排除扭曲的候選區域邊框 即只保留近似正方形的 x, y, w, h = r['rect'] if w / h > 1.2 or h / w > 1.2: continue candidates.add(r['rect']) #在原始圖像上繪制候選區域邊框 fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6)) ax.imshow(img) for x, y, w, h in candidates: print(x, y, w, h) rect = mpatches.Rectangle( (x, y), w, h, fill=False, edgecolor='red', linewidth=1) ax.add_patch(rect) plt.show() if __name__ == "__main__": main()
參考文章:
https://www.cnblogs.com/zyly/p/9259392.html
圖像分割—基於圖的圖像分割(Graph-Based Image Segmentation)(附代碼)
https://github.com/AlpacaDB/selectivesearch(代碼)
Selective Search for Object Recognition(推薦)