三维重建(SFM):360全景摄像机采集街景图像对重建的影响与优化
采集工具:insta one 360
数据:360自动拼接的“全景”视频文件(截帧,转换,切割)。
切图工具:open MVG pano2pinhole(已有功能,绕y轴旋转,横向选取n个pinhole点,并且选择每个点切割图形的FOV)(切图已经是针对全景图应用,并非机械crop,但仍不能避免图像形变)
问题简述:大FOV产生严重形变,影响行进方向图片的匹配(RANSAC)被干扰,关联度不够;小FOV画幅小,窄街横向图片景深不够,关联度不够。
行进方向匹配实验:
sift2048,FOV40:
两图跨9帧(帧不确切指定真实视频的fps(此例一帧可能是1/2秒),作为统一切割完成的数据集的相对标尺)
两图跨13帧
18帧
FOV120
5帧
FOV120,5帧,但是截取中间部分,好了很多,只为了证明图片中部匹配不错,但是周边形变,被RANSAC过滤后,好的匹配对也会消失!!!
FOV160,5帧,切割局部
切割组数实验
sift2048,FOV80下,产生5组,重合度较低。
FOV80下,产生6组,明显增加重合度。
FOV80下,产生4组,无重合度,损失信息。
结论:并非先平均切割指定组数再拉伸(360/5=72,72度拉伸至80度),而是根据组数选取中心点,每个中心点指定FOV切割。多组切割有利于增加重叠数据与总的匹配对数,有利于建模过程中的匹配鲁棒性(但不确定视角是否正确,是否因为畸变干扰不同视角间匹配关系,否则应使用小fov多组数的方式进行切割,高低视角的损失再做补救)
1.不用担心增加组数会产生额外畸变(比如,先平均得到360/6=60度,再拉伸到期望的80度)
2.组数超额可能有额外收益(建议:同FOV下,可以尝试更多组数,使视角覆盖度数更大,FOV80*6=480度>FOV80*5=400度,FOV40*10=400度>FOV40*9=360度。)
后续经过实验证明:增加组数n与同一帧下不同视角间的重叠度,能提高总的匹配对。
基于特征匹配实验结论,使用小FOV更优,但画幅不够,侧向匹配变差
改善方案
根据前边分析,在FOV45-120之间,根据图片形变量(“畸变”)和画幅大小,折中取了FOV50~FOV80等不同参数进行对比实验,在某些场景下,确实产生了质的变化——原本不能重建的数据集重建成功。
定量分析实验
为了让自己的各种“猜测”不变成玄学,从增量重建过程拆解出很多参数进行统计。
例:
total_images:90
total_image_pairs:1961
max_corrs:1570
min_corrs:30
total_corrs:430529
corrs_avg:219
corrs_rms:179
total_tri_corrs:251609
tri_corrs_avg:128
tri_corrs_rms:339
avg_recall:0.623677
total_track_len:89318
rms_track_len:8.46855
avg_track_len:6.1688
track3_cnt:5437, percentage:0.375509
track6_cnt:5239, percentage:0.361834
track10_cnt:2009, percentage:0.138753
track15_cnt:916, percentage:0.063264
track30_cnt:716, percentage:0.0494509
trackInf_cnt:162, percentage:0.0111886
total 3d points:14479
此外还有:重投影误差等。
参数分析依据:
3d点,越多,证明场景覆盖越好,特征点提取越全面;
corrs相关都是匹配对,事关匹配质量和数量,影响重建过程;
track是每个3d点属于多少张图,反映图片之间相关度;
track3_cnt意为:track长度小于等于3;后边的percentage为占所有3d点的百分比
track3_cnt意为:track长度小于等于6(大于3);
实验结果统计
有个组合技巧:例如,用u60v60n8切割全景图,再用u80v80n8切割全景图,从u60数据集下选取某两个和行进有关的组,从u80数据集下选取几个与横向视角(店铺)有关的组,拼在一起进行重建,大量实验表明,有明显改善,甚至丢失一侧墙壁也可重建成功,鲁棒性大幅增强。
291_320小图集基础实验
total_images | total_image_pairs | total_corrs | corrs_avg | corrs_rms | total_tri_corrs | tri_corrs_avg | tri_corrs_rms | avg_track_len | rms_track_len | median_number_of_key_points_per_photo | num_of_points(平均3D点) | RMS_of_rep rojection_errors | 报告3d点(无过滤) | 报告3d点 | 3d点召回率 | 说明 | |
340u80v80n5 | 150 | 4707 | 711927 | 151 | 149 | 424803 | 90 | 244 | 5150 | 151 | 1.017445 | 46608 | 31590 | 0.677780639 | 80虽然3d点召回率优于72,但是因为有视角重叠,并且纵向视角也更大,而且这是340的 | ||
320u72v72n5 | 150 | 302455 | 176 | 156 | 178126 | 104 | 276 | 5217 | 218 | 0.939378 | 22727 | 15187 | 0.668236019 | 重投影误差: 72是否优于60?因为组数?因为视角?30张图过少,rms不能反应所有问题,加大数据量单独对比此项 (不对等条件,u72对应v72,而u60对应v60) | |||
NLGX320_u90v90n4 | #DIV/0! | 调试流程用 | |||||||||||||||
#DIV/0! | |||||||||||||||||
重叠改善对比 | |||||||||||||||||
320u120v120n3 | 90 | 868 | 182911 | 210 | 111880 | 128 | 5673 | 238 | 1.039085 | 15257 | 9198 | 0.602870813 | |||||
320u120v120n4 | 120 | 1705 | 265318 | 155 | 159 | 174546 | 102 | 249 | 5473 | 257 | 1.107931 | 21597 | 13128 | 0.607862203 | 增加重叠度,误差加大 多组数重叠有利于提升3d点召回率 | ||
#DIV/0! | |||||||||||||||||
同uv下对比不同n | |||||||||||||||||
320u60v60n6 | 180 | 320159 | 168 | 143 | 185584 | 97 | 258 | 4770 | 194 | 0.970595 | 23036 | 15413 | 0.669083174 | ||||
320u60v60n8 | 240 | 4396 | 763619 | 173 | 139 | 440183 | 100 | 262 | 4676 | 228 | 0.958221 | 38183 | 24711 | 0.647172826 | 视角重叠:匹配效果增加、点云增加,加滤波后点云仍明显多于n6 | ||
同v对比,n无重叠 | |||||||||||||||||
320u45v60n8 | 240 | 353804 | 138 | 105 | 180009 | 70 | 205 | 4597 | 166 | 0.954611 | 24884 | 16279 | 0.654195467 | 较u60v60n6,总度数相同,无重叠 tri_corrs提升不明显 3d点增多 重投影误差降低 | |||
320u60v60n6 | 180 | 320159 | 168 | 143 | 185584 | 97 | 258 | 4770 | 194 | 0.970595 | 23036 | 15413 | 0.669083174 |
u72n5下对比不同v,证明小v画幅瓶颈。
total_images | total_image_pairs | total_corrs | corrs_avg | corrs_rms | total_tri_corrs | tri_corrs_avg | tri_corrs_rms | avg_track_len | rms_track_len | median_number_of_key_points_per_photo | num_of_points(平均3D点) | RMS_of_rep rojection_errors | 报告3d点(无过滤) | 报告3d点 | 3d点召回率 | 说明 | |
NLGX320_u72v40n5 | 150 | 1591 | 277855 | 174 | 143 | 156132 | 98 | 265 | 4688 | 163 | 0.97746 | 18282 | 12241 | 0.669565693 | 从刚重建结束,到最后产生报告,两个3d点数据有何不同,是否被过滤?二次空三?没有gcp应该没有 | ||
NLGX320_u72v60n5 | 129 | 1231 | 237837 | 193 | 163 | 142847 | 116 | 288 | 4862 | 172 | 0.94241 | 17949 | 12008 | 0.66900663 | 注册不全 | ||
NLGX320_u72v72n5 | 302455 | 176 | 156 | 178126 | 104 | 276 | 5217 | 218 | 0.939378 | 22727 | 15187 | 0.668236019 | |||||
NLGX320_u72v90n5 | 150 | 1757 | 283971 | 161 | 147 | 168872 | 96 | 254 | 4967 | 240 | 0.917816 | 22323 | 14935 | 0.6690409 | |||
NLGX320_u72v120n5 | 1971 | 298622 | 151 | 142 | 180530 | 91 | 237 | 5646 | 286 | 0.980885 | 22812 | 14677 | 0.643389444 | 3d点召回率下降:过滤基于体素过滤,证明从结构讲,或者至少从目前的版本讲,v120多冗余3d点并没有使用价值,反而增大误差。 |
小FOV确实取得了更好的平均track长度
total_images | total_image_pairs | total_corrs | corrs_avg | corrs_rms | total_tri_corrs | tri_corrs_avg | tri_corrs_rms | avg_track_len | rms_track_len | median_number_of_key_points_per_photo | num_of_points(平均3D点) | RMS_of_rep rojection_errors | 报告3d点(无过滤) | 报告3d点 | 3d点召回率 | 说明 | |
NLGX320_u90v90n4 | 120 | 1247 | 251327 | 201 | 184 | 157804 | 126 | 306 | 4.613363849 | 5.472636361 | 20099 | total_track_len 92724.000000000000 double | |||||
NLGX320_u72v72n5 | 150 | 1707 | 302403 | 177 | 157 | 178053 | 104 | 277 | 4.688685069 | 5.586258069 | 0.924589 | 22678 | total_track_len 106330.00000000000 double | ||||
NLGX320_u60v60n6 | 180 | 1903 | 320829 | 168 | 143 | 185874 | 97 | 259 | 4.757325968 | 5.708141885 | 0.940675 | 23171 | total_track_len 110232.00000000000 double | ||||
NLGX320_u45v60n8 | 240 | 2547 | 353903 | 138 | 116 | 205610 | 80 | 205 | 4.862121928 | 5.872982768 | 0.925113 | 25392 | total_track_len 123459.00000000000 double |
同n下同group对比
因为单视角无法重建,选择了n个视角下的group2、3、4,但是同n8下,不同u总覆盖与重叠度不同,有一定干扰,最后使用u60g2\u60g4+u110g3的组合方式控制,g3更偏行进方向(大景深),最后证明小fov确实在行进方向能获取匹配优势。
total_images | total_image_pairs | total_corrs | corrs_avg | corrs_rms | total_tri_corrs | tri_corrs_avg | tri_corrs_rms | avg_track_len | rms_track_len | median_number_of_key_points_per_photo | num_of_points(平均3D点) | RMS_of_rep rojection_errors | 报告3d点(无过滤) | 报告3d点 | 3d点召回率 | 说明 | |
track统计实验:证明大FOV的平均纵向关联度更差(控制变量,用同样的n,n=8,选中单一视角,6点钟方向:group_index=3) | |||||||||||||||||
单视角重建失败,改用group_index=2,3,4 | |||||||||||||||||
NLGX320_u45v60n8_g2g3g4 | 90 | 969 | 165255 | 170 | 141 | 95791 | 98 | 242 | 5.12044122 | 6.233307232 | 4861 | 138 | 0.921808 | 10063 | total_track_len 51527.000000000000 double | ||
NLGX320_u70v70n8_g2g3g4 | 90 | 1971 | 430642 | 218 | 179 | 251580 | 127 | 338 | 6.164731896 | 8.467444892 | 5334 | 158 | 0.937981 | 14472 | total_track_len 89216.000000000000 double | ||
NLGX320_u90v90n8_g2g3g4 | 90 | 2020 | 403876 | 199 | 168 | 238738 | 118 | 298 | 5.930191972 | 8.07325103 | 5279 | 185 | 1.015964 | 14325 | total_track_len 84950.000000000000 double | ||
NLGX320_u120v120n8_g2g3g4 | |||||||||||||||||
NLGX320_u60v60n8_g2g3g4 | 5.86092 | 7.9377 | 0.88052 | 13933 | |||||||||||||
NLGX320_u60v60g2g4_u110v110g3 | 5.43078 | 6.96349 | 0.975863 | 12777 | |||||||||||||
NLGX320_u60v60g2g4_u90v90g3 | 程序崩溃CheckErrorCUDA |
单独对比u60g2\g3\g4与u60g2\u110g3\u60g4,明显u110获得了很大的劣势
大数据集下重建结果:
最后,不光在有竹林的子集小场景(badcase)重建成功,包含同样场景的大场景也重建成功。(对照组均失败)
下图:南锣鼓巷634张图,u70v80n8
补充:这个很像orbslam2的场景,orbslam2通过特征均匀分布来增加关键帧的鲁棒性。现在也是因为误匹配导致正确的特征点消失。(当然,思路落实到操作,不一定相似,现在排除外点才是更好的——也就是裁剪)