From a1c99ebf9fdf126ff8467440caf84c844180f82b Mon Sep 17 00:00:00 2001 From: Sergey Revyakin Date: Tue, 5 May 2026 12:51:07 +0700 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20inference=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=B2=D1=83=D1=85=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NN_server/Models/ensemble_1200_v44.py | 197 ++++++++++++++++++++++++++ NN_server/Models/ensemble_2400_v44.py | 197 ++++++++++++++++++++++++++ 2 files changed, 394 insertions(+) create mode 100644 NN_server/Models/ensemble_1200_v44.py create mode 100644 NN_server/Models/ensemble_2400_v44.py diff --git a/NN_server/Models/ensemble_1200_v44.py b/NN_server/Models/ensemble_1200_v44.py new file mode 100644 index 0000000..d805a4f --- /dev/null +++ b/NN_server/Models/ensemble_1200_v44.py @@ -0,0 +1,197 @@ +from torchvision import models +import torch.nn as nn +import matplotlib +import numpy as np +import torch +import cv2 +import gc +import io + + +def _render_plot(values, figsize=(16, 16), dpi=16): + import matplotlib.pyplot as plt + + fig = plt.figure(figsize=figsize) + plt.axes(ylim=(-1, 1)) + plt.plot(values, color="black") + plt.gca().set_axis_off() + plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) + plt.margins(0, 0) + + buf = io.BytesIO() + fig.savefig(buf, format="png", dpi=dpi) + buf.seek(0) + img_arr = np.frombuffer(buf.getvalue(), dtype=np.uint8) + buf.close() + + img = cv2.imdecode(img_arr, 1) + if img is None: + raise RuntimeError("failed to decode plot image") + + plt.clf() + plt.cla() + plt.close() + plt.close(fig) + + return np.asarray(cv2.split(img), dtype=np.float32) + + +def pre_func_ensemble(data=None, src="", ind_inference=0): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + + real = np.asarray(data[0], dtype=np.float32) + imag = np.asarray(data[1], dtype=np.float32) + signal = real + 1j * imag + + img_real = _render_plot(signal.real) + img_mag = _render_plot(np.abs(signal)) + + cv2.destroyAllWindows() + gc.collect() + + print("Подготовка данных завершена") + print() + return [img_real, img_mag] + + except Exception as exc: + print(str(exc)) + return None + + +def build_func_ensemble(file_model="", file_config="", num_classes=None): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + torch.cuda.empty_cache() + + num_classes = 2 + model1 = models.resnet18(pretrained=False) + model2 = models.resnet50(pretrained=False) + + model1.fc = nn.Linear(model1.fc.in_features, num_classes) + model2.fc = nn.Linear(model2.fc.in_features, num_classes) + + class Ensemble(nn.Module): + def __init__(self, model1, model2): + super().__init__() + self.model1 = model1 + self.model2 = model2 + self.fc = nn.Linear(2 * num_classes, num_classes) + + def forward(self, x): + if isinstance(x, (list, tuple)): + x1 = x[0] + x2 = x[1] if len(x) > 1 else x[0] + else: + x1 = x + x2 = x + y1 = self.model1(x1) + y2 = self.model2(x2) + y = torch.cat((y1, y2), dim=1) + return self.fc(y) + + model = Ensemble(model1, model2) + + device = "cuda" if torch.cuda.is_available() else "cpu" + if device != "cpu": + model = model.to(device) + model.load_state_dict(torch.load(file_model, map_location=device)) + model.eval() + + cv2.destroyAllWindows() + gc.collect() + + print("Инициализация модели завершена") + print() + return model + + except Exception as exc: + print(str(exc)) + return None + + +def inference_func_ensemble(data=None, model=None, mapping=None, shablon=""): + try: + cv2.destroyAllWindows() + gc.collect() + torch.cuda.empty_cache() + + device = "cuda" if torch.cuda.is_available() else "cpu" + if isinstance(data, (list, tuple)) and len(data) >= 2: + inputs = [ + torch.unsqueeze(torch.tensor(data[0]).cpu(), 0).to(device).float(), + torch.unsqueeze(torch.tensor(data[1]).cpu(), 0).to(device).float(), + ] + else: + tensor = torch.unsqueeze(torch.tensor(data).cpu(), 0).to(device).float() + inputs = [tensor, tensor] + + with torch.no_grad(): + output = model(inputs) + _, predict = torch.max(output.data, 1) + + prediction = mapping[int(np.asarray(predict.cpu())[0])] + print("PREDICTION" + shablon + ": " + prediction) + + output = output.cpu() + label = np.asarray(np.argmax(output, axis=1))[0] + output = np.asarray(torch.squeeze(output, 0)) + expon = np.exp(output - np.max(output)) + probability = round((expon / expon.sum())[label], 2) + + cv2.destroyAllWindows() + gc.collect() + print("Уверенность" + shablon + " в предсказании: " + str(probability)) + print("Инференс завершен") + print() + return [prediction, probability] + + except Exception as exc: + print(str(exc)) + return None + + +def post_func_ensemble(src="", model_type="", prediction="", model_id=0, ind_inference=0, data=None): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + + if int(ind_inference) <= 100 and isinstance(data, (list, tuple)) and len(data) >= 2: + fig, ax = plt.subplots() + ax.imshow(np.moveaxis(data[0], 0, -1)) + plt.savefig(src + "_inference_" + str(ind_inference) + "_" + prediction + "_real_" + str(model_id) + "_" + model_type + ".png") + plt.clf() + plt.cla() + plt.close(fig) + cv2.destroyAllWindows() + gc.collect() + + fig, ax = plt.subplots() + ax.imshow(np.moveaxis(data[1], 0, -1)) + plt.savefig(src + "_inference_" + str(ind_inference) + "_" + prediction + "_mod_" + str(model_id) + "_" + model_type + ".png") + plt.clf() + plt.cla() + plt.close(fig) + cv2.destroyAllWindows() + gc.collect() + + plt.clf() + plt.cla() + plt.close() + cv2.destroyAllWindows() + gc.collect() + + print("Постобработка завершена") + print() + + except Exception as exc: + print(str(exc)) + return None diff --git a/NN_server/Models/ensemble_2400_v44.py b/NN_server/Models/ensemble_2400_v44.py new file mode 100644 index 0000000..d805a4f --- /dev/null +++ b/NN_server/Models/ensemble_2400_v44.py @@ -0,0 +1,197 @@ +from torchvision import models +import torch.nn as nn +import matplotlib +import numpy as np +import torch +import cv2 +import gc +import io + + +def _render_plot(values, figsize=(16, 16), dpi=16): + import matplotlib.pyplot as plt + + fig = plt.figure(figsize=figsize) + plt.axes(ylim=(-1, 1)) + plt.plot(values, color="black") + plt.gca().set_axis_off() + plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) + plt.margins(0, 0) + + buf = io.BytesIO() + fig.savefig(buf, format="png", dpi=dpi) + buf.seek(0) + img_arr = np.frombuffer(buf.getvalue(), dtype=np.uint8) + buf.close() + + img = cv2.imdecode(img_arr, 1) + if img is None: + raise RuntimeError("failed to decode plot image") + + plt.clf() + plt.cla() + plt.close() + plt.close(fig) + + return np.asarray(cv2.split(img), dtype=np.float32) + + +def pre_func_ensemble(data=None, src="", ind_inference=0): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + + real = np.asarray(data[0], dtype=np.float32) + imag = np.asarray(data[1], dtype=np.float32) + signal = real + 1j * imag + + img_real = _render_plot(signal.real) + img_mag = _render_plot(np.abs(signal)) + + cv2.destroyAllWindows() + gc.collect() + + print("Подготовка данных завершена") + print() + return [img_real, img_mag] + + except Exception as exc: + print(str(exc)) + return None + + +def build_func_ensemble(file_model="", file_config="", num_classes=None): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + torch.cuda.empty_cache() + + num_classes = 2 + model1 = models.resnet18(pretrained=False) + model2 = models.resnet50(pretrained=False) + + model1.fc = nn.Linear(model1.fc.in_features, num_classes) + model2.fc = nn.Linear(model2.fc.in_features, num_classes) + + class Ensemble(nn.Module): + def __init__(self, model1, model2): + super().__init__() + self.model1 = model1 + self.model2 = model2 + self.fc = nn.Linear(2 * num_classes, num_classes) + + def forward(self, x): + if isinstance(x, (list, tuple)): + x1 = x[0] + x2 = x[1] if len(x) > 1 else x[0] + else: + x1 = x + x2 = x + y1 = self.model1(x1) + y2 = self.model2(x2) + y = torch.cat((y1, y2), dim=1) + return self.fc(y) + + model = Ensemble(model1, model2) + + device = "cuda" if torch.cuda.is_available() else "cpu" + if device != "cpu": + model = model.to(device) + model.load_state_dict(torch.load(file_model, map_location=device)) + model.eval() + + cv2.destroyAllWindows() + gc.collect() + + print("Инициализация модели завершена") + print() + return model + + except Exception as exc: + print(str(exc)) + return None + + +def inference_func_ensemble(data=None, model=None, mapping=None, shablon=""): + try: + cv2.destroyAllWindows() + gc.collect() + torch.cuda.empty_cache() + + device = "cuda" if torch.cuda.is_available() else "cpu" + if isinstance(data, (list, tuple)) and len(data) >= 2: + inputs = [ + torch.unsqueeze(torch.tensor(data[0]).cpu(), 0).to(device).float(), + torch.unsqueeze(torch.tensor(data[1]).cpu(), 0).to(device).float(), + ] + else: + tensor = torch.unsqueeze(torch.tensor(data).cpu(), 0).to(device).float() + inputs = [tensor, tensor] + + with torch.no_grad(): + output = model(inputs) + _, predict = torch.max(output.data, 1) + + prediction = mapping[int(np.asarray(predict.cpu())[0])] + print("PREDICTION" + shablon + ": " + prediction) + + output = output.cpu() + label = np.asarray(np.argmax(output, axis=1))[0] + output = np.asarray(torch.squeeze(output, 0)) + expon = np.exp(output - np.max(output)) + probability = round((expon / expon.sum())[label], 2) + + cv2.destroyAllWindows() + gc.collect() + print("Уверенность" + shablon + " в предсказании: " + str(probability)) + print("Инференс завершен") + print() + return [prediction, probability] + + except Exception as exc: + print(str(exc)) + return None + + +def post_func_ensemble(src="", model_type="", prediction="", model_id=0, ind_inference=0, data=None): + try: + import matplotlib.pyplot as plt + + matplotlib.use("Agg") + plt.ioff() + + if int(ind_inference) <= 100 and isinstance(data, (list, tuple)) and len(data) >= 2: + fig, ax = plt.subplots() + ax.imshow(np.moveaxis(data[0], 0, -1)) + plt.savefig(src + "_inference_" + str(ind_inference) + "_" + prediction + "_real_" + str(model_id) + "_" + model_type + ".png") + plt.clf() + plt.cla() + plt.close(fig) + cv2.destroyAllWindows() + gc.collect() + + fig, ax = plt.subplots() + ax.imshow(np.moveaxis(data[1], 0, -1)) + plt.savefig(src + "_inference_" + str(ind_inference) + "_" + prediction + "_mod_" + str(model_id) + "_" + model_type + ".png") + plt.clf() + plt.cla() + plt.close(fig) + cv2.destroyAllWindows() + gc.collect() + + plt.clf() + plt.cla() + plt.close() + cv2.destroyAllWindows() + gc.collect() + + print("Постобработка завершена") + print() + + except Exception as exc: + print(str(exc)) + return None