目标检测——图像金字塔
目錄
- 一、圖像金字塔的作用及實現
- 二、代碼來實現圖像金字塔
- 三、圖像金字塔結合滑動窗口
- 3.1 代碼實現
- 四、實驗總結
?
- 介紹圖像金字塔。
- 使用圖像金字塔結合滑動窗口的方法
- 標記出圖像中不同尺寸的物體。
?
一、圖像金字塔的作用及實現
- 簡單來說就是用多個不同的尺寸來表示一張圖片。
- 像這種圖片的尺寸逐步遞增或遞減的多張圖層就是圖像金字塔
- 每張不同尺寸的圖片都稱為圖像金字塔的一層。
- 圖像金字塔的目的就是尋找圖片中出現的不同尺寸的目標(物體、動物等)。
?
?
二、代碼來實現圖像金字塔
- 導入 cv2 模塊用于處理圖片
- 分別從 matplotlib 導入 pyplot 和從 IPython 中導入 display 模塊用于顯示圖片
- 然后我們使用 %matplotlib inline 魔法函數讓圖片在頁面中顯示
?
- 創建了一個名為 pyramid 函數,這個函數將用來生成圖像金字塔
這個函數有三個參數:
在函數內我們首先使用 yield 生成器返回原始圖片
因為在圖像金字塔的最底端我們需要一張原始圖片。
然后使用 while 循環來不斷縮小圖片尺寸。
直到縮小后圖片的尺寸比前面的 top 參數小為止。
在循環內 (w, h) 表示圖像金字塔前一層的圖像縮小 ratio 倍的寬和高。
我們使用 cv2.resize 方法將前一層圖片進行縮放,我們將 (w, h) 作為函數的第二個參數,表示縮放后圖片的寬和高的值。
我們使用 if 語句判斷圖片的尺寸是否已經到達了設定的最小尺寸
將每次圖片縮放后的寬和高與設定的最小尺寸 top 進行對比
如果小于最小尺寸則使用 break 結束循環
最后使用 yield 生成器返回每次縮放后的圖片
至此圖像金字塔的函數就構建完成了。
?
調用這個函數看下結果
- 首先我們使用 cv2.imread 函數讀取圖片。
?
?
然后我們使用一個 for 循環獲取每次縮放的圖片
- 接下來我們使用切片方法 i[:,:,::-1] 調整圖片的通道順序以便使用 plt.imshow 方法顯示圖片
- 然后使用 plt.pause(0.3) 讓每張圖片顯示暫停 0.3 秒
- 最后使用 display 的 clear_output(wait=True) 方法清除當前顯示的圖片為顯示下一張圖片做準備。
執行上面代碼可以看到坐標軸上的數字在不斷縮小
- 說明圖片的尺寸已經按照我們傳遞給 pyramid函數的參數來縮小了。
?
?
?
三、圖像金字塔結合滑動窗口
在傳統的目標檢測方法中:
-
使用圖像金字塔和滑動窗口相結合的方式來檢測出圖片中不同位置和不同尺寸的目標。
-
用滑動窗口的方法時,在圖片上滑動的矩形框尺寸是固定的,這就導致了如果目標的尺寸相對于矩形框太大或太小都會導致我們無法檢測到目標。
我們可以在圖像金字塔的每層圖片上進行滑動窗口的操作來解決這個問題。
?
3.1 代碼實現
?
?
在循環內再使用一個 for 循環進行滑動窗口的操作
- 其中 sliding_window 函數的參數意義如下
- 第一個參數 i 是圖像金字塔每層的圖片。
- 第二個參數 (128, 128) 表示滑動窗口的寬和高都是 128。
- 第三個參數 100 表示滑動窗口將每次滑動的步長為 100 個像素。
我們使用一個 if 語句:
- 判斷獲得的滑動窗口和我們設定的滑動窗口大小是否一致。
- 如果滑動窗口截取的區域與設定的 (window_w, window_h) 中任意一個元素不同,則執行 continue 跳過該滑動窗口。
- 最后就是在圖片上繪制出滑動窗口。
?
下圖就是我們運行腳本后得到的部分圖片
- 可以看到我們在圖像金字塔的每一層都使用滑動窗口
- 雖然矩形框的尺寸保持不變,但是隨著圖片地不斷縮小,矩形框逐漸包裹住目標。
四、實驗總結
本節實驗我們學習了圖像金字塔方法
- 圖像金字塔就是用多個不同的尺寸來表示一張圖片。
- 通常圖像金字塔會和滑動窗口相結合來實現檢測出圖片中不同位置和不同尺寸的目標。
總結
以上是生活随笔為你收集整理的目标检测——图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN客服体验记录20220817
- 下一篇: Jetson NX YOLOV目标检测学