| 33 | |
| 34 | |
| 35 | class QuantizationModule: |
| 36 | def __init__(self, base_accuracy, level_kp_num=(30, 10, 3, 0), level_dacc=(0, 0.02, 0.04, 0.06), |
| 37 | ground_salience_level=2, feature_region=3, segments=8, sharp_num=4, less_sharp_num=8, flat_num=6, |
| 38 | uniform=True): |
| 39 | self.uniform = uniform |
| 40 | if uniform: |
| 41 | self.acc = base_accuracy |
| 42 | else: |
| 43 | #################################################################################### |
| 44 | # level_kp_num and level_dacc are enabled when non-uniform quantization. # |
| 45 | # level_kp_num: minimum number of key point in this salience level. # |
| 46 | # level_dacc: delta accuracy for this salience level. acc = base_acc + delta_acc. # |
| 47 | #################################################################################### |
| 48 | self.level_kp_num = np.array(level_kp_num) |
| 49 | self.acc = np.array([base_accuracy] * len(self.level_kp_num)) + np.array(level_dacc) |
| 50 | self.ground_level = ground_salience_level |
| 51 | self.feature_region = feature_region |
| 52 | self.segments = segments |
| 53 | self.sharp_num = sharp_num |
| 54 | self.less_sharp_num = less_sharp_num |
| 55 | self.flat_num = flat_num |
| 56 | |
| 57 | def quantize_residual(self, residual, seg_idx, point_cloud=None, range_image=None): |
| 58 | if self.uniform: |
| 59 | residual_quantized = quantization_utils_cpp.uniform_quantize(seg_idx, residual, self.acc) |
| 60 | # # python version |
| 61 | # residual_collect = [] |
| 62 | # cluster_num = np.max(seg_idx) + 1 |
| 63 | # for m in range(cluster_num): |
| 64 | # if m == 1: |
| 65 | # # zero points. |
| 66 | # continue |
| 67 | # residual_collect.extend(residual[..., 0][np.where(seg_idx == m)]) |
| 68 | # residual_quantized = np.rint(np.array(residual_collect) / self.acc).astype(np.int16) |
| 69 | salience_level = None |
| 70 | key_point_map = None |
| 71 | else: |
| 72 | feature_map, key_point_map = extract_features_without_ground(range_image, seg_idx, |
| 73 | self.feature_region, self.segments, |
| 74 | self.sharp_num, self.less_sharp_num, |
| 75 | self.flat_num) |
| 76 | # range_image, seg_idx, feature_region=3, segments=8, sharp_num=4, less_sharp_num=8, flat_num=6 |
| 77 | (residual_quantized, salience_level) = quantization_utils_cpp.nonuniform_quantize(seg_idx, |
| 78 | residual, key_point_map, |
| 79 | self.level_kp_num, |
| 80 | self.acc, |
| 81 | self.ground_level) |
| 82 | # # python version |
| 83 | # cluster_num = np.max(seg_idx) + 1 |
| 84 | # salience_level = np.ones(cluster_num, dtype=np.int32) * 3 |
| 85 | # |
| 86 | # for cluster_id in range(cluster_num): |
| 87 | # if cluster_id == 0 or cluster_id == 1: |
| 88 | # continue |
| 89 | # cluster_idx = np.where(seg_idx == cluster_id) |
| 90 | # key_point_num = np.where(key_point_map[cluster_idx] > 0)[0].shape[0] |
| 91 | # cluster_points = point_cloud[cluster_idx] |
| 92 | # if cluster_points.shape[0] < 30: |
no outgoing calls
no test coverage detected