Files
ascend_community_projects/MonocularDepthEstimation_V2
贝狄威尔 e54226ae65 update MonocularDepthEstimation_V2/README.MD.
Signed-off-by: 贝狄威尔 <751387081@qq.com>
2022-11-17 01:40:29 +00:00
..
2022-11-10 06:28:49 +00:00
2022-11-10 06:29:28 +00:00
2022-11-10 06:25:42 +00:00
2022-11-10 06:25:42 +00:00
2022-11-10 06:25:42 +00:00

AdaBins单目深度估计

1 介绍

基于AdaBins室内模型的单目深度估计输出输入图像的深度图
输入室内图片图片格式为JPEG格式
输出:输入图片的深度图

1.1 支持的产品

Atlas 200DK

1.2 支持的版本

本项目配套的CANN版本为 6.0.RC1 MindX SDK版本为 3.0.RC2

MindX SDK安装前准备可参考《用户指南》安装教程

1.3 软件方案介绍

本系统设计了不同的功能模块。主要流程为读取图片后将图片放缩至合适的尺寸再利用Adabins模型推理输入图像的深度信息然后使用OpenCV对推理的深度图进行归一化和色彩可视化最后保存可视化的深度图。各模块功能描述如表1.1所示:

表1.1 系统方案中各模块功能:

序号 子系统 功能描述
1 图像输入 将图像文件数据读取进内存
2 深度信息估计 利用Adabins模型估计输入图像的深度信息
3 后处理 适用OpenCV对推理结果进行归一化和色彩可视化
4 结果输出 将可视化的深度图保存

1.4 目录结构

|-------- dataset
|           |---- full_set                          // 测试集图片(需自行准备)
|           |---- depth_info                        // 测试集图片深度信息(需自行准备)
|           |---- test_set                          // 测试集图片子集,用于性能测试(可从full_set中复制少量图片)
|-------- models
|           |---- AdaBins_nyu.om                    // Adabins模型文件(需使用model_conversion.sh自行转换)
|           |---- aipp_adabins_640_480.aippconfig   // Adabins 模型转换配置文件
|           |---- model_conversion.sh               // 模型转换脚本
|-------- utils
|           |---- cal_accuracy.py                   // 计算模型精度脚本
|           |---- data_process.py                   // 处理数据集脚本
|-------- src
|           |---- CMakeLists.txt                    // 主程序CMakeLists文件
|           |---- main.cpp                          // 主程序
|           |---- Mono.cpp                          // 推理程序实现
|           |---- MOno.h                            // 推理程序头文件
|-------- results                                   // 用于存放推理结果的可视化图
|-------- build.sh                                  // 项目编译脚本
|-------- CMakeLists.txt                            // 项目CMakeLists文件
|-------- README.md                                 // ReadMe
|-------- test.jpg                                  // 运行所需图片(需自行准备)

1.5 技术实现流程图

pic

1.6 特性及适用场景

本案例可以满足单目深度估计,但同时对输入的图像有以下限制:

  1. 输入图像要求为jpg编码格式
  2. 输入图像要求为彩色的室内图像。

2 环境依赖

2.1 软件版本

软件 版本 说明 获取方式
mxVision 3.0.RC2 mxVision软件包 链接
Ascend-cann-toolkit 6.0.RC1 Ascend-cann-toolkit开发套件包 链接
Ubuntu 18.04
Python 3.9.12
Python软件 版本
numpy 1.23.4
imageio 2.21.0
h5py 3.7.0
opencv-python 4.6.0.66
Pillow 9.2.0
tqdm 4.63.0

2.2 配置环境变量

在编译运行项目前,需要设置环境变量:

MindX SDK环境变量

. ${SDK-path}/set_env.sh

CANN环境变量

. ${ascend-toolkit-path}/set_env.sh

环境变量介绍

SDK-pathmxVision SDK安装路径

ascend-toolkit-pathCANN安装路径

2.3 准备工作

模型转换

步骤1 下载AdaBins_nyu.onnx

步骤2 将下载得到的 AdaBins_nyu.onnx 放在 model 目录下

步骤3 修改模型转换脚本model_conversion.sh里的install_path

#此处请按实际情况修改
export install_path=/usr/local/Ascend/ascend-toolkit/latest 

步骤4 运行模型转换脚本 model_conversion.sh

执行完模型转换脚本后,会生成相应的.om模型文件。

模型转换使用了ATC工具如需更多信息请参考:

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/60RC1alpha003/infacldevg/atctool/atlasatc_16_0001.html

其他准备

通用配置

  1. main.cpp 中配置模型路径,设备ID
const uint32_t deviceID = 0;
const std::string modelPath = "models/AdaBins_nyu.om";

可选配置

  1. main.cpp 中配置数据集路径和保存路径以及模式等的默认值

    这些参数可以在运行程序时通过命令行参数传入,因此是可选修改项

std::string imagePath = "test.jpg";
std::string datasetPath = "dataset";
std::string outputPath = "results";
std::string mode = "run"; // `run`会保存经过可视化处理的深度图,`eval`会保存供精度计算的原始推理结果
  1. Mono.cpp 中配置输出可视化图大小
const cv::Size OUTPUT_SIZE(640,480);

精度测试配置

注意由于原数据集较大并且Atlas 200DK的内存有限因此在Atlas 200DK上无法直接处理原数据集。需先在配置较高的服务器上进行数据预处理然后复制到Atlas 200DK。

  1. 下载测试集数据( 下载地址 , 置于 dataset 文件夹下,检查文件名是否为 nyu_depth_v2_labeled.mat

  2. 运行 utils/data_process.py,处理完毕后的图片位于 dataset/full_set 文件夹下,深度信息位于 dataset/depth_info 文件夹下

    python3 utils/data_process.py
    
  3. utils/cal_accuracy.py中配置其他可选配置项

    # thresholds for accuracy
    threshold_1 = 1.25
    threshold_2 = 1.25 ** 2
    threshold_3 = 1.25 ** 3
    

性能测试配置

  1. 已经完成精度测试配置的可直接进行此处的第2步否则请先按照精度测试配置进行前2步

  2. dataset/full_set中7开头的文件拷贝至[dataset/test_set],共计111张图片。

    # 如果没有test_set文件夹先创建文件夹
    mkidr dataset/test_set
    # 拷贝以7开头的共计111张图片用作性能测试
    cp dataset/full_set/7* dataset/test_set
    

3 运行

请先准备自己的待测试图片重命名为test.jpg并放置于根目录下。

# 编译项目
bash build.sh

# 新建results文件夹已经有该文件夹的应清空里面文件
mkdir results

# 运行
./main -i test.jpg -o results

执行完毕后,经过可视化处理的深度图会保存在工程目录下results中。

4 性能验证

# 进入工程目录
cd MonocularDepthEstimation_V2

# 编译项目,如果已经进行上一步则不需要重新编译
bash build.sh

# 新建results_perf文件夹已经有该文件夹无需进行此步
mkdir results_perf

# 运行
./main -d dataset/test_set -m eval -o results_perf

执行完毕后,命令行会输出平均的每张图片处理时间。

作为对比单目深度估计v1的111张图片的端到端总耗时为31.93s平均每张图片的耗时为287.69ms。

5 精度验证

# 进入工程目录
cd MonocularDepthEstimation_V2

# 编译项目,如果已经进行上一步则不需要重新编译
bash build.sh

# 新建results_acc文件夹已经有该文件夹的应清空里面文件
mkdir results_acc

# 运行
./main -d dataset/full_set -m eval -o results_acc

执行完毕后,推理结果会保存在工程目录下results_acc中。

因为数据集较大以及需要计算的精度指标较多如果使用的是Atlas 200DK开发者套件因硬件配置限制是无法在Atlas 200DK上完成计算这一步的。但是精度计算的结果仅与推理结果和标签相关与环境无关因此可以将整个项目同步至配置较高的服务器上完成计算当然也可以仅迁移与精度计算相关的文件如utils/cal_accuracy.pydataset/depth_info文件夹和results_acc文件夹。服务器上需要安装numpy和opencv-python等Python包可参照2.1准备环境。

# 在云服务器上,进入工程目录
cd MonocularDepthEstimation_V2

# 运行精度测试代码
python3 utils/cal_accuracy.py --gt_path=./dataset/depth_info --pred_path=./results_acc

执行完毕后,命令行会输出模型精度的各项指标。

作为对比单目深度估计v1的平均精度为[0.7945507947291235, 0.9302372572859156, 0.9714240941130378]。v2项目精度达标跟v1的精度完全一致。