# 9.3 目標檢測和邊界框
在前面的一些章節中,我們介紹了諸多用于圖像分類的模型。在圖像分類任務里,我們假設圖像里只有一個主體目標,并關注如何識別該目標的類別。然而,很多時候圖像里有多個我們感興趣的目標,我們不僅想知道它們的類別,還想得到它們在圖像中的具體位置。在計算機視覺里,我們將這類任務稱為目標檢測(object detection)或物體檢測。
目標檢測在多個領域中被廣泛使用。例如,在無人駕駛里,我們需要通過識別拍攝到的視頻圖像里的車輛、行人、道路和障礙的位置來規劃行進線路。機器人也常通過該任務來檢測感興趣的目標。安防領域則需要檢測異常目標,如歹徒或者炸彈。
在接下來的幾節里,我們將介紹目標檢測里的多個深度學習模型。在此之前,讓我們來了解目標位置這個概念。先導入實驗所需的包或模塊。
``` python
%matplotlib inline
from PIL import Image
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
```
下面加載本節將使用的示例圖像。可以看到圖像左邊是一只狗,右邊是一只貓。它們是這張圖像里的兩個主要目標。
``` python
d2l.set_figsize()
img = Image.open('../../img/catdog.jpg')
d2l.plt.imshow(img); # 加分號只顯示圖
```
:-: 
## 9.3.1 邊界框
在目標檢測里,我們通常使用邊界框(bounding box)來描述目標位置。邊界框是一個矩形框,可以由矩形左上角的`$ x $`和`$ y $`軸坐標與右下角的`$ x $`和`$ y $`軸坐標確定。我們根據上面的圖的坐標信息來定義圖中狗和貓的邊界框。圖中的坐標原點在圖像的左上角,原點往右和往下分別為`$ x $`軸和`$ y $`軸的正方向。
``` python
# bbox是bounding box的縮寫
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]
```
我們可以在圖中將邊界框畫出來,以檢查其是否準確。畫之前,我們定義一個輔助函數`bbox_to_rect`。它將邊界框表示成matplotlib的邊界框格式。
``` python
def bbox_to_rect(bbox, color): # 本函數已保存在d2lzh_pytorch中方便以后使用
# 將邊界框(左上x, 左上y, 右下x, 右下y)格式轉換成matplotlib格式:
# ((左上x, 左上y), 寬, 高)
return d2l.plt.Rectangle(
xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
fill=False, edgecolor=color, linewidth=2)
```
我們將邊界框加載在圖像上,可以看到目標的主要輪廓基本在框內。
``` python
fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));
```
輸出:
:-: 
## 小結
* 在目標檢測里不僅需要找出圖像里面所有感興趣的目標,而且要知道它們的位置。位置一般由矩形邊界框來表示。
-----------
> 注:除代碼外本節與原書基本相同,[原書傳送門](https://zh.d2l.ai/chapter_computer-vision/bounding-box.html)
- Home
- Introduce
- 1.深度學習簡介
- 深度學習簡介
- 2.預備知識
- 2.1環境配置
- 2.2數據操作
- 2.3自動求梯度
- 3.深度學習基礎
- 3.1 線性回歸
- 3.2 線性回歸的從零開始實現
- 3.3 線性回歸的簡潔實現
- 3.4 softmax回歸
- 3.5 圖像分類數據集(Fashion-MINST)
- 3.6 softmax回歸的從零開始實現
- 3.7 softmax回歸的簡潔實現
- 3.8 多層感知機
- 3.9 多層感知機的從零開始實現
- 3.10 多層感知機的簡潔實現
- 3.11 模型選擇、反向傳播和計算圖
- 3.12 權重衰減
- 3.13 丟棄法
- 3.14 正向傳播、反向傳播和計算圖
- 3.15 數值穩定性和模型初始化
- 3.16 實戰kaggle比賽:房價預測
- 4 深度學習計算
- 4.1 模型構造
- 4.2 模型參數的訪問、初始化和共享
- 4.3 模型參數的延后初始化
- 4.4 自定義層
- 4.5 讀取和存儲
- 4.6 GPU計算
- 5 卷積神經網絡
- 5.1 二維卷積層
- 5.2 填充和步幅
- 5.3 多輸入通道和多輸出通道
- 5.4 池化層
- 5.5 卷積神經網絡(LeNet)
- 5.6 深度卷積神經網絡(AlexNet)
- 5.7 使用重復元素的網絡(VGG)
- 5.8 網絡中的網絡(NiN)
- 5.9 含并行連結的網絡(GoogLeNet)
- 5.10 批量歸一化
- 5.11 殘差網絡(ResNet)
- 5.12 稠密連接網絡(DenseNet)
- 6 循環神經網絡
- 6.1 語言模型
- 6.2 循環神經網絡
- 6.3 語言模型數據集(周杰倫專輯歌詞)
- 6.4 循環神經網絡的從零開始實現
- 6.5 循環神經網絡的簡單實現
- 6.6 通過時間反向傳播
- 6.7 門控循環單元(GRU)
- 6.8 長短期記憶(LSTM)
- 6.9 深度循環神經網絡
- 6.10 雙向循環神經網絡
- 7 優化算法
- 7.1 優化與深度學習
- 7.2 梯度下降和隨機梯度下降
- 7.3 小批量隨機梯度下降
- 7.4 動量法
- 7.5 AdaGrad算法
- 7.6 RMSProp算法
- 7.7 AdaDelta
- 7.8 Adam算法
- 8 計算性能
- 8.1 命令式和符號式混合編程
- 8.2 異步計算
- 8.3 自動并行計算
- 8.4 多GPU計算
- 9 計算機視覺
- 9.1 圖像增廣
- 9.2 微調
- 9.3 目標檢測和邊界框
- 9.4 錨框
- 10 自然語言處理
- 10.1 詞嵌入(word2vec)
- 10.2 近似訓練
- 10.3 word2vec實現
- 10.4 子詞嵌入(fastText)
- 10.5 全局向量的詞嵌入(Glove)
- 10.6 求近義詞和類比詞
- 10.7 文本情感分類:使用循環神經網絡
- 10.8 文本情感分類:使用卷積網絡
- 10.9 編碼器--解碼器(seq2seq)
- 10.10 束搜索
- 10.11 注意力機制
- 10.12 機器翻譯