日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 目标检测 >内容正文

目标检测

目标检测——图像金字塔

發(fā)布時(shí)間:2024/3/24 目标检测 114 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标检测——图像金字塔 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 一、圖像金字塔的作用及實(shí)現(xiàn)
  • 二、代碼來(lái)實(shí)現(xiàn)圖像金字塔
  • 三、圖像金字塔結(jié)合滑動(dòng)窗口
    • 3.1 代碼實(shí)現(xiàn)
  • 四、實(shí)驗(yàn)總結(jié)

?

  • 介紹圖像金字塔
  • 使用圖像金字塔結(jié)合滑動(dòng)窗口的方法
  • 標(biāo)記出圖像中不同尺寸的物體
    ?

一、圖像金字塔的作用及實(shí)現(xiàn)

  • 簡(jiǎn)單來(lái)說(shuō)就是用多個(gè)不同的尺寸來(lái)表示一張圖片。

  • 最左邊的圖片是原始圖片
  • 然后從左向右圖片的尺寸依次縮小直到圖片的尺寸達(dá)到一個(gè)閾值,這個(gè)閾值就是多次縮小圖片的最小尺寸,不會(huì)有比這更小尺寸的圖片了
    • 像這種圖片的尺寸逐步遞增或遞減的多張圖層就是圖像金字塔
    • 每張不同尺寸的圖片都稱為圖像金字塔的一層
    • 圖像金字塔的目的就是尋找圖片中出現(xiàn)的不同尺寸的目標(biāo)(物體、動(dòng)物等)。

    ?
    ?

    二、代碼來(lái)實(shí)現(xiàn)圖像金字塔

    • 導(dǎo)入 cv2 模塊用于處理圖片
    • 分別從 matplotlib 導(dǎo)入 pyplot 和從 IPython 中導(dǎo)入 display 模塊用于顯示圖片
    • 然后我們使用 %matplotlib inline 魔法函數(shù)讓圖片在頁(yè)面中顯示
    import cv2 from matplotlib import pyplot as plt from IPython import display %matplotlib inline

    ?

    • 創(chuàng)建了一個(gè)名為 pyramid 函數(shù),這個(gè)函數(shù)將用來(lái)生成圖像金字塔

    這個(gè)函數(shù)有三個(gè)參數(shù):

  • 第一個(gè)參數(shù) image 是要進(jìn)行圖像金字塔操作的原始圖片
  • 第二個(gè)參數(shù) top 是圖像將會(huì)被縮小的最小尺寸,我們將這個(gè)參數(shù)設(shè)置一個(gè)默認(rèn)值為 (128, 128),第一個(gè) 128 表示圖片的,第二個(gè) 128 表示圖片的
  • 第三個(gè)參數(shù) ratio 表示每次圖像將會(huì)被縮小 ratio 倍,我們給這個(gè)參數(shù)設(shè)置了一個(gè)默認(rèn)值為 1.2。
  • def pyramid(image, top = (128, 128), ratio = 1.2):yield imagewhile True:(w, h) = (int(image.shape[1] / ratio), int(image.shape[0] / ratio))image = cv2.resize(image, (w, h), interpolation = cv2.INTER_AREA)if w < top[1] or h < top[0]:breakyield image
  • 在函數(shù)內(nèi)我們首先使用 yield 生成器返回原始圖片
    因?yàn)樵?strong>圖像金字塔的最底端我們需要一張原始圖片

  • 然后使用 while 循環(huán)來(lái)不斷縮小圖片尺寸
    直到縮小后圖片的尺寸比前面的 top 參數(shù)小為止。

  • 在循環(huán)內(nèi) (w, h) 表示圖像金字塔前一層的圖像縮小 ratio 倍的寬和高。
    我們使用 cv2.resize 方法將前一層圖片進(jìn)行縮放,我們將 (w, h) 作為函數(shù)的第二個(gè)參數(shù),表示縮放后圖片的寬和高的值。

  • 我們使用 if 語(yǔ)句判斷圖片的尺寸是否已經(jīng)到達(dá)了設(shè)定的最小尺寸
    將每次圖片縮放后的寬和高設(shè)定的最小尺寸 top 進(jìn)行對(duì)比
    如果小于最小尺寸則使用 break 結(jié)束循環(huán)

  • 最后使用 yield 生成器返回每次縮放后的圖片

    至此圖像金字塔的函數(shù)就構(gòu)建完成了。


  • ?
    調(diào)用這個(gè)函數(shù)看下結(jié)果

    • 首先我們使用 cv2.imread 函數(shù)讀取圖片。
    image = cv2.imread("pets.jpg")

    ?
    ?
    然后我們使用一個(gè) for 循環(huán)獲取每次縮放的圖片

  • 這里 pyramid 的第一個(gè)參數(shù) image 就是需要逐層縮小的圖片
  • 第二個(gè)參數(shù) top 不傳入值,表示使用默認(rèn)的最小尺寸
  • 第三個(gè)參數(shù) ratio 表示每次將圖片縮小 1.5 倍
    • 接下來(lái)我們使用切片方法 i[:,:,::-1] 調(diào)整圖片的通道順序以便使用 plt.imshow 方法顯示圖片
    • 然后使用 plt.pause(0.3) 讓每張圖片顯示暫停 0.3 秒
    • 最后使用 display 的 clear_output(wait=True) 方法清除當(dāng)前顯示的圖片為顯示下一張圖片做準(zhǔn)備。
    for i in pyramid(image, ratio = 1.5):i = i[:,:,::-1]plt.imshow(i)plt.pause(0.3) display.clear_output(wait=True)

    執(zhí)行上面代碼可以看到坐標(biāo)軸上的數(shù)字在不斷縮小

    • 說(shuō)明圖片的尺寸已經(jīng)按照我們傳遞給 pyramid函數(shù)的參數(shù)來(lái)縮小了。

    ?
    ?
    ?

    三、圖像金字塔結(jié)合滑動(dòng)窗口

    在傳統(tǒng)的目標(biāo)檢測(cè)方法中:

    • 使用圖像金字塔和滑動(dòng)窗口相結(jié)合的方式來(lái)檢測(cè)出圖片中不同位置和不同尺寸的目標(biāo)

    • 用滑動(dòng)窗口的方法時(shí),在圖片上滑動(dòng)矩形框尺寸是固定的,這就導(dǎo)致了如果目標(biāo)的尺寸相對(duì)于矩形框太大或太小都會(huì)導(dǎo)致我們無(wú)法檢測(cè)到目標(biāo)

    我們可以在圖像金字塔的每層圖片上進(jìn)行滑動(dòng)窗口的操作來(lái)解決這個(gè)問(wèn)題。

  • 左邊的圖片,狗并不能完全被矩形框包圍,矩形框只能包住狗的部分面部區(qū)域;
  • 右邊的圖片,通過(guò)運(yùn)用圖像金字塔和滑動(dòng)窗口相結(jié)合的方法,矩形框的尺寸沒(méi)有變化,但是在經(jīng)過(guò)縮小后的圖片中狗完全被矩形框包裹住了。
  • ?

    3.1 代碼實(shí)現(xiàn)

  • 創(chuàng)建中前面學(xué)習(xí)過(guò)的 sliding_window 函數(shù)
  • def sliding_window(image, window, step):for y in range(0, image.shape[0] - window[1], step):for x in range(0, image.shape[1] - window[0], step):yield (x, y, image[y:y + window[1], x:x + window[0]])

    ?

  • 定義滑動(dòng)窗口的 window_w 為 128 個(gè)像素,滑動(dòng)窗口的 window_h 為 128 個(gè)像素
  • (window_w, window_h) = (128, 128)

    ?

  • 使用一個(gè) for 循環(huán)獲取每層縮放的圖片,其中 pyramid 函數(shù)的每個(gè)參數(shù)上一節(jié)已經(jīng)解釋過(guò)了,這里就不做贅述了。
  • for i in pyramid(image, ratio = 1.5):for (x, y, window) in sliding_window(i, (window_w, window_h), 100):if window.shape[0] != window_w or window.shape[1] != window_h:continueclone = i.copy()cv2.rectangle(clone, (x, y), (x + window_w, y + window_h), (0, 255, 0), 2)clone = clone[:,:,::-1]plt.imshow(clone)plt.pause(0.01) display.clear_output(wait=True)

    在循環(huán)內(nèi)再使用一個(gè) for 循環(huán)進(jìn)行滑動(dòng)窗口的操作

    • 其中 sliding_window 函數(shù)的參數(shù)意義如下
      • 第一個(gè)參數(shù) i 是圖像金字塔每層的圖片
      • 第二個(gè)參數(shù) (128, 128) 表示滑動(dòng)窗口的寬和高都是 128。
      • 第三個(gè)參數(shù) 100 表示滑動(dòng)窗口將每次滑動(dòng)的步長(zhǎng)為 100 個(gè)像素。

        我們使用一個(gè) if 語(yǔ)句:
    • 判斷獲得的滑動(dòng)窗口和我們設(shè)定的滑動(dòng)窗口大小是否一致。
    • 如果滑動(dòng)窗口截取的區(qū)域與設(shè)定的 (window_w, window_h) 中任意一個(gè)元素不同,則執(zhí)行 continue 跳過(guò)該滑動(dòng)窗口。
    • 最后就是在圖片上繪制出滑動(dòng)窗口

    ?
    下圖就是我們運(yùn)行腳本后得到的部分圖片

    • 可以看到我們?cè)趫D像金字塔的每一層都使用滑動(dòng)窗口
    • 雖然矩形框的尺寸保持不變,但是隨著圖片地不斷縮小,矩形框逐漸包裹住目標(biāo)

    四、實(shí)驗(yàn)總結(jié)

    本節(jié)實(shí)驗(yàn)我們學(xué)習(xí)了圖像金字塔方法

    • 圖像金字塔就是用多個(gè)不同的尺寸來(lái)表示一張圖片
    • 通常圖像金字塔會(huì)和滑動(dòng)窗口相結(jié)合來(lái)實(shí)現(xiàn)檢測(cè)出圖片中不同位置和不同尺寸的目標(biāo)

    總結(jié)

    以上是生活随笔為你收集整理的目标检测——图像金字塔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。