1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
| class VirtualDMSSensor: """ DMS传感器数字孪生模型 模拟三星ISOCELL Auto传感器特性 用于Synopsys/Ansys虚拟验证流程 """ def __init__(self, sensor_config: dict): self.qe_curve = sensor_config.get('qe_curve', {400: 0.45, 550: 0.55, 650: 0.50, 850: 0.30, 940: 0.25}) self.dark_current = sensor_config.get('dark_current', 2.0) self.read_noise = sensor_config.get('read_noise', 1.5) self.full_well = sensor_config.get('full_well', 15000) self.bit_depth = sensor_config.get('bit_depth', 12) self.exposure_time = sensor_config.get('exposure_time', 0.033) def simulate_capture(self, scene_radiance: np.ndarray, wavelength: float = 550, temperature: float = 25) -> np.ndarray: """ 模拟传感器捕获图像 Args: scene_radiance: (H, W) 场景辐射度(来自光学仿真) wavelength: 波长(nm) temperature: 传感器温度(°C) Returns: sensor_output: (H, W) 模拟的传感器输出 """ qe = self._interp_qe(wavelength) photons = scene_radiance * self.exposure_time * qe signal = np.random.poisson(photons).astype(np.float64) dark = self.dark_current * (2 ** ((temperature - 25) / 8)) dark_electrons = np.random.poisson(dark * self.exposure_time, size=scene_radiance.shape) read = np.random.normal(0, self.read_noise, size=scene_radiance.shape) total = signal + dark_electrons + read total = np.clip(total, 0, self.full_well) digital = (total / self.full_well * (2 ** self.bit_depth - 1)).astype(np.uint16) return digital def _interp_qe(self, wavelength: float) -> float: """插值获取指定波长的量子效率""" wavelengths = sorted(self.qe_curve.keys()) return np.interp(wavelength, wavelengths, [self.qe_curve[w] for w in wavelengths])
class VirtualDMSValidation: """ 虚拟DMS验证流程 1. 从Ansys光学仿真获取场景辐射度 2. 通过传感器数字孪生生成模拟图像 3. 用DMS算法处理模拟图像 4. 验证算法在模拟数据上的表现 """ def __init__(self, sensor_config: dict): self.sensor = VirtualDMSSensor(sensor_config) self.test_scenarios = [] def add_scenario(self, name: str, radiance: np.ndarray, expected_result: dict): """添加测试场景""" self.test_scenarios.append({ 'name': name, 'radiance': radiance, 'expected': expected_result }) def run_validation(self, dms_algorithm) -> dict: """ 运行虚拟验证 Args: dms_algorithm: DMS处理函数 (image) -> result Returns: validation_report: 验证报告 """ results = [] for scenario in self.test_scenarios: simulated_image = self.sensor.simulate_capture( scenario['radiance'] ) dms_result = dms_algorithm(simulated_image) passed = self._check_result(dms_result, scenario['expected']) results.append({ 'scenario': scenario['name'], 'passed': passed, 'result': dms_result, 'expected': scenario['expected'] }) pass_rate = sum(r['passed'] for r in results) / len(results) return { 'total_scenarios': len(results), 'passed': sum(r['passed'] for r in results), 'pass_rate': pass_rate, 'results': results } def _check_result(self, result, expected): """检查结果是否符合预期""" for key, value in expected.items(): if result.get(key) != value: return False return True
import numpy as np
if __name__ == "__main__": sensor_config = { 'qe_curve': {400: 0.45, 550: 0.55, 650: 0.50, 850: 0.30, 940: 0.25}, 'dark_current': 2.0, 'read_noise': 1.5, 'full_well': 15000, 'bit_depth': 12, 'exposure_time': 0.033 } validator = VirtualDMSValidation(sensor_config) H, W = 100, 100 validator.add_scenario( "正常-睁眼", np.ones((H, W)) * 5000, {'face_detected': True} ) validator.add_scenario( "低照度", np.ones((H, W)) * 500, {'face_detected': True} ) radiance = np.ones((H, W)) * 200 radiance[:H//2] = 10000 validator.add_scenario( "HDR场景", radiance, {'face_detected': True} ) def mock_dms(image): return {'face_detected': image.mean() > 300} report = validator.run_validation(mock_dms) print(f"虚拟验证报告:") print(f" 总场景: {report['total_scenarios']}") print(f" 通过: {report['passed']}") print(f" 通过率: {report['pass_rate']:.1%}") for r in report['results']: print(f" {r['scenario']:15s}: {'✅' if r['passed'] else '❌'}")
|