├── kitti.png ├── scripts ├── kitti_noise │ ├── 0000.pcd │ ├── 0001.pcd │ ├── 0002.pcd │ ├── 0003.pcd │ ├── 0004.pcd │ ├── 0005.pcd │ ├── 0006.pcd │ ├── 0007.pcd │ ├── 0008.pcd │ ├── 0009.pcd │ ├── 0010.pcd │ ├── 0011.pcd │ ├── 0012.pcd │ ├── 0013.pcd │ ├── 0014.pcd │ ├── 0015.pcd │ ├── 0016.pcd │ ├── 0017.pcd │ ├── 0018.pcd │ ├── 0019.pcd │ ├── 0020.pcd │ ├── 0021.pcd │ ├── 0022.pcd │ ├── 0023.pcd │ ├── 0024.pcd │ ├── 0025.pcd │ ├── 0026.pcd │ ├── 0027.pcd │ ├── 0028.pcd │ ├── 0029.pcd │ ├── 0030.pcd │ ├── 0031.pcd │ ├── 0032.pcd │ ├── 0033.pcd │ ├── 0034.pcd │ ├── 0035.pcd │ ├── 0036.pcd │ ├── 0037.pcd │ ├── 0038.pcd │ ├── 0039.pcd │ ├── 0040.pcd │ ├── 0041.pcd │ ├── 0042.pcd │ ├── 0043.pcd │ ├── 0044.pcd │ ├── 0045.pcd │ ├── 0046.pcd │ ├── 0047.pcd │ ├── 0048.pcd │ ├── 0049.pcd │ ├── 0050.pcd │ ├── 0051.pcd │ ├── 0052.pcd │ ├── 0053.pcd │ ├── 0054.pcd │ ├── 0055.pcd │ ├── 0056.pcd │ ├── 0057.pcd │ ├── 0058.pcd │ ├── 0059.pcd │ ├── 0060.pcd │ ├── 0061.pcd │ ├── 0062.pcd │ ├── 0063.pcd │ ├── 0064.pcd │ ├── 0065.pcd │ ├── 0066.pcd │ ├── 0067.pcd │ ├── 0068.pcd │ ├── 0069.pcd │ ├── 0070.pcd │ ├── 0071.pcd │ ├── 0072.pcd │ ├── 0073.pcd │ ├── 0074.pcd │ ├── 0075.pcd │ ├── 0076.pcd │ ├── 0077.pcd │ ├── 0078.pcd │ ├── 0079.pcd │ ├── 0080.pcd │ ├── 0081.pcd │ ├── 0082.pcd │ ├── 0083.pcd │ ├── 0084.pcd │ ├── 0085.pcd │ ├── 0086.pcd │ ├── 0087.pcd │ ├── 0088.pcd │ ├── 0089.pcd │ ├── 0090.pcd │ ├── 0091.pcd │ ├── 0092.pcd │ ├── 0093.pcd │ ├── 0094.pcd │ ├── 0095.pcd │ ├── 0096.pcd │ ├── 0097.pcd │ ├── 0098.pcd │ ├── 0099.pcd │ ├── 0100.pcd │ ├── 0101.pcd │ ├── 0102.pcd │ ├── 0103.pcd │ ├── 0104.pcd │ ├── 0105.pcd │ ├── 0106.pcd │ ├── 0107.pcd │ ├── 0108.pcd │ ├── 0109.pcd │ ├── 0110.pcd │ ├── 0111.pcd │ ├── 0112.pcd │ ├── 0113.pcd │ ├── 0114.pcd │ ├── 0115.pcd │ ├── 0116.pcd │ ├── 0117.pcd │ ├── 0118.pcd │ ├── 0119.pcd │ ├── 0120.pcd │ ├── 0121.pcd │ ├── 0122.pcd │ ├── 0123.pcd │ ├── 0124.pcd │ ├── 0125.pcd │ ├── 0126.pcd │ ├── 0127.pcd │ ├── 0128.pcd │ ├── 0129.pcd │ ├── 0130.pcd │ ├── 0131.pcd │ ├── 0132.pcd │ ├── 0133.pcd │ ├── 0134.pcd │ ├── 0135.pcd │ ├── 0136.pcd │ ├── 0137.pcd │ ├── 0138.pcd │ ├── 0139.pcd │ ├── 0140.pcd │ ├── 0141.pcd │ ├── 0142.pcd │ ├── 0143.pcd │ ├── 0144.pcd │ ├── 0145.pcd │ ├── 0146.pcd │ ├── 0147.pcd │ ├── 0148.pcd │ ├── 0149.pcd │ ├── 0150.pcd │ ├── 0151.pcd │ ├── 0152.pcd │ ├── 0153.pcd │ ├── 0154.pcd │ ├── 0155.pcd │ ├── 0156.pcd │ ├── 0157.pcd │ ├── 0158.pcd │ ├── 0159.pcd │ ├── 0160.pcd │ ├── 0161.pcd │ ├── 0162.pcd │ ├── 0163.pcd │ ├── 0164.pcd │ ├── 0165.pcd │ ├── 0166.pcd │ ├── 0167.pcd │ ├── 0168.pcd │ ├── 0169.pcd │ ├── 0170.pcd │ ├── 0171.pcd │ ├── 0172.pcd │ ├── 0173.pcd │ ├── 0174.pcd │ ├── 0175.pcd │ ├── 0176.pcd │ ├── 0177.pcd │ ├── 0178.pcd │ ├── 0179.pcd │ ├── 0180.pcd │ ├── 0181.pcd │ ├── 0182.pcd │ ├── 0183.pcd │ ├── 0184.pcd │ ├── 0185.pcd │ ├── 0186.pcd │ ├── 0187.pcd │ ├── 0188.pcd │ ├── 0189.pcd │ ├── 0190.pcd │ ├── 0191.pcd │ ├── 0192.pcd │ ├── 0193.pcd │ ├── 0194.pcd │ ├── 0195.pcd │ ├── 0196.pcd │ ├── 0197.pcd │ ├── 0198.pcd │ ├── 0199.pcd │ ├── 0200.pcd │ ├── 0201.pcd │ ├── 0202.pcd │ ├── 0203.pcd │ ├── 0204.pcd │ ├── 0205.pcd │ ├── 0206.pcd │ ├── 0207.pcd │ ├── 0208.pcd │ ├── 0209.pcd │ ├── 0210.pcd │ ├── 0211.pcd │ ├── 0212.pcd │ ├── 0213.pcd │ ├── 0214.pcd │ ├── 0215.pcd │ ├── 0216.pcd │ ├── 0217.pcd │ ├── 0218.pcd │ ├── 0219.pcd │ ├── 0220.pcd │ ├── 0221.pcd │ ├── 0222.pcd │ ├── 0223.pcd │ ├── 0224.pcd │ ├── 0225.pcd │ ├── 0226.pcd │ ├── 0227.pcd │ ├── 0228.pcd │ ├── 0229.pcd │ ├── 0230.pcd │ ├── 0231.pcd │ ├── 0232.pcd │ ├── 0233.pcd │ ├── 0234.pcd │ ├── 0235.pcd │ ├── 0236.pcd │ ├── 0237.pcd │ ├── 0238.pcd │ ├── 0239.pcd │ ├── 0240.pcd │ ├── 0241.pcd │ ├── 0242.pcd │ ├── 0243.pcd │ ├── 0244.pcd │ ├── 0245.pcd │ ├── 0246.pcd │ ├── 0247.pcd │ ├── 0248.pcd │ ├── 0249.pcd │ ├── 0250.pcd │ ├── 0251.pcd │ ├── 0252.pcd │ ├── 0253.pcd │ ├── 0254.pcd │ ├── 0255.pcd │ ├── 0256.pcd │ ├── 0257.pcd │ ├── 0258.pcd │ ├── 0259.pcd │ ├── 0260.pcd │ ├── 0261.pcd │ ├── 0262.pcd │ ├── 0263.pcd │ ├── 0264.pcd │ ├── 0265.pcd │ ├── 0266.pcd │ ├── 0267.pcd │ ├── 0268.pcd │ ├── 0269.pcd │ ├── 0270.pcd │ ├── 0271.pcd │ ├── 0272.pcd │ ├── 0273.pcd │ ├── 0274.pcd │ ├── 0275.pcd │ ├── 0276.pcd │ ├── 0277.pcd │ ├── 0278.pcd │ ├── 0279.pcd │ ├── 0280.pcd │ ├── 0281.pcd │ ├── 0282.pcd │ ├── 0283.pcd │ ├── 0284.pcd │ ├── 0285.pcd │ ├── 0286.pcd │ ├── 0287.pcd │ ├── 0288.pcd │ ├── 0289.pcd │ ├── 0290.pcd │ ├── 0291.pcd │ ├── 0292.pcd │ ├── 0293.pcd │ ├── 0294.pcd │ ├── 0295.pcd │ ├── 0296.pcd │ ├── 0297.pcd │ ├── 0298.pcd │ ├── 0299.pcd │ ├── 0300.pcd │ ├── 0301.pcd │ ├── 0302.pcd │ ├── 0303.pcd │ ├── 0304.pcd │ ├── 0305.pcd │ ├── 0306.pcd │ ├── 0307.pcd │ ├── 0308.pcd │ ├── 0309.pcd │ ├── 0310.pcd │ ├── 0311.pcd │ ├── 0312.pcd │ ├── 0313.pcd │ ├── 0314.pcd │ ├── 0315.pcd │ ├── 0316.pcd │ ├── 0317.pcd │ ├── 0318.pcd │ ├── 0319.pcd │ ├── 0320.pcd │ ├── 0321.pcd │ ├── 0322.pcd │ ├── 0323.pcd │ ├── 0324.pcd │ ├── 0325.pcd │ ├── 0326.pcd │ ├── 0327.pcd │ ├── 0328.pcd │ ├── 0329.pcd │ ├── 0330.pcd │ ├── 0331.pcd │ ├── 0332.pcd │ ├── 0333.pcd │ ├── 0334.pcd │ ├── 0335.pcd │ ├── 0336.pcd │ ├── 0337.pcd │ ├── 0338.pcd │ ├── 0339.pcd │ ├── 0340.pcd │ ├── 0341.pcd │ ├── 0342.pcd │ ├── 0343.pcd │ ├── 0344.pcd │ ├── 0345.pcd │ ├── 0346.pcd │ ├── 0347.pcd │ ├── 0348.pcd │ ├── 0349.pcd │ ├── 0350.pcd │ ├── 0351.pcd │ ├── 0352.pcd │ ├── 0353.pcd │ ├── 0354.pcd │ ├── 0355.pcd │ ├── 0356.pcd │ ├── 0357.pcd │ ├── 0358.pcd │ ├── 0359.pcd │ ├── 0360.pcd │ ├── 0361.pcd │ ├── 0362.pcd │ ├── 0363.pcd │ ├── 0364.pcd │ ├── 0365.pcd │ ├── 0366.pcd │ ├── 0367.pcd │ ├── 0368.pcd │ ├── 0369.pcd │ ├── 0370.pcd │ ├── 0371.pcd │ ├── 0372.pcd │ ├── 0373.pcd │ ├── 0374.pcd │ ├── 0375.pcd │ ├── 0376.pcd │ ├── 0377.pcd │ ├── 0378.pcd │ ├── 0379.pcd │ ├── 0380.pcd │ ├── 0381.pcd │ ├── 0382.pcd │ ├── 0383.pcd │ ├── 0384.pcd │ ├── 0385.pcd │ ├── 0386.pcd │ ├── 0387.pcd │ ├── 0388.pcd │ ├── 0389.pcd │ ├── 0390.pcd │ ├── 0391.pcd │ ├── 0392.pcd │ ├── 0393.pcd │ ├── 0394.pcd │ ├── 0395.pcd │ ├── 0396.pcd │ ├── 0397.pcd │ ├── 0398.pcd │ ├── 0399.pcd │ ├── 0400.pcd │ ├── 0401.pcd │ ├── 0402.pcd │ ├── 0403.pcd │ ├── 0404.pcd │ ├── 0405.pcd │ ├── 0406.pcd │ ├── 0407.pcd │ ├── 0408.pcd │ ├── 0409.pcd │ ├── 0410.pcd │ ├── 0411.pcd │ ├── 0412.pcd │ ├── 0413.pcd │ ├── 0414.pcd │ └── 0415.pcd ├── sample_kitti.py └── generate_synthetic_pc.py ├── .gitignore ├── README.md ├── visualizer.py ├── inference_superline3d.py ├── train_synthetic_data.py ├── train_superline3d.py └── model.py /kitti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/kitti.png -------------------------------------------------------------------------------- /scripts/kitti_noise/0000.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0000.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0001.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0001.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0002.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0002.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0003.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0003.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0004.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0004.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0005.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0005.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0006.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0006.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0007.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0007.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0008.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0008.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0009.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0009.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0010.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0010.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0011.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0011.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0012.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0012.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0013.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0013.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0014.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0014.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0015.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0015.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0016.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0016.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0017.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0017.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0018.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0018.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0019.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0019.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0020.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0020.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0021.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0021.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0022.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0022.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0023.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0023.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0024.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0024.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0025.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0025.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0026.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0026.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0027.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0027.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0028.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0028.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0029.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0029.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0030.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0030.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0031.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0031.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0032.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0032.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0033.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0033.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0034.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0034.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0035.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0035.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0036.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0036.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0037.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0037.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0038.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0038.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0039.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0039.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0040.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0040.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0041.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0041.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0042.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0042.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0043.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0043.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0044.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0044.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0045.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0045.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0046.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0046.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0047.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0047.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0048.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0048.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0049.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0049.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0050.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0050.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0051.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0051.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0052.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0052.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0053.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0053.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0054.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0054.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0055.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0055.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0056.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0056.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0057.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0057.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0058.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0058.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0059.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0059.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0060.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0060.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0061.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0061.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0062.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0062.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0063.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0063.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0064.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0064.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0065.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0065.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0066.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0066.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0067.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0067.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0068.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0068.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0069.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0069.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0070.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0070.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0071.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0071.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0072.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0072.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0073.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0073.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0074.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0074.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0075.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0075.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0076.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0076.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0077.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0077.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0078.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0078.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0079.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0079.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0080.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0080.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0081.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0081.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0082.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0082.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0083.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0083.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0084.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0084.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0085.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0085.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0086.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0086.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0087.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0087.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0088.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0088.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0089.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0089.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0090.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0090.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0091.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0091.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0092.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0092.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0093.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0093.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0094.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0094.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0095.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0095.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0096.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0096.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0097.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0097.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0098.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0098.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0099.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0099.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0100.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0100.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0101.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0101.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0102.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0102.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0103.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0103.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0104.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0104.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0105.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0105.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0106.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0106.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0107.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0107.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0108.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0108.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0109.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0109.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0110.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0110.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0111.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0111.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0112.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0112.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0113.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0113.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0114.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0114.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0115.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0115.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0116.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0116.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0117.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0117.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0118.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0118.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0119.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0119.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0120.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0120.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0121.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0121.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0122.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0122.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0123.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0123.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0124.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0124.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0125.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0125.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0126.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0126.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0127.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0127.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0128.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0128.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0129.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0129.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0130.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0130.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0131.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0131.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0132.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0132.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0133.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0133.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0134.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0134.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0135.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0135.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0136.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0136.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0137.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0137.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0138.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0138.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0139.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0139.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0140.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0140.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0141.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0141.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0142.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0142.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0143.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0143.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0144.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0144.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0145.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0145.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0146.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0146.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0147.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0147.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0148.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0148.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0149.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0149.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0150.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0150.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0151.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0151.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0152.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0152.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0153.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0153.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0154.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0154.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0155.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0155.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0156.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0156.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0157.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0157.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0158.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0158.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0159.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0159.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0160.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0160.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0161.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0161.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0162.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0162.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0163.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0163.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0164.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0164.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0165.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0165.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0166.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0166.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0167.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0167.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0168.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0168.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0169.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0169.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0170.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0170.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0171.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0171.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0172.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0172.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0173.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0173.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0174.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0174.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0175.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0175.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0176.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0176.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0177.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0177.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0178.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0178.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0179.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0179.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0180.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0180.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0181.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0181.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0182.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0182.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0183.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0183.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0184.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0184.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0185.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0185.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0186.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0186.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0187.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0187.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0188.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0188.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0189.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0189.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0190.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0190.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0191.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0191.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0192.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0192.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0193.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0193.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0194.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0194.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0195.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0195.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0196.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0196.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0197.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0197.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0198.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0198.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0199.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0199.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0200.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0200.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0201.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0201.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0202.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0202.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0203.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0203.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0204.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0204.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0205.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0205.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0206.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0206.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0207.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0207.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0208.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0208.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0209.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0209.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0210.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0210.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0211.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0211.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0212.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0212.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0213.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0213.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0214.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0214.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0215.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0215.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0216.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0216.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0217.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0217.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0218.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0218.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0219.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0219.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0220.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0220.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0221.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0221.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0222.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0222.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0223.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0223.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0224.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0224.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0225.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0225.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0226.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0226.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0227.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0227.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0228.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0228.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0229.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0229.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0230.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0230.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0231.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0231.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0232.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0232.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0233.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0233.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0234.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0234.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0235.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0235.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0236.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0236.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0237.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0237.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0238.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0238.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0239.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0239.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0240.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0240.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0241.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0241.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0242.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0242.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0243.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0243.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0244.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0244.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0245.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0245.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0246.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0246.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0247.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0247.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0248.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0248.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0249.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0249.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0250.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0250.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0251.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0251.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0252.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0252.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0253.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0253.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0254.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0254.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0255.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0255.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0256.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0256.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0257.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0257.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0258.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0258.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0259.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0259.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0260.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0260.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0261.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0261.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0262.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0262.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0263.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0263.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0264.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0264.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0265.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0265.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0266.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0266.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0267.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0267.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0268.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0268.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0269.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0269.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0270.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0270.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0271.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0271.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0272.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0272.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0273.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0273.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0274.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0274.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0275.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0275.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0276.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0276.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0277.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0277.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0278.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0278.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0279.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0279.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0280.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0280.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0281.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0281.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0282.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0282.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0283.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0283.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0284.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0284.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0285.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0285.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0286.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0286.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0287.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0287.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0288.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0288.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0289.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0289.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0290.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0290.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0291.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0291.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0292.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0292.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0293.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0293.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0294.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0294.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0295.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0295.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0296.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0296.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0297.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0297.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0298.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0298.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0299.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0299.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0300.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0300.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0301.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0301.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0302.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0302.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0303.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0303.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0304.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0304.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0305.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0305.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0306.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0306.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0307.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0307.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0308.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0308.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0309.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0309.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0310.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0310.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0311.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0311.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0312.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0312.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0313.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0313.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0314.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0314.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0315.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0315.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0316.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0316.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0317.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0317.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0318.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0318.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0319.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0319.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0320.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0320.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0321.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0321.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0322.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0322.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0323.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0323.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0324.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0324.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0325.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0325.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0326.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0326.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0327.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0327.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0328.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0328.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0329.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0329.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0330.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0330.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0331.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0331.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0332.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0332.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0333.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0333.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0334.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0334.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0335.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0335.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0336.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0336.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0337.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0337.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0338.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0338.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0339.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0339.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0340.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0340.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0341.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0341.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0342.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0342.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0343.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0343.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0344.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0344.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0345.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0345.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0346.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0346.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0347.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0347.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0348.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0348.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0349.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0349.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0350.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0350.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0351.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0351.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0352.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0352.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0353.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0353.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0354.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0354.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0355.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0355.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0356.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0356.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0357.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0357.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0358.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0358.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0359.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0359.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0360.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0360.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0361.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0361.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0362.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0362.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0363.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0363.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0364.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0364.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0365.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0365.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0366.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0366.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0367.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0367.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0368.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0368.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0369.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0369.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0370.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0370.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0371.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0371.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0372.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0372.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0373.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0373.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0374.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0374.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0375.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0375.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0376.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0376.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0377.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0377.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0378.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0378.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0379.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0379.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0380.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0380.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0381.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0381.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0382.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0382.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0383.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0383.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0384.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0384.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0385.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0385.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0386.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0386.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0387.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0387.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0388.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0388.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0389.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0389.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0390.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0390.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0391.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0391.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0392.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0392.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0393.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0393.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0394.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0394.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0395.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0395.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0396.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0396.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0397.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0397.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0398.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0398.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0399.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0399.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0400.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0400.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0401.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0401.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0402.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0402.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0403.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0403.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0404.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0404.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0405.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0405.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0406.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0406.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0407.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0407.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0408.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0408.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0409.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0409.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0410.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0410.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0411.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0411.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0412.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0412.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0413.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0413.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0414.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0414.pcd -------------------------------------------------------------------------------- /scripts/kitti_noise/0415.pcd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zxrzju/SuperLine3D/HEAD/scripts/kitti_noise/0415.pcd -------------------------------------------------------------------------------- /scripts/sample_kitti.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import open3d as o3d 4 | import sys 5 | from os.path import join 6 | from tqdm import tqdm 7 | 8 | kitti_base = sys.argv[1] 9 | output_base = sys.argv[2] 10 | 11 | seqs = sorted(os.listdir(kitti_base)) 12 | 13 | voxel_size = 0.25 14 | point_num = 25000 15 | 16 | for seq in seqs: 17 | raw_path = join(kitti_base, seq, 'velodyne') 18 | files = sorted(os.listdir(raw_path)) 19 | out_path = join(output_base, seq) 20 | os.makedirs(out_path) if not os.path.isdir(out_path) else None 21 | for file in tqdm(files[:100]): 22 | raw_dat = np.fromfile(join(raw_path, file), dtype=np.float32).reshape((-1, 4))[:,:3] 23 | pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(raw_dat)) 24 | downpcd = pcd.voxel_down_sample(voxel_size) 25 | 26 | point_set = np.asarray(downpcd.points) 27 | if len(point_set) < point_num: 28 | add_index = np.random.choice( 29 | len(point_set), point_num - len(point_set)) 30 | add_pts = point_set[add_index, ...] 31 | sample_pc = np.vstack([point_set, add_pts]) 32 | else: 33 | tree = o3d.geometry.KDTreeFlann(downpcd) 34 | k, ind, _ = tree.search_knn_vector_3d([0, 0, 0], point_num) 35 | sample_pc = point_set[ind] 36 | 37 | idx = np.arange(point_num) 38 | np.random.shuffle(idx) 39 | sample_pc = sample_pc[idx] 40 | out_pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(sample_pc)) 41 | out_pcd.paint_uniform_color([1, 1, 0]) 42 | o3d.io.write_point_cloud(join(out_path, file[:-4] + '.pcd'), out_pcd) 43 | 44 | 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SuperLine3D 2 | 3 | > SuperLine3D: Self-supervised Line Segmentation and Description for LiDAR Point Cloud 4 | > Xiangrui Zhao, Sheng Yang, Tianxin Huang, Jun Chen, Teng Ma, Mingyang Li and Yong Liu 5 | > ECCV 2022 Poster 6 | 7 | ![kitti](kitti.png) 8 | 9 | ## TODO List and ETA 10 | - [x] Code for training on synthetic and real data, and the synthetic data preparation scripts (2022-7-21). 11 | 12 | - [ ] Evaluation code and metrics (expected 2022-8-21). 13 | 14 | 15 | ## Requirements 16 | Our code was tested using Tensorflow 1.15.5 and Python 3.8. To use the code, you need to first install the following python packages: 17 | 18 | ```Shell 19 | pip install tensorflow-gpu==1.15.5 h5py open3d tqdm visdom multiprocessing Geometry3D 20 | pip install git+https://github.com/utiasSTARS/liegroups.git 21 | ``` 22 | 23 | ## How to Use 24 | 25 | ### Step 1. Train on Synthetic Data 26 | 28 | 29 | ```bash 30 | # Generate synthetic data 31 | cd scripts 32 | python generate_synthetic_pc.py synthetic_data/ 33 | 34 | # Train on synthetic data 35 | cd .. 36 | python train_synthetic_data.py --load_folder scripts/synthetic_data/line_pole_noise/ 37 | ``` 38 | 39 | 40 | 41 | ### Step 2. Train on Labeled Lidar Data 42 | Download labeled Lidar data from [Google Drive](https://drive.google.com/file/d/1zFnez6jERWH3zlIFxuJASiJUFiK04o77/view?usp=sharing) 43 | Change **batch_size** according to your VRAM. It must be **even**. 44 | 46 | 47 | ```bash 48 | python train_superline3d.py --loader_folder /kitti_reg_diff35/ 49 | ``` 50 | 51 | 52 | 53 | ### Step 3. Inference on Kitti Test Data 54 | Download test Lidar data from [Google Drive](https://drive.google.com/file/d/1ZritaoKOynMZ29QBFmijEkxT65MKpSE_/view?usp=sharing) 55 | 57 | 58 | ```bash 59 | python inference_superline3d.py --load_folder /kitti_reg_test_diff5_2w5/ --pred_path --best_model xxx.ckpt 60 | ``` 61 | 62 | 63 | 64 | ## Citation 65 | 66 | ```bibtex 67 | @inproceedings{zhao2022superline3d, 68 | title={SuperLine3D: Self-supervised Line Segmentation and Description for LiDAR Point Cloud}, 69 | author={Zhao, Xiangrui and Yang, Sheng and Huang, Tianxin and Chen, Jun and Ma, Teng and Li, Mingyang and Liu, Yong}, 70 | booktitle={European Conference on Computer Vision}, 71 | year={2022}, 72 | organization={Springer} 73 | } 74 | ``` 75 | 76 | ## Acknowledgments 77 | This code benefits from [DGCNN](https://github.com/WangYueFt/dgcnn.git) and [ASIS](https://github.com/WXinlong/ASIS) . -------------------------------------------------------------------------------- /visualizer.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | import ntpath 4 | import time 5 | 6 | 7 | 8 | class Visualizer(): 9 | def __init__(self, opt): 10 | # self.opt = opt 11 | self.display_id = opt.display_id 12 | 13 | self.win_size = opt.display_winsize 14 | self.name = opt.name 15 | if self.display_id > 0: 16 | import visdom 17 | self.vis = visdom.Visdom(env='%d' % self.display_id) 18 | 19 | 20 | 21 | # |visuals|: dictionary of images to display or save 22 | def display_current_results(self, visuals): 23 | if self.display_id > 0: # show images in the browser 24 | idx = 1 25 | for label, item in visuals.items(): 26 | if 'data_vis' in label: 27 | data_vis_np, data_vis_color_np = item 28 | self.vis.scatter(data_vis_np, 29 | Y=None, 30 | opts=dict(title=label, 31 | markersize=4, 32 | markercolor=data_vis_color_np, 33 | markersymbol='circle'), 34 | win=self.display_id + idx, 35 | name='data_vis') 36 | elif 'pc' in label: 37 | N = item.shape[0] 38 | color_np = np.repeat(np.expand_dims(np.array([125, 125, 125], dtype=np.int64), axis=0), 39 | N, 40 | axis=0) # 1x3 -> Nx3 41 | self.vis.scatter(item, 42 | Y=None, 43 | opts=dict(title=label, 44 | markersize=4, 45 | markercolor=color_np, 46 | markersymbol='circle'), 47 | win=self.display_id + idx) 48 | elif 'img' in label: 49 | # the transpose: HxWxC -> CxHxW 50 | self.vis.image(np.transpose(item, (2,0,1)), opts=dict(title=label), 51 | win=self.display_id + idx) 52 | idx += 1 53 | 54 | # errors: dictionary of error labels and values 55 | def plot_current_errors(self, epoch, counter_ratio, opt, errors): 56 | # clamp the errors at plot, to increase resolution 57 | # for key, value in errors.items(): 58 | # if value > 1: 59 | # errors[key] = 1 60 | 61 | if not hasattr(self, 'plot_data'): 62 | self.plot_data = {'X':[],'Y':[], 'legend':list(errors.keys())} 63 | self.plot_data['X'].append(epoch + counter_ratio) 64 | self.plot_data['Y'].append([errors[k] for k in self.plot_data['legend']]) 65 | self.vis.line( 66 | X=np.stack([np.array(self.plot_data['X'])]*len(self.plot_data['legend']),1), 67 | Y=np.array(self.plot_data['Y']), 68 | opts={ 69 | 'title': self.name + ' loss over time', 70 | 'legend': self.plot_data['legend'], 71 | 'xlabel': 'epoch', 72 | 'ylabel': 'loss'}, 73 | win=self.display_id) 74 | 75 | # errors: same format as |errors| of plotCurrentErrors 76 | def print_current_errors(self, epoch, i, errors, t): 77 | message = '(epoch: %d, iters: %d, time: %.3f) ' % (epoch, i, t) 78 | for k, v in errors.items(): 79 | message += '%s: %.3f ' % (k, v) 80 | 81 | print(message) 82 | 83 | 84 | -------------------------------------------------------------------------------- /inference_superline3d.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import numpy as np 3 | import tensorflow as tf 4 | from tqdm import tqdm 5 | import os 6 | import sys 7 | import open3d as o3d 8 | from os.path import join 9 | 10 | from tensorflow.python.framework.ops import prepend_name_scope 11 | 12 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 13 | ROOT_DIR = os.path.dirname(BASE_DIR) 14 | sys.path.append(BASE_DIR) 15 | sys.path.append(ROOT_DIR) 16 | sys.path.append(os.path.join(ROOT_DIR, 'utils')) 17 | import tf_util 18 | from model import * 19 | 20 | # from visualizer import Visualizer 21 | from collections import OrderedDict 22 | 23 | class opt: 24 | display_id = 1 25 | display_winsize = 256 26 | name = 'vis' 27 | 28 | 29 | parser = argparse.ArgumentParser() 30 | parser.add_argument('--model_idx', type=int, default=40, help='the number of GPUs to use [default: 2]') 31 | parser.add_argument('--num_gpu', type=int, default=1, help='the number of GPUs to use [default: 2]') 32 | parser.add_argument('--gpu_idx', type=int, default=0, help='GPU idx to use [default: 2]') 33 | parser.add_argument('--log_dir', default='log_line', help='Log dir [default: log]') 34 | parser.add_argument('--num_point', type=int, default=20000, help='Point number [default: 4096]') 35 | parser.add_argument('--max_epoch', type=int, default=101, help='Epoch to run [default: 50]') 36 | parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training for each GPU [default: 24]') 37 | parser.add_argument('--stride', type=int, default=4, help='Batch Size during training for each GPU [default: 24]') 38 | parser.add_argument('--desp', type=int, default=64, help='Batch Size during training for each GPU [default: 24]') 39 | 40 | parser.add_argument('--knn', type=int, default=20, help='Batch Size during training for each GPU [default: 24]') 41 | parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') 42 | parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') 43 | parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') 44 | parser.add_argument('--decay_step', type=int, default=30000, help='Decay step for lr decay [default: 300000]') 45 | parser.add_argument('--decay_rate', type=float, default=0.5, help='Decay rate for lr decay [default: 0.5]') 46 | parser.add_argument('--test_area', type=int, default=6, help='Which area to use for test, option: 1-6 [default: 6]') 47 | 48 | # parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset/lpn_5k_small/', help='dataset folder') 49 | # parser.add_argument('--pred_path', type=str, default='/home/miyun/dataset4t/dataset2/dgcnn_pred/TriFace_desp/', help='dataset folder') 50 | 51 | # parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset4t/dataset2/07_single_5k_ins_big_rot3/', help='dataset folder') 52 | parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset4t/dataset2/apollo_test_sjd_diff5/', help='dataset folder') 53 | # parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset4t/dataset2/kitti_test_v25/', help='dataset folder') 54 | # parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset4t/dataset2/kitti/preprocess/', help='dataset folder') 55 | parser.add_argument('--pred_path', type=str, default='/home/miyun/dataset4t/dataset2/dgcnn_pred/apollo_test_2w_rand_k20_120_309011/', help='dataset folder') 56 | parser.add_argument('--best_model', default='log_models/bak/epoch_120.ckpt', help='model checkpoint file path [default: log/model.ckpt]') 57 | 58 | FLAGS = parser.parse_args() 59 | 60 | TOWER_NAME = 'tower' 61 | 62 | BATCH_SIZE = FLAGS.batch_size 63 | NUM_POINT = FLAGS.num_point 64 | MAX_EPOCH = FLAGS.max_epoch 65 | NUM_POINT = FLAGS.num_point 66 | BASE_LEARNING_RATE = FLAGS.learning_rate 67 | MOMENTUM = FLAGS.momentum 68 | OPTIMIZER = FLAGS.optimizer 69 | DECAY_STEP = FLAGS.decay_step 70 | DECAY_RATE = FLAGS.decay_rate 71 | # MODEL_PATH = FLAGS.best_model % (FLAGS.model_idx) 72 | MODEL_PATH = FLAGS.best_model 73 | STRIDE = FLAGS.stride 74 | KNN = FLAGS.knn 75 | # PRED_PATH = FLAGS.pred_path % (FLAGS.model_idx) 76 | PRED_PATH = FLAGS.pred_path 77 | GPU_IDX = FLAGS.gpu_idx 78 | DESP = FLAGS.desp 79 | 80 | # visualizer = Visualizer(opt) 81 | 82 | PRED_NP = PRED_PATH + 'np/' 83 | PRED_PCD = PRED_PATH + 'pcd/' 84 | PRED_DESP = PRED_PATH + 'desc/' 85 | PRED_L_NP = PRED_PATH + 'l_np/' 86 | PRED_L_PCD = PRED_PATH + 'l_pcd/' 87 | PRED_L_DESP = PRED_PATH + 'l_desp/' 88 | 89 | os.makedirs(PRED_NP) if not os.path.isdir(PRED_NP) else None 90 | os.makedirs(PRED_PCD) if not os.path.isdir(PRED_PCD) else None 91 | os.makedirs(PRED_DESP) if not os.path.isdir(PRED_DESP) else None 92 | os.makedirs(PRED_L_NP) if not os.path.isdir(PRED_L_NP) else None 93 | os.makedirs(PRED_L_PCD) if not os.path.isdir(PRED_L_PCD) else None 94 | os.makedirs(PRED_L_DESP) if not os.path.isdir(PRED_L_DESP) else None 95 | 96 | 97 | load_folder = FLAGS.load_folder 98 | 99 | LOG_DIR = FLAGS.log_dir 100 | if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) 101 | os.system('cp model.py %s' % (LOG_DIR)) 102 | os.system('cp train.py %s' % (LOG_DIR)) 103 | LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') 104 | LOG_FOUT.write(str(FLAGS)+'\n') 105 | 106 | # MAX_NUM_POINT = 4096 107 | # NUM_CLASSES = 13 108 | 109 | MAX_NUM_POINT = NUM_POINT 110 | NUM_CLASSES = 2 111 | 112 | BN_INIT_DECAY = 0.5 113 | BN_DECAY_DECAY_RATE = 0.5 114 | BN_DECAY_DECAY_STEP = float(DECAY_STEP) 115 | BN_DECAY_CLIP = 0.99 116 | 117 | class_name = sorted(os.listdir(load_folder)) 118 | 119 | train_all_files = [] 120 | test_all_files = [] 121 | 122 | if os.path.isdir(load_folder): 123 | test_all_path = join(load_folder, 'test', 'npy') 124 | l_test_all_path = join(load_folder, 'test', 'npy') 125 | 126 | cls_test_files = sorted(os.listdir(test_all_path)) 127 | l_cls_test_files = sorted(os.listdir(l_test_all_path)) 128 | 129 | for i in range(0, len(cls_test_files), 1): 130 | if '.npy' in cls_test_files[i]: 131 | test_all_files.append(join(test_all_path, cls_test_files[i])) 132 | test_all_files.append(join(l_test_all_path, l_cls_test_files[i])) 133 | 134 | test_num = len(test_all_files) 135 | 136 | 137 | test_all_files = test_all_files[:200] 138 | 139 | test_data, test_label = [], [] 140 | for i in range(len(test_all_files)): 141 | dat = np.load(test_all_files[i]) 142 | test_data.append(dat[:, :3]) 143 | test_label.append(dat[:, 3]) 144 | 145 | 146 | # # class weight 147 | num_per_class = np.array([2, 1]) 148 | weight = num_per_class / float(sum(num_per_class)) 149 | ce_label_weight = 1 / (weight + 0.0001) 150 | class_weight = np.expand_dims(ce_label_weight, axis=0) 151 | 152 | def log_string(out_str): 153 | LOG_FOUT.write(out_str+'\n') 154 | LOG_FOUT.flush() 155 | print(out_str) 156 | 157 | 158 | def get_learning_rate(batch): 159 | learning_rate = tf.train.exponential_decay( 160 | BASE_LEARNING_RATE, # Base learning rate. 161 | batch * BATCH_SIZE, # Current index into the dataset. 162 | DECAY_STEP, # Decay step. 163 | DECAY_RATE, # Decay rate. 164 | staircase=True) 165 | learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE!! 166 | return learning_rate 167 | 168 | def get_bn_decay(batch): 169 | bn_momentum = tf.train.exponential_decay( 170 | BN_INIT_DECAY, 171 | batch*BATCH_SIZE, 172 | BN_DECAY_DECAY_STEP, 173 | BN_DECAY_DECAY_RATE, 174 | staircase=True) 175 | bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) 176 | return bn_decay 177 | 178 | def average_gradients(tower_grads): 179 | """Calculate average gradient for each shared variable across all towers. 180 | 181 | Note that this function provides a synchronization point across all towers. 182 | 183 | Args: 184 | tower_grads: List of lists of (gradient, variable) tuples. The outer list 185 | is over individual gradients. The inner list is over the gradient 186 | calculation for each tower. 187 | Returns: 188 | List of pairs of (gradient, variable) where the gradient has been 189 | averaged across all towers. 190 | """ 191 | average_grads = [] 192 | for grad_and_vars in zip(*tower_grads): 193 | # Note that each grad_and_vars looks like the following: 194 | # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) 195 | grads = [] 196 | for g, _ in grad_and_vars: 197 | expanded_g = tf.expand_dims(g, 0) 198 | grads.append(expanded_g) 199 | 200 | # Average over the 'tower' dimension. 201 | grad = tf.concat(grads, 0) 202 | grad = tf.reduce_mean(grad, 0) 203 | 204 | # Keep in mind that the Variables are redundant because they are shared 205 | # across towers. So .. we will just return the first tower's pointer to 206 | # the Variable. 207 | v = grad_and_vars[0][1] 208 | grad_and_var = (grad, v) 209 | average_grads.append(grad_and_var) 210 | return average_grads 211 | 212 | 213 | 214 | def evaluate(): 215 | is_training = False 216 | GPU_INDEX = GPU_IDX 217 | with tf.device('/gpu:'+str(GPU_INDEX)): 218 | pointclouds_pl, labels_pl = placeholder_inputs(BATCH_SIZE, NUM_POINT) 219 | is_training_pl = tf.placeholder(tf.bool, shape=()) 220 | 221 | # simple model 222 | pred, desp, nn_idx0 = get_model(pointclouds_pl, is_training_pl, STRIDE, KNN, DESP) 223 | 224 | # loss = get_loss(pred, labels_pl) 225 | loss = tf.constant(0) 226 | 227 | # Add ops to save and restore all the variables. 228 | saver = tf.train.Saver() 229 | 230 | # Create a session 231 | config = tf.ConfigProto() 232 | config.gpu_options.allow_growth = True 233 | config.allow_soft_placement = True 234 | config.log_device_placement = True 235 | sess = tf.Session(config=config) 236 | 237 | # Restore variables from disk. 238 | 239 | # Restore variables from disk. 240 | saver.restore(sess, MODEL_PATH) 241 | log_string("Model restored.") 242 | 243 | ops = {'pointclouds_pl': pointclouds_pl, 244 | 'labels_pl': labels_pl, 245 | 'is_training_pl': is_training_pl, 246 | 'pred': pred, 247 | 'desp': desp, 248 | 'loss': loss} 249 | 250 | eval_one_epoch(sess, ops) 251 | 252 | 253 | def eval_one_epoch(sess, ops): 254 | is_training = False 255 | test_size = len(test_data) 256 | current_data = test_data 257 | current_label = test_label 258 | 259 | num_batches = test_size // BATCH_SIZE 260 | 261 | for batch_idx in tqdm(range(num_batches)): 262 | start_idx = batch_idx * BATCH_SIZE 263 | end_idx = (batch_idx+1) * BATCH_SIZE 264 | cur_batch_size = end_idx - start_idx 265 | # print(start_idx_1, end_idx_1) 266 | feed_dict = { 267 | # ops['pointclouds_pl']: current_data[start_idx:end_idx, :, :], 268 | ops['pointclouds_pl']: current_data[start_idx:end_idx], 269 | ops['labels_pl']: current_label[start_idx:end_idx], 270 | ops['is_training_pl']: is_training, 271 | } 272 | loss_val, pred_val, desp_val = sess.run([ops['loss'], ops['pred'], ops['desp']], feed_dict=feed_dict) 273 | 274 | for j in range(BATCH_SIZE): 275 | file_name0 = test_all_files[BATCH_SIZE*batch_idx + j] 276 | # print(file_name0) 277 | file_name = file_name0[file_name0.rfind('/'):-4] 278 | if not 'l_' in file_name0: 279 | seg_file = PRED_NP + file_name + '.npy' 280 | desc_file = PRED_DESP + file_name + '.npz' 281 | pcd_file = PRED_PCD+ file_name + '.pcd' 282 | else: 283 | seg_file = PRED_L_NP + file_name + '.npy' 284 | desc_file = PRED_L_DESP + file_name + '.npz' 285 | pcd_file = PRED_L_PCD+ file_name + '.pcd' 286 | 287 | pred = pred_val[j,...] 288 | np.save(seg_file , pred) 289 | 290 | desp = desp_val[j, ...] 291 | # np.save(desc_file, desp) 292 | np.savez_compressed(desc_file, desp) 293 | pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(current_data[start_idx:end_idx][j])) 294 | pcd.paint_uniform_color([0.8, 0.8, 0.8]) 295 | colors = np.asarray(pcd.colors) 296 | # print(pred.shape) 297 | pred = np.argmax(pred, 1) 298 | colors[np.where(pred > 0)[0], :] = [1, 1, 0] 299 | o3d.io.write_point_cloud(pcd_file, pcd) 300 | 301 | 302 | if __name__ == "__main__": 303 | # train() 304 | with tf.Graph().as_default(): 305 | evaluate() 306 | LOG_FOUT.close() 307 | -------------------------------------------------------------------------------- /scripts/generate_synthetic_pc.py: -------------------------------------------------------------------------------- 1 | 2 | import matplotlib.pyplot as plt 3 | import numpy as np 4 | import open3d as o3d 5 | from os.path import join 6 | import os 7 | from tqdm import tqdm 8 | from multiprocessing import Pool 9 | import random 10 | import Geometry3D as g3d 11 | from liegroups.numpy import SO3 12 | import sys 13 | 14 | def get_labels(pcd, kps, k): 15 | out_dat = np.zeros((len(pcd.points), 4)) 16 | out_dat[:, :3] = np.asarray(pcd.points) 17 | pcd_tree = o3d.geometry.KDTreeFlann(pcd) 18 | for i in range(kps.shape[0]): 19 | # k, idx, _ = pcd_tree.search_hybrid_vector_3d(kps[i, :], 0.2, 10) 20 | # k, idx, _ = pcd_tree.search_radius_vector_3d(kps[i, :], 0.05) 21 | k, idx, _ = pcd_tree.search_knn_vector_3d(kps[i, :], k) 22 | out_dat[idx, 3] = 1 23 | 24 | return out_dat 25 | 26 | def gen_one_pole(points_num, label_line=False): 27 | np.random.seed(int(random.random()*100)) 28 | all_np = [] 29 | pts = [] 30 | line_idx_all = [] 31 | 32 | length = np.random.rand(1)*0.8 + 0.2 33 | length = length[0] 34 | # print(length) 35 | 36 | points = np.array([[0, 0, 0], [0, 0.03, 0], [0, 0, length], [0, 0.03, length], 37 | [0, 0, 0], [0, 1, 0], [1, 0, 0], [-0.8, -0.8, 0], 38 | [0, 0, 0], [0.03, 0, 0], [0, 0, length], [0.03, 0, length]]).astype(np.float) 39 | 40 | faces = np.array( 41 | [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]]).astype(np.int) 42 | triangles = np.zeros((12, 3)).astype(np.int) 43 | triangles[:4, :] = faces 44 | triangles[4:8, :] = faces + 4 45 | triangles[8:, :] = faces + 8 46 | mesh = o3d.geometry.TriangleMesh() 47 | mesh.vertices = o3d.utility.Vector3dVector(points) 48 | mesh.triangles = o3d.utility.Vector3iVector(triangles) 49 | mesh.compute_vertex_normals() 50 | mesh.paint_uniform_color([0.8, 0.8, 0.8]) 51 | mesh.paint_uniform_color([0, 0.651, 0.929]) 52 | 53 | pts_g3d = [] 54 | for i in [0, 1, 2, 3, 8, 9, 10, 11]: 55 | pts_g3d.append(g3d.Point(points[i])) 56 | 57 | poly_g3d = [] 58 | for i in range(len(pts_g3d)//4): 59 | poly_g3d.append(g3d.ConvexPolygon( 60 | [pts_g3d[4*i], pts_g3d[4*i+1], pts_g3d[4*i+2], pts_g3d[4*i+3]])) 61 | 62 | inter_poly = [] 63 | for i in range(len(poly_g3d)-1): 64 | for k in range(i+1, len(poly_g3d)): 65 | inter_poly.append(g3d.intersection(poly_g3d[i], poly_g3d[k])) 66 | 67 | inter_line = [] 68 | for i in range(len(inter_poly)-1): 69 | for k in range(i+1, len(inter_poly)): 70 | inter_line.append(g3d.intersection(inter_poly[i], inter_poly[k])) 71 | 72 | inter_pts = [] 73 | for i in range(len(inter_poly)): 74 | inter_pts.append([inter_poly[i][0][0], inter_poly[i] 75 | [0][1], inter_poly[i][0][2]]) 76 | inter_pts.append([inter_poly[i][1][0], inter_poly[i] 77 | [1][1], inter_poly[i][1][2]]) 78 | 79 | pcds = mesh.sample_points_uniformly(int(points_num*10)) 80 | pcds = pcds.voxel_down_sample(0.04) 81 | 82 | pcd_pts = np.array(pcds.points) 83 | pcd_all = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(pcd_pts.copy())) 84 | 85 | line_noise = [] 86 | line_idx = [] 87 | 88 | if label_line: 89 | inte = np.linspace(0, points[1, 1], 51) 90 | line0 = np.zeros((51, 3)) 91 | line0[:, 0] = inte.copy() 92 | line1 = np.zeros((51, 3)) 93 | line1[:, 1] = inte.copy() 94 | line2 = np.zeros((51, 3)) 95 | inte = np.linspace(0, length, 51).reshape(-1) 96 | line2[:, 2] = inte.copy() 97 | line_all = np.vstack((line0, line1, line2)) 98 | line_all = np.expand_dims(line_all, 1) 99 | pts_all = np.expand_dims(pcd_pts, 0) 100 | dist = np.sum(np.abs(line_all - pts_all), -1) 101 | 102 | line_idx = np.argmin(dist, 1) 103 | line_pts = pcd_pts[line_idx, :] 104 | 105 | line_noise = get_labels(pcd_all, line_pts[-48:], 5) 106 | 107 | pts_labels = line_noise 108 | 109 | pcd_all.paint_uniform_color([0, 0.651, 0.929]) 110 | colors_all = np.asarray(pcd_all.colors) 111 | colors_all[np.where(pts_labels[:, -1] > 0)[0]] = [1, 0, 0] 112 | # o3d.visualization.draw_geometries([pcd_all]) 113 | # o3d.io.write_point_cloud('data/test_face_pole.pcd', pcd_all) 114 | 115 | shuffle_idx = np.arange(pts_labels.shape[0]) 116 | np.random.shuffle(shuffle_idx) 117 | pts_labels = pts_labels[shuffle_idx] 118 | pts_labels[:,:3] += (np.random.rand(pts_labels.shape[0], 3)-0.5)*0.01 119 | return pts_labels 120 | 121 | def gen_one_triface(points_num, label_line=False): 122 | 123 | np.random.seed(int(random.random()*100)) 124 | 125 | points = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 1], 126 | [0, 0, 0], [0, 1, 0], [1, 0, 0], [-0.8, -0.8, 0], 127 | [0, 0, 0], [1, 0, 0], [0, 0, 1], [1, 0, 1]]).astype(np.float) 128 | 129 | noise = np.random.rand(3, 2)*0.2-0.1 130 | 131 | points[3, 1:] += noise[0, :] 132 | points[7, :2] += noise[1, :] 133 | points[11, [0, 2]] += noise[2, :] 134 | 135 | faces = np.array( 136 | [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]]).astype(np.int) 137 | triangles = np.zeros((12, 3)).astype(np.int) 138 | triangles[:4, :] = faces 139 | triangles[4:8, :] = faces + 4 140 | triangles[6:8, :] = triangles[4:6, :] 141 | triangles[8:, :] = faces + 8 142 | mesh = o3d.geometry.TriangleMesh() 143 | mesh.vertices = o3d.utility.Vector3dVector(points) 144 | mesh.triangles = o3d.utility.Vector3iVector(triangles) 145 | mesh.compute_vertex_normals() 146 | # mesh.paint_uniform_color([0.8, 0.8, 0.8]) 147 | mesh.paint_uniform_color([0, 0.651, 0.929]) 148 | # o3d.io.write_triangle_mesh('data/test_face.ply', mesh) 149 | pts_g3d = [] 150 | for i in range(len(points)): 151 | pts_g3d.append(g3d.Point(points[i])) 152 | 153 | poly_g3d = [] 154 | for i in range(len(points)//4): 155 | poly_g3d.append(g3d.ConvexPolygon( 156 | [pts_g3d[4*i], pts_g3d[4*i+1], pts_g3d[4*i+2], pts_g3d[4*i+3]])) 157 | 158 | inter_poly = [] 159 | for i in range(len(poly_g3d)-1): 160 | for k in range(i+1, len(poly_g3d)): 161 | inter_poly.append(g3d.intersection(poly_g3d[i], poly_g3d[k])) 162 | 163 | inter_line = [] 164 | for i in range(len(inter_poly)-1): 165 | for k in range(i+1, len(inter_poly)): 166 | inter_line.append(g3d.intersection(inter_poly[i], inter_poly[k])) 167 | 168 | inter_pts = [] 169 | for i in range(len(inter_poly)): 170 | inter_pts.append([inter_poly[i][0][0], inter_poly[i] 171 | [0][1], inter_poly[i][0][2]]) 172 | inter_pts.append([inter_poly[i][1][0], inter_poly[i] 173 | [1][1], inter_poly[i][1][2]]) 174 | 175 | inter_pts.append([inter_line[0][0], inter_line[0][1], inter_line[0][2]]) 176 | 177 | # o3d.visualization.draw_geometries([mesh]) 178 | pcds = mesh.sample_points_uniformly(int(points_num*10)) 179 | # pcds = mesh.sample_points_uniformly(points_num*10) 180 | pcds = pcds.voxel_down_sample(0.052) 181 | pcd_pts = np.array(pcds.points) 182 | # print(len(pcd_pts)) 183 | 184 | 185 | if len(pcd_pts) > points_num: 186 | # idx = np.random.choice(len(pcd_pts), points_num) 187 | pcd_pts = pcd_pts[:points_num, :] 188 | 189 | noise_all = (np.random.rand(pcd_pts.shape[0], 3)-0.5)*(0.01) 190 | pcd_pts += noise_all 191 | pcd_all = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(pcd_pts.copy())) 192 | 193 | line_noise = [] 194 | line_idx = [] 195 | if label_line: 196 | inte = np.linspace(0, 1, 51) 197 | line0 = np.zeros((51, 3)) 198 | line0[:, 0] = inte.copy() 199 | line1 = np.zeros((51, 3)) 200 | line1[:, 1] = inte.copy() 201 | line2 = np.zeros((51, 3)) 202 | line2[:, 2] = inte.copy() 203 | line_all = np.vstack((line0, line1, line2)) 204 | line_all = np.expand_dims(line_all, 1) 205 | pts_all = np.expand_dims(pcd_pts, 0) 206 | dist = np.sum(np.abs(line_all - pts_all), -1) 207 | 208 | line_idx = np.argmin(dist, 1) 209 | line_pts = pcd_pts[line_idx, :] 210 | 211 | line_noise = get_labels(pcd_all, line_pts, 1) 212 | 213 | pts_labels = line_noise 214 | 215 | pcd_all.paint_uniform_color([0, 0.651, 0.929]) 216 | colors_all = np.asarray(pcd_all.colors) 217 | colors_all[np.where(pts_labels[:,-1]>0)[0]] = [1, 0, 0] 218 | # o3d.visualization.draw_geometries([pcd_all]) 219 | 220 | # o3d.io.write_point_cloud('data/test_face_pc.pcd', pcd_all) 221 | shuffle_idx = np.arange(pts_labels.shape[0]) 222 | np.random.shuffle(shuffle_idx) 223 | pts_labels = pts_labels[shuffle_idx] 224 | 225 | return pts_labels 226 | 227 | def gen_one_lpn(train_all, train_pcd, noise_path, noise_files, points_num, j): 228 | file_name = '%04d' % j 229 | trans = np.array([[1.3,1.3], [1.3, -1.3], [-1.3, 1.3], [-1.3, -1.3], [4., 4.]]) 230 | np.random.seed(int(random.random()*100)) 231 | 232 | list_pts = [] 233 | 234 | list_pts.append(gen_one_triface(points_num//5, True)) 235 | list_pts.append(gen_one_triface(points_num//5, True)) 236 | pts_all = gen_one_pole(points_num//5, True) 237 | pts_all[:, -1] *= 2 238 | list_pts.append(pts_all) 239 | 240 | lp = int(np.random.rand(1)*100)%2 241 | if lp == 1: 242 | list_pts.append(gen_one_triface(points_num//5, True)) 243 | else: 244 | pts_all = gen_one_pole(points_num//5, True) 245 | pts_all[:, -1] *= 2 246 | list_pts.append(pts_all) 247 | 248 | noise_idx = j%len(noise_files) 249 | 250 | noise_pcd = o3d.io.read_point_cloud(noise_path + noise_files[noise_idx]) 251 | noise_pcd.paint_uniform_color([0.8, 0.8, 0.8]) 252 | noise_pcd.paint_uniform_color([1, 0.706, 0]) 253 | 254 | # o3d.visualization.draw_geometries([noise_pcd]) 255 | noise = np.asarray(noise_pcd.points) 256 | # print(noise.shape) 257 | noise_all = np.hstack([noise, np.zeros((noise.shape[0], 1))]) 258 | 259 | list_pts.append(noise_all) 260 | all_np = [] 261 | 262 | pcd_all = o3d.geometry.PointCloud() 263 | for i in range(len(list_pts)): 264 | 265 | transform = np.identity(4) 266 | transform[:2, 3] = trans[i] 267 | transform[:3, :3] = SO3.from_rpy(0, 0, np.random.rand(1)*2*np.pi).as_matrix() 268 | 269 | pts_labels = list_pts[i] 270 | pts_h = np.zeros(pts_labels.shape) 271 | pts_h[:,3] = 1 272 | pts_h[:,:3] = pts_labels[:,:3].copy() 273 | # print(rot_angle) 274 | pts_h = np.matmul(pts_h, transform.T) 275 | pts_labels[:, :3] = pts_h[:,:3] 276 | 277 | cur_pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(pts_h[:, :3])) 278 | if i < 4: 279 | cur_pcd.paint_uniform_color([0, 0.651, 0.929]) 280 | else: 281 | cur_pcd.paint_uniform_color([1, 0.706, 0]) 282 | 283 | pcd_all += cur_pcd 284 | if len(all_np) == 0: 285 | all_np = pts_labels.copy() 286 | else: 287 | all_np = np.vstack((all_np, pts_labels)) 288 | 289 | colors = np.asarray(pcd_all.colors) 290 | colors[np.where(all_np[:, 3] > 0)[0]] = [1, 0, 0] 291 | 292 | all_idx = np.arange(len(all_np)) 293 | if len(all_np) > points_num: 294 | reserved_idx = all_idx[:points_num] 295 | 296 | else: 297 | choice_id = np.random.choice(len(all_np), points_num-len(all_np)) 298 | reserved_idx = np.concatenate((all_idx, choice_id)) 299 | 300 | 301 | all_np = all_np[reserved_idx] 302 | all_np[:, :3] += (np.random.rand(points_num, 3)-0.5)*0.005 303 | 304 | shuffle_idx = np.arange(len(all_np)) 305 | np.random.shuffle(shuffle_idx) 306 | all_np = all_np[shuffle_idx] 307 | 308 | transform = np.identity(4) 309 | transform[:3, :3] = SO3.from_rpy(0, 0, np.random.rand(1)*2*np.pi).as_matrix() 310 | 311 | pts_h = np.zeros(all_np.shape) 312 | pts_h[:, 3] = 1 313 | pts_h[:, :3] = all_np[:, :3] 314 | pts_h = np.matmul(pts_h, transform.T) 315 | all_np[:, :3] = pts_h[:, :3] 316 | 317 | all_pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(all_np[:, :3])) 318 | all_pcd.colors = o3d.utility.Vector3dVector(colors[reserved_idx][shuffle_idx]) 319 | 320 | 321 | # o3d.visualization.draw_geometries([all_pcd]) 322 | 323 | o3d.io.write_point_cloud(join(train_pcd, file_name+'.pcd'), all_pcd) 324 | np.save(join(train_all, file_name+'.npy'), all_np) 325 | 326 | 327 | base_path = '/home/miyun/dataset/lpn_2_class_5k/' 328 | 329 | base_path = sys.argv[1] 330 | noise_path = './kitti_noise/' 331 | noise_files = os.listdir(noise_path) 332 | 333 | class_name = 'line_pole_noise' 334 | pts_num = 5000 335 | 336 | if 1: 337 | train = join(base_path, class_name, 'train') 338 | test = join(base_path, class_name, 'test') 339 | train_pcd = join(train, 'pcd') 340 | train_all = join(train, 'npy') 341 | test_pcd = join(test, 'pcd') 342 | test_all = join(test, 'npy') 343 | if not os.path.isdir(train_all): 344 | os.makedirs(train_pcd) 345 | os.makedirs(train_all) 346 | os.makedirs(test_pcd) 347 | os.makedirs(test_all) 348 | 349 | for ii in range(10): 350 | gen_one_lpn(train_all, train_pcd, noise_path, noise_files, pts_num, ii) 351 | 352 | train_num = 100 353 | test_num = 20 354 | 355 | 356 | pool = Pool(processes=4, maxtasksperchild=50) 357 | for ii in range(train_num): 358 | pool.apply_async(gen_one_lpn, (train_all, train_pcd, noise_path, noise_files, 5000, ii)) 359 | pool.close() 360 | pool.join() 361 | 362 | # pool = Pool(processes=4, maxtasksperchild=50) 363 | 364 | # for ii in range(test_num): 365 | # pool.apply_async(gen_one_lpn, (test_all, test_pcd, noise_path, noise_files, 5000, ii)) 366 | # pool.close() 367 | # pool.join() 368 | -------------------------------------------------------------------------------- /train_synthetic_data.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import math 3 | 4 | import numpy as np 5 | import tensorflow as tf 6 | import socket 7 | 8 | import os 9 | import sys 10 | 11 | from os.path import join 12 | 13 | from visualizer import Visualizer 14 | from collections import OrderedDict 15 | 16 | class opt: 17 | display_id = 13 18 | display_winsize = 256 19 | name = 'vis' 20 | 21 | import tf_util 22 | from model import * 23 | 24 | parser = argparse.ArgumentParser() 25 | parser.add_argument('--num_gpu', type=int, default=1, help='the number of GPUs to use [default: 1]') 26 | parser.add_argument('--vis', type=bool, default=True, help='enable visualization [default: False]') 27 | parser.add_argument('--log_dir', default='log_line_pole_noise_si', help='Log dir [default: log]') 28 | parser.add_argument('--num_point', type=int, default=5000, help='Point number [default: 4096]') 29 | parser.add_argument('--max_epoch', type=int, default=101, help='Epoch to run [default: 50]') 30 | parser.add_argument('--batch_size', type=int, default=8, help='Batch Size during training for each GPU [default: 24]') 31 | parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') 32 | parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') 33 | parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') 34 | parser.add_argument('--decay_step', type=int, default=2000, help='Decay step for lr decay [default: 300000]') 35 | parser.add_argument('--decay_rate', type=float, default=0.5, help='Decay rate for lr decay [default: 0.5]') 36 | parser.add_argument('--test_area', type=int, default=6, help='Which area to use for test, option: 1-6 [default: 6]') 37 | parser.add_argument('--load_folder', type=str, default='./scripts/line_pole_noise/', help='dataset folder') 38 | FLAGS = parser.parse_args() 39 | 40 | TOWER_NAME = 'tower' 41 | 42 | BATCH_SIZE = FLAGS.batch_size 43 | NUM_POINT = FLAGS.num_point 44 | MAX_EPOCH = FLAGS.max_epoch 45 | BASE_LEARNING_RATE = FLAGS.learning_rate 46 | MOMENTUM = FLAGS.momentum 47 | OPTIMIZER = FLAGS.optimizer 48 | DECAY_STEP = FLAGS.decay_step 49 | DECAY_RATE = FLAGS.decay_rate 50 | VIS = FLAGS.vis 51 | 52 | load_folder = FLAGS.load_folder 53 | 54 | LOG_DIR = FLAGS.log_dir 55 | if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) 56 | os.system('cp model.py %s' % (LOG_DIR)) 57 | os.system('cp train_synthetic_data.py %s' % (LOG_DIR)) 58 | LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') 59 | LOG_FOUT.write(str(FLAGS)+'\n') 60 | 61 | # MAX_NUM_POINT = 4096 62 | # NUM_CLASSES = 13 63 | 64 | MAX_NUM_POINT = NUM_POINT 65 | NUM_CLASSES = 2 66 | 67 | BN_INIT_DECAY = 0.5 68 | BN_DECAY_DECAY_RATE = 0.5 69 | BN_DECAY_DECAY_STEP = float(DECAY_STEP) 70 | BN_DECAY_CLIP = 0.99 71 | 72 | if VIS: 73 | visualizer = Visualizer(opt) 74 | 75 | train_files = [] 76 | test_files = [] 77 | print(load_folder) 78 | if os.path.isdir(load_folder): 79 | train_path = join(load_folder, 'train', 'npy') 80 | test_path = join(load_folder, 'test', 'npy') 81 | 82 | cls_train_files = os.listdir(train_path) 83 | cls_test_files = os.listdir(test_path) 84 | 85 | for i in range(len(cls_train_files)): 86 | train_files.append(join(train_path, cls_train_files[i])) 87 | 88 | for i in range(len(cls_test_files)): 89 | test_files.append(join(test_path, cls_test_files[i])) 90 | 91 | 92 | train_num = len(train_files) 93 | test_num = len(test_files) 94 | 95 | 96 | shuffle_idx = np.arange(train_num) 97 | np.random.shuffle(shuffle_idx) 98 | train_files = list(np.array(train_files)[shuffle_idx]) 99 | 100 | train_data = np.zeros((len(train_files), NUM_POINT, 3)) 101 | train_label = np.zeros((len(train_files), NUM_POINT)) 102 | 103 | for i in range(len(train_files)): 104 | dat = np.load(train_files[i]) 105 | train_data[i, ...] = dat[:, :3] 106 | train_label[i, ...] = dat[:, 3] 107 | 108 | test_data = np.zeros((len(test_files), NUM_POINT, 3)) 109 | test_label = np.zeros((len(test_files), NUM_POINT)) 110 | 111 | for i in range(len(test_files)): 112 | dat = np.load(test_files[i]) 113 | test_data[i, ...] = dat[:, :3] 114 | test_label[i, ...] = dat[:, 3] 115 | 116 | print(train_data.shape, train_label.shape) 117 | # # class weight 118 | num_per_class = np.array([2, 1]) 119 | weight = num_per_class / float(sum(num_per_class)) 120 | ce_label_weight = 1 / (weight + 0.0001) 121 | class_weight = np.expand_dims(ce_label_weight, axis=0) 122 | 123 | def log_string(out_str): 124 | LOG_FOUT.write(out_str+'\n') 125 | LOG_FOUT.flush() 126 | print(out_str) 127 | 128 | 129 | def get_learning_rate(batch): 130 | learning_rate = tf.train.exponential_decay( 131 | BASE_LEARNING_RATE, # Base learning rate. 132 | batch * BATCH_SIZE, # Current index into the dataset. 133 | DECAY_STEP, # Decay step. 134 | DECAY_RATE, # Decay rate. 135 | staircase=True) 136 | learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE!! 137 | return learning_rate 138 | 139 | def get_bn_decay(batch): 140 | bn_momentum = tf.train.exponential_decay( 141 | BN_INIT_DECAY, 142 | batch*BATCH_SIZE, 143 | BN_DECAY_DECAY_STEP, 144 | BN_DECAY_DECAY_RATE, 145 | staircase=True) 146 | bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) 147 | return bn_decay 148 | 149 | def average_gradients(tower_grads): 150 | """Calculate average gradient for each shared variable across all towers. 151 | 152 | Note that this function provides a synchronization point across all towers. 153 | 154 | Args: 155 | tower_grads: List of lists of (gradient, variable) tuples. The outer list 156 | is over individual gradients. The inner list is over the gradient 157 | calculation for each tower. 158 | Returns: 159 | List of pairs of (gradient, variable) where the gradient has been 160 | averaged across all towers. 161 | """ 162 | average_grads = [] 163 | for grad_and_vars in zip(*tower_grads): 164 | # Note that each grad_and_vars looks like the following: 165 | # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) 166 | grads = [] 167 | for g, _ in grad_and_vars: 168 | expanded_g = tf.expand_dims(g, 0) 169 | grads.append(expanded_g) 170 | 171 | # Average over the 'tower' dimension. 172 | grad = tf.concat(grads, 0) 173 | grad = tf.reduce_mean(grad, 0) 174 | 175 | # Keep in mind that the Variables are redundant because they are shared 176 | # across towers. So .. we will just return the first tower's pointer to 177 | # the Variable. 178 | v = grad_and_vars[0][1] 179 | grad_and_var = (grad, v) 180 | average_grads.append(grad_and_var) 181 | return average_grads 182 | 183 | def build_pc_node_keypoint_visual(pc_np, seg_gt, seg_pred, kp_gt=None, kp_pred=None, keypoint_other_np=None, kp_other_gt=None, sigmas_np=None, sigmas_other_np=None): 184 | pc_color_np = np.repeat(np.expand_dims(np.array([255, 255, 255], dtype=np.int64), axis=0), 185 | pc_np.shape[0], 186 | axis=0) # 1x3 -> Nx3 187 | seg_gt_color = np.repeat(np.expand_dims(np.array([0, 0, 255], dtype=np.int64), axis=0), 188 | seg_gt.shape[0], 189 | axis=0) # 1x3 -> Mx3 190 | seg_pred_color = np.repeat(np.expand_dims(np.array([0, 255, 0], dtype=np.int64), axis=0), 191 | seg_pred.shape[0], 192 | axis=0) # 1x3 -> Mx3 193 | if kp_pred is not None: 194 | keypoint_color_np = np.repeat(np.expand_dims(np.array([125, 0, 0], dtype=np.int64), axis=0), 195 | kp_pred.shape[0], 196 | axis=0) # 1x3 -> Kx3 197 | # # consider the sigma 198 | # if sigmas_np is not None: 199 | # sigmas_normalized_np = (1.0 / sigmas_np) / np.max(1.0 / sigmas_np) # K 200 | # keypoint_color_np = keypoint_color_np * np.expand_dims(sigmas_normalized_np, axis=1) # Kx3 201 | # keypoint_color_np = keypoint_color_np.astype(np.int32) 202 | if keypoint_other_np is not None: 203 | keypoint_other_color_np = np.repeat(np.expand_dims(np.array([0, 0, 255], dtype=np.int64), axis=0), 204 | keypoint_other_np.shape[0], 205 | axis=0) # 1x3 -> Kx3 206 | # consider the sigma 207 | if sigmas_other_np is not None: 208 | sigmas_other_normalized_np = ( 209 | 1.0 / sigmas_other_np) / np.max(1.0 / sigmas_other_np) # K 210 | keypoint_other_color_np = keypoint_other_color_np * np.expand_dims(sigmas_other_normalized_np, 211 | axis=1) # Kx3 212 | keypoint_other_color_np = keypoint_other_color_np.astype( 213 | np.int32) 214 | 215 | if kp_gt is not None: 216 | gt_color_np = np.repeat(np.expand_dims(np.array([255, 0, 0], dtype=np.int64), axis=0), 217 | kp_gt.shape[0], 218 | axis=0) # 1x3 -> Kx3 219 | 220 | pc_vis_np = np.concatenate((pc_np, seg_gt, seg_pred), axis=0) 221 | pc_vis_color_np = np.concatenate( 222 | (pc_color_np, seg_gt_color, seg_pred_color), axis=0) 223 | if kp_pred is not None: 224 | pc_vis_np = np.concatenate((pc_vis_np, kp_pred), axis=0) 225 | pc_vis_color_np = np.concatenate( 226 | (pc_vis_color_np, keypoint_color_np), axis=0) 227 | if keypoint_other_np is not None: 228 | pc_vis_np = np.concatenate((pc_vis_np, keypoint_other_np), axis=0) 229 | pc_vis_color_np = np.concatenate( 230 | (pc_vis_color_np, keypoint_other_color_np), axis=0) 231 | if kp_gt is not None: 232 | pc_vis_np = np.concatenate((pc_vis_np, kp_gt), axis=0) 233 | pc_vis_color_np = np.concatenate( 234 | (pc_vis_color_np, gt_color_np), axis=0) 235 | return pc_vis_np, pc_vis_color_np 236 | 237 | def train(): 238 | with tf.Graph().as_default(), tf.device('/cpu:0'): 239 | batch = tf.Variable(0, trainable=False) 240 | 241 | bn_decay = get_bn_decay(batch) 242 | tf.summary.scalar('bn_decay', bn_decay) 243 | 244 | learning_rate = get_learning_rate(batch) 245 | tf.summary.scalar('learning_rate', learning_rate) 246 | 247 | trainer = tf.train.AdamOptimizer(learning_rate) 248 | 249 | tower_grads = [] 250 | pointclouds_phs = [] 251 | labels_phs = [] 252 | is_training_phs =[] 253 | 254 | with tf.variable_scope(tf.get_variable_scope()): 255 | for i in range(FLAGS.num_gpu): 256 | i += 1 257 | with tf.device('/gpu:%d' % i): 258 | with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: 259 | 260 | pointclouds_pl, labels_pl = placeholder_inputs(BATCH_SIZE, NUM_POINT) 261 | is_training_pl = tf.placeholder(tf.bool, shape=()) 262 | 263 | pointclouds_phs.append(pointclouds_pl) 264 | labels_phs.append(labels_pl) 265 | is_training_phs.append(is_training_pl) 266 | 267 | pred = get_seg_model(pointclouds_phs[-1], is_training_phs[-1], k=20, stride=1, scale_invariant=True, bn_decay=bn_decay) 268 | # loss = get_loss(pred, labels_phs[-1]) 269 | loss = get_seg_loss(pred, labels_phs[-1], class_weight) 270 | tf.summary.scalar('loss', loss) 271 | 272 | correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_phs[-1])) 273 | accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) 274 | tf.summary.scalar('accuracy', accuracy) 275 | 276 | tf.get_variable_scope().reuse_variables() 277 | 278 | grads = trainer.compute_gradients(loss) 279 | 280 | tower_grads.append(grads) 281 | 282 | grads = average_gradients(tower_grads) 283 | 284 | train_op = trainer.apply_gradients(grads, global_step=batch) 285 | 286 | saver = tf.train.Saver(tf.global_variables(), sharded=True, max_to_keep=10) 287 | 288 | # Create a session 289 | config = tf.ConfigProto() 290 | config.gpu_options.allow_growth = True 291 | config.allow_soft_placement = True 292 | sess = tf.Session(config=config) 293 | 294 | # Add summary writers 295 | merged = tf.summary.merge_all() 296 | train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), 297 | sess.graph) 298 | test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) 299 | 300 | # Init variables for two GPUs 301 | init = tf.group(tf.global_variables_initializer(), 302 | tf.local_variables_initializer()) 303 | sess.run(init) 304 | 305 | ops = {'pointclouds_phs': pointclouds_phs, 306 | 'labels_phs': labels_phs, 307 | 'is_training_phs': is_training_phs, 308 | 'pred': pred, 309 | 'loss': loss, 310 | 'train_op': train_op, 311 | 'merged': merged, 312 | 'step': batch} 313 | 314 | for epoch in range(MAX_EPOCH): 315 | log_string('**** EPOCH %03d ****' % (epoch)) 316 | sys.stdout.flush() 317 | 318 | train_one_epoch(sess, ops, train_writer) 319 | 320 | # Save the variables to disk. 321 | if epoch % 5 == 0: 322 | save_path = saver.save(sess, os.path.join(LOG_DIR,'epoch_' + str(epoch)+'.ckpt')) 323 | log_string("Model saved in file: %s" % save_path) 324 | 325 | 326 | 327 | def train_one_epoch(sess, ops, train_writer): 328 | """ ops: dict mapping from string to tf ops """ 329 | is_training = True 330 | 331 | log_string('----') 332 | current_data = train_data 333 | current_label = train_label 334 | # print(current_data.shape) 335 | file_size = current_data.shape[0] 336 | num_batches = file_size // (FLAGS.num_gpu * BATCH_SIZE) 337 | 338 | total_correct = 0 339 | total_seen = 0 340 | loss_sum = 0 341 | 342 | for batch_idx in range(num_batches): 343 | if batch_idx % 100 == 0: 344 | print('Current batch/total batch num: %d/%d'%(batch_idx,num_batches)) 345 | start_idx_0 = batch_idx * BATCH_SIZE 346 | end_idx_0 = (batch_idx+1) * BATCH_SIZE 347 | start_idx_1 = (batch_idx+1) * BATCH_SIZE 348 | end_idx_1 = (batch_idx+2) * BATCH_SIZE 349 | 350 | # print(start_idx_1, end_idx_1) 351 | feed_dict = {ops['pointclouds_phs'][0]: current_data[start_idx_0:end_idx_0, :, :], 352 | # ops['pointclouds_phs'][1]: current_data[start_idx_1:end_idx_1, :, :], 353 | ops['labels_phs'][0]: current_label[start_idx_0:end_idx_0], 354 | # ops['labels_phs'][1]: current_label[start_idx_1:end_idx_1], 355 | ops['is_training_phs'][0]: is_training, 356 | # ops['is_training_phs'][1]: is_training 357 | } 358 | summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) 359 | train_writer.add_summary(summary, step) 360 | # summary1 = tf.Summary( 361 | # value=[tf.Summary.Value(tag='iou', simple_value=step)]) 362 | # train_writer.add_summary(summary1, step) 363 | 364 | pred_val = np.argmax(pred_val, 2) 365 | correct = np.sum(pred_val == current_label[start_idx_0:end_idx_0]) 366 | total_correct += correct 367 | total_seen += (BATCH_SIZE*NUM_POINT) 368 | loss_sum += loss_val 369 | 370 | # print(pred_val.shape, current_data.shape, start_idx_0, end_idx_0) 371 | if VIS and batch_idx % 50 == 0: 372 | label_gt = current_label[start_idx_0] 373 | pc_val = current_data[start_idx_0] 374 | label_pred = pred_val[0] 375 | 376 | gt_pc = pc_val[np.where(label_gt>0)[0], :] 377 | pred_pc = pc_val[np.where(label_pred>0)[0], :] 378 | 379 | # if len(gt_pc)==0: 380 | # gt_pc = np.array([[0, 0, 0]]) 381 | if len(pred_pc)==0: 382 | pred_pc = np.array([[0, 0, 0]]) 383 | src_data_vis_np, src_data_vis_color_np = build_pc_node_keypoint_visual(pc_val, gt_pc, pred_pc, None, None) 384 | visuals = OrderedDict([('src_data_vis', (src_data_vis_np, src_data_vis_color_np)) 385 | ]) 386 | 387 | visualizer.display_current_results(visuals) 388 | 389 | log_string('mean loss: %f' % (loss_sum / float(num_batches))) 390 | log_string('accuracy: %f' % (total_correct / float(total_seen))) 391 | 392 | if __name__ == "__main__": 393 | train() 394 | LOG_FOUT.close() 395 | -------------------------------------------------------------------------------- /train_superline3d.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import math 3 | import h5py 4 | import numpy as np 5 | import tensorflow as tf 6 | from tensorflow.python.client import device_lib 7 | import os 8 | import sys 9 | 10 | from os.path import join 11 | 12 | from collections import OrderedDict 13 | from liegroups.numpy import SO3 14 | 15 | def load_h5_files(h5_path): 16 | files = sorted(os.listdir(h5_path)) 17 | data_batchlist, label_batchlist, mask_batchlist = [], [], [] 18 | for f in files[:1]: 19 | file = h5py.File(os.path.join(h5_path, f), 'r') 20 | data = file["data"][:] 21 | label = file["label"][:] 22 | mask = file["mask"][:] 23 | data_batchlist.append(data) 24 | label_batchlist.append(label) 25 | mask_batchlist.append(mask) 26 | # data_batches = np.asarray(data_batchlist) 27 | # seg_batches = np.asarray(label_batchlist) 28 | # mask_batches = np.asarray(mask_batchlist) 29 | 30 | data_batches = np.concatenate(data_batchlist, 0) 31 | seg_batches = np.concatenate(label_batchlist, 0) 32 | mask_batches = np.concatenate(mask_batchlist, 0) 33 | 34 | return data_batches, seg_batches, mask_batches 35 | 36 | def load_h5_poses(h5_path): 37 | files = sorted(os.listdir(h5_path)) 38 | data_batchlist = [] 39 | for f in files: 40 | file = h5py.File(os.path.join(h5_path, f), 'r') 41 | data = file["poses"][:] 42 | data_batchlist.append(data) 43 | data_batches = np.concatenate(data_batchlist, 0) 44 | return data_batches 45 | 46 | def get_available_gpus(): 47 | local_device_protos = device_lib.list_local_devices() 48 | return ['/'+x.name[-5:] for x in local_device_protos if x.device_type == 'GPU'] 49 | 50 | class opt: 51 | display_id = 700 52 | display_winsize = 256 53 | name = 'vis' 54 | 55 | 56 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 57 | ROOT_DIR = os.path.dirname(BASE_DIR) 58 | sys.path.append(BASE_DIR) 59 | sys.path.append(ROOT_DIR) 60 | sys.path.append(os.path.join(ROOT_DIR, 'utils')) 61 | # import provider 62 | import tf_util 63 | from model import * 64 | 65 | # print(os.environ.get('HYPER_PARAMETERS')) 66 | 67 | parser = argparse.ArgumentParser() 68 | parser.add_argument('--num_gpu', type=int, default=2, help='the number of GPUs to use [default: 1]') 69 | parser.add_argument('--vis', type=bool, default=True, help='enable visualization [default: False]') 70 | parser.add_argument('--log_dir', default='./summary/', help='Log dir [default: log]') 71 | parser.add_argument('--model_dir', default='./model/', help='model dir [default: /model/]') 72 | parser.add_argument('--stride', type=int, default=1, help='stride in knn [default: 2]') 73 | parser.add_argument('--trans_noise', type=int, default=20, help='translation noise [default: 10]') 74 | parser.add_argument('--knn', type=int, default=20, help='k in knn [default: 20]') 75 | 76 | 77 | parser.add_argument('--num_point', type=int, default=15000, help='Point number [default: 4096]') 78 | parser.add_argument('--max_epoch', type=int, default=1000, help='Epoch to run [default: 50]') 79 | parser.add_argument('--batch_size', type=int, default=2, help='4 12 10 Batch Size during training for each GPU [default: 24 14]') 80 | parser.add_argument('--learning_rate', type=float, default=0.001, help='Initial learning rate [default: 0.001]') 81 | parser.add_argument('--momentum', type=float, default=0.9, help='Initial learning rate [default: 0.9]') 82 | parser.add_argument('--optimizer', default='adam', help='adam or momentum [default: adam]') 83 | parser.add_argument('--decay_step', type=int, default=40000, help='Decay step for lr decay [default: 300000]') 84 | parser.add_argument('--decay_rate', type=float, default=0.5, help='Decay rate for lr decay [default: 0.5]') 85 | parser.add_argument('--test_area', type=int, default=6, help='Which area to use for test, option: 1-6 [default: 6]') 86 | # parser.add_argument('--load_folder', type=str, default='/public/home/zxr/dataset/TriFaceOneCornerRotLine5k_voxel_so3/', help='dataset folder') 87 | parser.add_argument('--load_folder', type=str, default='/home/miyun/dataset4t/dataset2/kitti_reg_diff35/', help='dataset folder') 88 | 89 | # train_args = os.environ.get('HYPER_PARAMETERS').split(' ') 90 | FLAGS = parser.parse_args() 91 | print(FLAGS) 92 | # FLAGS = parser.parse_args() 93 | 94 | gpu_name = get_available_gpus() 95 | print(gpu_name) 96 | NUM_GPU = len(gpu_name) 97 | TOWER_NAME = 'tower' 98 | 99 | BATCH_SIZE = FLAGS.batch_size 100 | NUM_POINT = FLAGS.num_point 101 | MAX_EPOCH = FLAGS.max_epoch 102 | BASE_LEARNING_RATE = FLAGS.learning_rate 103 | MOMENTUM = FLAGS.momentum 104 | OPTIMIZER = FLAGS.optimizer 105 | DECAY_STEP = FLAGS.decay_step 106 | DECAY_RATE = FLAGS.decay_rate 107 | VIS = FLAGS.vis 108 | STRIDE = FLAGS.stride 109 | TRANS_NOISE = FLAGS.trans_noise 110 | KNN = FLAGS.knn 111 | print('STRIDE: ', STRIDE) 112 | print('TRANS_NOISE: ', TRANS_NOISE) 113 | 114 | load_folder = FLAGS.load_folder 115 | 116 | LOG_DIR = FLAGS.log_dir 117 | if not os.path.exists(LOG_DIR): os.mkdir(LOG_DIR) 118 | os.system('cp model.py %s' % (LOG_DIR)) 119 | os.system('cp train_superline3d.py %s' % (LOG_DIR)) 120 | LOG_FOUT = open(os.path.join(LOG_DIR, 'log_train.txt'), 'w') 121 | LOG_FOUT.write(str(FLAGS)+'\n') 122 | 123 | 124 | MAX_NUM_POINT = NUM_POINT 125 | NUM_CLASSES = 2 126 | 127 | BN_INIT_DECAY = 0.5 128 | BN_DECAY_DECAY_RATE = 0.5 129 | BN_DECAY_DECAY_STEP = float(DECAY_STEP) 130 | BN_DECAY_CLIP = 0.99 131 | 132 | if VIS: 133 | from visualizer import Visualizer 134 | visualizer = Visualizer(opt) 135 | 136 | class_name = sorted(os.listdir(load_folder)) 137 | 138 | r_train_data0, r_train_label0, r_train_mask0 = load_h5_files(join(load_folder, 'r_train_h5')) 139 | l_train_data0, l_train_label0, l_train_mask0 = load_h5_files(join(load_folder, 'l_train_h5')) 140 | 141 | r_train_data0, r_train_label0, r_train_mask0 = r_train_data0[:100], r_train_label0[:100], r_train_mask0[:100] 142 | l_train_data0, l_train_label0, l_train_mask0 = l_train_data0[:100], l_train_label0[:100], l_train_mask0[:100] 143 | 144 | 145 | # # class weight 146 | num_per_class = np.array([40,1]) 147 | weight = num_per_class / float(sum(num_per_class)) 148 | ce_label_weight = 1 / (weight + 0.0001) 149 | class_weight = np.expand_dims(ce_label_weight, axis=0) 150 | 151 | def log_string(out_str): 152 | LOG_FOUT.write(out_str+'\n') 153 | LOG_FOUT.flush() 154 | print(out_str) 155 | 156 | 157 | def get_learning_rate(batch): 158 | learning_rate = tf.train.exponential_decay( 159 | BASE_LEARNING_RATE, # Base learning rate. 160 | batch * BATCH_SIZE, # Current index into the dataset. 161 | DECAY_STEP, # Decay step. 162 | DECAY_RATE, # Decay rate. 163 | staircase=True) 164 | learning_rate = tf.maximum(learning_rate, 0.000001) # CLIP THE LEARNING RATE!! 165 | return learning_rate 166 | 167 | def get_bn_decay(batch): 168 | bn_momentum = tf.train.exponential_decay( 169 | BN_INIT_DECAY, 170 | batch*BATCH_SIZE, 171 | BN_DECAY_DECAY_STEP, 172 | BN_DECAY_DECAY_RATE, 173 | staircase=True) 174 | bn_decay = tf.minimum(BN_DECAY_CLIP, 1 - bn_momentum) 175 | return bn_decay 176 | 177 | def average_gradients(tower_grads): 178 | """Calculate average gradient for each shared variable across all towers. 179 | 180 | Note that this function provides a synchronization point across all towers. 181 | 182 | Args: 183 | tower_grads: List of lists of (gradient, variable) tuples. The outer list 184 | is over individual gradients. The inner list is over the gradient 185 | calculation for each tower. 186 | Returns: 187 | List of pairs of (gradient, variable) where the gradient has been 188 | averaged across all towers. 189 | """ 190 | average_grads = [] 191 | for grad_and_vars in zip(*tower_grads): 192 | # Note that each grad_and_vars looks like the following: 193 | # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) 194 | grads = [] 195 | for g, _ in grad_and_vars: 196 | expanded_g = tf.expand_dims(g, 0) 197 | grads.append(expanded_g) 198 | 199 | # Average over the 'tower' dimension. 200 | grad = tf.concat(grads, 0) 201 | grad = tf.reduce_mean(grad, 0) 202 | 203 | # Keep in mind that the Variables are redundant because they are shared 204 | # across towers. So .. we will just return the first tower's pointer to 205 | # the Variable. 206 | v = grad_and_vars[0][1] 207 | grad_and_var = (grad, v) 208 | average_grads.append(grad_and_var) 209 | return average_grads 210 | 211 | def build_pc_node_keypoint_visual(pc_np, seg_gt, seg_pred, kp_gt=None, kp_pred=None, keypoint_other_np=None, kp_other_gt=None, sigmas_np=None, sigmas_other_np=None): 212 | pc_color_np = np.repeat(np.expand_dims(np.array([255, 255, 255], dtype=np.int64), axis=0), 213 | pc_np.shape[0], 214 | axis=0) # 1x3 -> Nx3 215 | seg_gt_color = np.repeat(np.expand_dims(np.array([0, 0, 255], dtype=np.int64), axis=0), 216 | seg_gt.shape[0], 217 | axis=0) # 1x3 -> Mx3 218 | seg_pred_color = np.repeat(np.expand_dims(np.array([0, 255, 0], dtype=np.int64), axis=0), 219 | seg_pred.shape[0], 220 | axis=0) # 1x3 -> Mx3 221 | if kp_pred is not None: 222 | keypoint_color_np = np.repeat(np.expand_dims(np.array([125, 0, 0], dtype=np.int64), axis=0), 223 | kp_pred.shape[0], 224 | axis=0) # 1x3 -> Kx3 225 | # # consider the sigma 226 | # if sigmas_np is not None: 227 | # sigmas_normalized_np = (1.0 / sigmas_np) / np.max(1.0 / sigmas_np) # K 228 | # keypoint_color_np = keypoint_color_np * np.expand_dims(sigmas_normalized_np, axis=1) # Kx3 229 | # keypoint_color_np = keypoint_color_np.astype(np.int32) 230 | if keypoint_other_np is not None: 231 | keypoint_other_color_np = np.repeat(np.expand_dims(np.array([0, 0, 255], dtype=np.int64), axis=0), 232 | keypoint_other_np.shape[0], 233 | axis=0) # 1x3 -> Kx3 234 | # consider the sigma 235 | if sigmas_other_np is not None: 236 | sigmas_other_normalized_np = ( 237 | 1.0 / sigmas_other_np) / np.max(1.0 / sigmas_other_np) # K 238 | keypoint_other_color_np = keypoint_other_color_np * np.expand_dims(sigmas_other_normalized_np, 239 | axis=1) # Kx3 240 | keypoint_other_color_np = keypoint_other_color_np.astype( 241 | np.int32) 242 | 243 | if kp_gt is not None: 244 | gt_color_np = np.repeat(np.expand_dims(np.array([255, 0, 0], dtype=np.int64), axis=0), 245 | kp_gt.shape[0], 246 | axis=0) # 1x3 -> Kx3 247 | 248 | pc_vis_np = np.concatenate((pc_np, seg_gt, seg_pred), axis=0) 249 | pc_vis_color_np = np.concatenate( 250 | (pc_color_np, seg_gt_color, seg_pred_color), axis=0) 251 | if kp_pred is not None: 252 | pc_vis_np = np.concatenate((pc_vis_np, kp_pred), axis=0) 253 | pc_vis_color_np = np.concatenate( 254 | (pc_vis_color_np, keypoint_color_np), axis=0) 255 | if keypoint_other_np is not None: 256 | pc_vis_np = np.concatenate((pc_vis_np, keypoint_other_np), axis=0) 257 | pc_vis_color_np = np.concatenate( 258 | (pc_vis_color_np, keypoint_other_color_np), axis=0) 259 | if kp_gt is not None: 260 | pc_vis_np = np.concatenate((pc_vis_np, kp_gt), axis=0) 261 | pc_vis_color_np = np.concatenate( 262 | (pc_vis_color_np, gt_color_np), axis=0) 263 | return pc_vis_np, pc_vis_color_np 264 | 265 | def train(): 266 | with tf.Graph().as_default(), tf.device('/cpu:0'): 267 | batch = tf.Variable(0, trainable=False) 268 | 269 | bn_decay = get_bn_decay(batch) 270 | tf.summary.scalar('bn_decay', bn_decay) 271 | 272 | learning_rate = get_learning_rate(batch) 273 | tf.summary.scalar('learning_rate', learning_rate) 274 | 275 | trainer = tf.train.AdamOptimizer(learning_rate) 276 | 277 | num_batches = 2*r_train_data0.shape[0] // (NUM_GPU * BATCH_SIZE) 278 | 279 | loss_weights = tf.train.piecewise_constant(batch, [40*num_batches, 60*num_batches],[[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]]) 280 | pred_weights = tf.train.piecewise_constant(batch, [60*num_batches],[[0.0, 1.0], [0.0, 1.0]]) 281 | desp_loss_weights = tf.train.piecewise_constant(batch, [1*num_batches, 4*num_batches],[[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]]) 282 | tower_grads = [] 283 | pointclouds_phs = [] 284 | labels_phs = [] 285 | is_training_phs =[] 286 | sparse_mask_phs = [] 287 | with tf.variable_scope(tf.get_variable_scope()): 288 | for i in range(NUM_GPU): 289 | # i += 1 290 | # with tf.device('/gpu:%d' % i): 291 | with tf.device(gpu_name[i]): 292 | with tf.name_scope('%s_%d' % (TOWER_NAME, i)) as scope: 293 | 294 | pointclouds_pl, labels_pl = placeholder_inputs(BATCH_SIZE, NUM_POINT) 295 | is_training_pl = tf.placeholder(tf.bool, shape=()) 296 | # sparse_mask_pl = tf.sparse_placeholder(tf.float32) 297 | sparse_mask_pl = tf.placeholder(tf.int32, shape=(BATCH_SIZE, NUM_POINT)) 298 | pointclouds_phs.append(pointclouds_pl) 299 | labels_phs.append(labels_pl) 300 | is_training_phs.append(is_training_pl) 301 | sparse_mask_phs.append(sparse_mask_pl) 302 | 303 | pred, desp = get_superline3d_model(pointclouds_phs[-1], is_training_phs[-1], KNN, STRIDE, bn_decay=bn_decay) 304 | # pred= get_model(pointclouds_phs[-1], is_training_phs[-1], bn_decay=bn_decay) 305 | # loss = get_loss(pred, labels_phs[-1]) 306 | seg_loss = get_seg_loss(pred, labels_phs[-1], class_weight) 307 | 308 | labels_gt = tf.cast(labels_phs[-1], tf.float32) 309 | # labels_for_loss = pred_weights[0]*labels_pred + pred_weights[1]*labels_gt 310 | labels_for_loss = labels_gt 311 | 312 | disc_loss, l_var, l_dist, l_reg, disc_loss0, l_var0, l_dist0, l_reg0 = get_desc_loss(desp, sparse_mask_phs[-1]) 313 | # loss = desp_loss_weights[0] * seg_loss + desp_loss_weights[1]*(l_var0 + l_dist0 + l_dist + l_var) 314 | loss = seg_loss + l_var0 + l_dist0 + l_dist + l_var 315 | tf.summary.scalar('loss', loss) 316 | tf.summary.scalar('seg_loss', seg_loss) 317 | tf.summary.scalar('desp_loss', disc_loss) 318 | tf.summary.scalar('desp_loss0', disc_loss0) 319 | tf.summary.scalar('weight0', desp_loss_weights[0]) 320 | tf.summary.scalar('weight1', desp_loss_weights[1]) 321 | 322 | # tf.summary.scalar('nd_num', nd_num) 323 | tf.summary.scalar('l_dist', l_dist) 324 | tf.summary.scalar('l_var', l_var) 325 | tf.summary.scalar('l_reg', l_reg) 326 | 327 | tf.summary.scalar('l_dist0', l_dist0) 328 | tf.summary.scalar('l_var0', l_var0) 329 | tf.summary.scalar('l_reg0', l_reg0) 330 | # tf.summary.scalar('positive', pd) 331 | # tf.summary.scalar('negative', nd) 332 | 333 | # tf.summary.scalar('feat_positive', feat_pd) 334 | # tf.summary.scalar('feat_negative', feat_nd) 335 | 336 | # tf.summary.scalar('positive_diff', pd_diff) 337 | # tf.summary.scalar('negative_diff', nd_diff) 338 | 339 | # tf.summary.scalar('positive_transpose_diff', pd_transpose_diff) 340 | # tf.summary.scalar('negative_transpose_diff', nd_transpose_diff) 341 | 342 | 343 | correct = tf.equal(tf.argmax(pred, 2), tf.to_int64(labels_phs[-1])) 344 | accuracy = tf.reduce_sum(tf.cast(correct, tf.float32)) / float(BATCH_SIZE*NUM_POINT) 345 | tf.summary.scalar('accuracy', accuracy) 346 | 347 | tf.get_variable_scope().reuse_variables() 348 | 349 | grads = trainer.compute_gradients(loss) 350 | 351 | tower_grads.append(grads) 352 | 353 | grads = average_gradients(tower_grads) 354 | 355 | train_op = trainer.apply_gradients(grads, global_step=batch) 356 | 357 | saver = tf.train.Saver(tf.global_variables(), sharded=True, max_to_keep=10) 358 | 359 | # Create a session 360 | config = tf.ConfigProto() 361 | config.gpu_options.allow_growth = False 362 | config.allow_soft_placement = True 363 | sess = tf.Session(config=config) 364 | 365 | # Add summary writers 366 | merged = tf.summary.merge_all() 367 | train_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'train'), 368 | sess.graph) 369 | test_writer = tf.summary.FileWriter(os.path.join(LOG_DIR, 'test')) 370 | 371 | # Init variables for two GPUs 372 | init = tf.group(tf.global_variables_initializer(), 373 | tf.local_variables_initializer()) 374 | sess.run(init) 375 | 376 | ops = {'pointclouds_phs': pointclouds_phs, 377 | 'labels_phs': labels_phs, 378 | 'is_training_phs': is_training_phs, 379 | 'sparse_mask_phs': sparse_mask_phs, 380 | 'pred': pred, 381 | 'loss': loss, 382 | 'train_op': train_op, 383 | 'merged': merged, 384 | 'step': batch, 385 | 'l_var0': l_var0, 386 | 'l_dist0': l_dist0, 387 | 'l_var': l_var, 388 | 'l_dist': l_dist} 389 | 390 | for epoch in range(MAX_EPOCH): 391 | log_string('**** EPOCH %03d ****' % (epoch)) 392 | sys.stdout.flush() 393 | 394 | train_one_epoch(sess, ops, train_writer) 395 | 396 | # Save the variables to disk. 397 | if epoch % 5 == 0: 398 | save_path = saver.save(sess, os.path.join(LOG_DIR,'epoch_' + str(epoch)+'.ckpt')) 399 | log_string("Model saved in file: %s" % save_path) 400 | 401 | def train_one_epoch(sess, ops, train_writer): 402 | """ ops: dict mapping from string to tf ops """ 403 | is_training = True 404 | 405 | log_string('----') 406 | # current_data, current_label, _ = provider.shuffle_data(r_train_data[:,0:NUM_POINT,:], r_train_label) 407 | shuffle_idx = np.arange(len(r_train_data0)) 408 | np.random.shuffle(shuffle_idx) 409 | 410 | r_train_data = r_train_data0[shuffle_idx] 411 | r_train_mask = r_train_mask0[shuffle_idx] 412 | r_train_label = r_train_label0[shuffle_idx] 413 | l_train_data = l_train_data0[shuffle_idx] 414 | l_train_mask = l_train_mask0[shuffle_idx] 415 | l_train_label = l_train_label0[shuffle_idx] 416 | 417 | current_data = r_train_data 418 | current_label = r_train_label 419 | # print(current_data.shape) 420 | file_size = current_data.shape[0] 421 | num_batches = 2 * file_size // (NUM_GPU * BATCH_SIZE) 422 | 423 | total_correct = 0 424 | total_seen = 0 425 | loss_sum = 0 426 | start_idxs, end_idxs = [], [] 427 | for batch_idx in range(num_batches): 428 | if batch_idx % 100 == 0: 429 | print('Current batch/total batch num: %d/%d'%(batch_idx,num_batches)) 430 | data_all, label_all, mask_all = [], [], [] 431 | for j in range(NUM_GPU): 432 | start_idxs.append(int((batch_idx+j) * BATCH_SIZE // 2)) 433 | end_idxs.append(int((batch_idx+j+1) * BATCH_SIZE // 2)) 434 | start_idx = int((batch_idx+j) * BATCH_SIZE // 2) 435 | end_idx = int((batch_idx+j+1) * BATCH_SIZE // 2) 436 | 437 | cur_data = np.hstack((r_train_data[start_idx:end_idx, :, :], l_train_data[start_idx:end_idx, :, :])).reshape((-1, NUM_POINT, 3)) 438 | cur_mask = np.hstack((r_train_mask[start_idx:end_idx, :], l_train_mask[start_idx:end_idx, :])).reshape((-1, NUM_POINT)) 439 | cur_label = np.hstack((r_train_label[start_idx:end_idx, :], l_train_label[start_idx:end_idx, :])).reshape((-1, NUM_POINT)) 440 | 441 | for i in range(len(cur_data)): 442 | cur_data[i] = np.matmul(cur_data[i], SO3.from_rpy(0, 0, *np.random.rand(1)*np.pi*2).as_matrix()) 443 | cur_data[i, :, :2] += (np.random.rand(2) - 0.5)*TRANS_NOISE 444 | 445 | data_all.append(cur_data) 446 | label_all.append(cur_label) 447 | mask_all.append(cur_mask) 448 | 449 | feed_dict = {} 450 | for j in range(NUM_GPU): 451 | feed_dict[ops['pointclouds_phs'][j]] = data_all[j] 452 | feed_dict[ops['sparse_mask_phs'][j]] = mask_all[j] 453 | feed_dict[ops['labels_phs'][j]] = label_all[j] 454 | feed_dict[ops['is_training_phs'][j]] = is_training 455 | # feed_dict = {ops['pointclouds_phs'][0]: cur_data, 456 | # ops['pointclouds_phs'][1]: cur_data_1, 457 | # ops['sparse_mask_phs'][0]: cur_mask, 458 | # ops['sparse_mask_phs'][1]: cur_mask_1, 459 | # ops['labels_phs'][0]: cur_label, 460 | # ops['labels_phs'][1]: cur_label_1, 461 | # ops['is_training_phs'][0]: is_training, 462 | # ops['is_training_phs'][1]: is_training 463 | # } 464 | summary, step, _, loss_val, pred_val = sess.run([ops['merged'], ops['step'], ops['train_op'], ops['loss'], ops['pred']], feed_dict=feed_dict) 465 | train_writer.add_summary(summary, step) 466 | summary1 = tf.Summary( 467 | value=[tf.Summary.Value(tag='iou', simple_value=step)]) 468 | train_writer.add_summary(summary1, step) 469 | 470 | # print(pred_val.shape) 471 | pred_val = np.argmax(pred_val, 2) 472 | correct = np.sum(pred_val == label_all[start_idxs[-1]:end_idxs[-1]]) 473 | total_correct += correct 474 | total_seen += (BATCH_SIZE*NUM_POINT) 475 | loss_sum += loss_val 476 | 477 | if VIS and batch_idx % 50 == 0: 478 | label_gt = label_all[-1][0] 479 | pc_val = data_all[-1][0] 480 | label_pred = pred_val[0] 481 | 482 | gt_pc = pc_val[np.where(label_gt>0)[0], :] 483 | pred_pc = pc_val[np.where(label_pred>0)[0], :] 484 | 485 | # if len(gt_pc)==0: 486 | # gt_pc = np.array([[0, 0, 0]]) 487 | if len(pred_pc)==0: 488 | pred_pc = np.array([[0, 0, 0]]) 489 | src_data_vis_np, src_data_vis_color_np = build_pc_node_keypoint_visual(pc_val, gt_pc, pred_pc, None, None) 490 | visuals = OrderedDict([('src_data_vis', (src_data_vis_np, src_data_vis_color_np)) 491 | ]) 492 | 493 | visualizer.display_current_results(visuals) 494 | 495 | log_string('mean loss: %f' % (loss_sum / float(num_batches))) 496 | log_string('accuracy: %f' % (total_correct / float(total_seen))) 497 | 498 | if __name__ == "__main__": 499 | train() 500 | LOG_FOUT.close() 501 | -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import os 3 | import sys 4 | 5 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 6 | ROOT_DIR = os.path.dirname(BASE_DIR) 7 | 8 | sys.path.append(os.path.join(BASE_DIR, '../models')) 9 | import tf_util 10 | 11 | def placeholder_inputs(batch_size, num_point): 12 | pointclouds_pl = tf.placeholder(tf.float32, 13 | shape=(batch_size, num_point, 3)) 14 | labels_pl = tf.placeholder(tf.int32, 15 | shape=(batch_size, num_point)) 16 | return pointclouds_pl, labels_pl 17 | 18 | def feature_encoder(point_cloud, is_training, k=20, stride=1, scale_invariant=False, bn_decay=False): 19 | """ ConvNet baseline, input is BxNx9 gray image """ 20 | batch_size = point_cloud.get_shape()[0].value 21 | num_point = point_cloud.get_shape()[1].value 22 | input_image = tf.expand_dims(point_cloud, -1) 23 | 24 | k = 20 25 | adj0 = tf_util.pairwise_distance(point_cloud) 26 | nn_idx0 = tf_util.knn(adj0, k=k) # (batch, num_points, k) 27 | 28 | if scale_invariant: 29 | neighb0_xyz = gather_neighbour(point_cloud, nn_idx0) 30 | xyz_tile = tf.tile(tf.expand_dims(point_cloud, axis=2), [1, 1, tf.shape(nn_idx0)[-1], 1]) 31 | relative_xyz = (xyz_tile - neighb0_xyz) 32 | relative_dis = tf.sqrt(tf.reduce_sum(tf.square(relative_xyz), axis=-1, keepdims=True)) # # BxNxkx1 33 | relative_dis_sum = tf.reduce_sum(relative_dis, axis=-2, keepdims=True) + 1e-7 34 | relative_xyz_sum = tf.reduce_sum(relative_xyz, axis=-2, keepdims=True) 35 | 36 | feature0 = tf.divide(relative_xyz_sum, relative_dis_sum) 37 | feature = tf.tile(feature0, [1, 1, k, 1]) 38 | relative_xyz_dis = tf.divide(relative_xyz, relative_dis_sum) 39 | edge_feature = tf.concat([feature, relative_xyz_dis - feature], axis=-1) # # rel 6 40 | else: 41 | edge_feature = tf_util.get_edge_feature(input_image, nn_idx=nn_idx0, k=k) 42 | 43 | 44 | out1 = tf_util.conv2d(edge_feature, 64, [1,1], 45 | padding='VALID', stride=[1,1], 46 | bn=True, is_training=is_training, weight_decay=0.0, 47 | scope='adj_conv1', bn_decay=bn_decay, is_dist=True) 48 | 49 | out2 = tf_util.conv2d(out1, 64, [1,1], 50 | padding='VALID', stride=[1,1], 51 | bn=True, is_training=is_training, weight_decay=0.0, 52 | scope='adj_conv2', bn_decay=bn_decay, is_dist=True) 53 | 54 | net_1 = tf.reduce_max(out2, axis=-2, keep_dims=True) 55 | 56 | # k=60 57 | adj = tf_util.pairwise_distance(net_1) 58 | nn_idx = tf_util.knn(adj, k=k) 59 | edge_feature = tf_util.get_edge_feature(net_1, nn_idx=nn_idx, k=k) 60 | 61 | out3 = tf_util.conv2d(edge_feature, 64, [1, 1], 62 | padding='VALID', stride=[1,1], 63 | bn=True, is_training=is_training, weight_decay=0.0, 64 | scope='adj_conv3', bn_decay=bn_decay, is_dist=True) 65 | 66 | out4 = tf_util.conv2d(out3, 64, [1,1], 67 | padding='VALID', stride=[1,1], 68 | bn=True, is_training=is_training, weight_decay=0.0, 69 | scope='adj_conv4', bn_decay=bn_decay, is_dist=True) 70 | 71 | net_2 = tf.reduce_max(out4, axis=-2, keep_dims=True) 72 | 73 | adj = tf_util.pairwise_distance(net_2) 74 | nn_idx = tf_util.knn(adj, k=k) 75 | edge_feature = tf_util.get_edge_feature(net_2, nn_idx=nn_idx, k=k) 76 | 77 | out5 = tf_util.conv2d(edge_feature, 64, [1,1], 78 | padding='VALID', stride=[1,1], 79 | bn=True, is_training=is_training, weight_decay=0.0, 80 | scope='adj_conv5', bn_decay=bn_decay, is_dist=True) 81 | 82 | out6 = tf_util.conv2d(out5, 64, [1,1], 83 | padding='VALID', stride=[1,1], 84 | bn=True, is_training=is_training, weight_decay=0.0, 85 | scope='adj_conv6', bn_decay=bn_decay, is_dist=True) 86 | 87 | net_3 = tf.reduce_max(out6, axis=-2, keep_dims=True) 88 | 89 | out7 = tf_util.conv2d(tf.concat([net_1, net_2, net_3], axis=-1), 1024, [1, 1], 90 | padding='VALID', stride=[1,1], 91 | bn=True, is_training=is_training, 92 | scope='adj_conv7', bn_decay=bn_decay, is_dist=True) 93 | 94 | out_max = tf_util.max_pool2d(out7, [num_point, 1], padding='VALID', scope='maxpool') 95 | 96 | expand = tf.tile(out_max, [1, num_point, 1, 1]) 97 | 98 | concat = tf.concat(axis=3, values=[expand, 99 | net_1, 100 | net_2, 101 | net_3]) 102 | return concat 103 | 104 | def decoder(feat, is_training, scope, out_dim): 105 | # CONV 106 | net = tf_util.conv2d(feat, 512, [1, 1], padding='VALID', stride=[1, 1], 107 | bn=True, is_training=is_training, scope=scope+'/conv1', is_dist=True) 108 | net = tf_util.conv2d(net, 256, [1, 1], padding='VALID', stride=[1, 1], 109 | bn=True, is_training=is_training, scope=scope+'/conv2', is_dist=True) 110 | net = tf_util.dropout( 111 | net, keep_prob=0.7, is_training=is_training, scope=scope+'/dp1') 112 | net = tf_util.conv2d(net, out_dim, [1, 1], padding='VALID', stride=[1, 1], 113 | is_training=is_training, activation_fn=None, scope=scope+'/conv3', is_dist=True) 114 | net = tf.squeeze(net, [2]) 115 | return net 116 | 117 | def get_seg_model(point_cloud, is_training, k=20, stride=1, scale_invariant=False, bn_decay=None): 118 | feature = feature_encoder(point_cloud, is_training, k, stride, scale_invariant, bn_decay) 119 | seg = decoder(feature, is_training, 'seg', 2) 120 | return seg 121 | 122 | def get_superline3d_model(point_cloud, is_training, k=20, stride=4, desc_dim=64, scale_invariant=False, bn_decay=None): 123 | feature = feature_encoder(point_cloud, is_training, k, stride, scale_invariant, bn_decay) 124 | seg = decoder(feature, is_training, 'seg', 2) 125 | desp = decoder(feature, is_training, 'desp', desc_dim) 126 | return seg, desp 127 | 128 | def get_loss(pred, label): 129 | """ pred: B,N,13; label: B,N """ 130 | loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=label) 131 | return tf.reduce_mean(loss) 132 | 133 | def get_seg_loss(pred, label, pre_cal_weights): 134 | # print(pred) 135 | logits = tf.reshape(pred, [-1, 2]) 136 | labels = tf.reshape(label, [-1]) 137 | class_weights = tf.convert_to_tensor(pre_cal_weights, dtype=tf.float32) 138 | one_hot_labels = tf.one_hot(labels, depth=2) 139 | weights = tf.reduce_sum(class_weights * one_hot_labels, axis=1) 140 | unweighted_losses = tf.nn.softmax_cross_entropy_with_logits( 141 | logits=logits, labels=one_hot_labels) 142 | weighted_losses = unweighted_losses * weights 143 | output_loss = tf.reduce_mean(weighted_losses) 144 | return output_loss 145 | 146 | def gather_neighbour(pc, neighbor_idx): 147 | # gather the coordinates or features of neighboring points 148 | batch_size = tf.shape(pc)[0] 149 | num_points = tf.shape(neighbor_idx)[1] 150 | d = pc.get_shape()[2].value 151 | index_input = tf.reshape(neighbor_idx, shape=[batch_size, -1]) 152 | features = tf.batch_gather(pc, index_input) 153 | features = tf.reshape(features, [batch_size, num_points, tf.shape(neighbor_idx)[-1], d]) 154 | return features 155 | 156 | 157 | def discriminative_loss_single(prediction, correct_label_in, feature_dim, 158 | delta_v, delta_d, param_var, param_dist, param_reg): 159 | ''' Discriminative loss for a single prediction/label pair. 160 | :param prediction: inference of network 161 | :param correct_label: instance label 162 | :feature_dim: feature dimension of prediction 163 | :param label_shape: shape of label 164 | :param delta_v: cutoff variance distance 165 | :param delta_d: curoff cluster distance 166 | :param param_var: weight for intra cluster variance 167 | :param param_dist: weight for inter cluster distances 168 | :param param_reg: weight regularization 169 | ''' 170 | 171 | ### Reshape so pixels are aligned along a vector 172 | #correct_label = tf.reshape(correct_label, [label_shape[1] * label_shape[0]]) 173 | reshaped_pred = tf.reshape(prediction, [-1, feature_dim]) 174 | correct_label = tf.reshape(correct_label_in, [tf.shape(reshaped_pred)[0]]) 175 | # print(correct_label_in.shape, correct_label.shape) 176 | 177 | ### Count instances 178 | unique_labels, unique_id, counts = tf.unique_with_counts(correct_label) 179 | 180 | counts = tf.cast(counts, tf.float32) 181 | num_instances = tf.size(unique_labels) 182 | 183 | segmented_sum = tf.unsorted_segment_sum(reshaped_pred, unique_id, num_instances) 184 | 185 | mu = tf.div(segmented_sum, tf.reshape(counts, (-1, 1))) 186 | mu_expand = tf.gather(mu, unique_id) 187 | 188 | ### Calculate l_var 189 | #distance = tf.norm(tf.subtract(mu_expand, reshaped_pred), axis=1) 190 | #tmp_distance = tf.subtract(reshaped_pred, mu_expand) 191 | tmp_distance = reshaped_pred - mu_expand 192 | distance = tf.norm(tmp_distance, ord=1, axis=1) 193 | 194 | distance = tf.subtract(distance, delta_v) 195 | distance = tf.clip_by_value(distance, 0., distance) 196 | distance = tf.square(distance) 197 | 198 | l_var = tf.unsorted_segment_sum(distance, unique_id, num_instances) 199 | 200 | labels_sort = tf.argsort(tf.cast(unique_labels, tf.int32)) 201 | l_var = tf.gather(l_var, labels_sort[1:]) 202 | counts = tf.gather(counts, labels_sort[1:]) 203 | 204 | l_var = tf.div(l_var, counts) 205 | 206 | # line_idx = tf.where(tf.greater(unique_labels, 0)) 207 | # l_var_line = tf.reshape(tf.gather(l_var, line_idx), [-1]) 208 | # l_var_top_k, _ = tf.nn.top_k(l_var_line, tf.cast(num_instances/4 + 1, tf.int32)) 209 | # l_var = tf.reduce_mean(l_var_top_k) 210 | 211 | # l_var = tf.reduce_sum(l_var) 212 | # l_var = tf.divide(l_var, tf.cast(num_instances, tf.float32)) 213 | 214 | mask0 = tf.greater(unique_labels, 0) 215 | l_var = tf.boolean_mask(l_var, mask0) 216 | l_var = tf.reduce_sum(l_var) 217 | l_var = tf.divide(l_var, tf.cast(num_instances-1, tf.float32)) 218 | 219 | ### Calculate l_dist 220 | 221 | # Get distance for each pair of clusters like this: 222 | # mu_1 - mu_1 223 | # mu_2 - mu_1 224 | # mu_3 - mu_1 225 | # mu_1 - mu_2 226 | # mu_2 - mu_2 227 | # mu_3 - mu_2 228 | # mu_1 - mu_3 229 | # mu_2 - mu_3 230 | # mu_3 - mu_3 231 | 232 | mu = tf.boolean_mask(mu, mask0) 233 | 234 | mu_interleaved_rep = tf.tile(mu, [num_instances-1, 1]) 235 | mu_band_rep = tf.tile(mu, [1, num_instances-1]) 236 | mu_band_rep = tf.reshape(mu_band_rep, ((num_instances-1) * (num_instances-1), feature_dim)) 237 | 238 | mu_diff = tf.subtract(mu_band_rep, mu_interleaved_rep) 239 | 240 | # Filter out zeros from same cluster subtraction 241 | eye = tf.eye(num_instances-1) 242 | zero = tf.zeros(1, dtype=tf.float32) 243 | diff_cluster_mask = tf.equal(eye, zero) 244 | diff_cluster_mask = tf.reshape(diff_cluster_mask, [-1]) 245 | mu_diff_bool = tf.boolean_mask(mu_diff, diff_cluster_mask) 246 | 247 | #intermediate_tensor = tf.reduce_sum(tf.abs(mu_diff),axis=1) 248 | #zero_vector = tf.zeros(1, dtype=tf.float32) 249 | #bool_mask = tf.not_equal(intermediate_tensor, zero_vector) 250 | #mu_diff_bool = tf.boolean_mask(mu_diff, bool_mask) 251 | 252 | mu_norm = tf.norm(mu_diff_bool, ord=1, axis=1) 253 | mu_norm = tf.subtract(2. * delta_d, mu_norm) 254 | mu_norm = tf.clip_by_value(mu_norm, 0., mu_norm) 255 | mu_norm = tf.square(mu_norm) 256 | 257 | # norm_k_cnt = tf.cond(tf.greater(num_instances*5, num_instances*num_instances-num_instances), lambda:(num_instances*num_instances-num_instances), lambda:(num_instances*5)) 258 | # mu_norm_top_k , _ = tf.nn.top_k(mu_norm, tf.cast(norm_k_cnt, tf.int32)) 259 | # l_dist = tf.reduce_mean(mu_norm_top_k) 260 | l_dist = tf.reduce_mean(mu_norm) 261 | 262 | def rt_0(): return 0. 263 | def rt_l_dist(): return l_dist 264 | l_dist = tf.cond(tf.equal(1, num_instances), rt_0, rt_l_dist) 265 | 266 | ### Calculate l_reg 267 | l_reg = tf.reduce_mean(tf.norm(mu, ord=1, axis=1)) 268 | 269 | param_scale = 1. 270 | l_var = param_var * l_var 271 | l_dist = param_dist * l_dist 272 | l_reg = param_reg * l_reg 273 | 274 | loss = param_scale * (l_var + l_dist + 0*l_reg) 275 | 276 | return loss, l_var, l_dist, l_reg 277 | 278 | def discriminative_loss_single2(prediction, correct_label_in, feature_dim, 279 | delta_v, delta_d, param_var, param_dist, param_reg): 280 | ''' Discriminative loss for a single prediction/label pair. 281 | :param prediction: inference of network 282 | :param correct_label: instance label 283 | :feature_dim: feature dimension of prediction 284 | :param label_shape: shape of label 285 | :param delta_v: cutoff variance distance 286 | :param delta_d: curoff cluster distance 287 | :param param_var: weight for intra cluster variance 288 | :param param_dist: weight for inter cluster distances 289 | :param param_reg: weight regularization 290 | ''' 291 | 292 | ### Reshape so pixels are aligned along a vector 293 | #correct_label = tf.reshape(correct_label, [label_shape[1] * label_shape[0]]) 294 | reshaped_pred = tf.reshape(prediction, [2, -1, feature_dim]) 295 | correct_label = tf.reshape(correct_label_in, [2, -1]) 296 | 297 | # print(correct_label_in.shape, correct_label.shape) 298 | correct_label0 = correct_label[0] 299 | reshaped_pred0 = reshaped_pred[0] 300 | ### Count instances 301 | unique_labels, unique_id, counts = tf.unique_with_counts(correct_label0) 302 | counts = tf.cast(counts, tf.float32) 303 | num_instances = tf.size(unique_labels) 304 | segmented_sum = tf.unsorted_segment_sum(reshaped_pred0, unique_id, num_instances) 305 | 306 | labels_sort = tf.argsort(tf.cast(unique_labels, tf.int32)) 307 | segmented_sum = tf.gather(segmented_sum, labels_sort[1:]) 308 | counts = tf.gather(counts, labels_sort[1:]) 309 | 310 | mu0 = tf.div(segmented_sum, tf.reshape(counts, (-1, 1))) 311 | 312 | 313 | # print(correct_label_in.shape, correct_label.shape) 314 | correct_label1 = correct_label[1] 315 | reshaped_pred1 = reshaped_pred[1] 316 | ### Count instances 317 | unique_labels, unique_id, counts = tf.unique_with_counts(correct_label1) 318 | counts = tf.cast(counts, tf.float32) 319 | segmented_sum = tf.unsorted_segment_sum(reshaped_pred1, unique_id, num_instances) 320 | 321 | labels_sort = tf.argsort(tf.cast(unique_labels, tf.int32)) 322 | segmented_sum = tf.gather(segmented_sum, labels_sort[1:]) 323 | counts = tf.gather(counts, labels_sort[1:]) 324 | 325 | mu1 = tf.div(segmented_sum, tf.reshape(counts, (-1, 1))) 326 | 327 | 328 | ### Calculate l_dist 329 | 330 | # Get distance for each pair of clusters like this: 331 | # mu_1 - mu_1 332 | # mu_2 - mu_1 333 | # mu_3 - mu_1 334 | # mu_1 - mu_2 335 | # mu_2 - mu_2 336 | # mu_3 - mu_2 337 | # mu_1 - mu_3 338 | # mu_2 - mu_3 339 | # mu_3 - mu_3 340 | 341 | mu_interleaved_rep = tf.tile(mu0, [num_instances-1, 1]) 342 | mu_band_rep = tf.tile(mu1, [1, num_instances-1]) 343 | mu_band_rep = tf.reshape(mu_band_rep, ((num_instances-1) * (num_instances-1), feature_dim)) 344 | 345 | mu_diff = tf.subtract(mu_band_rep, mu_interleaved_rep) 346 | 347 | # Filter out zeros from same cluster subtraction 348 | eye = tf.eye(num_instances-1) 349 | zero = tf.zeros(1, dtype=tf.float32) 350 | one = tf.ones(1, dtype=tf.float32) 351 | same_cluster_mask = tf.equal(eye, one) 352 | same_cluster_mask = tf.reshape(same_cluster_mask, [-1]) 353 | diff_cluster_mask = tf.equal(eye, zero) 354 | diff_cluster_mask = tf.reshape(diff_cluster_mask, [-1]) 355 | 356 | mu_same_bool = tf.boolean_mask(mu_diff, same_cluster_mask) 357 | 358 | mu_same_norm = tf.norm(mu_same_bool, ord=1, axis=1) 359 | mu_same_norm = tf.subtract(mu_same_norm, delta_v) 360 | mu_same_norm = tf.clip_by_value(mu_same_norm, 0., mu_same_norm) 361 | mu_same_norm = tf.square(mu_same_norm) 362 | 363 | # same_norm_k_cnt = tf.cond(tf.greater(num_instances*5, num_instances), lambda:(num_instances), lambda:(num_instances*5)) 364 | # mu_same_norm_top_k , _ = tf.nn.top_k(mu_same_norm, tf.cast(same_norm_k_cnt, tf.int32)) 365 | # l_var = tf.reduce_mean(mu_same_norm_top_k) 366 | 367 | 368 | # l_var = tf.reduce_mean(mu_same_norm) 369 | 370 | # mask0 = tf.cast(tf.greater(unique_labels, 0), tf.float32) 371 | # l_var = tf.reduce_sum(mu_same_norm*mask0) 372 | 373 | l_var = tf.reduce_sum(mu_same_norm) 374 | l_var = tf.divide(l_var, tf.cast(num_instances-1, tf.float32)) 375 | 376 | mu_diff_bool = tf.boolean_mask(mu_diff, diff_cluster_mask) 377 | 378 | mu_norm = tf.norm(mu_diff_bool, ord=1, axis=1) 379 | mu_norm = tf.subtract(2. * delta_d, mu_norm) 380 | mu_norm = tf.clip_by_value(mu_norm, 0., mu_norm) 381 | mu_norm = tf.square(mu_norm) 382 | 383 | # norm_k_cnt = tf.cond(tf.greater(num_instances*5, num_instances*num_instances-num_instances), lambda:(num_instances*num_instances-num_instances), lambda:(num_instances*5)) 384 | # mu_norm_top_k , _ = tf.nn.top_k(mu_norm, tf.cast(norm_k_cnt, tf.int32)) 385 | 386 | # l_dist = tf.reduce_mean(mu_norm_top_k) 387 | l_dist = tf.reduce_mean(mu_norm) 388 | 389 | 390 | def rt_0(): return 0. 391 | def rt_l_dist(): return l_dist 392 | l_dist = tf.cond(tf.equal(1, num_instances), rt_0, rt_l_dist) 393 | 394 | ### Calculate l_reg 395 | # l_reg = tf.reduce_mean(tf.norm(mu, ord=1, axis=1)) 396 | 397 | param_scale = 1. 398 | l_var = param_var * l_var 399 | l_dist = param_dist * l_dist 400 | l_reg = param_reg * 0 401 | 402 | loss = param_scale * (l_var + l_dist + l_reg) 403 | 404 | return loss, l_var, l_dist, l_reg 405 | 406 | 407 | def discriminative_loss(prediction, correct_label, feature_dim, 408 | delta_v, delta_d, param_var, param_dist, param_reg): 409 | ''' Iterate over a batch of prediction/label and cumulate loss 410 | :return: discriminative loss and its three components 411 | ''' 412 | 413 | def cond(label, batch, out_loss, out_var, out_dist, out_reg, i): 414 | return tf.less(i, tf.shape(batch)[0]) 415 | 416 | def body(label, batch, out_loss, out_var, out_dist, out_reg, i): 417 | disc_loss, l_var, l_dist, l_reg = discriminative_loss_single(prediction[i], correct_label[i], feature_dim, 418 | delta_v, delta_d, param_var, param_dist, param_reg) 419 | 420 | out_loss = out_loss.write(i, disc_loss) 421 | out_var = out_var.write(i, l_var) 422 | out_dist = out_dist.write(i, l_dist) 423 | out_reg = out_reg.write(i, l_reg) 424 | 425 | return label, batch, out_loss, out_var, out_dist, out_reg, i + 1 426 | 427 | # TensorArray is a data structure that support dynamic writing 428 | output_ta_loss = tf.TensorArray(dtype=tf.float32, 429 | size=0, 430 | dynamic_size=True) 431 | output_ta_var = tf.TensorArray(dtype=tf.float32, 432 | size=0, 433 | dynamic_size=True) 434 | output_ta_dist = tf.TensorArray(dtype=tf.float32, 435 | size=0, 436 | dynamic_size=True) 437 | output_ta_reg = tf.TensorArray(dtype=tf.float32, 438 | size=0, 439 | dynamic_size=True) 440 | 441 | _, _, out_loss_op, out_var_op, out_dist_op, out_reg_op, _ = tf.while_loop(cond, body, [correct_label, 442 | prediction, 443 | output_ta_loss, 444 | output_ta_var, 445 | output_ta_dist, 446 | output_ta_reg, 447 | 0]) 448 | out_loss_op = out_loss_op.stack() 449 | out_var_op = out_var_op.stack() 450 | out_dist_op = out_dist_op.stack() 451 | out_reg_op = out_reg_op.stack() 452 | 453 | disc_loss = tf.reduce_mean(out_loss_op) 454 | l_var = tf.reduce_mean(out_var_op) 455 | l_dist = tf.reduce_mean(out_dist_op) 456 | l_reg = tf.reduce_mean(out_reg_op) 457 | 458 | return disc_loss, l_var, l_dist, l_reg 459 | 460 | 461 | def discriminative_loss2(prediction, correct_label, feature_dim, 462 | delta_v, delta_d, param_var, param_dist, param_reg): 463 | ''' Iterate over a batch of prediction/label and cumulate loss 464 | :return: discriminative loss and its three components 465 | ''' 466 | 467 | def cond(label, batch, out_loss, out_var, out_dist, out_reg, i): 468 | return tf.less(2*i, tf.shape(batch)[0]) 469 | 470 | def body(label, batch, out_loss, out_var, out_dist, out_reg, i): 471 | disc_loss, l_var, l_dist, l_reg = discriminative_loss_single2(prediction[2*i:2*(i+1)], correct_label[2*i:2*(i+1)], feature_dim, 472 | delta_v, delta_d, param_var, param_dist, param_reg) 473 | 474 | out_loss = out_loss.write(i, disc_loss) 475 | out_var = out_var.write(i, l_var) 476 | out_dist = out_dist.write(i, l_dist) 477 | out_reg = out_reg.write(i, l_reg) 478 | 479 | return label, batch, out_loss, out_var, out_dist, out_reg, i + 1 480 | 481 | # TensorArray is a data structure that support dynamic writing 482 | output_ta_loss = tf.TensorArray(dtype=tf.float32, 483 | size=0, 484 | dynamic_size=True) 485 | output_ta_var = tf.TensorArray(dtype=tf.float32, 486 | size=0, 487 | dynamic_size=True) 488 | output_ta_dist = tf.TensorArray(dtype=tf.float32, 489 | size=0, 490 | dynamic_size=True) 491 | output_ta_reg = tf.TensorArray(dtype=tf.float32, 492 | size=0, 493 | dynamic_size=True) 494 | 495 | _, _, out_loss_op, out_var_op, out_dist_op, out_reg_op, _ = tf.while_loop(cond, body, [correct_label, 496 | prediction, 497 | output_ta_loss, 498 | output_ta_var, 499 | output_ta_dist, 500 | output_ta_reg, 501 | 0]) 502 | out_loss_op = out_loss_op.stack() 503 | out_var_op = out_var_op.stack() 504 | out_dist_op = out_dist_op.stack() 505 | out_reg_op = out_reg_op.stack() 506 | 507 | disc_loss = tf.reduce_mean(out_loss_op) 508 | l_var = tf.reduce_mean(out_var_op) 509 | l_dist = tf.reduce_mean(out_dist_op) 510 | l_reg = tf.reduce_mean(out_reg_op) 511 | 512 | return disc_loss, l_var, l_dist, l_reg 513 | 514 | def get_desc_loss(desp, ins_label): 515 | 516 | feature_dim = desp.get_shape()[-1] 517 | delta_v = 0.2 518 | delta_d = 1.0 519 | param_var = 1. 520 | param_dist = 1. 521 | param_reg = 0.0001 522 | 523 | disc_loss, l_var, l_dist, l_reg = discriminative_loss2(desp, ins_label, feature_dim, 524 | delta_v, delta_d, param_var, param_dist, param_reg) 525 | 526 | disc_loss0, l_var0, l_dist0, l_reg0 = discriminative_loss(desp, ins_label, feature_dim, 527 | delta_v, delta_d, param_var, param_dist, param_reg) 528 | 529 | # disc_loss, l_var, l_dist, l_reg = disc_loss0, l_var0, l_dist0, l_reg0 530 | return disc_loss, l_var, l_dist, l_reg, disc_loss0, l_var0, l_dist0, l_reg0 531 | --------------------------------------------------------------------------------