1. 程式人生 > >使用tensorflow objet_detection API 實現遙感影像飛機模型識別全過程

使用tensorflow objet_detection API 實現遙感影像飛機模型識別全過程

1 思路產生
在進行了多次cifor10網路訓練浦東機場飛機樣本的試驗後,發現網路只能做到辨別是不是飛機而無法實現在一張圖中正確找出一架或多架飛機的功能,實驗思路陷入僵局。7月27日凌晨覺得如此下去不能完勝既定實驗任務,幸而在知乎大神的博文中發現了object_detection API這一google最新開源出來的技術,簡要閱讀後發現和自己的實驗目標十分吻合,遂開始這一方向的研究。

2 環境準備
簡要閱讀官方文件後,按照installation進行配置。

  • 問題1: Add Libraries to PYTHONPATH配置問題
export PYTHONPATH=$PYTHONPATH
:`pwd`:`pwd`/slim

pwd是當前路徑的意思,需要自己填寫完整的路徑進行配置,否則是找不到slim資料夾的,修改後為

export PYTHONPATH=$PYTHONPATH:/home/diana/tensorflow/models:/home/diana/tensorflow/models/slim
  • 問題2:Protobuf Compilation配置問題
# From tensorflow/models/
protoc object_detection/protos/*.proto --python_out=.

每次使用新解壓出來的object_detection資料夾時都要重新執行這一句,否則執行demo時會出現找不到string_int_label_map_pb2的問題,檢視label_map_util.py檔案發現from object_detection.protos import string_int_label_map_pb2

,重新配置後問題解決。

  • 問題3:python2 與python3 不相容問題
    執行demo進行測試,執行到
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)

報錯”得到的是byte型別,not string”
搜尋之後鎖定問題出在python的版本問題,這個API僅支援python2.7。嘗試修改原始碼失敗,從根本解決問題重新安裝了沙箱facecourse-py2,並在其中安裝tensorflow進行配置,demo執行成功!(但是我今天寫blog想符合錯誤資訊的時候,它使用python3也不報錯了…….)

pip install --ignore-installed --upgrade https://storage.googleapis
.com/tensorflow/linux/gpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.whl

–ignore-installed忽略了一些依賴包,所以使用pip install tensorflow 重新安裝,這個命令會幫助你自動匹配相應的版本,由於是從國外的網站進行下載所以速度很慢,經常因為網速問題出現time runs out導致安裝失敗,可以使用清華大學臨時映象進行下載pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow 也可以修改配置檔案永久使用清華大學映象源。

  • 問題5:libcudart.so.6: cannot open shared object file: No such file or directory
    檢視/usr/local/cuda/lib64資料夾發現只有libcudnn.so.5,使用以下語句建立libcudnn.so.6的軟連線後問題解決
sudo ln -s libcudnn.so.5.* libcudnn.so.6

一定要加 -s,否則刪除libcudnn.so.6時會把libcudnn.so.5原始檔一起刪掉。

3 資料準備
object_detection API僅支援兩種格式的資料集,分別是Oxford-IIIT Pets Dataset和PASCAL VOC2007/2012格式,所以要先將自己的資料製作成VOC2007格式,參考博文[http://www.cnblogs.com/whlook/p/7220105.html] ,因為這個工具是使用C++和python實現的所以在win10系統下安裝vs2013和opencv2.4.9並進行配置,網上參考博文很豐富,使用時需要改為release模式,新增好標記後要按 ‘o’ 生成xml檔案。在win10環境下安裝沙箱facecourse-pyw,為win10下的python3.6下載匹配的opencv python-3.2.08-cp36-cp36m-win amd 64.whl

5 在雲端實現訓練過程
註冊谷歌雲,建立GCS並配置自己的名字。

export YOUR_GCS_BUCKET=${YOUR_GCS_BUCKET}
export YOUR_GCS_BUCKET=17diana18

其他的步驟和在本機執行相似

  • 問題6:Configuring the Object Detection Pipeline配置問題
    和在本機執行不同的是要將PATH_TO_BE_CONFIGURED改為雲端GCS的名稱,並且配置檔案中還可以設定相應的訓練次數等引數,需要根據試驗情況和樣本數量自行修改。
sed -i "s|PATH_TO_BE_CONFIGURED|"gs://${YOUR_GCS_BUCKET}"/data|g" \
    object_detection/samples/configs/faster_rcnn_resnet101_pets.config
train_input_reader: {
  tf_record_input_reader {
    input_path: "gs://17diana18/data/pet_train.record"
  }
  label_map_path: "gs://17diana18/data/pascal_label_map.pbtxt"
}

eval_config: {
  num_examples: 2000
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "gs://17diana18/data/pet_val.record"
  }
  label_map_path: "gs://17diana18/data/pascal_label_map.pbtxt"
  shuffle: false
  num_readers: 1
}

6 將訓練模型儲存為.pb檔案並移植到demo

gsutil cp gs://${YOUR_GCS_BUCKET}/train/model.ckpt-3942.* .
python object_detection/export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_pets.config \
    --checkpoint_path model.ckpt-3942 \
    --inference_graph_path output_inference_graph.pb

直接匯入生成的.pb檔案即可不用再次下載模型

PATH_TO_CKPT = '/home/diana/tensorflow/models/output_inference_graph.pb'
PATH_TO_LABELS = os.path.join('data', 'pascal_label_map.pbtxt')
NUM_CLASSES = 1

7 模型識別效能測試與分析
殘缺飛機識別成功
全部飛機識別成功
遺漏一架飛機
以後的實驗將根據識別結果存在的問題做進一步的完善。