# 四、對象檢測
對象檢測是在圖像中找到對象位置的動作。 在本章中,我們將通過了解以下主題來學習對象檢測技術和實現行人檢測:
* 基礎知識以及定位和檢測之間的區別
* 各種數據集及其描述
* 用于對象定位和檢測的算法
* TensorFlow API 用于對象檢測
* 訓練新的對象檢測模型
* 基于 YOLO 算法的移動汽車行人檢測
# 檢測圖像中的對象
近年來,對象檢測在應用和研究方面都出現了爆炸式增長。 對象檢測是計算機視覺中的重要問題。 與圖像分類任務相似,更深的網絡在檢測方面表現出更好的表現。 目前,這些技術的準確率非常好。 因此,它被用于許多應用中。
圖像分類將圖像標記為一個整體。 除了標記對象外,找到對象的位置也稱為**對象定位**。 通常,對象的位置由直角坐標定義。 在圖像中使用直角坐標查找多個對象稱為檢測。 這是對象檢測的示例:

該圖顯示了帶有邊界框的四個對象。 我們將學習可以執行查找框任務的算法。 這些應用在自動駕駛汽車和工業對象等機器人視覺領域具有巨大的應用前景。 我們可以將定位和檢測任務概括為以下幾點:
* 定位檢測標簽內圖像中的一個對象
* 檢測可找到圖像中的所有對象以及標簽
區別在于對象的數量。 在檢測中,存在可變數量的對象。 在設計與定位或檢測有關的深度學習模型的架構時,此小差異會帶來很大的不同。 接下來,我們將看到可用于任務的各種數據集。
# 探索數據集
可用于對象定位和檢測的數據集很多。 在本節中,我們將探索研究社區用來評估計法的數據集。 有些數據集帶有不同數量的對象,這些對象中標注的范圍從 20 到 200 不等,這使得對象檢測變得困難。 與其他數據集(每個圖像僅包含一個對象)相比,某些數據集在一個圖像中包含的對象太多。 接下來,我們將詳細查看數據集。
# ImageNet 數據集
ImageNet 具有用于評估分類,定位和檢測任務的數據。 第 2 章,“圖像分類”詳細討論了分類數據集。 與分類數據類似,定位任務有 1,000 個類別。 準確率是根據前五次檢測得出的。 所有圖像中至少會有一個邊界框。 有 470,000 張圖像的檢測問題有 200 個對象,每個圖像平均有 1.1 個對象。
# PASCAL VOC 挑戰
PASCAL VOC 挑戰賽于 2005 年至 2012 年進行。該挑戰賽被認為是對象檢測技術的基準。 數據集中有 20 個類別。 該數據集包含用于訓練和驗證的 11,530 張圖像,以及針對興趣區域的 27,450 條標注。 以下是數據集中存在的二十個類:
* 人: 人
* 動物: 鳥,貓,牛,狗,馬,綿羊
* 車輛: 飛機,自行車,輪船,公共汽車,汽車,摩托車,訓練
* 室內: 水壺,椅子,餐桌,盆栽,沙發,電視/顯示器
您可以從[這里](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar)下載數據集。 每個圖像平均有 2.4 個對象。
# COCO 對象檢測挑戰
**上下文中的通用對象**(**COCO**)數據集具有 200,000 張圖像,其中 80 個類別的標注超過 500,000 個。 它是最廣泛的公開可用的對象檢測數據庫。 下圖顯示了數據集中存在的對象的列表:

每個圖像的平均對象數為 7.2。 這些是對象檢測挑戰的著名數據集。 接下來,我們將學習如何針對這些數據集評估計法。
# 使用指標評估數據集
指標對于深度學習任務中的理解至關重要。 由于人工標注,對象檢測和定位的度量是特殊的。 人類可能已經標注了一個名為**真實情況**的框。 真實性不一定是絕對真理。 此外,盒子的像素可能因人而異。 因此,算法很難檢測到人類繪制的確切邊界框。 **交并比**(**IoU**)用于評估定位任務。 **平均精確度平均值**(**mAP**)用于評估檢測任務。 我們將在下一部分中看到指標的描述。
# 交并比
IoU 是**真實情況**與預測面積的重疊面積與總面積之比。 這是該指標的直觀說明:

這兩個正方形代表真實情況和預測的邊界框。 IoU 計算為重疊面積與并集面積之比。 這是給定地面真理和預測邊界框的 IoU 計算腳本:
```py
def calculate_iou(gt_bb, pred_bb):
'''
:param gt_bb: ground truth bounding box :param pred_bb: predicted bounding box ''' gt_bb = tf.stack([
gt_bb[:, :, :, :, 0] - gt_bb[:, :, :, :, 2] / 2.0,
gt_bb[:, :, :, :, 1] - gt_bb[:, :, :, :, 3] / 2.0,
gt_bb[:, :, :, :, 0] + gt_bb[:, :, :, :, 2] / 2.0,
gt_bb[:, :, :, :, 1] + gt_bb[:, :, :, :, 3] / 2.0])
gt_bb = tf.transpose(gt_bb, [1, 2, 3, 4, 0])
pred_bb = tf.stack([
pred_bb[:, :, :, :, 0] - pred_bb[:, :, :, :, 2] / 2.0,
pred_bb[:, :, :, :, 1] - pred_bb[:, :, :, :, 3] / 2.0,
pred_bb[:, :, :, :, 0] + pred_bb[:, :, :, :, 2] / 2.0,
pred_bb[:, :, :, :, 1] + pred_bb[:, :, :, :, 3] / 2.0])
pred_bb = tf.transpose(pred_bb, [1, 2, 3, 4, 0])
area = tf.maximum(
0.0,
tf.minimum(gt_bb[:, :, :, :, 2:], pred_bb[:, :, :, :, 2:]) -
tf.maximum(gt_bb[:, :, :, :, :2], pred_bb[:, :, :, :, :2]))
intersection_area= area[:, :, :, :, 0] * area[:, :, :, :, 1]
gt_bb_area = (gt_bb[:, :, :, :, 2] - gt_bb[:, :, :, :, 0]) * \
(gt_bb[:, :, :, :, 3] - gt_bb[:, :, :, :, 1])
pred_bb_area = (pred_bb[:, :, :, :, 2] - pred_bb[:, :, :, :, 0]) * \
(pred_bb[:, :, :, :, 3] - pred_bb[:, :, :, :, 1])
union_area = tf.maximum(gt_bb_area + pred_bb_area - intersection_area, 1e-10)
iou = tf.clip_by_value(intersection_area / union_area, 0.0, 1.0)
return iou
```
真實情況和預測的邊界框堆疊在一起。 然后在處理負面積的情況下計算面積。 當邊界框坐標不正確時,可能會出現負區域。 框的右側坐標很多發生在從左到左的坐標上。 由于沒有保留邊界框的結構,因此必然會出現負區域。 計算聯合和交叉區域,然后進行最終的 IoU 計算,該計算是**真實情況**和預測的重合面積與總面積之比。 IoU 計算可以與算法結合使用,以訓練定位問題。
# 平均精度均值
mAP 用于評估檢測算法。 mAP 度量是檢測到的邊界框的精度和召回率的乘積。 mAP 值的范圍是 0 到 100。數字越大,則越好。 可以通過分別為每個類別計算**平均精度**(**AP**),然后計算該類別的平均值來計算 mAP。 僅當 mAP 高于 0.5 時,檢測結果才被視為真正的陽性。 通過繪制每個類別的繪制精度/召回曲線,可以合并來自測試圖像的所有檢測。 曲線下的最終區域可用于算法比較。 mAP 是衡量網絡靈敏度的一種很好的方法,同時不會引發很多錯誤警報。 我們已經了解了數據集的評估計法。 接下來,我們將研究定位任務的算法。
# 定位算法
定位算法是在第 2 章,“圖像分類”和第 3 章,“圖像檢索”中學習的材料的擴展。 在圖像分類中,圖像經過 CNN(卷積神經網絡)的多層。 CNN 的最后一層輸出屬于每個標簽的概率值。 可以擴展它以定位對象。 我們將在以下各節中看到這些想法。
# 使用滑動窗口定位對象
定位的一種直觀方法是使用對象預測圖像的多個裁剪部分。 可以通過在圖像上移動一個窗口并為每個窗口進行預測來完成圖像的裁剪。 移動比圖像小的窗口并根據窗口大小裁剪圖像的方法稱為**滑動窗口**。 可以對圖像的每個裁剪窗口進行預測,這稱為滑動窗口對象檢測。
可以通過針對緊密裁剪的圖像進行圖像分類問題訓練的深度學習模型來完成預測。 近距離修剪意味著在整個圖像中只會找到一個對象。 窗口在整個圖像上的移動必須一致。 圖像的每個部分都會通過模型以找到分類。 這種方法有兩個問題。
* 它只能找到與窗口大小相同的對象。 如果對象大小大于窗口大小,則滑動窗口將丟失對象。 為了克服這個問題,我們將使用**標度空間**的概念。
* 另一個問題是,將窗口移到像素上方可能會導致丟失一些對象。 在每個像素上移動窗口會導致大量額外的計算,因此會降低系統速度。 為避免這種情況,我們將在卷積層中加入一個技巧。
在下一節中,我們將介紹這兩種技術。
# 比例空間概念
比例空間是使用各種大小的圖像的概念。 圖像會縮小為較小的尺寸,因此可以在相同尺寸的窗口中檢測到較大的對象。 可以使用減小的尺寸將圖像調整為某些尺寸。 通過刪除替代像素或插值來調整圖像大小可能會留下一些偽像。 因此,圖像被平滑并迭代調整大小。 通過平滑和調整大小獲得的圖像是比例空間。
窗口在每個刻度上滑動以定位對象。 運行多個比例相當于使用更大的窗口運行圖像。 在多個規模上運行的計算復雜度很高。 可以通過以準確率為代價進行快速移動來加快定位速度。 復雜性使解決方案無法在生產中使用。 滑動窗口的思想可以通過完全卷積的滑動窗口實現而變得高效。
# 將全連接層訓練為卷積層
滑動窗口的問題是計算復雜度。 復雜性是因為對每個窗口都進行了預測。 已針對重疊區域的每個窗口計算了深度學習特征。 可以減少裁剪窗口中重疊區域的特征計算。 解決方案是使用僅計算一次特征的全卷積網絡。 為了理解全卷積網絡,讓我們首先看看如何將全連接層轉換為`convolution_layer`。 內核更改為相同的大小,并使用與神經元數量相同的過濾器數量。 也可以對其他層重復此操作。 更改內核大小是將全連接層轉換為`convolution_layer`的簡便方法:
```py
convolution_layer_1 = convolution_layer(x_input_reshape, 64)
pooling_layer_1 = pooling_layer(convolution_layer_1)
convolution_layer_2 = convolution_layer(pooling_layer_1, 128)
pooling_layer_2 = pooling_layer(convolution_layer_2)
dense_layer_bottleneck = convolution_layer(pooling_layer_2, 1024, [5, 5])
logits = convolution_layer(dense_layer_bottleneck, no_classes, [1, 1])
logits = tf.reshape(logits, [-1, 10])
```
密集層表示為卷積層。 這個想法在各種情況下都是強大而有用的。 我們將擴展此思想,以將滑動窗口表示為完整的卷積網絡。
# 滑動窗口的卷積實現
在這種技術中,最終目標不是滑動,而是變成一些需要深度的目標,并需要多個框作為窗口。 [Sermanet 等人](https://arxiv.org/pdf/1312.6229.pdf)使用完全卷積實現來克服滑動窗口的這一問題。 這是滑動窗口的這種卷積實現的說明:

經 Sermanet 等人許可復制。
在示例的上部,常規分類表示為完全卷積層。 在該圖的下部,相同的內核應用于更大的圖像,最后生成`2x2`而不是 1。最后一層表示這些邊界框的輸出中的四個。 具有用于預測的體積可以提高效率,但是盒子仍然存在準確定位的問題。 因此不需要滑動窗口,因此解決了復雜性。 縱橫比總是在變化,必須在多個比例尺上看到。 通過完全卷積方法生成的邊界框不是很準確。 僅針對額外區域進行額外計算。 可以想像,這些盒子僅限于經過訓練的盒子的數量。 接下來,我們將看到一種更準確地檢測邊界框位置的方法。
# 將定位視為回歸問題
思考定位的一種基本方法是將問題建模為回歸問題。 邊界框是四個數字,因此可以通過回歸設置以直接方式進行預測。 我們還需要預測標簽,這是一個分類問題。
有不同的參數化可用于定義邊界框。 邊界框通常有四個數字。 表示形式之一是坐標的中心以及邊界框的高度和寬度。 通過刪除全連接層并用回歸編碼器替換它,可以使用預訓練的模型。 必須使用 L2 損失對回歸進行正則化,而 L2 損失在異常值方面表現不佳。 L1 的損失比 L1 好。 用平滑化的正則化交換回歸更好。 對模型進行微調可提供良好的準確率,而對整個網絡進行訓練只會帶來微不足道的表現改善。 在訓練時間和準確率之間進行權衡。 接下來,我們將看到使用卷積網絡進行回歸的不同應用。
# 將回歸應用于其他問題
回歸圖像坐標適用于其他幾種應用,例如**姿態檢測**和**基準點檢測**。 姿勢檢測是在人體中發現關節位置的動作,如下所示:

在上一個圖像中,檢測到多個位置,例如頭部,頸部,肩膀,腳踝和手。 這可以擴展到所有人類部分。 我們了解到的回歸可以用于此應用。 這是基準點檢測的示例:

基準點是人臉相對于眼睛,鼻子和嘴唇的位置的地標。 找到這些地標對于基于人臉的增強現實應用至關重要。 人臉識別中還有更多地標可用,將在第 6 章,“相似性學習”中詳細介紹。
# 結合回歸與滑動窗口
為滑動窗口方法或完全卷積方法中的每個窗口計算分類分數,以了解該窗口中存在哪些對象。 代替預測用于檢測對象的每個窗口的分類得分,可以利用分類得分來預測每個窗口本身。 結合滑動窗口,比例空間,完全卷積和回歸之類的所有想法,比任何單獨的方法都具有更好的結果。 以下是各種網絡使用回歸方法在`ImageNet`數據集上獲得的前五個定位錯誤率:

上圖顯示網絡越深,結果越好。 對于 AlexNet,定位方法未在本文中描述。 OverFeat 使用帶有框合并的多尺度卷積回歸。 VGG 使用了定位,但比例尺和位置較少。 這些收益歸因于深層特征。 ResNet 使用不同的定位方法和更深入的特征。
回歸編碼器和分類編碼器獨立運行。 因此,有可能預測邊界框的標簽不正確。 通過在不同的層上附加回歸編碼器可以解決此問題。 該方法也可以用于多個對象,從而解決了對象檢測問題。 給定一個圖像,找到其中的所有實例。 很難將檢測視為回歸,因為輸出的數量是可變的。 一個圖像可能有兩個對象,而另一個可能有三個或更多。 在下一節中,我們將看到更有效地處理檢測問題的算法。
# 檢測對象
對象檢測算法有多種變體。 這里討論了對象檢測 API 附帶的一些算法。
# 卷積神經網絡(R-CNN)的區域
該系列的第一個工作是 Girshick 等人提出的 [CNN 區域](https://arxiv.org/pdf/1311.2524.pdf)。 它提出了一些框,并檢查是否有任何框對應于基本事實。 **選擇性搜索**用于這些地區提案。 選擇性搜索通過對各種大小的窗口的顏色/紋理進行分組來建議區域。 選擇性搜索尋找斑點樣的結構。 它以一個像素開始,并在更大范圍內產生斑點。 它產生了大約 2,000 個區域提案。 與所有可能的滑動窗口相比,該區域建議更少。
調整提案的大小并通過標準的 CNN 體??系結構,例如 Alexnet/VGG/Inception/ResNet。 CNN 的最后一層是通過 SVM 進行訓練的,該 SVM 使用無對象類來標識對象。 通過拉緊圖像周圍的框可以進一步改善框。 使用對象區域建議訓練用于預測更近邊界框的線性回歸模型。 R-CNN 的架構如下所示:

經 Girshick 等人許可復制。
編碼器可以是標準深度學習模型的預訓練模型。 從訓練數據為所有區域計算特征。 存儲特征,然后訓練 SVM。 接下來,用標準化坐標訓練邊界框。 在圖像坐標之外可能會有一些建議,因此將其標準化以進行訓練和推理。
這種方法的缺點是:
* 通過選擇性搜索形成了多個建議,因此必須計算許多推論,通常約為 2,000
* 必須對三個分類器進行訓練,這會增加參數的數量
* 沒有端到端的訓練
# Fast R-CNN
Girshick 等人提出的 [Fast R-CNN](https://arxiv.org/pdf/1504.08083.pdf) 方法僅運行一次 CNN 推理,因此減少了計算量。 CNN 的輸出用于建議網絡并選擇邊界框。 它介紹了一種稱為**興趣區域池**的技術。 興趣區域池采用 CNN 特征,并根據區域將它們合并在一起。 合并使用 CNN 進行推理后獲得的特征,并選擇區域,如下圖所示:

經 Girshick 等人許可復制。
這樣,執行端到端訓練,避免了多個分類器。 請注意,SVM 被 softmax 層替換,并且框回歸器由邊界框回歸器代替。 仍然存在的缺點是選擇性搜索,這需要一些時間。
# Faster R-CNN
Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Faster R-CNN 和 Fast R-CNN 方法之間的區別在于,Faster R-CNN 使用諸如 VGG 和 Inception 等架構的 CNN 特征來提案而不是選擇性搜索。 CNN 特征進一步通過區域提議網絡傳遞。 滑動窗口通過具有潛在邊界框和分數的特征傳遞,并輸出一些直觀的長寬比,模型輸出邊界框和分數:

經 Ren 等人許可復制。
更快的 R-CNN 比快速 R-CNN 更快,因為它通過僅計算一次特征來節省計算量。
# 單發多框探測器
SSD(單發多框)是所有方法中最快的。 此方法同時預測對象并找到邊界框。 在訓練期間,可能會有很多負面因素,因此很難否定地挖掘類別失衡。 CNN 的輸出具有各種大小的特征。 這些被傳遞到`3x3`卷積過濾器以預測邊界框。
此步驟將預測對象和邊界框:

經 Liu 等人許可復制。
這些是可用于對象檢測的算法,我們將在下一節中學習如何實現它們。
# 對象檢測 API
Google 發布了經過預先訓練的模型,并在`COCO`數據集上對各種算法進行了訓練,以供公眾使用。 該 API 建立在 TensorFlow 之上,旨在用于構建,訓練和部署對象檢測模型。 這些 API 支持對象檢測和定位任務。 預訓練模型的可用性可對新數據進行微調,從而加快訓練速度。 這些不同的模型在速度和準確率之間進行權衡。
# 安裝與配置
使用以下命令安裝協議緩沖區(**protobuf**)編譯器。 為 protobuf 創建目錄并直接下載該庫:
```py
mkdir protoc_3.3
cd protoc_3.3
wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip
```
更改文件夾的權限并提取內容,如下所示:
```py
chmod 775 protoc-3.3.0-linux-x86_64.zip
unzip protoc-3.3.0-linux-x86_64.zip
```
協議緩沖區(protobuf)是 Google 的語言無關,平臺無關的可擴展機制,用于序列化結構化數據。 它用于 XML 的使用,但是更加簡單快捷。 模型通常在 TensorFlow 中導出為這種格式。 一個人可以定義一次數據結構,但可以用多種語言進行讀寫。 然后運行以下命令來編譯 protobuf。 返回到工作文件夾,然后從[這里](https://github.com/tensorflow/models.git)克隆存儲庫,并將它們移至以下文件夾:
```py
git clone https://github.com/tensorflow/models.git
```
現在,使用以下代碼將模型移至研究文件夾:
```py
cd models/research/
~/protoc_3.3/bin/protoc object_detection/protos/*.proto --python_out=.
```
TensorFlow 對象檢測 API 使用 protobuf 導出模型權重和訓練參數。 TensorFlow ,模型,研究和苗條目錄應通過以下命令附加到`PYTHONPATH`:
```py
export PYTHONPATH=.:./slim/
```
使用前面的命令添加到 python 路徑僅一次。 對于下一個,該命令必須再次運行。 可以通過運行以下代碼來測試安裝:
```py
python object_detection/builders/model_builder_test.py
```
此代碼的輸出在此處給出:
```py
Ran 7 tests in 0.022s
OK
```
可以從[這里](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md)獲得有關安裝的更多信息。 現在安裝已完成并經過測試。
# 預訓練模型
有幾種模型已經過預先訓練并可以使用。 所有這些模型都在`COCO`數據集上進行了訓練,可用于檢測`COCO`數據集中可用的對象,例如人和汽車。 這些模型對于新任務(例如交通標志檢測)的遷移學習也很有用。 此處顯示了經過預訓練的模型的表格,其中包含`COCO`數據集上的相對速度和 mAP。 使用不同的 CNN 訓練了各種算法,并在名稱中進行了描述:
| **模型名稱** | **速度** | **COCO MAP** |
| --- | --- | --- |
| `ssd_mobilenet_v1_coco` | 快 | 21 |
| `ssd_inception_v2_coco` | 快 | 24 |
| `rfcn_resnet101_coco` | 中 | 30 |
| `faster_rcnn_resnet101_coco` | 中 | 32 |
| `faster_rcnn_inception_resnet_v2_atrous_coco` | 慢 | 37 |
根據需求,可以從模型中進行選擇。 下載在 Mobilenet 上訓練的 SSD 模型,并通過轉到工作目錄將其提取,如下所示:
```py
mkdir Chapter04 && cd Chapter04
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz
tar -xzvf ssd_mobilenet_v1_coco_11_06_2017.tar.gz
```
`Chapter04`文件夾中將包含各種文件,這些文件在此處列出:
* 這是圖的原始定義-`graph.pbtxt`
* 圖的權重已凍結,可以用于推斷-`frozen_inference_graph.pb`
* 檢查點文件
* `model.ckpt.data-00000-of-00001`
* `model.ckpt.meta`
* `model.ckpt.index`
下一部分將使用此模型執行檢測任務。
# 重新訓練對象檢測模型
使用相同的 API,我們可以為自定義數據集重新訓練模型。 定制數據的訓練涉及數據集的準備,選擇算法以及執行微調。 整個流水線可以作為參數傳遞給訓練腳本。 訓練數據必須轉換為 TensorFlow 記錄。 TensorFlow 記錄是 Google 提供的一種文件格式,可以使數據讀取比常規文件更快。 現在,我們將逐步進行訓練。
# Pet 數據集的數據準備
本示例使用`Oxford-IIIT Pet`數據集。 使用這些命令從`Chapter04`目錄下載圖像和標注。
```py
wget http://www.robots.ox.ac.uk/~vgg/data/pets/daimg.tar.gz
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
```
提取圖像和標注,如下所示:
```py
tar -xvf images.tar.gz
tar -xvf annotations.tar.gz
```
創建`pet_tf`記錄文件以在`tf`記錄中創建數據集,因為它們是對象檢測訓練器的必需輸入。 可在`object_detection/data/pet_label_map.pbtxt`找到`Pet`數據集的`label_map`。 移至`research`文件夾并運行以下命令:
```py
python object_detection/create_pet_tf_record.py \
--label_map_path=object_detection/data/pet_label_map.pbtxt \
--data_dir=~/chapter4/. \
--output_dir=~/chapter4/.
```
您可以在研究目錄`pet_train.record`和`pet_val.record`中看到兩個`.record`文件。
# 目標檢測的訓練流水線
訓練 protobuf 必須配置為進行訓練。 在此過程中,以下五件事很重要:
* 具有模型類型的模型配置
* `train_config`用于標準訓練參數
* 必須報告的指標的`eval_config`
* 數據集的`train_input_`配置
* 評估數據集的`eval_input_`配置
我們將使用[這個頁面](https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_mobilenet_v1_pets.config)中的配置文件。 通過運行以下命令將其下載到`Chapter04`文件夾。 打開`config`文件并編輯以下行:
```py
fine_tune_checkpoint: "~/Chapter04/ssd_mobilenet_v1_coco_11_06_2017/model.ckpt"
train_input_reader: {
tf_record_input_reader {
input_path: "~/Chapter04/pet_train.record"
}
label_map_path: "~/model/research/object_detection/data/pet_label_map.pbtxt"
}
eval_input_reader: {
tf_record_input_reader {
input_path: "~/Chapter04/pet_val.record"
}
label_map_path: "~/model/research/object_detection/data/pet_label_map.pbtxt"
}
```
保存`config`文件。 文件中有各種參數會影響模型的準確率。
# 訓練模型
現在,API,數據和配置文件已準備好進行重新訓練。 可以通過以下命令觸發訓練:
```py
PYTHONPATH=.:./slim/. python object_detection/train.py \
--logtostderr \
--pipeline_config_path=~/chapter4/ssd_mobilenet_v1_pets.config \
--train_dir=~/Chapter04
```
訓練將從大約 140 的損失開始,并將持續減少。 訓練將永遠進行,必須使用`Ctrl + C`命令手動將其終止。 訓練期間創建的檢查點可在以后用于推理。
# 使用 TensorBoard 監控損失和準確率
訓練損失和準確率可以使用 TensorBoard 進行監視。 使用以下命令運行 TensorBoard:
```py
tensorboard --logdir=/home/ubuntu/Chapter04
```
訓練和評估都可以在 TensorBoard 中可視化。
# 訓練自動駕駛汽車的行人檢測
可以在[這個頁面](http://pascal.inrialpes.fr/data/human/)中找到用于訓練行人對象檢測的數據集。 可以在[這個頁面](https://github.com/diegocavalca/machine-learning/blob/master/supervisioned/object.detection_tensorflow/simple.detection.ipynb)中找到檢測行人的步驟。 可以從[這個頁面](http://www.vision.ee.ethz.ch/~timofter/traffic_signs/)和[這個頁面](http://btsd.ethz.ch/shareddata/)下載用于訓練符號檢測器的數據集。 對于無人駕駛汽車,圖像中將有四個類別用于標記:行人,汽車,摩托車和背景。 當不存在任何后臺類時,必須檢測到該后臺類。 訓練深度學習分類模型的一個假設是,至少一個對象將出現在圖像中。 通過添加`background`類,我們克服了這個問題。 神經網絡還可以根據標簽生成對象的邊界框。
# YOLO 對象檢測算法
最近的對象檢測算法是**你只需看一次**(**YOLO**)。 圖像分為多個網格。 圖像的每個網格單元都運行相同的算法。 讓我們通過定義帶有初始化器的層來開始實現:
```py
def pooling_layer(input_layer, pool_size=[2, 2], strides=2, padding='valid'):
layer = tf.layers.max_pooling2d(
inputs=input_layer,
pool_size=pool_size,
strides=strides,
padding=padding
)
add_variable_summary(layer, 'pooling')
return layer
def convolution_layer(input_layer, filters, kernel_size=[3, 3], padding='valid',
activation=tf.nn.leaky_relu):
layer = tf.layers.conv2d(
inputs=input_layer,
filters=filters,
kernel_size=kernel_size,
activation=activation,
padding=padding,
weights_initializer=tf.truncated_normal_initializer(0.0, 0.01),
weights_regularizer=tf.l2_regularizer(0.0005)
)
add_variable_summary(layer, 'convolution')
return layer
def dense_layer(input_layer, units, activation=tf.nn.leaky_relu):
layer = tf.layers.dense(
inputs=input_layer,
units=units,
activation=activation,
weights_initializer=tf.truncated_normal_initializer(0.0, 0.01),
weights_regularizer=tf.l2_regularizer(0.0005)
)
add_variable_summary(layer, 'dense')
return layer
```
可以注意到,激活層為`leaky_relu`,權重以截斷的正態分布初始化。 這些修改的層可用于構建模型。 該模型如下創建:
```py
yolo = tf.pad(images, np.array([[0, 0], [3, 3], [3, 3], [0, 0]]), name='pad_1')
yolo = convolution_layer(yolo, 64, 7, 2)
yolo = pooling_layer(yolo, [2, 2], 2, 'same')
yolo = convolution_layer(yolo, 192, 3)
yolo = pooling_layer(yolo, 2, 'same')
yolo = convolution_layer(yolo, 128, 1)
yolo = convolution_layer(yolo, 256, 3)
yolo = convolution_layer(yolo, 256, 1)
yolo = convolution_layer(yolo, 512, 3)
yolo = pooling_layer(yolo, 2, 'same')
yolo = convolution_layer(yolo, 256, 1)
yolo = convolution_layer(yolo, 512, 3)
yolo = convolution_layer(yolo, 256, 1)
yolo = convolution_layer(yolo, 512, 3)
yolo = convolution_layer(yolo, 256, 1)
yolo = convolution_layer(yolo, 512, 3)
yolo = convolution_layer(yolo, 256, 1)
yolo = convolution_layer(yolo, 512, 3)
yolo = convolution_layer(yolo, 512, 1)
yolo = convolution_layer(yolo, 1024, 3)
yolo = pooling_layer(yolo, 2)
yolo = convolution_layer(yolo, 512, 1)
yolo = convolution_layer(yolo, 1024, 3)
yolo = convolution_layer(yolo, 512, 1)
yolo = convolution_layer(yolo, 1024, 3)
yolo = convolution_layer(yolo, 1024, 3)
yolo = tf.pad(yolo, np.array([[0, 0], [1, 1], [1, 1], [0, 0]]))
yolo = convolution_layer(yolo, 1024, 3, 2)
yolo = convolution_layer(yolo, 1024, 3)
yolo = convolution_layer(yolo, 1024, 3)
yolo = tf.transpose(yolo, [0, 3, 1, 2])
yolo = tf.layers.flatten(yolo)
yolo = dense_layer(yolo, 512)
yolo = dense_layer(yolo, 4096)
dropout_bool = tf.placeholder(tf.bool)
yolo = tf.layers.dropout(
inputs=yolo,
rate=0.4,
training=dropout_bool
)
yolo = dense_layer(yolo, output_size, None)
```
堆疊了幾個卷積層,生成了 YOLO 網絡。 該網絡用于創建用于實時檢測的對象檢測算法。
# 總結
在本章中,我們了解了對象定位和檢測任務之間的區別。 討論了幾個數據集和評估標準。 討論了各種解決定位問題和算法的方法,例如用于檢測的 R-CNN 和 SSD 模型的變體。 涵蓋了在開源存儲庫中執行檢測的過程。 我們使用該技術訓練了行人檢測模型。 我們還了解了在訓練此類模型時需要進行的各種取舍。
在下一章中,我們將學習語義分割算法。 我們將使用該知識來實現??醫學成像和衛星成像問題的分割算法。
- TensorFlow 1.x 深度學習秘籍
- 零、前言
- 一、TensorFlow 簡介
- 二、回歸
- 三、神經網絡:感知器
- 四、卷積神經網絡
- 五、高級卷積神經網絡
- 六、循環神經網絡
- 七、無監督學習
- 八、自編碼器
- 九、強化學習
- 十、移動計算
- 十一、生成模型和 CapsNet
- 十二、分布式 TensorFlow 和云深度學習
- 十三、AutoML 和學習如何學習(元學習)
- 十四、TensorFlow 處理單元
- 使用 TensorFlow 構建機器學習項目中文版
- 一、探索和轉換數據
- 二、聚類
- 三、線性回歸
- 四、邏輯回歸
- 五、簡單的前饋神經網絡
- 六、卷積神經網絡
- 七、循環神經網絡和 LSTM
- 八、深度神經網絡
- 九、大規模運行模型 -- GPU 和服務
- 十、庫安裝和其他提示
- TensorFlow 深度學習中文第二版
- 一、人工神經網絡
- 二、TensorFlow v1.6 的新功能是什么?
- 三、實現前饋神經網絡
- 四、CNN 實戰
- 五、使用 TensorFlow 實現自編碼器
- 六、RNN 和梯度消失或爆炸問題
- 七、TensorFlow GPU 配置
- 八、TFLearn
- 九、使用協同過濾的電影推薦
- 十、OpenAI Gym
- TensorFlow 深度學習實戰指南中文版
- 一、入門
- 二、深度神經網絡
- 三、卷積神經網絡
- 四、循環神經網絡介紹
- 五、總結
- 精通 TensorFlow 1.x
- 一、TensorFlow 101
- 二、TensorFlow 的高級庫
- 三、Keras 101
- 四、TensorFlow 中的經典機器學習
- 五、TensorFlow 和 Keras 中的神經網絡和 MLP
- 六、TensorFlow 和 Keras 中的 RNN
- 七、TensorFlow 和 Keras 中的用于時間序列數據的 RNN
- 八、TensorFlow 和 Keras 中的用于文本數據的 RNN
- 九、TensorFlow 和 Keras 中的 CNN
- 十、TensorFlow 和 Keras 中的自編碼器
- 十一、TF 服務:生產中的 TensorFlow 模型
- 十二、遷移學習和預訓練模型
- 十三、深度強化學習
- 十四、生成對抗網絡
- 十五、TensorFlow 集群的分布式模型
- 十六、移動和嵌入式平臺上的 TensorFlow 模型
- 十七、R 中的 TensorFlow 和 Keras
- 十八、調試 TensorFlow 模型
- 十九、張量處理單元
- TensorFlow 機器學習秘籍中文第二版
- 一、TensorFlow 入門
- 二、TensorFlow 的方式
- 三、線性回歸
- 四、支持向量機
- 五、最近鄰方法
- 六、神經網絡
- 七、自然語言處理
- 八、卷積神經網絡
- 九、循環神經網絡
- 十、將 TensorFlow 投入生產
- 十一、更多 TensorFlow
- 與 TensorFlow 的初次接觸
- 前言
- 1.?TensorFlow 基礎知識
- 2. TensorFlow 中的線性回歸
- 3. TensorFlow 中的聚類
- 4. TensorFlow 中的單層神經網絡
- 5. TensorFlow 中的多層神經網絡
- 6. 并行
- 后記
- TensorFlow 學習指南
- 一、基礎
- 二、線性模型
- 三、學習
- 四、分布式
- TensorFlow Rager 教程
- 一、如何使用 TensorFlow Eager 構建簡單的神經網絡
- 二、在 Eager 模式中使用指標
- 三、如何保存和恢復訓練模型
- 四、文本序列到 TFRecords
- 五、如何將原始圖片數據轉換為 TFRecords
- 六、如何使用 TensorFlow Eager 從 TFRecords 批量讀取數據
- 七、使用 TensorFlow Eager 構建用于情感識別的卷積神經網絡(CNN)
- 八、用于 TensorFlow Eager 序列分類的動態循壞神經網絡
- 九、用于 TensorFlow Eager 時間序列回歸的遞歸神經網絡
- TensorFlow 高效編程
- 圖嵌入綜述:問題,技術與應用
- 一、引言
- 三、圖嵌入的問題設定
- 四、圖嵌入技術
- 基于邊重構的優化問題
- 應用
- 基于深度學習的推薦系統:綜述和新視角
- 引言
- 基于深度學習的推薦:最先進的技術
- 基于卷積神經網絡的推薦
- 關于卷積神經網絡我們理解了什么
- 第1章概論
- 第2章多層網絡
- 2.1.4生成對抗網絡
- 2.2.1最近ConvNets演變中的關鍵架構
- 2.2.2走向ConvNet不變性
- 2.3時空卷積網絡
- 第3章了解ConvNets構建塊
- 3.2整改
- 3.3規范化
- 3.4匯集
- 第四章現狀
- 4.2打開問題
- 參考
- 機器學習超級復習筆記
- Python 遷移學習實用指南
- 零、前言
- 一、機器學習基礎
- 二、深度學習基礎
- 三、了解深度學習架構
- 四、遷移學習基礎
- 五、釋放遷移學習的力量
- 六、圖像識別與分類
- 七、文本文件分類
- 八、音頻事件識別與分類
- 九、DeepDream
- 十、自動圖像字幕生成器
- 十一、圖像著色
- 面向計算機視覺的深度學習
- 零、前言
- 一、入門
- 二、圖像分類
- 三、圖像檢索
- 四、對象檢測
- 五、語義分割
- 六、相似性學習
- 七、圖像字幕
- 八、生成模型
- 九、視頻分類
- 十、部署
- 深度學習快速參考
- 零、前言
- 一、深度學習的基礎
- 二、使用深度學習解決回歸問題
- 三、使用 TensorBoard 監控網絡訓練
- 四、使用深度學習解決二分類問題
- 五、使用 Keras 解決多分類問題
- 六、超參數優化
- 七、從頭開始訓練 CNN
- 八、將預訓練的 CNN 用于遷移學習
- 九、從頭開始訓練 RNN
- 十、使用詞嵌入從頭開始訓練 LSTM
- 十一、訓練 Seq2Seq 模型
- 十二、深度強化學習
- 十三、生成對抗網絡
- TensorFlow 2.0 快速入門指南
- 零、前言
- 第 1 部分:TensorFlow 2.00 Alpha 簡介
- 一、TensorFlow 2 簡介
- 二、Keras:TensorFlow 2 的高級 API
- 三、TensorFlow 2 和 ANN 技術
- 第 2 部分:TensorFlow 2.00 Alpha 中的監督和無監督學習
- 四、TensorFlow 2 和監督機器學習
- 五、TensorFlow 2 和無監督學習
- 第 3 部分:TensorFlow 2.00 Alpha 的神經網絡應用
- 六、使用 TensorFlow 2 識別圖像
- 七、TensorFlow 2 和神經風格遷移
- 八、TensorFlow 2 和循環神經網絡
- 九、TensorFlow 估計器和 TensorFlow HUB
- 十、從 tf1.12 轉換為 tf2
- TensorFlow 入門
- 零、前言
- 一、TensorFlow 基本概念
- 二、TensorFlow 數學運算
- 三、機器學習入門
- 四、神經網絡簡介
- 五、深度學習
- 六、TensorFlow GPU 編程和服務
- TensorFlow 卷積神經網絡實用指南
- 零、前言
- 一、TensorFlow 的設置和介紹
- 二、深度學習和卷積神經網絡
- 三、TensorFlow 中的圖像分類
- 四、目標檢測與分割
- 五、VGG,Inception,ResNet 和 MobileNets
- 六、自編碼器,變分自編碼器和生成對抗網絡
- 七、遷移學習
- 八、機器學習最佳實踐和故障排除
- 九、大規模訓練
- 十、參考文獻