感受很久不寫帖子了,一直忙別的事,終於得閒寬鬆幾日,我又回來了哈哈哈哈哈~~~python
沒錯,沉寂了一段時間,我又進步了!(嗯先誇下本身。。。)這幾天,本小白摸了摸深度學習slam,特此記錄一下。本帖只包含下載運行無原理解析,大神請繞走哈git
網上找了幾個深度slam的開源算法,最終選擇了無監督的 SfMLearner 下手。這個算法經過對單目照片數據集(做者用的KITTI)進行學習,能夠估計出抓取的單張圖片的深度,以及相鄰幀的位姿變換。我只測試了單目深度估計,沒有測試位姿的,不過過程大同小異,還有,我知道 KITTI 包含了不少傳感器數據,可是這裏只用了單目的進行訓練,槓精請收斂github
以前對於深度學習的理解僅限於這四個字,故小白我很能體會屏幕前的各小白們,因此簡單說兩句(僅我的簡單理解,不承擔任何法律責任噢)。算法
深度學習網絡是前饋神經網絡的一種,只不過包含了不少隱藏層,因此不甘平庸的它就給本身加了 深度 兩個字。跟普通神經網絡同樣,它也是經過n萬次的迭代來將網絡參數調整至最佳,也要經過反向傳播算法來完成。bash
ok,深度學習就說這麼多,再多就露餡兒啦 [笑哭]服務器
首先的首先,若是筆記本是NVIDIA顯卡,那麼能夠方便地用GPU跑深度學習,不過須要安裝 CUDA、CUDNN,必定要選擇跟本身顯卡型號對應的版本。網絡
我安裝的是CUDA8.0,,,參考的是這兩個帖子:app
https://blog.csdn.net/wf19930209/article/details/81879514框架
https://blog.csdn.net/qq_41962120/article/details/80821113python2.7
首先呢,須要安裝 python、tensorflow,以及須要的一些依賴(具體有哪些忘了。。。當時沒記錄)
做者推薦的是 tensorflow1.0,我在訓練的時候出現問題,程序不能運行,因此查了下資料改用了新一點點的版本,因此個人配置是:
顯卡:GEFORCE GTX 1050 Ti
CUDA:8.0
系統:Ubuntu16.04(雙系統,不是虛擬機)
Python:2.7
tensorflow:1.2.1
我用python2.7安裝tensorflow的時候報錯,說要先安裝另一個東西,裝了那個以後再裝tensorflow就沒問題了。
安裝 tensorflow 的指令很簡單:
pip install tensorflow-gpu==1.2.1
這句指令安裝的是 支持GPU 的 tensorflow 版本,若是沒有能用 CUDA 的 NVIDIA 顯卡,就裝普通的 CPU 版本:
pip install tensorflow==1.2.1
下載源碼到指定文件夾,我是放在了 ~/home 下:
cd ~/home git clone https://github.com/tinghuiz/SfMLearner
代碼是用 python 寫的,因此不須要編譯,直接就能夠進行運行、測試。
做者用的是 KITTI 數據集訓練的,因此我也用的 KITTI,具體操做以下:
進入做者給的連接,填寫郵箱地址;
而後會收到一封郵件,裏面給了下載連接,下載下來不是數據集而是一個壓縮包;
將壓縮包解壓,運行裏面的 sh 文件就能夠下載相應的包了
可是用做者給的下載方法我是下不下來,不知道大家網絡行不行。我最後是在Windows下用迅雷下的,速度500k往上:
前幾步同樣,只不過我不是直接運行的 sh 文件,而是把裏面的網址 copy 了下來,在Windows裏面用迅雷下載到移動硬盤,而後再回到Linux裏面搞的。
下載數據的網址命名格式以下:
對於相機參數包:https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_calib.zip
‘2011_09_26’ 爲日期,更改後就能夠下載別的包了,如 2011_09_30_calib.zip 等
對於像片數據包:https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0002_sync.zip
像片數據包不但要改日期還要改序列編號,注意 ‘_sync’ 不能少,如 2011_09_26_drive_0009_sync.zip、2011_09_30_drive_0016_sync.zip
你能夠把那些包都下下來,也能夠根據須要只下一部分,想肯定下哪一部分,把這個帖子後面的內容看明白了就知道了。我本身是隻下了 _09_26 的。
這裏咱們是要用做者已經訓練好的模型進行單張圖片深度估計,首先咱們須要下載做者的模型文件:
bash ./models/download_depth_model.sh
這個腳本會自動下載並進行解壓,獲得的模型編號爲 190532,做者用的框架是 tensorflow,一個模型由三個文件構成。爲了不看的眼花,我在 model 下新建了個文件夾 kitti_depth_model,而後把這三個文件移進去了。前面我也說了,我只測試了深度估計,因此沒有下載位姿估計的模型,想下載的話就運行 download_pose_model.sh
下載好後就能夠用這個模型文件進行測試了,做者提供了一個簡單圖片測試的程序,文件名爲 demo.ipynb,這是一個網頁端服務器運行的文件格式,須要在本身系統上裝上 jupyter notebook,而後啓動 jupyter notebook 就會打開一個網頁,在這個網頁中能夠運行 .ipynb 文件。
我我的不喜歡這種方式,我仍是喜歡踏踏實實的 python 腳本,因此我把程序改了下,存在一個叫 demo.py 的文件裏,放在 SfMLearner 目錄下,內容爲:
#!/usr/bin/env python from __future__ import division import os import numpy as np import PIL.Image as pil import tensorflow as tf import matplotlib.pyplot as plt import cv2 from pylab import * from SfMLearner import SfMLearner from utils import normalize_depth_for_display img_height=128 img_width=416 ckpt_file = 'models/kitti_depth_model/model-190532' fh = open('misc/sample.png', 'rb') I = pil.open(fh) I = I.resize((img_width, img_height), pil.ANTIALIAS) I = np.array(I) sfm = SfMLearner() sfm.setup_inference(img_height, img_width, mode='depth') saver = tf.train.Saver([var for var in tf.model_variables()]) with tf.Session() as sess: saver.restore(sess, ckpt_file) pred = sfm.inference(I[None,:,:,:], sess, mode='depth') plt.figure() plt.subplot(121) cv2.imshow("source",I) plt.subplot(122) cv2.imshow("result",normalize_depth_for_display(pred['depth'][0,:,:,0])) cv2.waitKey()
命令行進入 SfMLearner,運行:
python demo.py
能夠看到以下結果,一個是深度估計的圖像,一個是 ‘源圖’,哈哈爲啥我引發來,由於它好像不是源圖,,顏色好像有點不同,你能夠跟 misc 裏的圖片對比一下,不過我確實麼有對它進行什麼處理。。。。這個不重要,沒必要深究
從這兒開始,纔是正片!下面就要看你對哪一個感興趣了,是用做者訓練好的模型跑數據集,仍是打算本身訓練再用本身的模型跑數據集。前面也已經提到過了,能夠根據須要下載數據集,且聽我慢慢道來~~~~~~~
這部分介紹的是用做者訓練好的模型跑數據集,既是已訓練好的,那麼就沒必要下一堆數據去訓練了,能夠只挑一兩個下載進行測試,過過癮就行啦
但也不是隨便下一個就好,試想一下,若是你用了數據集 A、B 進行訓練,那麼測試的時候還用 A 或者 B 是否是就不合適了?因此咱們要用另一個 C 去測試才行。訓練集、驗證集、測試集的概念請自行百度。
做者提供了一個文件 data/kitti/test_scenes_eigen.txt,裏面定義了可用於測試的數據序列,因此,你只需從這裏面挑一兩個下載便可。
假設咱們只挑一個子數據集 2011_09_26_drive_0002,那麼我只須要下載:
https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_calib.zip
https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0002_sync.zip
下載以後解壓,將 3 個 calib 文件放到 2011_09_26_drive_0002_sync 同級目錄,且確保上級目錄爲 2011_09_26,結構大體以下:
能夠看到,我是把數據集總體放到了桌面上。
運行程序以前,還要對程序進行一點修改,由於做者的原程序是同時加載全部測試集,只要缺一個就報錯沒法運行。
首先修改 /data/kitti/test_files_eigen.txt,這裏面詳細描述了每一個子測試集中包含的圖片,程序運行時,會加載這個文件中的圖片路徑。修改前先備份!!!
咱們這裏只下了一個 2011_09_26_drive_0002,因此只保留 2011_09_26/2011_09_26_drive_0002_sync 開頭的行,其它所有刪掉。保存退出。
而後修改程序 data/kitti/kitti_raw_loader.py,這個程序負責加載圖片等文件。將第 27 行左右 :
self.date_list = ['2011_09_26', '2011_09_28', '2011_09_29', '2011_09_30', '2011_10_03']
修改成:
self.date_list = ['2011_09_26']
保存退出。
這裏注意!!!
這個時候若是直接運行程序,是看不到圖片的。是的,這個做者並無在程序中添加顯示圖片的功能,,,,,奇葩吧?!!
修改 test_kitti_depth.py:
首先在前面 import 相關模塊:
import cv2
import matplotlib.pyplot as plt
第 38 行左右,with 前添加:
plt.ion()
68 行左右,pred_all.append(pred['depth'][b,:,:,0]) 下面添加:
plt.subplot(211)
plt.imshow(scaled_im, cmap='gray')
plt.subplot(212)
plt.imshow(pred['depth'][b,:,:,0], cmap='gray')
plt.pause(0.05)
75 行左右,np.save(output_file, pred_all) 下面添加:
plt.close()
保存退出,而後就能夠運行程序了:
python test_kitti_depth.py --dataset_dir /home/gao/Desktop/ --output_dir /home/gao/SfMLearner/gao_first --ckpt_file /home/gao/SfMLearner/models/kitti_depth_model/model-190532
其中 ‘dataset_dir’ 的值即爲 '2011_09_26' 的位置,’output_dir‘ 用於保存×××(我也不知道這是啥哈哈哈),'ckpt_file' 爲模型文件所在位置,最後必定要加上模型編號,做者估計這個問題太簡單了就沒說,害得我迷糊了很久
運行效果以下:
若是運行程序,報GPU的錯,大概意思爲顯卡顯存不夠,那麼就修改程序 test_kitti_depth.py:
36 行左右,註釋掉 ’config.gpu_options.allow_growth = True‘,下面添加:
config.gpu_options.per_process_gpu_memory_fraction = 0.8
這是對 GPU 進行設置,避免程序毫無節制地佔用顯卡內存。
這裏介紹的是訓練本身的模型。
首先須要下載用於訓練的數據集,上一部分也說了 test_scenes_eigen.txt 中的子數據集是做者用於測試的,因此若是不想改這個文件,那麼你就去下載這個文件裏面沒有提到的子數據集進行訓練。
由於訓練程序運行時,不會加載 test_scenes_eigen.txt 中的子數據集,好比 2011_09_26,假如我就要用 2011_09_26 進行訓練,固然能夠,不過要改一下 test_scenes_eigen.txt,也不難,只須要把 2011_09_26_drive_0002 這一行刪掉就好了。修改以前別忘了備份噢!!
理論上講,深度模型的訓練毫不是這樣一個小子數據集就能作的很好的,它須要大量數據,這裏僅以 2011_09_26 爲例示意一下過程而已。
訓練以前須要對原數據集進行一下處理,這跟做者的網絡設計有關,個人 2011_09_26 仍是放在桌面上,命令行進入 SfMLearner 執行:
python data/prepare_train_data.py --dataset_dir=/home/gao/Desktop/ --dataset_name='kitti_raw_eigen' --dump_root=/home/gao/Desktop/2011_09_26_formatted --seq_length=3 --img_width=416 --img_height=128 --num_threads=4
其中,’dataset_dir‘ 爲 2011_09_26 位置,’dump_root‘ 爲處理後的數據存放位置,其它按做者意思來就行。
注意了,若是沒有將 2011_09_26 從 test_scenes_eigen.txt 中刪掉,是不會處理成功的噢!
處理成功後,會在指定的文件夾下生成處理後的數據,個人是桌面上的 2011_09_26_formatted,它下面會有 2011_09_26_drive_0002_sync_0二、2011_09_26_drive_0002_sync_03,將 2011_09_26_formattedtrain.txt、2011_09_26_formattedval.txt 更名爲 train.txt、val.txt,而後移到 2011_09_26_drive_0002_sync_02 同級目錄,大概這樣紙:
我是以前本身作的時候同時處理了 0九、1三、20,因此纔會多了 6 個文件夾,忽略就好。
訓練數據已備好,能夠開始訓練咯,命令行進入 SfMLearner 執行:
python train.py --dataset_dir=/home/gao/Desktop/2011_09_26_formatted/ --checkpoint_dir=/home/gao/SfMLearner/gao_checkpoints/ --img_width=416 --img_height=128 --batch_size=4
其中,’dataset_dir‘ 爲訓練數據位置,’checkpoint_dir‘ 爲保存模型的位置,其它按做者意思來
程序會默認保存最近的 10 次模型(能夠在程序中進行修改),每一個模型 3 個文件
訓練時大概長這樣:
epoch、global_step 等概念自行百度。
另外,運行訓練程序時,可能也會出現 GPU 內存不夠的問題,編輯 SfMLearner.py:
第 224 行左右,註釋掉 ’onfig.gpu_options.allow_growth = True‘,下面添加:
config.gpu_options.per_process_gpu_memory_fraction = 0.8
保存退出,從新運行訓練程序。
方法同第5部分,只需修改一下模型路徑和編號便可:
python test_kitti_depth.py --dataset_dir /home/gao/Desktop/2011_09_26_2/ --output_dir /home/gao/SfMLearner/gao_second --ckpt_file /home/gao/SfMLearner/gao_checkpoints/model-115311
這裏我把路徑改了一下,我測試時的數據集放在桌面的 2011_09_26_2 下,而後個人模型保存的位置是 /home/gao/SfMLearner/gao_checkpoints/,爲了不與做者訓練的模型輸出混淆, output_dir 我也改了一下。
我用 0二、0九、1三、20 訓練了一下午+一夜,400 次 epoch,而後用 84 測試的
效果哈哈哈哈哈哈哈哈哈哈哈哈極差![微笑]