45多尺度目標檢測
# 多尺度錨框
"""
減少圖像上的錨框數量并不困難。 比如,我們可以在輸入圖像中均勻采樣一小部分像素,
并以它們為中心生成錨框。 此外,在不同尺度下,我們可以生成不同數量和不同大小的錨框。
直觀地說,比起較大的目標,較小的目標在圖像上出現的可能性更多樣。
例如,1*1,1*2,2*2的目標可以分別以4、2和1種可能的方式出現在2*2
圖像上。 因此,當使用較小的錨框檢測較小的物體時,我們可以采樣更多的區域,
而對于較大的物體,我們可以采樣較少的區域。
"""
import torch
from PIL import Image
import matplotlib.pylab as plt
from d2l import torch as d2lplt.figure('catdog')
img = plt.imread('../limuPytorch/images/catdog.jpg')
# # plt.imshow(img)
# print(img.shape) # (561, 728, 3)
# 獲取圖像的高度和寬度,忽略通道數
h, w = img.shape[:2]# 定義一個顯示錨框(anchors)的函數
def display_anchors(fmap_w, fmap_h, s):# 設置圖像的顯示大小d2l.set_figsize()# 創建一個零張量,形狀為(1, 10, fmap_h, fmap_w),前兩個維度不影響輸出fmap = torch.zeros((1, 10, fmap_h, fmap_w))# 生成多尺度的錨框,sizes參數為s,ratios參數為[1, 2, 0.5]anchors = d2l.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])"""sizes=s:指定了錨框的尺寸,這里傳入的是一個列表 s。例如,在代碼的調用中 s=[0.15]、s=[0.4]、s=[0.8]。這些值表示錨框相對于圖像尺寸的比例ratios=[1, 2, 0.5]:指定了錨框的長寬比,分別是 1(即正方形),2(即寬高比為2的矩形),以及 0.5(即寬高比為0.5的矩形)。"""# 將圖像寬高轉化為張量,用于尺度轉換bbox_scale = torch.tensor((w, h, w, h))# 顯示圖像上的錨框,使用工具庫d2l的show_bboxes函數# 顯示圖像,獲取axes,anchors乘以bbox_scale進行尺度轉換d2l.show_bboxes(d2l.plt.imshow(img).axes, anchors[0] * bbox_scale)# 調用display_anchors函數,特征圖大小為4x4,錨框尺度為0.15
display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
# 顯示圖像
plt.show()# 調用display_anchors函數,特征圖大小為2x2,錨框尺度為0.4
display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
# 顯示圖像
plt.show()# 調用display_anchors函數,特征圖大小為1x1,錨框尺度為0.8
display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
# 顯示圖像
plt.show()
運行結果: