本文件夹包括了ScanNet数据集和Stanford (S3DIS)数据集的代码,代码依据SpatioTemporalSegmentation代码库建立。
请依据SpatioTemporalSegmentation代码库中指示安装所需要的包。
我们推荐您使用Anaconda来安装Minkowski Engine,相关的安装步骤可以参考Minkowski Engine 0.4.3代码库。你需要确保你下载的是0.4.3版本安装包,不是最新版。
在这里我们提供了一份安装示例。
- 从官方网站下载ScanNet数据集,你需要同意ScanNet数据集使用须知。
- 使用下面命令去处理所有原始点云数据。在运行前你需要在
lib/datasets/preprocessing/scannet.py
文件中修改SCANNET_RAW_PATH
和SCANNET_OUT_PATH
的路径。
python -m lib.datasets.preprocessing.scannet
在本工作中,我们在模型库中选择使用2厘米体素和conv1卷积核大小为5的Mink16UNet34C模型,在这里可以下载训练好的模型MinkUNet34C-train-conv1-5.pth
,模型下载后请将其放置在weights/
文件夹内。
在给定最大攻击幅度<budget>
下,使用如下命令去攻击。数据路径<data path>
是SCANNET_OUT_PATH/train
。
python adv_scannet.py --data_path <data path> --budget <budget>
你需要使用CUDA_VISIBLE_DEVICES
去指定实验中具体使用哪些GPU卡,否则脚本将会使用所有GPU卡。例如,在上述命令开头加入CUDA_VISIBLE_DEVICES=0,1,2,3
去指定使用编号为0,1,2,3
的4张GPU卡,或者在脚本中添加os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3"
。
你可以通过在上述命令的末尾增加下面这些额外的指令来控制攻击的具体过程。
--exp_name <name>
指定一个实验名称,如果不指定则实验名称默认是Logs_<日期>_<时间>
。--dynamics_aware
本次攻击是否是动态感知的,默认是True
。--save_coords
是否保存攻击后的点云坐标,默认是False
。--save_preds
是否保存攻击后模型的预测结果,默认是False
。--save_probs
是否保存攻击后模型的各类别预测分数,默认是False
。--visual
是否保存.ply
格式的可视化结果,默认是False
。
我们建议您在攻击时使用--save_coords
命令,这样攻击时可以保存攻击过后的点云坐标。当程序意外终止时,通过这些已保存的点云坐标您可以在攻击命令中添加命令--resume_path <resume path>
恢复上次攻击。
--resume_path <resume path>
恢复某次攻击实验,路径的格式是outputs/scannet/budget_<your budget>/<your exp name>
。你需要确保在需要恢复的攻击实验中,之前已经使用了--save_coords
命令。
如果攻击的最大攻击幅度是列表[0.005, 0.01, 0.02, 0.05]中的一个,脚本将自动加载我们调好的攻击参数,您可以根据您的需要通过下面的指令修改攻击参数。
--default_para
当攻击的最大攻击幅度是列表[0.005, 0.01, 0.02, 0.05]中的一个,是否使用默认攻击参数,默认是True
。--iter_num <num>
攻击迭代数量。--step <size>
攻击步长。--lamda_input <value>
本参数控制在模型输入体素化(voxelization)处S形函数(sigmoid-like function)的斜度。--lamda_conv <value>
本参数控制在稀疏卷积的占用值(occupancy value)处S形函数(sigmoid-like function)的斜度。--lamda_output <value>
本参数控制在模型输出反体素化(devoxelization)处S形函数(sigmoid-like function)的斜度。
使用如下命令使用未攻击的点云坐标来测试模型性能,输出结果反映了攻击前模型的性能。
python eval_scannet.py --data_path <data path>
我们的脚本能够对模型MinkUNet34C-train-conv1-5.pth
在验证集上复现出mIoU 72.22%性能。
当攻击过后,您可以使用如下命令使用攻击后的点云坐标来测试模型性能,输出结果反映了攻击后模型的性能。攻击后的点云坐标路径<coord path>
的格式是outputs/scannet/budget_<your budget>/<your exp name>/coord
。
python eval_scannet.py --data_path=<data path> --attacked_coords=<coord path>
同样,您可以通过在上述两条命令末尾增加额外的指令来控制模型评估过程。
--exp_name <name>
指定一个实验名称,如果不指定则实验名称默认是Logs_<日期>_<时间>
。--save_preds
是否保存模型的预测结果,默认是False
。--save_probs
是否保存模型的各类别预测分数,默认是False
。--visual
是否保存.ply
格式的可视化结果,默认是False
。
方法 | 最大攻击幅度 = 0.005 m | 最大攻击幅度 = 0.01 m | 最大攻击幅度 = 0.02 m | 最大攻击幅度 = 0.05 m |
---|---|---|---|---|
FGM | 60.44 | 55.51 | 38.65 | 8.70 |
LGM | 25.79 | 11.51 | 5.76 | 3.83 |
因为我们修改了代码中的一些错误,本代码库中攻击性能会略优于上述展示的我们文章中汇报的性能。
- 从官方网站下载Stanford 3D数据集,你需要同意Stanford 3D数据集使用须知。
- 使用下面命令去处理所有原始点云数据。在运行前你需要在
lib/datasets/preprocessing/stanford.py
文件中修改STANFORD_3D_IN_PATH
和STANFORD_3D_OUT_PATH
的路径。
python -m lib.datasets.preprocessing.stanford
在本工作中,我们在模型库中选择使用5厘米体素和conv1卷积核大小为5的Mink16UNet34模型,在这里可以下载训练好的模型Mink16UNet34-stanford-conv1-5.pth
,模型下载后请将其放置在weights/
文件夹内。
在给定最大攻击幅度<budget>
下,使用如下命令去攻击。数据路径<data path>
是STANFORD_3D_OUT_PATH
。
python adv_stanford.py --data_path <data path> --budget <budget>
你需要使用CUDA_VISIBLE_DEVICES
去指定实验中具体使用哪些GPU卡,否则脚本将会使用所有GPU卡。例如,在上述命令开头加入CUDA_VISIBLE_DEVICES=0,1,2,3
去指定使用编号为0,1,2,3
的4张GPU卡,或者在脚本中添加os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3"
。
你可以通过在上述命令的末尾增加下面这些额外的指令来控制攻击的具体过程。
--exp_name <name>
指定一个实验名称,如果不指定则实验名称默认是Logs_<日期>_<时间>
。--dynamics_aware
本次攻击是否是动态感知的,默认是True
。--save_coords
是否保存攻击后的点云坐标,默认是False
。--save_preds
是否保存攻击后模型的预测结果,默认是False
。--save_probs
是否保存攻击后模型的各类别预测分数,默认是False
。--visual
是否保存.ply
格式的可视化结果,默认是False
。
我们建议您在攻击时使用--save_coords
命令,这样攻击时可以保存攻击过后的点云坐标。当程序意外终止时,通过这些已保存的点云坐标您可以在攻击命令中添加命令--resume_path <resume path>
恢复上次攻击。
--resume_path <resume path>
恢复某次攻击实验,路径的格式是outputs/stanford/budget_<your budget>/<your exp name>
。你需要确保在需要恢复的攻击实验中,之前已经使用了--save_coords
命令。
如果攻击的最大攻击幅度是列表[0.005, 0.01, 0.02, 0.05]中的一个,脚本将自动加载我们调好的攻击参数,您可以根据您的需要通过下面的指令修改攻击参数。
--default_para
当攻击的最大攻击幅度是列表[0.005, 0.01, 0.02, 0.05]中的一个,是否使用默认攻击参数,默认是True
。--iter_num <num>
攻击迭代数量。--step <size>
攻击步长。--lamda_input <value>
本参数控制在模型输入体素化(voxelization)处S形函数(sigmoid-like function)的斜度。--lamda_conv <value>
本参数控制在稀疏卷积的占用值(occupancy value)处S形函数(sigmoid-like function)的斜度。--lamda_output <value>
本参数控制在模型输出反体素化(devoxelization)处S形函数(sigmoid-like function)的斜度。--lamda_floor <value>
本参数控制S形函数(sigmoid-like function)在模拟阶梯函数(floor function)时的斜度。
使用如下命令使用未攻击的点云坐标来测试模型性能,输出结果反映了攻击前模型的性能。
python eval_stanford.py --data_path <data path>
我们的脚本能够对模型Mink16UNet34-stanford-conv1-5.pth
在数据集区域5上复现出mIoU 65.47%性能。
当攻击过后,您可以使用如下命令使用攻击后的点云坐标来测试模型性能,输出结果反映了攻击后模型的性能。攻击后的点云坐标路径<coord path>
的格式是outputs/stanford/budget_<your budget>/<your exp name>/coord
。
python eval_stanford.py --data_path=<data path> --attacked_coords=<coord path>
同样,您可以通过在上述两条命令末尾增加额外的指令来控制模型评估过程。
--exp_name <name>
指定一个实验名称,如果不指定则实验名称默认是Logs_<日期>_<时间>
。--area <id>
使用的数据集区域,默认是5
。--save_preds
是否保存模型的预测结果,默认是False
。--save_probs
是否保存模型的各类别预测分数,默认是False
。--visual
是否保存.ply
格式的可视化结果,默认是False
。
方法 | 最大攻击幅度 = 0.005 m | 最大攻击幅度 = 0.01 m | 最大攻击幅度 = 0.02 m | 最大攻击幅度 = 0.05 m |
---|---|---|---|---|
FGM | 57.53 | 52.35 | 45.24 | 21.21 |
LGM | 48.20 | 39.65 | 30.93 | 7.45 |
因为我们修改了代码中的一些错误,本代码库中攻击性能会略优于上述展示的我们文章中汇报的性能。