目標檢測之選擇性搜索-Selective Search


一、滑動窗口檢測器

一種用於目標檢測的暴力方法就是從左到右,從上到下滑動窗口,利用分類識別目標。為了在不同觀察距離處檢測不同的目標類型,我們可以使用不同大小和寬高比的窗口

得到窗口內的圖片送入分類器,但是很多分類器只取固定大小的圖像,所以這些圖像需要經過一定的變形轉換。但是,這不影響分類的准確率,因為分類器是可以處理變形后的圖像

將圖像變形轉換成固定大小

變形圖像塊被輸入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)(附代碼)

目標檢測(1)-Selective Search

https://github.com/AlpacaDB/selectivesearch(代碼)

Selective Search for Object Recognition(推薦)

J.R. Uijlings, K.E. vandeSande, T. Gevers, and A.W. Smeulders. Selective search for object recognition. IJCV, 2013.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM