CFTM User Manual Version 1.0
更新日期 2024.04.01
概览
CFTM是一个基于Agisoft Metashape开发的工具。它灵感来自于先进的Co-alignment算法,并改进了匹配方式和增加了滤波优化算法,可以同时实现多期航摄像片的高精度配准与摄影测量处理,使生成的多期三维空间数据直接位于同一参考坐标系中,实现高精度的时空分析应用,例如地表变形监测等。如果你在你的研究中使用了本项目,请引用文献:
@inproceedings{Xinlong Li2024CFTM,
author={Xinlong Li, Mingtao Ding, Zhenhong Li, Peng Cui},
title={Common-Feature-Track-Matching approach for multi epoch UAV},
booktitle={XXX},
year={2024},
}
下载
源代码链接: https://github.com/lixinlong1998/CoSfM.
文档(英文版): https://blog.youkuaiyun.com/LXLng/article/details/134613468.
文档(中文版):https://blog.youkuaiyun.com/LXLng/article/details/136598055.
1 安装
CFTM v1.0是在Windows环境下基于Agisoft Metashape Pro v1.8.5软件的Python API开发的。由于Metashape Pro v1.8.5中没有开放特征点和原始特征匹配的接口,所以特征点提取模块借助了第三方开源库COLMAP中的特征提取功能(SIFT-GPU),结果分析模块借助了COLMAP中的特征匹配功能。此外,部分功能还依赖第三方库函数,尽管Metashape Pro v1.8.5自带的python3.8环境预置了一些第三方库函数,但还需要额外安装和/或升级一些第三方库函数。
1.1 安装 Agisoft Metashape Pro v1.8.5
如果您是第一次接触Metashape,请注意该软件是付费软件,需要购买许可证。Agisoft公司提供了教育优惠版本的许可证(Educational License),详情查看官网购买说明。
以下是一些相关链接,便于您快速了解和查阅Metashape:
【官网】,【新手教程】,【论坛】,【知识库】
- 访问 Agisoft 官方网站并下载 Metashape Pro v1.8.5 安装程序。注意,官网会随版本更新而下架以往的版本,建议用户自行google搜索历史版本(为了方便大家,我会把安装包的下载地址贴在评论区)。
- 运行下载的安装程序,并按照安装向导的指示完成安装过程。
- 在安装过程中,您可能需要接受许可协议、选择安装路径以及其他选项。
1.2 将Metashape.exe添加到环境变量
- “此电脑”右键菜单选择“属性”,找到“高级系统设置”,打开面板
- 打开环境变量面板,在“系统变量”中选择“Path”,然后点“编辑”。
- 点击“新建”,然后输入安装路径(即包含了Metashape.exe的文件夹的路径),依次“确定”所有面板,即可完成环境变量设置。
1.3 安装第三方python库
Metashape1.8.5自带了python3.8环境和一些基本的python库函数,我们的插件是在Metashape1.8.5自带了python3.8环境下开发的,但由于一些复杂功能需要使用额外的库函数来实现,所以需要在既有的python3.8环境下安装新的第三方库函数。
官方提供了原版教程:How to install external Python module to Metashape Professional package
这里提供2种在Windows下指定python环境中安装第三方库函数的方法,以numpy为例:
第一种:自动下载
- Win+R,输入
cmd
,回车进入命令行cmd.exe - 输入
cd /d G:\UAV_SOFTWARE\Metashape\Metashape1.8.5\python
(注意替换为你的安装路径) - 输入
python -m pip install numpy
安装numpy库 - 如果找不到库的话,可以尝试在后面指定源网址,例如使用清华源,则输入
python -m pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
第二种:手动下载
- 提前在源网站上下载版本合适的轮子< numpy-1.24.2-cp38-cp38-win_amd64.whl >
- Win+R,输入
cmd
,回车进入命令行cmd.exe - 输入
cd /d G:\UAV_SOFTWARE\Metashape\Metashape1.8.5\python
,注意替换为你的安装路径 - 执行命令
python -m pip install <轮子存放路径>
下面是所需要安装的第三方库函数:
- 这些库的版本仅在Metashape Pro v1.8.5中测试过是合适的。
- GDAL最好是手动下载轮子然后使用第二种方法手动安装。
库名称 | 版本或轮子 | 推荐方式 |
---|---|---|
numpy | 1.23.5 | 自动下载 |
scipy | 1.10.1 | 自动下载 |
pandas | 2.0.0 | 自动下载 |
networkx | 3.1 | 自动下载 |
GDAL | GDAL‑3.4.3‑cp38‑cp38‑win_amd64.whl | 手动下载 |
opencv-python | 4.7 | 自动下载 |
opencv-contrib-python | 4.7 | 自动下载 |
matplotlib | 3.7.1 | 自动下载 |
python-dateutil | 2.8.2 | 自动下载 |
pytz | 2023.3 | 自动下载 |
具体安装过程:
- 先下载好GDAL的安装包,然后逐行执行下面的命令。
- 如果您在安装过程中遇到pip损坏导致的相关问题,您可以参考这个方法1
cd /d G:\UAV_SOFTWARE\Metashape\Metashape1.8.5\python
python -m pip install --upgrade pip
python -m pip install numpy==1.23.5
python -m pip install scipy==1.10.1
python -m pip install pandas==2.0.0
python -m pip install matplotlib==3.7.1
python -m pip install networkx==3.1
python -m pip install python-dateutil==2.8.2
python -m pip install pytz==2023.3
python -m pip install opencv-python==4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple/
python -m pip install opencv-contrib-python==4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple/
python -m pip install G:\UAV_SOFTWARE\Metashape\Python3Module\GDAL-3.4.3-cp38-cp38-win_amd64.whl
- 安装完成后,在命令行中逐行输入下面的命令,可以查看当前Metashape的Python环境中所安装的库函数,您可以对照参考库函数列表进行检查。
cd /d G:\UAV_SOFTWARE\Metashape\Metashape1.8.5\python
python -m pip list
库 | 版本号 | 库 | 版本号 |
---|---|---|---|
attrs | 23.1.0 | backcall | 0.2.0 |
click | 8.1.3 | colorama | 0.4.3 |
ConfigArgParse | 1.5.3 | contourpy | 1.0.7 |
cycler | 0.11.0 | dash | 2.9.3 |
dash-core-components | 2.0.0 | dash-html-components | 2.0.0 |
dash-table | 5.0.0 | decorator | 4.4.2 |
fastjsonschema | 2.16.3 | Flask | 2.2.3 |
fonttools | 4.39.3 | GDAL | 3.4.3 |
importlib-metadata | 6.5.0 | importlib-resources | 5.12.0 |
ipykernel | 5.3.4 | ipython | 7.16.1 |
ipython-genutils | 0.2.0 | ipywidgets | 8.0.6 |
itsdangerous | 2.1.2 | jedi | 0.17.2 |
Jinja2 | 3.1.2 | jsonschema | 4.17.3 |
jupyter-client | 6.1.6 | jupyter-core | 4.6.3 |
jupyterlab-widgets | 3.0.7 | kiwisolver | 1.4.4 |
llvmlite | 0.39.1 | MarkupSafe | 2.1.2 |
matplotlib | 3.7.1 | nbformat | 5.7.0 |
networkx | 3.1 | numba | 0.56.4 |
numpy | 1.23.5 | open3d | 0.17.0 |
opencv-contrib-python | 4.7.0.72 | opencv-python | 4.7.0.72 |
packaging | 23.1 | pandas | 2.0.0 |
parso | 0.7.1 | pexpect | 4.8.0 |
pickleshare | 0.7.5 | Pillow | 9.5.0 |
pip | 24.0 | pkgutil_resolve_name | 1.3.10 |
plotly | 5.14.1 | prompt-toolkit | 3.0.5 |
ptyprocess | 0.6.0 | Pygments | 2.6.1 |
pyparsing | 3.0.9 | pyrsistent | 0.19.3 |
PySide2 | 5.15.2.1 | python-dateutil | 2.8.1 |
pytz | 2023.3 | pywin32 | 228 |
pyzmq | 19.0.1 | qtconsole | 4.7.5 |
QtPy | 1.9.0 | scipy | 1.10.1 |
setuptools | 49.2.0 | shiboken2 | 5.15.2.1 |
shiboken2-generator | 5.15.2.1 | six | 1.15.0 |
tenacity | 8.2.2 | tornado | 6.0.4 |
traitlets | 4.3.3 | tzdata | 2023.3 |
wcwidth | 0.2.5 | Werkzeug | 2.2.3 |
wheel | 0.29.0 | widgetsnbextension | 4.0.7 |
zipp | 3.15.0 |
1.4 安装COLMAP (推荐的)
本插件使用的是COLMAP 3.6版本,其他版本未经测试。注意遵守COLMAP的许可协议。
官方安装教程:官方网站,GitHub Releases
其他安装教程:Windows10下Colmap的安装与调试、三维重建实践及中间结果输出
2 准备数据集
准备同一测区在2个不同时相采集的像片集,我们记为epoch1和epoch2;在光学相机获取地面影像时,机载的GPS定位系统同布获取拍摄瞬间飞机的地理位置,得到POS数据,我们记为POS1和POS2;注意,有些无人机厂商(例如大疆)直接将POS信息写入了像片的EXIF中。
3 基本流程
3.1 算法总体流程
获取多个不同时相的像片数据集;对多个不同时相的像片数据集中的像片进行粗配准,得到概略像片位姿和联合稀疏点云;将所述联合稀疏点云分割为固定大小的网格;计算每个网格的外包立方体,将所述外包立方体投影到对应的像片数据集中得到掩膜多边形,以提取掩膜多边形的特征点子集;根据所述特征点子集构建每个网格中不同时相的特征轨迹;对两个不同时相的特征轨迹进行特征匹配,将距离最近的同名特征作为共特征轨迹;通过三角交会,从所述共特征轨迹中构建共连接点;计算所述共连接点的时相重投影误差ERE,并进行迭代,直至迭代收敛,则得到配准后的像片位姿。
3.2 使用步骤
- 我们提供了从多期数据输入到配准后地形产品输出的全套工作流程,包括数据导入、参数配置、co-alignment粗配准、CFTM精配准、密集重建、地形产品建立与导出。如您所见,CFTM是嵌入在传统工作流程之间的,其输入是像片位姿和联合稀疏点云,输出是优化后的像片位姿和联合稀疏点云,是在SfM之后和MVS之前运行的配准优化算法。
- 创建工程文件、输入像片及POS数据和配置相关参数需要您手动完成,而剩余的部分可以通过运行一行命令来自动完成(考虑到数据格式繁杂,我们没有制作完整的端到端工作流程;若您需要完整的端到端自动化流程,您可以参考社区提供的自动化脚本)。
- CFTM具有断点记录功能。一般来说,再次运行时,CFTM会从上一个断点进程开始运行;您也可以通过手动修改…\cftm\state.json文件来单独控制每个环节是否运行;利用这一点,您可以实现手动逐步运行CFTM。
- CFTM支持使用检查点来评估配准精度,但这需要您在粗配准后手动制作检查点并导出,然后再运行CFTM算法实现精配准,随后算法会生成配准精度评估报告。
步骤1 创建工程文件
- 我们需要将像片数据和POS数据导入到工程文件。在工作区双击chunk1选中区块,点击添加照片按钮,在弹出的文件管理器中,转到您的像片文件夹,选择第一期所有像片,点击打开,等待照片加载。
- 对于第二期数据,我们点击添加堆块按钮,然后双击chunk 2选中区块后,添加第二期像片,方法同上。
- 在POS数据没有写入像片的EXIF信息的情况下,您需要手动导入POS数据。在工作区切换至参考,点击导入,选择对应的POS数据,在弹出的选项框中选择合适的坐标系统、转角系统、分隔符、标签和精度。
- 若单期数据中有多个架次需要分别添加,可以先将每个架次的数据单独添加到chunk中,然后合并为一个chunk。具体步骤是在主菜单栏中点击工作流程,选择合并堆块… ,在弹出的选项框中,勾选要合并的chunk,然后点击确定。
- 保存工程文件(假设工程文件名称是cftm_test_project.psx),建议您存储到单独的一个文件夹中,因为后续CFTM的过程文件会存储在与工程文件同目录的文件夹下。
步骤2 设置地理参考和相机模型参数
- 每个chunk都需要单独设置参考坐标系,相机模型参数和精度参数;在工作区中双击chunk可将其选为当前chunk(选中后字体会被加粗)。
- 将像片的参考定位坐标转换到对应的投影坐标系下,例如机载设备采集的原始定位信息是在WGS84参考坐标系下,那么根据经度换算到投影坐标系就是WGS84 UTM zone 47N。
- 点击参考设置,勾选camera reference,并根据机载GNSS的标称定位精度设置camera accuracy;其余值保持默认即可。
- 在主菜单中选择Tools,选择Camera Calibration… ,在弹出的选项框中配置相机的检校参数。需要注意的是,如果该chunk是多个chunk合并得到的,那么这里会有多个相机模型,可以将其全部选中后,右键菜单选择Merge Groups,这样一个chunk就只对应了一个相机模型。
步骤3 粗配准
- 合并两个chunk为一个chunk(此处命名为"coalign"),然后在主菜单中的Workflow中选择Align Photos… ,参数的含义请您查阅官方文档,我们采用了下图的参数设置,即精度为最高、启用预选择、关键点数量限制60000,无连接点限制,启用自适应的相机模型拟合。点击OK后程序开始运行。
- 待运行完成后,我们实现了利用co-alignment对数据进行粗配准,其结果是合并的稀疏点云和像片位姿。
- 若结果出现区块漂移、漏片太多、像片错位等情况,建议检查:POS数据是否正确对应?成像质量是否良好?定位系统是否受到干扰?
步骤4 制作检查点并导出(可选的)
- 在稀疏点云或者照片集中寻找稳定的地面特征点,并在特征点的位置上右键菜单,选择“Add Markers”。添加的marker可以在左侧工作区的“Markers”分组中找到。
- 我们需要进行精准刺点,选中新添加的marker(例如此处名为point 1),右键菜单中选择“Filter Photos by Markers”后,在Photos面板中会出现该点对应的可视像片。双击第一张像片,然后在放大的面板中拖动标签到准确的位置,小旗子的颜色从蓝色变为绿色(在Metashape中,Marker作为控制点时,绿色和蓝色分别表示在优化时启用和不启用该图像点;但是作为检查点时,只有右键菜单选择Remove Marker后,该图像点才会失效,否则会被视为有效图像点参与计算)。然后继续对下一张像片进行刺点,尽可能保证两个时相中有大致相等数量的像片被刺点。
- 重复上述检查点制作步骤,目标是在稳定区域中均匀地选择不少于5个检查点。
- Ctrl+R弹出“Run Python Script”运行脚本对话框,选择CFTM代码包下的…\toolbox\CheckPoints_Export.py程序,点击OK,随后检查点数据文件将导出在工程文件的同目录下(例如此处名为cftm_test_project_CPsdatabase.txt)
- 最后,由于Metashape中光束法平差时Marker会被视为tie point参与计算,为了避免影响自动配准结果,我们需要移除刚刚创建的这些检查点Markers(不用担心,我们已经保存了检查点数据文件,后续可以使用CFTM代码包下的…\toolbox\CheckPoints_Import.py程序来将这些点重新导入回工程)。
步骤5 配置参数
- 总共有2个文件需要配置参数:CFTM代码包中的config.py和Run.py。
- 在config.py中,需要在setup区域设置代码包的路径和COLMAP的路径
PATH_CODE = r'D:\Research\20221223_CFTM\Release\CFTM_v1.0'
PATH_COLMAP_BAT = r'D:\Software\COLMAP\COLMAP-3.6-windows-cuda\COLMAP.bat'
- 在Run.py中,大部分参数按照下图保持默认,而CFTM_args参数需要根据实际情况设置。在CFTM_args中,需要设置的关键参数包括:gird_size_1, gird_size_2, num_nominated, num_selected, num_max_iterations, pool_size , threshold_Distance。
- gird_size 是指将初始稀疏点云按此大小分割为方格。gird_size_1设置的方格是为了约束匹配范围,加速匹配效率,所以不宜太大,可保持默认;gird_size_1设置的方格是为了保证空间均匀性,但是需要防止算法为了满足空间均匀而选择低质量的点,建议grid_size_2大于grid_size_1。
- 算法会先在全局选出ERE最小的num_nominated×m×n的CTPs作为候选点,然后为每个网格尝试从候选点集中选出num_selected个ERE最小的CTPs。因此最终得到的CTPs是小于num_selected×m×n的。
- num_max_iterations是最大迭代次数。根据我们的经验,如果粗配准效果相对较好,那么迭代次数可能是个位数,一般而言,我们建议设为30。
- pool_size需要根据你的CPU核心数量来设置;例如Intel i7-10875H 有16个核心,那么此处的pool_size最大可以设为16,(如果出现内存不足或者阻塞了其他程序,您可以降低pool_size的数值)。
- threshold_Distance是指如果一对跨时相特征轨迹各自对应的三维点之间的距离超过了该阈值,那么算法会忽略该对跨时相特征轨迹,也即初始配准最大偏移量的预估值。根据我们的经验,threshold_Distance应该至少大于POS数据的定位精度(例如定位精度为2m,那么threshold_Distance至少应该为3m)。
########################################################################################################################
################################################ SETUP #####################################################
# Open a project file
workspace_path = r"K:\CoSfM_v1\project_with_cftm" # 工作空间路径
project_name = "cftm_test_project.psx" # 工程文件名称
images_path = r'K:\CoSfM_v1\images' # 像片集的路径
check_points_path = r"K:\CoSfM_v1/cftm_test_project_CPsdatabase.txt" # 检查点数据的路径(没有的话写"")
# please make sure your major version is:
compatible_major_version = "1.8" # 保持默认
# Process arguments # 每个处理步骤的开关选项,分为CFTM部分和重建部分
process_args = {
# Choose the processing options for CFTM.
"process_coalign": False, # 脚本只提供了co-alignment中对齐照片的部分,用户仍然需要手动制作coalign区块
"process_feature_extraction": True, # 特征提取
"process_CTPs_generation": True, # 特征轨迹匹配和CTP生成
"process_iterative_optimization": True, # 迭代优化
"process_analysis": True, # 配准评估分析
"process_analysis_matches": False, # 分析特征轨迹匹配,开启这个选项可能会比较耗时
"process_compare_matches": False, # 对比分析精配准前后的特征轨迹匹配,开启这个选项会非常耗时
# Choose the processing options for reconstruction.
"process_reconstruction": True, # 执行密集重建
"process_build_DSM": True, # 生成DSM
"process_build_DOM": False, # 生成DOM
"process_build_TiledModel": False, # 生成TiledModel
"process_export_DSM": True, # 导出DSM
"process_export_DOM": False, # 导出DOM
"process_export_TiledModel": False, # 导出TiledModel
"process_white_balance": False, # 处理白平衡
"save_project_each_step": True, # 每一步处理完成后都保存工程文件
}
# 选择让算法根据拍摄时间或者像片所属文件夹来区分像片属于哪个时相
# Choose the way of defining epoch for images: "DATE" or "FOLDER"
epoch_mode = 'DATE'
# 如果在安装时安装了COLMAP那么推荐选择2,否则用0;除非你将带cuda的OpenCV编译绑定到Metashape的python环境中。
# Which feature extraction mode do you want to use?
# 0 : use OpenCV to extract SIFT feature without cuda (default but slow);
# 1 : use OpenCV to extract SIFT-GPU feature with cuda (need additional manual compilation);
# 2 : use COLMAP to extract SIFT-GPU feature (recommend).
feature_extraction_mode = 2
# 是否从断点处继续运行
# Whether to continue the run from the last breakpoint?
begin_from_breakpoint = True
# 指定哪个chunk是coalign chunk,算法会自动寻找照片数最大的chunk作为coalign chunk,保持默认即可。
# Specify which chunk to process; leave empty will automatically select the chunk which has maximum images.
coalign_chunk_name = ''
# 建议保持默认,否则CFTM只会计算那些co-alignment没有生成CTPs的区域。
# Generate CTPs for all grids or only for those grid without CTPs.
for_all_grids = True
# 是否重新使用co-alignment中生成的CTPs。
# If CTPs are generated for all grids, do you what to reuse the CTPs generated from co-alignment?
reuse_ICTPs = True
# 是否使用预定义的非稳定区来掩膜掉CTPs。
# Whether to use *.shp to mask the unstable areas?
unstable_areas_mask_path = '' # 'I:/20230418_CTPsGenerator/Adata/Region/UnstableRegion.shp'
# Common Feature Track Matching
'''帮助:
grid_size_1: 将调查区域的点云按给定大小(以米为单位)划分为方格,用于CFTM。
grid_size_2: 将调查区域的点云按给定大小(以米为单位)划分为方格,用于迭代优化。
scoring: 这是一个空间均匀性评分表,由调查区域的外接矩形构建的金字塔网格,第一个方格的边长为1米,第二个方格的边长为2米,第n个方格的边长为2^(n-1)米;
每当一个点掉入某一层的方格时,根据评分表添加总分。
pool_size: 启用的CPU核心数。
criterias_1: 特征匹配阶段的最大重投影误差阈值和最小交叉角度阈值,单位分别为像素和度。
criterias_2: 轨迹过滤阶段的最大重投影误差阈值和最小交叉角度阈值,单位分别为像素和度。
ratio_inlier_init: 轨迹中内点平均比例的初始值,范围从0到1。
confidence: 通过随机采样多次能够获得一致集的概率,范围从0到1。
threshold_RepError: 用于轨迹点质量最终评估的阈值,单位为像素。
threshold_Distance: 对于轨迹匹配,只有点之间距离小于阈值的轨迹对才被考虑,单位为米。
num_nominated: 基于其质量预先选择的CTP数目。
num_selected: 基于其质量最终选择的CTP数目。
num_max_iterations: 最大迭代次数。迭代次数达到此值时停止迭代。
skip_edge: 在生成CTP时跳过调查区域的边缘区域。
threshold_Termination: 迭代收敛阈值。当前后指标的差异小于该值时,迭代停止。
num_inertia: 连续收敛次数。只有当迭代连续触发指定次数的收敛信号时,迭代才会停止。
'''
CFTM_args = {
"gird_size_1": 32,
"gird_size_2": 64,
"scoring": [0, 0, 0, 0, 0, 0, 2, 4, 8, 16],
"num_nominated": 10,
"num_selected": 5,
"num_max_iterations": 20,
"pool_size": 16,
"criterias_1": [2, 3],
"criterias_2": [1, 3],
"ratio_inlier_init": 0.25,
"confidence": 0.9,
"threshold_RepError": 0.5,
"threshold_Distance": 3,
"skip_edge": False,
"threshold_Termination": 0.001,
"num_inertia": 3,
}
# 确保下面的参数设置与工程文件中的参数保持一致,算法将以下面的参数为输入运行
# Make sure the coordinates of the chunk are in the projected coordinate system;
# here is just an example, this should change to the EPSG code of your projected coordinate system.
reference_args = {
"PJCS_EPSG": 32647,
"camera_accuracy_m": 3.0,
"camera_accuracy_deg": 10.0,
"marker_accuracy_m": 20.0,
"marker_accuracy_pix": 0.5,
"tiepoint_accuracy_pix": 1,
"camera_reference_enabled": True,
"marker_reference_enabled": False,
"rotation_system": 'opk'
}
# 优化时所采用的相机模型参数
# Bundle Adjustment Arguments
bundle_adjustment_args = {
"fit_f": True,
"fit_cx": True, "fit_cy": True,
"fit_b1": False, "fit_b2": False,
"fit_k1": True, "fit_k2": True,
"fit_k3": True, "fit_k4": False,
"fit_p1": True, "fit_p2": True,
"fit_corrections": False,
"adaptive_fitting": True,
"tiepoint_covariance": True
}
# Metashape中三维重建的参数设置,详情参考Metashape官方用户手册和Metashape Python API文档
# Photogrammetry arguments
photogrammetry_args = {
# Align photos
"quality_SPC": 1, # 1(UltraHigh), 2(High), 4(Medium)
"keypoint_limit": 60000,
"keypoint_limit_Per_Megapixel": 1000,
"tiepoint_limit": 0,
# Error reduction
"reprojection_error": 0.3,
"reconstruction_uncertainty": 15,
"projection_accuracy": 5,
"max_ratio_remove_points": 0.3,
# Dense matching
"quality_DPC": 2, # 1(UltraHigh), 2(High), 4(Medium)
"dense_cloud_FileterMode": 'Mild',
# Build tiled model
"tiled_model_TiledModelFormat": 'Cesium',
"tiled_model_pixel_size": 0.3, # metres
"tiled_model_face_count": 20000,
"tiled_model_ModelFormat": 'None',
"tiled_model_ImageFormat": 'JPEG',
}
# 打包前面所有的参数,并存储在..\cftm\Arguments.json中
# Packing arguments
args = {
# The Common Feature Track Matching settings
"CFTM_args": CFTM_args,
# The process settings
"process_args": process_args,
# The photogrammetry settings
"photogrammetry_args": photogrammetry_args,
"reference_args": reference_args,
"bundle_adjustment_args": bundle_adjustment_args,
# The default settings
"epoch_mode": epoch_mode,
"feature_extraction_mode": feature_extraction_mode,
"begin_from_breakpoint": begin_from_breakpoint,
"for_all_grids": for_all_grids,
"reuse_ICTPs": reuse_ICTPs,
"coalign_chunk_name": coalign_chunk_name,
# The default path (Recommended to keep the default)
"code_path": PATH_CODE,
"project_path": os.path.join(workspace_path, project_name),
"workspace_path": workspace_path,
"project_name": project_name,
"images_path": images_path,
"check_points_path": check_points_path,
"unstable_areas_mask_path": unstable_areas_mask_path,
"process_path": os.path.join(workspace_path, "cftm"),
"data_package_path": os.path.join(os.path.join(workspace_path, "cftm"), "ProcessData"),
"feature_path": os.path.join(os.path.join(workspace_path, "cftm"), "FeatureData"),
"CTP_path": os.path.join(os.path.join(workspace_path, "cftm"), "CommonTiePoints"),
"iterations_path": os.path.join(os.path.join(workspace_path, "cftm"), "Iterations"),
"report_path": os.path.join(os.path.join(workspace_path, "cftm"), "Reports"),
"state_path": os.path.join(os.path.join(workspace_path, "cftm"), "state.json"),
"arguments_path": os.path.join(os.path.join(workspace_path, "cftm"), "Arguments.json"),
"state_CFTM_path": os.path.join(os.path.join(workspace_path, "cftm"), "StateCFTM")}
################################################### END SETUP ######################################################
########################################################################################################################
步骤6 运行脚本
- 键盘Win+R后输入cmd,回车进入命令行cmd.exe,输入下面命令,注意将路径替换为您的Run.py路径,回车后开始运行CFTM。
metashape.exe -r G:\AResearchG\20231223_CoSfM\Release\CoSfM_v1\Run.py
- CFTM具有断点记录功能。若发生意外情况,在修正后,您可以使用上述命令来继续运行CFTM,CFTM会从上一个断点处继续运行。您也可以通过手动修改…\cftm\state.json文件来单独控制每个环节是否运行。
步骤7 评估报告
- 您可以在…\cftm\Reports文件夹中找到生成的GCTPs及其质量指标,其中’‘_GCTPsQua.txt’‘是GCTPs的数据列表,’‘_GCTPsQuaSta.txt’'是基于GCTPs数据的统计指标。
- 若您在之前制作了检查点,并且配置了正确的路径,那么您可以在…\cftm\Reports文件夹中找到CPs质量指标,其格式与GCTPs相同。
4 分析
4.1 分析CFTM中的匹配点
如果在Run.py中将process_analysis_matches设置为True,则CFTM会在…\cftm\Reports文件夹下生成MatchesReport_CFTM.txt文件
文件结构及解释如下:
[Epoch1_PairNum, Epoch2_PairNum, Epoch1_MatchNum, Epoch2_MatchNum] # 时相e中的像对数量,时相e中的匹配数量
[Epoch1_PairMatcNum_AVG, Epoch2_PairMatcNum_AVG] # 时相e中平均每个像对的匹配数量
[Epoch1_PairInlierMatcRatio_AVG, Epoch2_PairInlierMatcRatio_AVG] # 时相e中平均每个像对的有效匹配数量
[Common_PairNum, Common_MatchNum1, Common_MatchNum2, Common_MatchPortion, Common_PairMatcNum_AVG] # 跨时相的像对数量,跨时相匹配数量,跨时相匹配数量,跨时相匹配在所有有效匹配中的占比,平均每个跨时相像对的正确匹配数量
[Epoch1_TrackNum, Epoch2_TrackNum, Epoch1_InlierTrackNum, Epoch2_InlierTrackNum] # 时相e中的特征轨迹数量,时相e中的有效特征轨迹数量
[Common_TrackNum, Common_TrackCrosMatcNum_AVG] # 跨时相的特征轨迹数量,平均每个跨时相特征轨迹中的匹配数量
4.2 对比使用CFTM之前和之后的匹配点
如果在Run.py中将process_compare_matches设置为True,则CFTM会在…\cftm\Reports文件夹下生成MatchesReport_Coalign.txt文件
文件结构及解释如下:
[Epoch1_PairNum, Epoch2_PairNum, Common_PairNum] # 像对数量
[Epoch1_MatchNum, Epoch2_MatchNum, Common_MatchNum] # 匹配数量
[Epoch1_PairMatchNum_AVG, Epoch2_PairMatchNum_AVG, Common_PairMatchNum_AVG] # 平均每个像对的匹配数量
[Epoch1_PairInlierMatchNum_AVG, Epoch2_PairInlierMatchNum_AVG, Common_PairInlierMatchNum_AVG] # 平均每个像对的有效匹配数量
[Epoch1_PairInlierMatchRatio_WAVG, Epoch2_PairInlierMatchRatio_WAVG, Common_PairInlierMatchRatio_WAVG] # 加权平均每个像对的有效匹配数量
[Epoch1_PairInlierMatchRatio_AVG, Epoch2_PairInlierMatchRatio_AVG, Common_PairInlierMatchRatio_AVG] # 平均每个像对的有效匹配率(忽略有效率为0的像对)
[Epoch1_MatchPortion, Epoch2_MatchPortion, Common_MatchPortion] # 时相1匹配在所有匹配中的占比,时相2匹配在所有匹配中的占比,跨时相匹配在所有匹配中的占比。
[Epoch1_InlierMatchPortion, Epoch2_InlierMatchPortion, Common_InlierMatchPortion] # 平均每个像对的有效匹配率
[Epoch1_TrackNum, Epoch2_TrackNum, Common_TrackNum] # 特征轨迹数量
[Epoch1_ValidTrackNum, Epoch2_ValidTrackNum, Common_ValidTrackNum] # 有效特征轨迹数量
[Epoch1_ERValidTrackNum, Epoch2_ERValidTrackNum, Common_ERValidTrackNum] # 误差剔除后,剩余的有效特征轨迹数量
[Epoch1_ValidTrackPortion, Epoch2_ValidTrackPortion, Common_ValidTrackPortion] # 特征轨迹有效率
[Epoch1_ERValidTrackPortion, Epoch2_ERValidTrackPortion, Common_ERValidTrackPortion] # 误差剔除后特征轨迹有效率
5 报错信息
-
ERROR: Database: {colmap_database_path} is not found!
SOLUTION: 没有找到COLMAP数据库,这一步是在Compare Matches时,没有找到在Feature Extraction中创建的COLMAP文件,您可能在运行CFTM的过程中删除或者移动了这部分文件。您可以通过修改…\cftm\state.json,将"feature_extraction": “DONE"改为"feature_extraction”: “NO”,然后重新运行CFTM;或者将process_compare_matches设置为False。 -
ERROR: this script could only deal with pairwise co-align!
SOLUTION: CFTM目前只能处理2个时相数据之间的配准,请确保输入的数据来自于两个时相。关于时相的划分模式(变量“epoch_mode”),若您选择"DATE",请检查是否每个时相中的像片日期为同一天;若您选择"FOLDER",请检查变量“images_path”文件夹下的子文件夹(即每个时相对应的像片文件夹)数量为2。 -
ERROR: COLMAPindex should be ‘identifier’ or ‘image_path’!
SOLUTION: 请确认Metashape中存储的像片路径是否与COLMAP中存储的像片路径是否一致,这通常发生在硬盘重新连接时,盘符发生了变化的情况。
6 许可
[pip损坏]
关于Metashape自带python环境中pip损坏后的修复方式:
在命令行中逐行运行如下命令,注意将路径替换为你的路径
cd /d <G:\UAV_SOFTWARE\Metashape\Metashape1.8.5\python>
python <…CFTM_v1.0\toolbox\get-pip.py>
python -m pip install --upgrade pip
然后就可以正常使用pip了,但是再次打开Metashape时,Metashape会自动更新并恢复至原来的pip,如果不希望这样,你可以尝试关掉Metashape中的自动更新选项(工具→偏好设置→杂项→程序启动时检查更新) ↩︎