1
| 本文作者: AI研習社-譯站 | 2018-05-03 18:00 |
雷鋒網按:本文為雷鋒字幕組編譯的技術博客,原標題A complete Transfer Learning Toolchain for Object Detection,作者Ralph Fehrer。
翻譯 | 龍珂宇 于志鵬 整理 | 凡江

遷移學習指的是,通過對預訓練模型的參數進行微調,將訓練好的模型應用到相似或者只有細微差異的不同任務中。通過這個方法,我們可以基于一些性能頂尖的深度學習模型得到別的高性能模型。盡管聽上去較為簡單,遷移學習仍然在預處理、搭建和測試上有很多的研究空間。
這份教程旨在提供一個工具鏈(流程中工具和相關庫的集合),含有遷移學習中涉及語義分割的一些最基本的內容。以下的教程幫助你搭建一個典型的、具有生產可用性的遷移學習模型。本質上,它是一些特定的工具、框架和模型的結合。我們使用:
google-image-downloader通過圖片URL鏈接向Google發送搜索請求,獲取csv圖片
Labelbox給數據集做標注,輸出及轉換
一個tf模型:TensorFlow’s model zoo,基于COCO dataset訓練
TensorFlow Object Detection API:應用于遷移學習和推斷
一臺win10電腦,配備Intel的GPU
每一個單獨的步驟沿一下敘述展開:
我們想要通過微調在COCO數據集上預訓練的模型,來檢測桃子。因為COCO數據集的模型訓練目標是檢測蘋果和橘子,因此只調整預訓練模型頂層的一些參數就足夠了。
請注意,我們并不會在這個教程中制造出一個很成功的模型,因為那需要在步驟1中用到大得多的模型,也需要花費數倍的時間。我們主要致力于給大家展現一個可以應用于其他類似場景的遷移學習工具鏈,從如何構建一個自定義的數據集開始,最終得到一個微調完成的模型。
這個工具鏈中的每一步都有很多的替代選項,并且對于不同的任務,實現遷移學習的方法也有很多種。但如果你想盡快上手,不妨嘗試這個工具鏈,再盡可能地根據你的需求調整每一個步驟。
我們也提供了一個對應的GitHub項目,上面的文件夾存有大部分我們需要的文件及操作過程中生成的文件。你可以克隆它來復現整個項目,也可以創建分支來擴展和修改該項目。
1. 創建一個數據集
如果你在已有的數據集中找不到一個你想檢測的物體的數據集,你需要自己找到圖片并給他們做標注。有幾種工具可以幫助你減化這個痛苦的操作:接下來幾步簡單地描述了如何使用labelbox, 它是一個基于云端的標注工具,且操作界面十分簡潔。如果想了解更詳細的操作指南,可以看labelbox documentation.
1.1 收集圖片URLs
因為找不到桃子圖片的數據集,我們使用Google的圖片搜索來構建我們的基礎數據集。手動從Google上下載成千張圖片非常乏味和耗時,幸運的是,有工具幫助我們通過腳本文件向Google發送搜索請求:
復制google-images-download.py script到腳本文件夾
在當前文件夾下打開command prompt
運行以下指令

我們的數據(桃子)文件夾現在就會出現一個image_urls.csv文件,里面是桃子圖片的URL鏈接。
1.2 給圖片做標注
在這一步里,我們創建一個labelbox的項目,導入我們的image_urls.csv文件,然后給圖片們做標注。
(可選) Adapt the labeling interface調整做標注的界面
將the labeled datasets輸出到json格式
使用這個腳本Use this script將json格式的數據集轉化為COCO的格式
請注意:為了生成TFRecords文件,我們需要將coco-files分成訓練集,驗證集和測試集。你可以創建幾個獨立的labelbox project,然后重復幾遍上述操作;也可以手動或者用腳本把上面生成的東西分成幾部分。
下面這張圖片展示了web-based labelbox的UI:

使用labelbox給桃子做標注,用于之后的語義分割
這一步的輸出是三個json文件,以COCO格式存儲其標簽及其他信息,分別對應我們的訓練集,驗證集和測試集。你們可以在accompanying GitHub-repository中對應的data subfolder里找到示例文件。
2. 遷移學習
2.1 將COCO標簽數據轉換為TFRecords的數據格式
TensorFlow的對象檢測API要求數據需為TFRecord格式,這是一種不易理解的數據格式。準確的理解TFRecord需要花費一定的時間,而且并非易事。幸運的是,Tensorflow提供了一些腳本,可以將大部分常用格式轉換為TFRecord,例如create_coco_tf.record.py。你可以在我們的GitHub倉庫中找到這個腳本的小改版本。
創建TFRecords數據
用命令行cd到與GitHub倉庫中對應的腳本文件夾
運行下面的代碼

腳本會為三個數據集中的每一個輸出一個record文件,并且下載圖片到data子目錄中,你可以在here看到三個.record后綴的文件
2.2 配置模型參數
下面的步驟與與你準備使用的模型有關,也與新類和原始訓練類的關系有關。在本例中,我們訓練了可用于TensorFlow模型zoo中的faster_rcnn_resnet50_coco模型,用來監測桃子。桃子與原始數據集中的蘋果和句子有著很強的相關性。
從here下載faster_rcnn_resnet50_coco
解壓縮下載的tar包
將三個.ckpt后綴文件復制到模型的文件夾中
復制faster_rcnn_resnet50_coco配置文件到模型的子文件夾中
用標簽映射創建label_map.pbtxt文件
打開配置文件并做如下更改
-將 fine-tune checkpoint 改為: fine_tune_checkpoint:“../model/model.ckpt”
- 將 train_input_reader 的input_path值改為: input_path: “../data/coco_train.record”
- 將 train_input_reader 的label_map_path 值改為: label_map_path: “../data/label_map.pbtxt”
- 將val_input_reader的 input_path值改為:
input_path: ”../data/coco_val.record”
- 將 val_input_reader 的label_map_path值改為: label_map_path: “../data/label_map.pbtxt”
7.(可選)根據需要,可以修改其他條目
經過以上步驟,我們創建了label_map.pbtxt,并且修改了faster_rcnn_resnet50_coco.config
2.3 訓練模型
在這個環節,我們根據之前的配置重新訓練模型
復制train.py到腳本的子文件夾
用命令行cd到這個子文件夾
運行下面的代碼

檢查model/train 子文件夾中是否存在此步驟產生的文件。
3. 生成推理圖
首先執行下面的1~3操作,生成的.ckpt文件和frozen_inference_graph.pb文件將用于步驟4、檢驗推理圖和5、推理和評估模型的操作:
將export_inference_graph.py復制到scripts 文件夾。
打開命令行并cd到scripts文件夾
執行下面的腳本:

腳本運行后會在model/fine_tuned_model 文件夾中產生幾個.ckpt.*文件和一個frozen_inference_graph.pb文件
4. 檢驗推理圖
TensorBoard是檢驗Tensorflow程序的一個強大的組件,我們可以用它來更好的理解、調試和優化Tensorflow圖
用pip 命令安裝TensorBoard
將import_pb_to_tensorboard.py拷貝到 scripts 目錄下
在 model/fine_tuned_model 子目錄中創建logdir 目錄
打開命令行并cd到scripts文件夾
執行下面的腳本:

新創建的logdir文件夾中應當包含tensorboard所需的事件文件
完成以下步驟以開始tensorboard:
打開命令行cd到到scripts目錄
運行下面的命令

TensorBoard開始運行后你可以訪問 http://localhost:6006,可以在GUI界面中再次看到訓練的模型。

關于TensorBoard的更多信息,詳見TensorBoard documentation或閱讀this tutorial。
5. 推理和評估模型
為了評估模型效果, 我們借助在步驟3中創建的 frozen_inference_graph.pb 文件,來運行在步驟2.1中創建的coco_testdev.record
將detection_inference.py腳本拷貝到scripts目錄
將infer_detections.py腳本拷貝到scripts目錄
打開命令行cd到scripts目錄
運行下面的腳本

在 /data/inference文件夾中查看運行腳本結果 . 關于TensorFlow API的更多說明請參考this TensorFlow tutorial。
如果對模型最終的訓練效果滿意的話,那么此模型就算訓練完成。
博客原址 https://medium.com/practical-deep-learning/a-complete-transfer-learning-toolchain-for-semantic-segmentation-3892d722b604
雷鋒字幕組正在招募中,掃描下方二維碼,備注“雷鋒字幕組+姓名”加入我們。雷鋒網雷鋒網

雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知。