SfMLearner——深度學習SLAM(無監督)測試運行


感覺好久不寫帖子了,一直忙別的事,終於得閑寬松幾日,我又回來了哈哈哈哈哈~~~

沒錯,沉寂了一段時間,我又進步了!(嗯先誇下自己。。。)這幾天,本小白摸了摸深度學習slam,特此記錄一下。本帖只包含下載運行無原理解析,大神請繞走哈

網上找了幾個深度slam的開源算法,最終選擇了無監督的 SfMLearner 下手。這個算法通過對單目照片數據集(作者用的KITTI)進行學習,可以估計出抓取的單張圖片的深度,以及相鄰幀的位姿變換。我只測試了單目深度估計,沒有測試位姿的,不過過程大同小異,還有,我知道 KITTI 包含了很多傳感器數據,但是這里只用了單目的進行訓練,杠精請收斂

1. 概念

之前對於深度學習的理解僅限於這四個字,故小白我很能體會屏幕前的各小白們,所以簡單說兩句(僅個人簡單理解,不承擔任何法律責任噢)。

深度學習網絡是前饋神經網絡的一種,只不過包含了很多隱藏層,所以不甘平庸的它就給自己加了 深度 兩個字。跟普通神經網絡一樣,它也是通過n萬次的迭代來將網絡參數調整至最佳,也要通過反向傳播算法來完成。

ok,深度學習就說這么多,再多就露餡兒啦 [笑哭]

2. 環境

首先的首先,如果筆記本是NVIDIA顯卡,那么可以方便地用GPU跑深度學習,不過需要安裝 CUDA、CUDNN,一定要選擇跟自己顯卡型號對應的版本。

我安裝的是CUDA8.0,,,參考的是這兩個帖子:

https://blog.csdn.net/wf19930209/article/details/81879514

https://blog.csdn.net/qq_41962120/article/details/80821113

首先呢,需要安裝 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

3. 下載源碼

下載源碼到指定文件夾,我是放在了 ~/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 的。

4. 圖片測試

這里我們是要用作者已經訓練好的模型進行單張圖片深度估計,首先我們需要下載作者的模型文件:

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 里的圖片對比一下,不過我確實么有對它進行什么處理。。。。這個不重要,不必深究

5. 數據集測試

從這兒開始,才是正片!下面就要看你對哪個感興趣了,是用作者訓練好的模型跑數據集,還是打算自己訓練再用自己的模型跑數據集。前面也已經提到過了,可以根據需要下載數據集,且聽我慢慢道來~~~~~~~

這部分介紹的是用作者訓練好的模型跑數據集,既是已訓練好的,那么就不必下一堆數據去訓練了,可以只挑一兩個下載進行測試,過過癮就行啦

但也不是隨便下一個就好,試想一下,如果你用了數據集 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 進行設置,避免程序毫無節制地占用顯卡內存。

6. 訓練模型

這里介紹的是訓練自己的模型。

首先需要下載用於訓練的數據集,上一部分也說了 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_02、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 同級目錄,大概這樣紙:

我是之前自己做的時候同時處理了 09、13、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

保存退出,重新運行訓練程序。

7. 用自己訓練的模型運行數據集 

方法同第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 我也改了一下。

我用 02、09、13、20 訓練了一下午+一晚上,400 次 epoch,然后用 84 測試的

效果哈哈哈哈哈哈哈哈哈哈哈哈極差![微笑]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM