VBGPS drone == ## Build model (on server) ### Environment :::info Under `/Hierarchical-Localization/` ``` conda create --name [conda_server_name] python=3.7.11 conda activate [conda_server_name] `/Hloc/` pip install -r requirements.txt ``` ::: ### [Colmap](https://colmap.github.io/gui.html) installation :::info ``` sudo apt-get install \ git \ cmake \ ninja-build \ build-essential \ libboost-program-options-dev \ libboost-filesystem-dev \ libboost-graph-dev \ libboost-system-dev \ libboost-test-dev \ libeigen3-dev \ libflann-dev \ libfreeimage-dev \ libmetis-dev \ libgoogle-glog-dev \ libgflags-dev \ libsqlite3-dev \ libglew-dev \ qtbase5-dev \ libqt5opengl5-dev \ libcgal-dev \ libceres-dev ``` ``` git clone https://github.com/colmap/colmap.git cd colmap git checkout dev mkdir build cd build cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=sm_70 ninja sudo ninja install ``` ``` sudo apt-get install -y \ nvidia-cuda-toolkit \ nvidia-cuda-toolkit-gcc ``` ::: ### Preparing datasets :::info Under `/Hierarchical-Localization/datasets/` ::: - Create a folder in datasets - Create three folder in your dataset folder: `db_images/` `images_upright/` `queries/` - Put all images into `db_images/` - Copy a intrinsic.txt (from `/1206_drone/queries/intrinsic.txt`) to `queries/` ``` $ mkdir [datasets_name] $ cd [datasets_name] $ mkdir db_images/ images_upright/ queries/ $ cp ../1206_drone/queries/intrinsic.txt queries/ ``` - Edit intrinsic.txt (change the **width** and **height** to match your images in `./db_images`) ``` SIMPLE_RADIAL [images width] [images height] 512.015 480 360 -0.00169481 ``` ### SfM (Start to build) :::info Under `/Hierarchical-Localization/` Environmemt: conda activate [conda_server_name] ::: Construct 3 bins in `outputs/[datasets_name]/sfm_superpoint+NN` ``` python3 -m hloc.pipelines.VBgps.Sfm --name [datasets_name] ``` ### Extract global feature :::info Location `/Hierarchical-Localization/` Environmemt: conda activate [conda_server_name] ::: Extract global feature from database ``` python3 -m hloc.pipelines.VBgps.extract_db_global --name [datasets_name] ``` Download the folder: `/Hierarchical-Localization/outputs/[datasets_name]/sfm_superpoint+NN/` `/Hierarchical-Localization/datasets/[datasets_name]/db_images/` --- ## Convert the model form ### Convert bin to nvm and Edit the Coordinate_demo.txt :::info Install [COLMAP](https://colmap.github.io/gui.html), [VisualSfM](http://ccwu.me/vsfm/index.html) ::: Convert 3 bins to nvm by COLMAP 1. Open **COLMAP** GUI and import model ![](https://i.imgur.com/PB4g9rJ.png) 2. Choose the directory of `/sfm_superpoint+NN/` ![](https://i.imgur.com/Yt6JYFE.png) 3. Press open database ![](https://i.imgur.com/vRrf0lu.png) 4. Select database.db in `/sfm_superpoint+NN/` ![](https://i.imgur.com/uRIZlYZ.png) 5. Select Images ![](https://i.imgur.com/B9Amc04.png) 6. Choose the directory of `/db_images/` ![](https://i.imgur.com/HrFPTrN.png) 7. Find out your four fundamental images and *press* them ![](https://i.imgur.com/AkxjPG8.png) 8. You can get their **qw qx qy qz tx ty tz** ![](https://i.imgur.com/XfgBpRz.png) 9. Open `/VBGPS_coor_transform/Coordinate_demo.txt` and write it down (four images pose) ![](https://i.imgur.com/POQd22O.png) 10. Press **Export model as** ![](https://i.imgur.com/sKuiaJB.png) 11. Choose **.nvm** form and save it ![](https://i.imgur.com/2Xb5v0U.png) ### Convert nvm to ply 1. Open VisualSFM GUI and load the **.nvm** model ![](https://i.imgur.com/F2e4AuQ.png) 2. SfM -> Extra Functions -> Save Current Model ![](https://i.imgur.com/dAtDmui.png) 3. Save model as **[model_name].ply** ![](https://i.imgur.com/sZ8X807.png) 4. Open the **.ply** file and you may find many line include **(-1.#IND)** ![](https://i.imgur.com/MRAQOHa.png) 5. Delete all the lines including **(-1.#IND)** and move **.ply** file to `/VBGPS_client/Examples/Monocular/model/` --- ## Transform coordinate system ### Environment :::info Under `/VBGPS_coor_transform/` ``` conda create --name [conda_transform_name] python=3.9.12 conda activate [conda_transform_name] pip install -r requirements.txt ``` ::: ### Transform You can edit the ***old_coor*** by yourself (depand on the distance(m) between four fundenmental images pose) ![](https://i.imgur.com/Z9yk5ay.png) Start to transform: ``` python3 Coordinate_Transform.py ``` You can get a **init.xml**, move it to `/VBGPS_client/Examples/Monocular/config/` ``` mv init.xml ../VBGPS_client/Examples/Monocular/config/ ``` --- ## Start to demo :::info Cuda == 8.0 OpenCV == 3.X ::: ### Convert ply to txt :::info Under `/VBGPS_client/Examples/Monocular/model/` ::: Make sure the **.ply** file is under `/VBGPS_client/Examples/Monocular/model/` ``` ./model.out [model_name].ply mv model.txt [model_name].txt ``` ### Compiling :::info Under `/VBGPS_client/` ::: ``` ./build.sh ``` Must compiled successful without any error ### Build a config file (test.xml) :::info Under `/VBGPS_client/Examples/Monocular/config/` ::: You can copy a `config_1206_drone_rm_IND.xml` as a `test.xml` ``` cp config_1206_drone_rm_IND.xml test.xml ``` And edit the `test.xml` change the `<MODEL_NAME>` to your model(.txt) path ![](https://i.imgur.com/t8SxhZr.png) ### Run server (on server) :::info Under `/Hierarchical-Localization/` ``` conda activate [conda_server_name] ``` ::: Run server according to the sepecific datasets ``` python3 -m hloc.pipelines.VBgps.pipeline_vbgps --dataset datasets/[datasets_name] --outputs outputs/[datasets_name] ``` Make sure you get the scene ![](https://i.imgur.com/YZiVoyx.png) ### Get Target image pose :::info Under `/VBGPS_client/Examples/Monocular/` ::: ``` ./client_Ray_get_target ../../Vocabulary/ORBvoc.txt [Target_image_path] config/test.xml ``` Make sure you will get a `target.xml` under `/VBGPS_client/Examples/Monocular/config/` ### Run client :::info Under `/VBGPS_client/Examples/Monocular/` ::: Start the client and specifiy a test video (Replace `test.xml` by you model config) ``` ./client_Ray_cropped ../../Vocabulary/ORBvoc.txt video [test_video_path] config/test.xml config/init.xml config/target.xml ``` Start the client and demo on drone ``` ./client_Ray_drone ../../Vocabulary/ORBvoc.txt config/test.xml config/init.xml config/target.xml ```