From 31c87bc5b74e62ed7de56a23c676694329c26eac Mon Sep 17 00:00:00 2001 From: Sergey Revyakin Date: Thu, 23 Apr 2026 16:26:25 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B4=D0=B8=D0=BA=D1=82=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D1=80=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NN_server/server.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/NN_server/server.py b/NN_server/server.py index 067f849..b09d64a 100644 --- a/NN_server/server.py +++ b/NN_server/server.py @@ -64,18 +64,34 @@ def get_required_drone_streak(freq): return 1 -def update_drone_streak(freq, prediction): - if prediction == "drone": +def get_required_drone_prob(freq): + raw_value = config.get(f"DRONE_PROB_THRESHOLD_{freq}", config.get("DRONE_PROB_THRESHOLD_DEFAULT", "0")) + try: + value = float(raw_value) + return min(1.0, max(0.0, value)) + except (TypeError, ValueError): + logging.warning("Invalid DRONE_PROB_THRESHOLD for %s=%r, falling back to 0.0", freq, raw_value) + return 0.0 + + +def update_drone_streak(freq, prediction, drone_probability): + required_prob = get_required_drone_prob(freq) + drone_probability = 0.0 if drone_probability is None else float(drone_probability) + passes_prob_gate = prediction == "drone" and drone_probability >= required_prob + + if passes_prob_gate: drone_streaks[freq] = drone_streaks.get(freq, 0) + 1 else: drone_streaks[freq] = 0 required = get_required_drone_streak(freq) - triggered = prediction == "drone" and drone_streaks[freq] >= required + triggered = passes_prob_gate and drone_streaks[freq] >= required logging.info( - "NN alarm gate freq=%s prediction=%s streak=%s/%s triggered=%s", + "NN alarm gate freq=%s prediction=%s drone_probability=%.3f threshold=%.3f streak=%s/%s triggered=%s", freq, prediction, + drone_probability, + required_prob, drone_streaks[freq], required, triggered, @@ -164,15 +180,21 @@ def receive_data(): print('-' * 100) print(str(model)) result_msg[str(model.get_model_name())] = {'freq': freq} - prediction, probability = model.get_inference([np.asarray(data['data_real'], dtype=np.float32), np.asarray(data['data_imag'], dtype=np.float32)]) + inference_result = model.get_inference([np.asarray(data['data_real'], dtype=np.float32), np.asarray(data['data_imag'], dtype=np.float32)]) + if inference_result is None: + raise RuntimeError(f"Inference failed for {model.get_model_name()}") + prediction, probability = inference_result[:2] + drone_probability = float(probability) if prediction == "drone" else 0.0 result_msg[str(model.get_model_name())]['prediction'] = prediction result_msg[str(model.get_model_name())]['probability'] = str(probability) + result_msg[str(model.get_model_name())]['drone_probability'] = str(drone_probability) + result_msg[str(model.get_model_name())]['drone_threshold'] = str(get_required_drone_prob(freq)) prediction_list.append(prediction) print('-' * 100) print() try: - result = update_drone_streak(freq, prediction_list[0]) + result = update_drone_streak(freq, prediction, drone_probability) data_to_send={ 'freq': str(freq), 'amplitude': result