#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Видео
"""
# ######################################################################################################################
# Импорт необходимых инструментов
# ######################################################################################################################
import warnings
# Подавление Warning
for warn in [UserWarning, FutureWarning]:
warnings.filterwarnings("ignore", category=warn)
from dataclasses import dataclass # Класс данных
import os # Взаимодействие с файловой системой
import requests # Отправка HTTP запросов
import numpy as np # Научные вычисления
import pandas as pd # Обработка и анализ данных
import math
import gradio
from urllib.parse import urlparse
from urllib.error import URLError
from pathlib import Path # Работа с путями в файловой системе
from scipy.spatial import distance
from scipy import stats
from datetime import datetime # Работа со временем
from sklearn.metrics import mean_absolute_error
# Типы данных
from typing import Dict, List, Tuple, Union, Optional, Callable
from types import ModuleType
from IPython.display import clear_output
# Персональные
from oceanai.modules.lab.download import Download # Загрузка файлов
import torch
import torch.nn as nn
from PIL import Image
import cv2
import mediapipe as mp # Набор нейросетевых моделей и решений для компьютерного зрения
from oceanai.modules.lab.architectures import utils
from oceanai.modules.lab.architectures.video_architectures import (
ResNet50,
video_model_hc,
video_model_nn,
video_model_b5,
)
mp.solutions.face_mesh.FaceMesh() # Удаление сообщения: INFO: Created TensorFlow Lite XNNPACK delegate for CPU)
# ######################################################################################################################
# Сообщения
# ######################################################################################################################
[docs]
@dataclass
class VideoMessages(Download):
"""Класс для сообщений
Args:
lang (str): Смотреть :attr:`~oceanai.modules.core.language.Language.lang`
color_simple (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_simple`
color_info (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_info`
color_err (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_err`
color_true (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_true`
bold_text (bool): Смотреть :attr:`~oceanai.modules.core.settings.Settings.bold_text`
num_to_df_display (int): Смотреть :attr:`~oceanai.modules.core.settings.Settings.num_to_df_display`
text_runtime (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.text_runtime`
"""
# ------------------------------------------------------------------------------------------------------------------
# Конструктор
# ------------------------------------------------------------------------------------------------------------------
def __post_init__(self):
super().__post_init__() # Выполнение конструктора из суперкласса
self._video_modality: str = self._(" (видео модальность) ...")
self._formation_video_model_hc: str = self._formation_model_hc + self._video_modality
self._formation_video_model_nn: str = self._formation_model_nn + self._video_modality
self._formation_video_deep_fe: str = (
self._("Формирование нейросетевой архитектуры для получения нейросетевых " "признаков")
+ self._video_modality
)
self._formation_video_models_b5: str = self._formation_models_b5 + self._video_modality
self._load_video_model_weights_hc: str = self._load_model_weights_hc + self._video_modality
self._load_video_model_weights_nn: str = self._load_model_weights_nn + self._video_modality
self._load_video_model_weights_deep_fe: str = (
self._("Загрузка весов нейросетевой модели для получения " "нейросетевых признаков") + self._video_modality
)
self._load_video_models_weights_b5: str = self._load_models_weights_b5 + self._video_modality
self._model_video_hc_not_formation: str = self._model_hc_not_formation + self._video_modality
self._model_video_nn_not_formation: str = self._model_nn_not_formation + self._video_modality
self._model_video_deep_fe_not_formation: str = (
self._oh
+ self._("нейросетевая архитектура модели для " "получения нейросетевых признаков не " "сформирована")
+ self._video_modality
)
self._models_video_not_formation: str = self._models_not_formation + self._video_modality
self._get_visual_feature_info: str = self._(
"Извлечение признаков (экспертных и нейросетевых) из визуального " "сигнала ..."
)
self._wrong_extension_video_formats = self._oh + self._('расширение видеофайла должно быть одним из: "{}"')
self._all_frames_is_zero: str = self._oh + self._("общее количество кадров в видеопотоке: {} ...")
self._calc_reshape_img_coef_error: str = self._oh + self._(
"вычисление коэффициента изменения размера " "изображения не произведено ..."
)
self._faces_not_found: str = self._oh + self._("не на одном кадре видеопотока лицо не найдено ...")
self._concat_video_pred_error: str = self._concat_pred_error + self._video_modality
self._norm_video_pred_error: str = self._norm_pred_error + self._video_modality
# ######################################################################################################################
# Аудио
# ######################################################################################################################
[docs]
@dataclass
class Video(VideoMessages):
"""Класс для обработки видео
Args:
lang (str): Смотреть :attr:`~oceanai.modules.core.language.Language.lang`
color_simple (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_simple`
color_info (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_info`
color_err (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_err`
color_true (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.color_true`
bold_text (bool): Смотреть :attr:`~oceanai.modules.core.settings.Settings.bold_text`
num_to_df_display (int): Смотреть :attr:`~oceanai.modules.core.settings.Settings.num_to_df_display`
text_runtime (str): Смотреть :attr:`~oceanai.modules.core.settings.Settings.text_runtime`
"""
# ------------------------------------------------------------------------------------------------------------------
# Конструктор
# ------------------------------------------------------------------------------------------------------------------
def __post_init__(self):
super().__post_init__() # Выполнение конструктора из суперкласса
# Нейросетевая модель **nn.Module** для получения оценок по экспертным признакам
self._video_model_hc: Optional[nn.Module] = None
# Нейросетевая модель **nn.Module** для получения нейросетевых признаков
self._video_model_deep_fe: Optional[nn.Module] = None
# Нейросетевая модель **nn.Module** для получения оценок по нейросетевым признакам
self._video_model_nn: Optional[nn.Module] = None
# Нейросетевые модели **nn.Module** для получения результатов оценки персональных качеств
self._video_models_b5: Dict[str, Optional[nn.Module]] = dict(zip(self._b5["en"], [None] * len(self._b5["en"])))
# ----------------------- Только для внутреннего использования внутри класса
# Поддерживаемые видео форматы
self.__supported_video_formats: List[str] = ["mp4", "mov", "avi", "flv"]
self.__mp_face_mesh: ModuleType = mp.solutions.face_mesh # 468 3D-ориентиров лица
self.__mp_drawing: ModuleType = mp.solutions.drawing_utils # Утилиты MediaPipe
self.__bndbox_face_size: List[int] = [224, 224] # Размер изображения с лицом
self.__lang_traslate: List[str] = ["ru", "en"]
self.lang_traslate: List[str] = self.__lang_traslate
# Используемые координаты ориентиров лица
self.__coords_face_mesh_fi: List[int] = [
0,
1,
386,
133,
6,
8,
267,
13,
14,
17,
145,
276,
152,
282,
411,
285,
159,
291,
37,
299,
46,
52,
55,
187,
61,
69,
331,
334,
336,
102,
105,
362,
107,
374,
33,
263,
]
self.__coords_face_mesh_mupta: List[int] = [
0,
1,
386,
133,
6,
8,
267,
13,
14,
17,
274,
145,
276,
152,
282,
411,
285,
159,
291,
37,
299,
46,
52,
55,
187,
61,
69,
331,
334,
336,
102,
105,
362,
]
self.__couples_face_mesh_fi: List[List[int]] = [
[133, 46],
[133, 52],
[133, 55],
[362, 285],
[362, 282],
[362, 276],
[55, 285],
[1, 6],
[8, 6],
[0, 1],
[0, 17],
[61, 291],
[0, 13],
[61, 291],
[37, 13],
[267, 13],
[13, 14],
[17, 152],
[102, 331],
[102, 133],
[331, 362],
[291, 362],
[61, 133],
[386, 374],
[159, 145],
[69, 105],
[69, 107],
[299, 336],
[299, 334],
[187, 133],
[411, 362],
]
self.__couples_face_mesh_mupta: List[List[int]] = [
[133, 46],
[133, 52],
[133, 55],
[362, 285],
[362, 282],
[362, 276],
[55, 285],
[1, 6],
[8, 6],
[0, 1],
[0, 17],
[61, 291],
[0, 13],
[61, 291],
[37, 13],
[267, 13],
[13, 14],
[17, 152],
[102, 331],
[102, 133],
[331, 362],
[291, 362],
[61, 133],
[386, 274],
[159, 145],
[69, 105],
[69, 145],
[299, 336],
[299, 334],
[187, 133],
[411, 362],
]
self.__len_paths: int = 0 # Количество искомых файлов
self.__local_path: Union[Callable[[str], str], None] = None # Локальный путь
# Ключи для точности
self.__df_accuracy_index: List[str] = ["MAE", "Accuracy"]
self.__df_accuracy_index_name: str = "Metrics"
self.__df_accuracy_mean: str = "Mean"
clear_output(False) # Удаление сообщения: INFO: Created TensorFlow Lite XNNPACK delegate for CPU)
# ------------------------------------------------------------------------------------------------------------------
# Свойства
# ------------------------------------------------------------------------------------------------------------------
@property
def video_model_hc_(self) -> Optional[nn.Module]:
"""Получение нейросетевой модели **nn.Module** для получения оценок по экспертным признакам
Returns:
Optional[nn.Module]: Нейросетевая модель **nn.Module** или None
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_hc(
lang = 'en',
show_summary = False, out = True,
runtime = True, run = True
)
video.video_model_hc_
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 13:19:24] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (видео модальность) ...
--- Время выполнения: 0.005 сек. ---
video_model_hc(
(lstm1): LSTM(115, 64, batch_first=True)
(dropout1): Dropout(p=0.2, inplace=False)
(lstm2): LSTM(64, 128, batch_first=True)
(dropout2): Dropout(p=0.2, inplace=False)
(fc): Linear(in_features=128, out_features=5, bias=True)
)
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.video_model_hc_
.. output-cell::
:execution-count: 2
:linenos:
"""
return self._video_model_hc
@property
def video_model_nn_(self) -> Optional[nn.Module]:
"""Получение нейросетевой модели **nn.Module** для получения оценок по нейросетевым признакам
Returns:
Optional[nn.Module]: Нейросетевая модель **nn.Module** или None
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_nn(
show_summary = False, out = True,
runtime = True, run = True
)
video.video_model_nn_
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 13:20:47] Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам (видео модальность) ...
--- Время выполнения: 0.055 сек. ---
video_model_nn(
(lstm1): LSTM(512, 1024, batch_first=True)
(dropout1): Dropout(p=0.2, inplace=False)
(fc): Linear(in_features=1024, out_features=5, bias=True)
)
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.video_model_nn_
.. output-cell::
:execution-count: 2
:linenos:
"""
return self._video_model_nn
@property
def video_model_deep_fe_(self) -> Optional[nn.Module]:
"""Получение нейросетевой модели **nn.Module** для получения нейросетевых признаков
Returns:
Optional[nn.Module]: Нейросетевая модель **nn.Module** или None
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_deep_fe(
show_summary = False, out = True,
runtime = True, run = True
)
video.video_model_deep_fe_
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 13:17:09] Формирование нейросетевой архитектуры для получения нейросетевых признаков (видео модальность) ...
--- Время выполнения: 0.228 сек. ---
ResNet(
(conv_layer_s2_same): Conv2dSame(3, 64, kernel_size=(7, 7), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
(max_pool): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(layer1): Sequential(
(0): Bottleneck(
(conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer2): Sequential(
(0): Bottleneck(
(conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(3): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer3): Sequential(
(0): Bottleneck(
(conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(3): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(4): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(5): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer4): Sequential(
(0): Bottleneck(
(conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
(fc1): Linear(in_features=2048, out_features=512, bias=True)
(relu1): ReLU()
(fc2): Linear(in_features=512, out_features=7, bias=True)
)
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.video_model_deep_fe_
.. output-cell::
:execution-count: 2
:linenos:
"""
return self._video_model_deep_fe
@property
def video_models_b5_(self) -> Dict[str, Optional[nn.Module]]:
"""Получение нейросетевых моделей **nn.Module** для получения результатов оценки персональных качеств
Returns:
Dict: Словарь с нейросетевыми моделями **nn.Module**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_models_b5(
show_summary = False, out = True,
runtime = True, run = True
)
video.video_models_b5_
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 13:21:52] Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств (видео модальность) ...
--- Время выполнения: 0.004 сек. ---
{'openness': video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
),
'conscientiousness': video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
),
'extraversion': video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
),
'agreeableness': video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
),
'non-neuroticism': video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
)}
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.video_models_b5_
.. output-cell::
:execution-count: 2
:linenos:
:tab-width: 8
{
'openness': None,
'conscientiousness': None,
'extraversion': None,
'agreeableness': None,
'non_neuroticism': None
}
"""
return self._video_models_b5
# ------------------------------------------------------------------------------------------------------------------
# Внутренние методы (приватные)
# ------------------------------------------------------------------------------------------------------------------
def __load_model_weights(
self,
url: str,
force_reload: bool = True,
info_text: str = "",
out: bool = True,
runtime: bool = True,
run: bool = True,
) -> bool:
"""Загрузка весов нейросетевой модели
.. note::
private (приватный метод)
Args:
url (str): Полный путь к файлу с весами нейросетевой модели
force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
info_text (str): Текст для информационного сообщения
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
video._Video__load_model_weights(
url = 'https://drive.usercontent.google.com/download?id=1QF7ReDQXpCciF7aWjbEt4Q-x06hwDrMZ&export=download&authuser=2&confirm=t&uuid=c2fd5a21-7af7-4b7f-8419-d7d628847768&at=AO7h07eilj-Bm5RIk0HwQBEr37ri:1727175670133',
force_reload = True,
info_text = 'Загрузка весов нейросетевой модели',
out = True, runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 11:42:21] Загрузка весов нейросетевой модели
[2024-10-09 11:42:25] Загрузка файла "weights_2022-03-22_16-31-48.pth" 100.0% ...
--- Время выполнения: 4.117 сек. ---
True
:bdg-light:`-- 2 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
video._Video__load_model_weights(
url = './models/weights_2022-03-22_16-31-48.pth',
force_reload = True,
info_text = 'Загрузка весов нейросетевой модели',
out = True, runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 11:46:15] Загрузка весов нейросетевой модели
--- Время выполнения: 0.005 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
video._Video__load_model_weights(
url = 'https://drive.usercontent.google.com/download?id=1QF7ReDQXpCciF7aWjbEt4Q-x06hwDrMZ&export=download&authuser=2&confirm=t&uuid=c2fd5a21-7af7-4b7f-8419-d7d628847768&at=AO7h07eilj-Bm5RIk0HwQBEr37ri:1727175670133',
force_reload = True, info_text = '',
out = True, runtime = True, run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2022-10-27 12:48:24] Неверные типы или значения аргументов в "Video.__load_model_weights" ...
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
type(url) is not str
or not url
or type(force_reload) is not bool
or type(info_text) is not str
or not info_text
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.__load_model_weights.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
# Информационное сообщение
self._info(info_text, last=False, out=out)
sections = urlparse(url) # Парсинг URL адреса
try:
# URL файл невалидный
if sections.scheme == "":
raise requests.exceptions.InvalidURL
except requests.exceptions.InvalidURL:
url = os.path.normpath(url)
try:
if os.path.isfile(url) is False:
raise FileNotFoundError # Не файл
except FileNotFoundError:
self._other_error(self._load_model_weights_error, out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
self._url_last_filename = url
return True
else:
try:
if force_reload is False:
clear_output(True)
# Загрузка файла из URL
res_download_file_from_url = self._download_file_from_url(
url=url, force_reload=force_reload, runtime=False, out=out, run=True
)
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
# Файл загружен
if res_download_file_from_url != 200:
return False
return True
finally:
if runtime:
self._r_end(out=out)
def __calc_reshape_img_coef(
self, shape: Union[Tuple[int], List[int]], new_shape: Union[int, Tuple[int], List[int]], out: bool = True
) -> float:
"""Вычисление коэффициента изменения размера изображения
.. note::
private (приватный метод)
Args:
shape (Union[Tuple[int], List[int]]): Текущий размер изображения (ширина, высота)
new_shape (Union[int, Tuple[int], List[int]]): Желаемый размер изображения
out (bool): Отображение
Returns:
float: Коэффициент изменения размера изображения
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video._Video__calc_reshape_img_coef(
shape = (1280, 720),
new_shape = 224,
out = True
)
.. output-cell::
:execution-count: 1
:linenos:
0.175
:bdg-success:`Верно` :bdg-light:`-- 2 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video._Video__calc_reshape_img_coef(
shape = (1280, 720),
new_shape = (1920, 1080),
out = True
)
.. output-cell::
:execution-count: 1
:linenos:
1.5
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
from oceanai.modules.lab.video import Video
video = Video()
video._Video__calc_reshape_img_coef(
shape = (1280, 720),
new_shape = '',
out = True
)
.. output-cell::
:execution-count: 4
:linenos:
[2022-10-29 13:24:27] Неверные типы или значения аргументов в "Video.__calc_reshape_img_coef" ...
-1.0
"""
try:
# Проверка аргументов
if (
(isinstance(shape, list) is False and isinstance(shape, tuple) is False)
or len(shape) != 2
or (
isinstance(new_shape, list) is False
and isinstance(new_shape, tuple) is False
and type(new_shape) is not int
)
or type(out) is not bool
):
raise TypeError
if type(shape[0]) is not int or type(shape[1]) is not int:
raise TypeError
if shape[0] < 1 or shape[1] < 1:
raise ValueError
if isinstance(new_shape, list) is True or isinstance(new_shape, tuple) is True:
if len(new_shape) != 2:
raise TypeError
if type(new_shape[0]) is not int or type(new_shape[1]) is not int:
raise TypeError
if new_shape[0] < 1 or new_shape[1] < 1:
raise ValueError
else:
if new_shape < 1:
raise ValueError
except (TypeError, ValueError):
self._inv_args(__class__.__name__, self.__calc_reshape_img_coef.__name__, out=out)
return -1.0
else:
if isinstance(new_shape, list) is False and isinstance(new_shape, tuple) is False:
new_shape = (new_shape, new_shape)
return min(new_shape[0] / shape[0], new_shape[1] / shape[1])
def __norm_pred(self, pred_data: np.ndarray, len_nn: int = 16, out: bool = True) -> np.ndarray:
"""Нормализация оценок по экспертным и нейросетевым признакам
.. note::
private (приватный метод)
Args:
pred_data (np.ndarray): Оценки
len_nn (int): Максимальный размер вектора оценок
out (bool): Отображение
Returns:
np.ndarray: Нормализованные оценки по экспертным и нейросетевым признакам
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
import numpy as np
from oceanai.modules.lab.video import Video
video = Video()
arr = np.array([
[0.64113516, 0.6217892, 0.54451424, 0.6144415, 0.59334993],
[0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
])
video._Video__norm_pred(
pred_data = arr,
len_nn = 4,
out = True
)
.. output-cell::
:execution-count: 1
:linenos:
:tab-width: 8
array([
[0.64113516, 0.6217892 , 0.54451424, 0.6144415 , 0.59334993],
[0.6652424 , 0.63606125, 0.572305 , 0.63169795, 0.612515],
[0.65318878, 0.62892523, 0.55840962, 0.62306972, 0.60293247],
[0.65318878, 0.62892523, 0.55840962, 0.62306972, 0.60293247]
])
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
import numpy as np
from oceanai.modules.lab.video import Video
video = Video()
arr = np.array([])
video._Video__norm_pred(
pred_data = arr,
len_nn = 4,
out = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2022-10-20 22:03:17] Неверные типы или значения аргументов в "Video.__norm_pred" ...
array([], dtype=float64)
"""
try:
# Проверка аргументов
if (
type(pred_data) is not np.ndarray
or len(pred_data) < 1
or type(len_nn) is not int
or len_nn < 1
or type(out) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.__norm_pred.__name__, out=out)
return np.array([])
else:
try:
if pred_data.shape[0] < len_nn:
return np.pad(pred_data, ((0, len_nn - pred_data.shape[0]), (0, 0)), "mean")
return pred_data[:len_nn]
except ValueError:
self._other_error(self._norm_video_pred_error, last=False, out=out)
return np.array([])
except Exception:
self._other_error(self._unknown_err, out=out)
return np.array([])
def __concat_pred(self, pred_hc: np.ndarray, pred_nn: np.ndarray, out: bool = True) -> List[Optional[np.ndarray]]:
"""Конкатенация оценок по экспертным и нейросетевым признакам
.. note::
private (приватный метод)
Args:
pred_hc (np.ndarray): Оценки по экспертным признакам
pred_nn (np.ndarray): Оценки по нейросетевым признакам
out (bool): Отображение
Returns:
List[Optional[np.ndarray]]: Конкатенированные оценки по экспертным и нейросетевым признакам
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
import numpy as np
from oceanai.modules.lab.video import Video
video = Video()
arr_hc = np.array([
[0.64113516, 0.6217892, 0.54451424, 0.6144415, 0.59334993],
[0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
])
arr_nn = np.array([
[0.56030345, 0.7488746, 0.44648764, 0.59893465, 0.5701077],
[0.5900006, 0.7652722, 0.4795154, 0.6409055, 0.6088242]
])
video._Video__concat_pred(
pred_hc = arr_hc,
pred_nn = arr_nn,
out = True
)
.. output-cell::
:execution-count: 1
:linenos:
:tab-width: 12
[
array([
0.64113516, 0.6652424, 0.65318878, 0.65318878, 0.65318878,
0.65318878, 0.65318878, 0.65318878, 0.65318878, 0.65318878,
0.65318878, 0.65318878, 0.65318878, 0.65318878, 0.65318878,
0.65318878, 0.56030345, 0.5900006, 0.57515202, 0.57515202,
0.57515202, 0.57515202, 0.57515202, 0.57515202, 0.57515202,
0.57515202, 0.57515202, 0.57515202, 0.57515202, 0.57515202,
0.57515202, 0.57515202
]),
array([
0.6217892, 0.63606125, 0.62892523, 0.62892523, 0.62892523,
0.62892523, 0.62892523, 0.62892523, 0.62892523, 0.62892523,
0.62892523, 0.62892523, 0.62892523, 0.62892523, 0.62892523,
0.62892523, 0.7488746, 0.7652722, 0.7570734, 0.7570734,
0.7570734, 0.7570734, 0.7570734, 0.7570734, 0.7570734,
0.7570734, 0.7570734, 0.7570734, 0.7570734, 0.7570734,
0.7570734, 0.7570734
]),
array([
0.54451424, 0.572305, 0.55840962, 0.55840962, 0.55840962,
0.55840962, 0.55840962, 0.55840962, 0.55840962, 0.55840962,
0.55840962, 0.55840962, 0.55840962, 0.55840962, 0.55840962,
0.55840962, 0.44648764, 0.4795154, 0.46300152, 0.46300152,
0.46300152, 0.46300152, 0.46300152, 0.46300152, 0.46300152,
0.46300152, 0.46300152, 0.46300152, 0.46300152, 0.46300152,
0.46300152, 0.46300152
]),
array([
0.6144415, 0.63169795, 0.62306972, 0.62306972, 0.62306972,
0.62306972, 0.62306972, 0.62306972, 0.62306972, 0.62306972,
0.62306972, 0.62306972, 0.62306972, 0.62306972, 0.62306972,
0.62306972, 0.59893465, 0.6409055, 0.61992008, 0.61992008,
0.61992008, 0.61992008, 0.61992008, 0.61992008, 0.61992008,
0.61992008, 0.61992008, 0.61992008, 0.61992008, 0.61992008,
0.61992008, 0.61992008
]),
array([
0.59334993, 0.612515, 0.60293247, 0.60293247, 0.60293247,
0.60293247, 0.60293247, 0.60293247, 0.60293247, 0.60293247,
0.60293247, 0.60293247, 0.60293247, 0.60293247, 0.60293247,
0.60293247, 0.5701077, 0.6088242, 0.58946595, 0.58946595,
0.58946595, 0.58946595, 0.58946595, 0.58946595, 0.58946595,
0.58946595, 0.58946595, 0.58946595, 0.58946595, 0.58946595,
0.58946595, 0.58946595
])
]
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
import numpy as np
from oceanai.modules.lab.video import Video
video = Video()
arr_hc = np.array([
[0.64113516, 0.6217892, 0.54451424, 0.6144415],
[0.6652424, 0.63606125, 0.572305, 0.63169795, 0.612515]
])
arr_nn = np.array([
[0.56030345, 0.7488746, 0.44648764, 0.59893465, 0.5701077],
[0.5900006, 0.7652722, 0.4795154, 0.6409055, 0.6088242]
])
video._Video__concat_pred(
pred_hc = arr_hc,
pred_nn = arr_nn,
out = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 11:34:39] Что-то пошло не так ... конкатенация оценок по экспертным и нейросетевым признакам не произведена (видео модальность) ...
[]
"""
try:
# Проверка аргументов
if (
type(pred_hc) is not np.ndarray
or len(pred_hc) < 1
or type(pred_nn) is not np.ndarray
or len(pred_nn) < 1
or type(out) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.__concat_pred.__name__, out=out)
return []
else:
# Нормализация оценок по экспертным и нейросетевым признакам
pred_hc_norm = self.__norm_pred(pred_hc, out=False)
pred_nn_norm = self.__norm_pred(pred_nn, out=False)
if len(pred_hc_norm) == 0 or len(pred_nn_norm) == 0:
self._error(self._concat_video_pred_error, out=out)
return []
concat = []
try:
# Проход по всем персональным качествам личности человека
for i in range(len(self._b5["en"])):
concat.append(np.hstack((np.asarray(pred_hc_norm)[:, i], np.asarray(pred_nn_norm)[:, i])))
except IndexError:
self._other_error(self._concat_video_pred_error, last=False, out=out)
return []
except Exception:
self._other_error(self._unknown_err, out=out)
return []
return concat
def __load_video_model_b5(self, show_summary: bool = False, out: bool = True) -> Optional[nn.Module]:
"""Формирование нейросетевой архитектуры модели для получения результата оценки персонального качества
.. note::
private (приватный метод)
Args:
show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
out (bool): Отображение
Returns:
Optional[nn.Module]:
**None** если неверные типы или значения аргументов, в обратном случае нейросетевая модель
**nn.Module** для получения результата оценки персонального качества
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video._Video__load_video_model_b5(
show_summary = True, out = True
)
.. output-cell::
:execution-count: 1
:linenos:
video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
)
video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
)
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video._Video__load_video_model_b5(
show_summary = True, out = []
)
.. output-cell::
:execution-count: 3
:linenos:
[2022-10-17 10:53:03] Неверные типы или значения аргументов в "Video.__load_video_model_b5" ...
"""
try:
# Проверка аргументов
if type(show_summary) is not bool or type(out) is not bool:
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.__load_video_model_b5.__name__, out=out)
return None
else:
model = video_model_b5()
if show_summary and out:
print(model)
return model
# ------------------------------------------------------------------------------------------------------------------
# Внутренние методы (защищенные)
# ------------------------------------------------------------------------------------------------------------------
[docs]
def _get_visual_features(
self,
path: str,
reduction_fps: int = 5,
window: int = 10,
step: int = 5,
lang: str = "ru",
last: bool = False,
out: bool = True,
runtime: bool = True,
run: bool = True,
) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
"""Извлечение признаков из визуального сигнала (без очистки истории вывода сообщений в ячейке Jupyter)
.. note::
protected (защищенный метод)
Args:
path (str): Путь к видеофайлу
reduction_fps (int): Понижение кадровой частоты
window (int): Размер окна сегмента сигнала (в кадрах)
step (int): Шаг сдвига окна сегмента сигнала (в кадрах)
lang (str): Язык
last (bool): Замена последнего сообщения
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
Tuple[np.ndarray, np.ndarray, np.ndarray]: Кортеж с двумя np.ndarray:
1. np.ndarray с экспертными признаками
2. np.ndarray с нейросетевыми признаками
3. np.ndarray с эмоциональными предсказаниями
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
res_load_model_deep_fe = video.load_video_model_deep_fe(
show_summary = False,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-11-03 16:37:12] Формирование нейросетевой архитектуры для получения нейросетевых признаков (видео модальность) ...
--- Время выполнения: 1.564 сек. ---
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['fe']['googledisk']
res_load_video_model_weights_deep_fe = video.load_video_model_weights_deep_fe(
url = url,
force_reload = True, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 12:19:15] Загрузка весов нейросетевой модели для получения нейросетевых признаков (видео модальность) ...
[2024-10-09 12:19:20] Загрузка файла "weights_2022-11-01_12-27-07.pth" 100.0% ...
--- Время выполнения: 5.445 сек. ---
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
path = '/Users/dl/GitHub/oceanai/oceanai/dataset/test80_01/glgfB3vFewc.004.mp4'
hc_features, nn_features, _ = video.get_visual_features(
path = path, reduction_fps = 5,
window = 10, step = 5,
out = True, runtime = True, run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 12:20:39] Извлечение признаков (экспертных и нейросетевых) из визуального сигнала ...
[2024-10-09 12:20:46] Статистика извлеченных признаков из визуального сигнала:
Общее количество сегментов с:
1. экспертными признаками: 12
2. нейросетевыми признаками: 12
Размерность матрицы экспертных признаков одного сегмента: 10 ✕ 109
Размерность матрицы с нейросетевыми признаками одного сегмента: 10 ✕ 512
Понижение кадровой частоты: с 30 до 5
--- Время выполнения: 7.123 сек. ---
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 4
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
path = '/Users/dl/GitHub/oceanai/oceanai/dataset/test80_01/glgfB3vFewc.004.mp4'
hc_features, nn_features, _ = video.get_visual_features(
path = path, reduction_fps = 5,
window = 10, step = 5,
out = True, runtime = True, run = True
)
.. output-cell::
:execution-count: 4
:linenos:
[2024-10-09 12:21:55] Извлечение признаков (экспертных и нейросетевых) из визуального сигнала ...
[2024-10-09 12:21:57] Что-то пошло не так ... нейросетевая архитектура модели для получения нейросетевых признаков не сформирована (видео модальность) ...
--- Время выполнения: 1.202 сек. ---
"""
try:
# Проверка аргументов
if (
(type(path) is not str or not path)
and (type(path) is not gradio.utils.NamedString)
or type(reduction_fps) is not int
or reduction_fps < 1
or type(window) is not int
or window < 1
or type(step) is not int
or step < 1
or not isinstance(lang, str)
or lang not in self.__lang_traslate
or type(last) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self._get_visual_features.__name__, last=last, out=out)
return np.empty([]), np.empty([]), np.empty([])
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, last=last, out=out)
return np.empty([]), np.empty([]), np.empty([])
if runtime:
self._r_start()
if last is False:
# Информационное сообщение
self._info(self._get_visual_feature_info, out=False)
if out:
self.show_notebook_history_output() # Отображение истории вывода сообщений в ячейке Jupyter
try:
if os.path.isfile(path) is False:
raise FileNotFoundError # Не файл
except FileNotFoundError:
self._other_error(self._file_not_found.format(self._info_wrapper(path)), last=last, out=out)
return np.empty([]), np.empty([]), np.empty([])
except Exception:
self._other_error(self._unknown_err, last=last, out=out)
return np.empty([]), np.empty([]), np.empty([])
else:
try:
# Расширение файла не соответствует расширению искомых файлов
if Path(path).suffix[1:].lower() not in self.__supported_video_formats:
raise TypeError
except TypeError:
self._other_error(
self._wrong_extension_video_formats.format(
self._info_wrapper(", ".join(x for x in self.__supported_video_formats))
),
out=out,
)
return np.empty([]), np.empty([]), np.empty([])
except Exception:
self._other_error(self._unknown_err, out=out)
return np.empty([]), np.empty([]), np.empty([])
else:
cap = cv2.VideoCapture(path) # Захват видеофайла для чтения
width_video = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # Ширина кадров в видеопотоке
height_video = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # Высота кадров в видеопотоке
all_frames_cv2 = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # # Всего кадров в видеопотоке
fps_cv2 = np.round(cap.get(cv2.CAP_PROP_FPS)) # Частота кадров (FPS)
# Вычисление коэффициента изменения размера изображения
reshape_img_coef = self.__calc_reshape_img_coef(
shape=[width_video, height_video], new_shape=self.__bndbox_face_size, out=False
)
try:
if reshape_img_coef == -1:
raise ValueError
except ValueError:
self._other_error(self._calc_reshape_img_coef_error, out=out)
return np.empty([]), np.empty([]), np.empty([])
else:
# Прореживание кадров
if reduction_fps > fps_cv2:
reduction_fps = fps_cv2
# Всего кадров после прореживания
all_frms_reduct = all_frames_cv2 / (fps_cv2 / reduction_fps)
# Индексы кадров, которые останутся после прореживания
idx_reduction_frames = list(
map(
self._round_math,
np.arange(0, all_frames_cv2, all_frames_cv2 / all_frms_reduct, dtype=float),
)
)
def alignment_procedure(left_eye: List[int], right_eye: List[int]) -> float:
"""Выравнивание угла наклона головы относительно центров глаз
.. note::
внутренняя функция
Args:
left_eye (List[int]): Координаты центра левого глаза
right_eye (List[int]): Координаты центра правого глаза
Returns:
float: Градус расхождения центров глаз
"""
left_eye_x, left_eye_y = left_eye
right_eye_x, right_eye_y = right_eye
if left_eye_y > right_eye_y:
point_3rd = (right_eye_x, left_eye_y)
direction = -1
else:
point_3rd = (left_eye_x, right_eye_y)
direction = 1
a = distance.euclidean(np.array(left_eye), np.array(point_3rd))
b = distance.euclidean(np.array(right_eye), np.array(point_3rd))
c = distance.euclidean(np.array(right_eye), np.array(left_eye))
if b != 0 and c != 0:
cos_a = (b * b + c * c - a * a) / (2 * b * c)
angle = np.arccos(cos_a)
angle = (angle * 180) / math.pi
if direction == -1:
angle = 90 - angle
else:
angle = 0
return angle
cnt_frame = 0 # Счетчик кадров
vt, pt = self.__mp_drawing._VISIBILITY_THRESHOLD, self.__mp_drawing._PRESENCE_THRESHOLD
hcs = [] # Набор экспертных признаков
bndbox_faces = [] # Области с лицами
# Получение 468 3D-ориентиров лица
with self.__mp_face_mesh.FaceMesh(
max_num_faces=1, # Максимальное количество лиц для обнаружения
# Необходимо ли дополнительно уточнять координаты ориентиров вокруг глаз и губ
# и выводить дополнительные ориентиры вокруг радужной оболочки
refine_landmarks=True,
# Минимальное значение достоверности из модели обнаружения лиц,
# при котором обнаружение считается успешным
min_detection_confidence=0.5,
# Минимальное значение достоверности из модели отслеживания ориентиров для того,
# чтобы ориентиры лиц считались успешно отслеженными
min_tracking_confidence=0.5,
) as face_mesh:
# Проход по всем кадрам видеопотока
while cap.isOpened():
_, frame = cap.read() # Захват, декодирование и возврат кадра
if frame is None:
break # Кадр не найден
if cnt_frame in idx_reduction_frames:
# Запись недоступна (увеличение производительности)
frame.flags.writeable = False
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = face_mesh.process(frame)
# Запись доступна
frame.flags.writeable = True
# Найдены 468 3D-ориентиров лица
if results.multi_face_landmarks:
# Проход по всем лицам
for idx_face, face_landmarks in enumerate(results.multi_face_landmarks):
idx_to_coors = {} # Координаты всех ориентиров лица
# Проход по всем ориентирам лица
for idx_landmark, lmk in enumerate(face_landmarks.landmark):
if (lmk.HasField("visibility") and lmk.visibility < vt) or (
lmk.HasField("presence") and lmk.presence < pt
):
continue
# Нормализация координат
norm_x = min(math.floor(lmk.x * width_video), width_video - 1)
norm_y = min(math.floor(lmk.y * height_video), height_video - 1)
norm_x = int(norm_x * reshape_img_coef)
norm_y = int(norm_y * reshape_img_coef)
# Добавление нормализованных координат ориентиров лица в словарь
idx_to_coors[idx_landmark] = (norm_x, norm_y)
# Вычисление ограничивающей рамки из ориентиров лица
x_min = np.min(np.asarray(list(idx_to_coors.values()))[:, 0])
y_min = np.min(np.asarray(list(idx_to_coors.values()))[:, 1])
x_max = np.max(np.asarray(list(idx_to_coors.values()))[:, 0])
y_max = np.max(np.asarray(list(idx_to_coors.values()))[:, 1])
# Коррекция ограничивающей рамки
start_x, start_y = (max(0, x_min), max(0, y_min))
end_x, end_y = (
min(width_video - 1, x_max),
min(height_video - 1, y_max),
)
# Область с лицом
bndbox_face = frame[
int(start_y / reshape_img_coef) : int(end_y / reshape_img_coef),
int(start_x / reshape_img_coef) : int(end_x / reshape_img_coef),
]
bndbox_face = Image.fromarray(bndbox_face)
bndbox_face = utils.preprocess_input(bndbox_face)
# 1) Координаты центра глаз
# 2) Текущие экспертные признаки
point_eyes, curr_seq_hc = [], []
# Вычисление центра глаз
for i in [[474, 476], [469, 471]]:
eye_x_min = min(idx_to_coors[i[0]][0], idx_to_coors[i[1]][0])
eye_y_min = min(idx_to_coors[i[0]][1], idx_to_coors[i[1]][1])
# Разница между yголками глаза
eye_x_diff = int(abs(idx_to_coors[i[0]][0] - idx_to_coors[i[1]][0]) / 2)
eye_y_diff = int(abs(idx_to_coors[i[0]][1] - idx_to_coors[i[1]][1]) / 2)
point_eyes.append(
[eye_x_min + eye_x_diff - x_min, eye_y_min + eye_y_diff - y_min]
)
curr_seq_hc.extend(
[eye_x_min + eye_x_diff - x_min, eye_y_min + eye_y_diff - y_min]
)
coords_left_eye = point_eyes[0] # Координата центра левого глаза
coords_right_eye = point_eyes[1] # Координата центра правого глаза
# Вычисление расстояния между центрами глаз
curr_seq_hc.append(distance.euclidean(coords_left_eye, coords_right_eye))
# Вычисление угла наклона головы
curr_seq_hc.append(alignment_procedure(coords_left_eye, coords_right_eye))
# Вычисление расстояния между центром левого глаза и его левым углом
curr_seq_hc.append(
distance.euclidean(
coords_left_eye,
np.asarray(idx_to_coors[263]) - np.asarray([x_min, y_min]),
)
)
# Вычисление расстояния между центром левого глаза и его правым углом
curr_seq_hc.append(
distance.euclidean(
coords_left_eye,
np.asarray(idx_to_coors[362]) - np.asarray([x_min, y_min]),
)
)
# Вычисление расстояния между центром правого глаза и его левым углом
curr_seq_hc.append(
distance.euclidean(
coords_right_eye,
np.asarray(idx_to_coors[133]) - np.asarray([x_min, y_min]),
)
)
# Вычисление расстояния между центром правого глаза и его правым углом
curr_seq_hc.append(
distance.euclidean(
coords_right_eye,
np.asarray(idx_to_coors[33]) - np.asarray([x_min, y_min]),
)
)
# Вычисление угла наклона уголков рта
curr_seq_hc.append(
alignment_procedure(
np.asarray(idx_to_coors[105]) - np.asarray([x_min, y_min]),
np.asarray(idx_to_coors[334]) - np.asarray([x_min, y_min]),
)
)
# Вычисление угла наклона бровей
curr_seq_hc.append(
alignment_procedure(
np.asarray(idx_to_coors[61]) - np.asarray([x_min, y_min]),
np.asarray(idx_to_coors[291]) - np.asarray([x_min, y_min]),
)
)
if lang == self.__lang_traslate[0]:
coords_face_mesh = self.__coords_face_mesh_mupta
couples_face_mesh = self.__couples_face_mesh_mupta
else:
coords_face_mesh = self.__coords_face_mesh_fi
couples_face_mesh = self.__couples_face_mesh_fi
for coord in coords_face_mesh:
curr_seq_hc.extend(
(
np.asarray(idx_to_coors[coord]) - np.asarray([x_min, y_min])
).tolist()
)
for cpl in couples_face_mesh:
curr_seq_hc.append(
distance.euclidean(
np.asarray(idx_to_coors[cpl[0]]) - np.asarray([x_min, y_min]),
np.asarray(idx_to_coors[cpl[1]]) - np.asarray([x_min, y_min]),
)
)
bndbox_faces.append(bndbox_face)
hcs.append(curr_seq_hc)
cnt_frame += 1
cap.release()
# Лицо не найдено не на одном кадре
if len(bndbox_faces) == 0:
self._error(self._faces_not_found, out=out)
return np.empty([]), np.empty([]), np.empty([])
hcs = np.asarray(hcs)
# Коды ошибок нейросетевой модели
code_error_pred_deep_fe = -1
batch_size_limit = 70
try:
# Отправка областей с лицами в нейросетевую модель для получения нейросетевых признаков
bndbox_faces = torch.from_numpy(np.vstack(bndbox_faces))
num_images = len(bndbox_faces)
if num_images > batch_size_limit:
all_extract_deep_fe = []
all_pred_emo = []
for i in range(0, num_images, batch_size_limit):
bndbox_subbatch = bndbox_faces[i : i + batch_size_limit].to(self._device)
pred_emo_sub, extract_deep_fe_sub = self._video_model_deep_fe(bndbox_subbatch)
extract_deep_fe_sub = extract_deep_fe_sub.detach().cpu()
pred_emo_sub = pred_emo_sub.detach().cpu()
all_extract_deep_fe.append(extract_deep_fe_sub)
all_pred_emo.append(pred_emo_sub)
extract_deep_fe = torch.cat(all_extract_deep_fe, dim=0)
pred_emo = torch.cat(all_pred_emo, dim=0)
else:
pred_emo, extract_deep_fe = self._video_model_deep_fe(bndbox_faces.to(self._device))
extract_deep_fe = extract_deep_fe.detach().cpu()
pred_emo = pred_emo.detach().cpu()
except TypeError:
code_error_pred_deep_fe = 1
except Exception:
code_error_pred_deep_fe = 2
if code_error_pred_deep_fe != -1:
self._error(self._model_video_deep_fe_not_formation, out=out)
return np.empty([]), np.empty([]), np.empty([])
# 1. Список с экспертными признаками
# 2. Список с нейросетевыми признаками
hc_features, nn_features, pred_emos = [], [], []
# Проход по всему набору экспертных и нейросетевых признаков
for idx_hc_nn in range(0, len(hcs) + 1, step):
last_idx__hc_nn = idx_hc_nn + window # ID последнего элемента в подвыборке
# Текущие подвыборки
curr_seq_nn = extract_deep_fe[idx_hc_nn:last_idx__hc_nn].numpy().tolist()
curr_pred_emos = pred_emo[idx_hc_nn:last_idx__hc_nn].numpy().tolist()
curr_seq_hc = hcs[idx_hc_nn:last_idx__hc_nn].tolist()
if len(curr_seq_nn) < window and len(curr_seq_nn) != 0:
curr_seq_hc.extend([curr_seq_hc[-1]] * (window - len(curr_seq_hc)))
curr_seq_nn.extend([curr_seq_nn[-1]] * (window - len(curr_seq_nn)))
curr_pred_emos.extend([curr_pred_emos[-1]] * (window - len(curr_pred_emos)))
if len(curr_seq_nn) != 0:
hc_features.append(curr_seq_hc)
nn_features.append(curr_seq_nn)
pred_emos.append(curr_pred_emos)
hc_features = stats.zscore(hc_features, axis=-1)
if last is False:
# Статистика извлеченных признаков из визуального сигнала
self._stat_visual_features(
last=last,
out=out,
len_hc_features=len(hc_features),
len_nn_features=len(nn_features),
shape_hc_features=np.array(hc_features[0]).shape,
shape_nn_features=np.array(nn_features[0]).shape,
fps_before=self._round_math(fps_cv2, out),
fps_after=self._round_math(reduction_fps, out),
)
return hc_features, np.asarray(nn_features), np.asarray(pred_emos)
finally:
if runtime:
self._r_end(out=out)
# ------------------------------------------------------------------------------------------------------------------
# Внешние методы
# ------------------------------------------------------------------------------------------------------------------
[docs]
def load_video_model_hc(
self, lang: str = "ru", show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам
Args:
lang (str): Язык
show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если нейросетевая архитектура модели сформирована, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_hc(
lang = 'en',
show_summary = False, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-10-25 16:37:43] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (видео модальность) ...
--- Время выполнения: 0.659 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_hc(
lang = 'en',
show_summary = 1, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2022-10-26 12:27:41] Неверные типы или значения аргументов в "Video.load_video_model_hc" ...
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
not isinstance(lang, str)
or lang not in self.__lang_traslate
or type(show_summary) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.load_video_model_hc.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
# Информационное сообщение
self._info(self._formation_video_model_hc, last=False, out=False)
if out:
self.show_notebook_history_output() # Отображение истории вывода сообщений в ячейке Jupyter
self._video_model_hc = video_model_hc(lang=lang)
if show_summary and out:
print(self._video_model_hc)
if runtime:
self._r_end(out=out)
return True
[docs]
def load_video_model_deep_fe(
self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Формирование нейросетевой архитектуры для получения нейросетевых признаков
Args:
show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если нейросетевая архитектура модели сформирована, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_deep_fe(
show_summary = True, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 12:22:54] Формирование нейросетевой архитектуры для получения нейросетевых признаков (видео модальность) ...
ResNet(
(conv_layer_s2_same): Conv2dSame(3, 64, kernel_size=(7, 7), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
(max_pool): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(layer1): Sequential(
(0): Bottleneck(
(conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(64, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer2): Sequential(
(0): Bottleneck(
(conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(3): Bottleneck(
(conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(128, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer3): Sequential(
(0): Bottleneck(
(conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(3): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(4): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(5): Bottleneck(
(conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(256, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(1024, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(layer4): Sequential(
(0): Bottleneck(
(conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(i_downsample): Sequential(
(0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)
(1): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
)
(relu): ReLU()
)
(1): Bottleneck(
(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
(2): Bottleneck(
(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm1): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=same, bias=False)
(batch_norm2): BatchNorm2d(512, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm3): BatchNorm2d(2048, eps=0.001, momentum=0.99, affine=True, track_running_stats=True)
(relu): ReLU()
)
)
(avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
(fc1): Linear(in_features=2048, out_features=512, bias=True)
(relu1): ReLU()
(fc2): Linear(in_features=512, out_features=7, bias=True)
)
--- Время выполнения: 0.222 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_deep_fe(
show_summary = 1, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2022-11-01 12:21:23] Неверные типы или значения аргументов в "Video.load_video_model_deep_fe" ...
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
type(show_summary) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.load_video_model_deep_fe.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
# Информационное сообщение
self._info(self._formation_video_deep_fe, last=False, out=False)
if out:
self.show_notebook_history_output() # Отображение истории вывода сообщений в ячейке Jupyter
self._video_model_deep_fe = ResNet50(7, channels=3)
if show_summary and out:
print(self._video_model_deep_fe)
if runtime:
self._r_end(out=out)
return True
[docs]
def load_video_model_nn(
self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам
Args:
show_summary (bool): Отображение сформированной нейросетевой архитектуры модели
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если нейросетевая архитектура модели сформирована, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_nn(
show_summary = True, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 12:49:36] Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам (видео модальность) ...
video_model_nn(
(lstm1): LSTM(512, 1024, batch_first=True)
(dropout1): Dropout(p=0.2, inplace=False)
(fc): Linear(in_features=1024, out_features=5, bias=True)
)
--- Время выполнения: 0.052 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_nn(
show_summary = 1, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2022-10-27 14:47:22] Неверные типы или значения аргументов в "Video.load_video_model_nn" ...
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
type(show_summary) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.load_video_model_nn.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
# Информационное сообщение
self._info(self._formation_video_model_nn, last=False, out=False)
if out:
self.show_notebook_history_output() # Отображение истории вывода сообщений в ячейке Jupyter
self._video_model_nn = video_model_nn()
if show_summary and out:
print(self._video_model_nn)
if runtime:
self._r_end(out=out)
return True
[docs]
def load_video_models_b5(
self, show_summary: bool = False, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств
Args:
show_summary (bool): Отображение последней сформированной нейросетевой архитектуры моделей
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если нейросетевые архитектуры модели сформированы, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_models_b5(
show_summary = True, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2024-10-09 13:12:19] Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств (видео модальность) ...
video_model_b5(
(fc): Linear(in_features=32, out_features=1, bias=True)
(sigmoid): Sigmoid()
)
--- Время выполнения: 0.009 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_models_b5(
show_summary = 1, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2022-11-04 15:30:15] Неверные типы или значения аргументов в "Video.load_video_models_b5" ...
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
type(show_summary) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.load_video_models_b5.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
# Информационное сообщение
self._info(self._formation_video_models_b5, last=False, out=False)
if out:
self.show_notebook_history_output() # Отображение истории вывода сообщений в ячейке Jupyter
for key, _ in self._video_models_b5.items():
self._video_models_b5[key] = self.__load_video_model_b5()
if show_summary and out:
print(self._video_models_b5[key])
if runtime:
self._r_end(out=out)
return True
[docs]
def load_video_model_weights_hc(
self, url: str, force_reload: bool = True, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Загрузка весов нейросетевой модели для получения оценок по экспертным признакам
Args:
url (str): Полный путь к файлу с весами нейросетевой модели
force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_hc(
lang = 'en',
show_summary = False, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-10-27 12:55:31] Формирование нейросетевой архитектуры модели для получения оценок по экспертным признакам (видео модальность) ...
--- Время выполнения: 0.606 сек. ---
True
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['hc']['googledisk']
video.load_video_model_weights_hc(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 13:06:56] Загрузка весов нейросетевой модели для получения оценок по экспертным признакам (видео модальность) ...
[2024-10-09 13:06:58] Загрузка файла "weights_2022-08-27_18-53-35.pth" 100.0% ...
--- Время выполнения: 2.49 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['hc']['googledisk']
video.load_video_model_weights_hc(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 13:07:56] Загрузка весов нейросетевой модели для получения оценок по экспертным признакам (видео модальность) ...
[2024-10-09 13:07:59] Загрузка файла "weights_2022-08-27_18-53-35.pth" 100.0% ...
[2024-10-09 13:07:59] Что-то пошло не так ... нейросетевая архитектура модели для получения оценок по экспертным признакам не сформирована (видео модальность) ...
--- Время выполнения: 2.381 сек. ---
False
"""
if runtime:
self._r_start()
if self.__load_model_weights(url, force_reload, self._load_video_model_weights_hc, out, False, run) is True:
try:
self._video_model_hc.load_state_dict(torch.load(self._url_last_filename, weights_only=True))
self._video_model_hc.to(self._device).eval()
except Exception:
self._error(self._model_video_hc_not_formation, out=out)
return False
else:
return True
finally:
if runtime:
self._r_end(out=out)
return False
[docs]
def load_video_model_weights_deep_fe(
self, url: str, force_reload: bool = True, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Загрузка весов нейросетевой модели для получения нейросетевых признаков
Args:
url (str): Полный путь к файлу с весами нейросетевой модели
force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_deep_fe(
show_summary = False, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-11-01 12:41:59] Формирование нейросетевой архитектуры для получения нейросетевых признаков (видео модальность) ...
--- Время выполнения: 1.306 сек. ---
True
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['fe']['googledisk']
video.load_video_model_weights_deep_fe(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 13:00:35] Загрузка весов нейросетевой модели для получения нейросетевых признаков (видео модальность) ...
[2024-10-09 13:00:41] Загрузка файла "weights_2022-11-01_12-27-07.pth" 100.0% ...
--- Время выполнения: 5.557 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['fe']['googledisk']
video.load_video_model_weights_deep_fe(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 13:01:48] Загрузка весов нейросетевой модели для получения нейросетевых признаков (видео модальность) ...
[2024-10-09 13:01:53] Загрузка файла "weights_2022-11-01_12-27-07.pth" 100.0% ...
[2024-10-09 13:01:53] Что-то пошло не так ... нейросетевая архитектура модели для получения нейросетевых признаков не сформирована (видео модальность) ...
--- Время выполнения: 4.712 сек. ---
False
"""
if runtime:
self._r_start()
if (
self.__load_model_weights(url, force_reload, self._load_video_model_weights_deep_fe, out, False, run)
is True
):
try:
self._video_model_deep_fe.load_state_dict(torch.load(self._url_last_filename, weights_only=True))
self._video_model_deep_fe.to(self._device).eval()
test_tensor = torch.randn((1, 3, 224, 224)).to(self._device)
_, _ = self._video_model_deep_fe(test_tensor)
except Exception:
self._error(self._model_video_deep_fe_not_formation, out=out)
return False
else:
return True
finally:
if runtime:
self._r_end(out=out)
return False
[docs]
def load_video_model_weights_nn(
self, url: str, force_reload: bool = True, out: bool = True, runtime: bool = True, run: bool = True
) -> bool:
"""Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам
Args:
url (str): Полный путь к файлу с весами нейросетевой модели
force_reload (bool): Принудительная загрузка файла с весами нейросетевой модели из сети
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если веса нейросетевой модели загружены, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_model_nn(
show_summary = False, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-10-27 15:17:13] Формирование нейросетевой архитектуры для получения оценок по нейросетевым признакам (видео модальность) ...
--- Время выполнения: 1.991 сек. ---
True
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['nn']['googledisk']
video.load_video_model_weights_nn(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 13:09:03] Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам (видео модальность) ...
[2024-10-09 13:09:08] Загрузка файла "weights_2022-03-22_16-31-48.pth" 100.0% ...
--- Время выполнения: 5.798 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url = video.weights_for_big5_['video']['fi']['nn']['googledisk']
video.load_video_model_weights_nn(
url = url,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 13:09:56] Загрузка весов нейросетевой модели для получения оценок по нейросетевым признакам (видео модальность) ...
[2024-10-09 13:10:02] Загрузка файла "weights_2022-03-22_16-31-48.pth" 100.0% ...
[2024-10-09 13:10:02] Что-то пошло не так ... нейросетевая архитектура модели для получения оценок по нейросетевым признакам не сформирована (видео модальность) ...
--- Время выполнения: 5.9 сек. ---
False
"""
if runtime:
self._r_start()
if self.__load_model_weights(url, force_reload, self._load_video_model_weights_nn, out, False, run) is True:
try:
self._video_model_nn.load_state_dict(torch.load(self._url_last_filename, weights_only=True))
self._video_model_nn.to(self._device).eval()
test_tensor = torch.randn((1, 10, 512)).to(self._device)
_, _ = self._video_model_nn(test_tensor)
except Exception:
self._error(self._model_video_nn_not_formation, out=out)
return False
else:
return True
finally:
if runtime:
self._r_end(out=out)
return False
[docs]
def load_video_models_weights_b5(
self,
url_openness: str,
url_conscientiousness: str,
url_extraversion: str,
url_agreeableness: str,
url_non_neuroticism: str,
force_reload: bool = True,
out: bool = True,
runtime: bool = True,
run: bool = True,
) -> bool:
"""Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств
Args:
url_openness (str): Полный путь к файлу с весами нейросетевой модели (открытость опыту)
url_conscientiousness (str): Полный путь к файлу с весами нейросетевой модели (добросовестность)
url_extraversion (str): Полный путь к файлу с весами нейросетевой модели (экстраверсия)
url_agreeableness (str): Полный путь к файлу с весами нейросетевой модели (доброжелательность)
url_non_neuroticism (str): Полный путь к файлу с весами нейросетевой модели (эмоциональная стабильность)
force_reload (bool): Принудительная загрузка файлов с весами нейросетевых моделей из сети
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если веса нейросетевых моделей загружены, в обратном случае **False**
.. dropdown:: Примеры
:class-body: sd-pr-5
:bdg-success:`Верно` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 1
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.load_video_models_b5(
show_summary = False, out = True,
runtime = True, run = True
)
.. output-cell::
:execution-count: 1
:linenos:
[2022-11-04 18:56:41] Формирование нейросетевых архитектур моделей для получения результатов оценки персональных качеств (видео модальность) ...
--- Время выполнения: 0.117 сек. ---
True
.. code-cell:: python
:execution-count: 2
:linenos:
:tab-width: 8
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url_openness = video.weights_for_big5_['video']['fi']['b5']['openness']['googledisk']
url_conscientiousness = video.weights_for_big5_['video']['fi']['b5']['conscientiousness']['googledisk']
url_extraversion = video.weights_for_big5_['video']['fi']['b5']['extraversion']['googledisk']
url_agreeableness = video.weights_for_big5_['video']['fi']['b5']['agreeableness']['googledisk']
url_non_neuroticism = video.weights_for_big5_['video']['fi']['b5']['non_neuroticism']['googledisk']
video.load_video_models_weights_b5(
url_openness = url_openness,
url_conscientiousness = url_conscientiousness,
url_extraversion = url_extraversion,
url_agreeableness = url_agreeableness,
url_non_neuroticism = url_non_neuroticism,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 2
:linenos:
[2024-10-09 13:14:48] Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств (видео модальность) ...
[2024-10-09 13:14:50] Загрузка файла "weights_2022-06-15_16-46-30.pth" 100.0% ... Открытость опыту
[2024-10-09 13:14:52] Загрузка файла "weights_2022-06-15_16-48-50.pth" 100.0% ... Добросовестность
[2024-10-09 13:14:55] Загрузка файла "weights_2022-06-15_16-54-06.pth" 100.0% ... Экстраверсия
[2024-10-09 13:14:57] Загрузка файла "weights_2022-06-15_17-02-03.pth" 100.0% ... Доброжелательность
[2024-10-09 13:15:00] Загрузка файла "weights_2022-06-15_17-06-15.pth" 100.0% ... Эмоциональная стабильность
--- Время выполнения: 11.832 сек. ---
True
:bdg-danger:`Ошибка` :bdg-light:`-- 1 --`
.. code-cell:: python
:execution-count: 3
:linenos:
:tab-width: 8
from oceanai.modules.lab.video import Video
video = Video()
video.path_to_save_ = './models'
video.chunk_size_ = 2000000
url_openness = video.weights_for_big5_['video']['fi']['b5']['openness']['googledisk']
url_conscientiousness = video.weights_for_big5_['video']['fi']['b5']['conscientiousness']['googledisk']
url_extraversion = video.weights_for_big5_['video']['fi']['b5']['extraversion']['googledisk']
url_agreeableness = video.weights_for_big5_['video']['fi']['b5']['agreeableness']['googledisk']
url_non_neuroticism = video.weights_for_big5_['video']['fi']['b5']['non_neuroticism']['googledisk']
video.load_video_models_weights_b5(
url_openness = url_openness,
url_conscientiousness = url_conscientiousness,
url_extraversion = url_extraversion,
url_agreeableness = url_agreeableness,
url_non_neuroticism = url_non_neuroticism,
force_reload = True,
out = True,
runtime = True,
run = True
)
.. output-cell::
:execution-count: 3
:linenos:
[2024-10-09 13:16:08] Загрузка весов нейросетевых моделей для получения результатов оценки персональных качеств (видео модальность) ...
[2024-10-09 13:16:10] Загрузка файла "weights_2022-06-15_16-46-30.pth" 100.0% ...
[2024-10-09 13:16:10] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Открытость опыту
Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/video.py
Линия: 3144
Метод: load_video_models_weights_b5
Тип ошибки: AttributeError
[2024-10-09 13:16:13] Загрузка файла "weights_2022-06-15_16-48-50.pth" 100.0% ...
[2024-10-09 13:16:13] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Добросовестность
Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/video.py
Линия: 3144
Метод: load_video_models_weights_b5
Тип ошибки: AttributeError
[2024-10-09 13:16:16] Загрузка файла "weights_2022-06-15_16-54-06.pth" 100.0% ...
[2024-10-09 13:16:16] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Экстраверсия
Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/video.py
Линия: 3144
Метод: load_video_models_weights_b5
Тип ошибки: AttributeError
[2024-10-09 13:16:19] Загрузка файла "weights_2022-06-15_17-02-03.pth" 100.0% ...
[2024-10-09 13:16:19] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Доброжелательность
Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/video.py
Линия: 3144
Метод: load_video_models_weights_b5
Тип ошибки: AttributeError
[2024-10-09 13:16:21] Загрузка файла "weights_2022-06-15_17-06-15.pth" 100.0% ...
[2024-10-09 13:16:21] Что-то пошло не так ... не удалось загрузить веса нейросетевой модели ... Эмоциональная стабильность
Файл: /Users/dl/@DmitryRyumin/Python/envs/OCEANAI/lib/python3.9/site-packages/oceanai/modules/lab/video.py
Линия: 3144
Метод: load_video_models_weights_b5
Тип ошибки: AttributeError
--- Время выполнения: 13.055 сек. ---
False
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
try:
# Проверка аргументов
if (
type(url_openness) is not str
or not url_openness
or type(url_conscientiousness) is not str
or not url_conscientiousness
or type(url_extraversion) is not str
or not url_extraversion
or type(url_agreeableness) is not str
or not url_agreeableness
or type(url_non_neuroticism) is not str
or not url_non_neuroticism
or type(force_reload) is not bool
or type(out) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.load_video_models_weights_b5.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
result_download_models = 0 # Все веса нейросетевых моделей по умолчанию загружены
# Информационное сообщение
self._info(self._load_video_models_weights_b5, last=False, out=out)
# Проход по всем URL с весами нейросетевых моделей
for cnt, url in enumerate(
[
(url_openness, self._b5["ru"][0]),
(url_conscientiousness, self._b5["ru"][1]),
(url_extraversion, self._b5["ru"][2]),
(url_agreeableness, self._b5["ru"][3]),
(url_non_neuroticism, self._b5["ru"][4]),
]
):
sections = urlparse(url[0]) # Парсинг URL адреса
try:
# URL файл невалидный
if sections.scheme == "":
raise requests.exceptions.InvalidURL
except requests.exceptions.InvalidURL:
url_norm = os.path.normpath(url[0])
try:
if os.path.isfile(url_norm) is False:
raise FileNotFoundError # Не файл
except FileNotFoundError:
self._other_error(
self._load_model_weights_error + " " + self._bold_wrapper(url[1].capitalize()), out=out
)
continue
except Exception:
self._other_error(self._unknown_err, out=out)
continue
else:
self._url_last_filename = url_norm
# Отображение истории вывода сообщений в ячейке Jupyter
if out:
self.show_notebook_history_output()
else:
try:
if force_reload is False:
clear_output(True)
# Загрузка файла из URL
res_download_file_from_url = self._download_file_from_url(
url=url[0], force_reload=force_reload, runtime=False, out=out, run=True
)
except Exception:
self._other_error(self._unknown_err, out=out)
continue
else:
# Файл загружен
if res_download_file_from_url != 200:
continue
try:
self._video_models_b5[self._b5["en"][cnt]].load_state_dict(
torch.load(self._url_last_filename, weights_only=True)
)
self._video_models_b5[self._b5["en"][cnt]].to(self._device).eval()
test_tensor = torch.randn((1, 32)).to(self._device)
_ = self._video_models_b5[self._b5["en"][cnt]](test_tensor)
except Exception:
self._other_error(
self._load_model_weights_error + " " + self._bold_wrapper(url[1].capitalize()), out=out
)
continue
else:
self._add_last_el_notebook_history_output(self._bold_wrapper(url[1].capitalize()))
result_download_models += 1
clear_output(True)
# Отображение истории вывода сообщений в ячейке Jupyter
if out:
self.show_notebook_history_output()
if runtime:
self._r_end(out=out)
if result_download_models != len(self._b5["ru"]):
return False
return True
[docs]
def get_visual_features(
self,
path: str,
reduction_fps: int = 5,
window: int = 10,
step: int = 5,
lang: str = "ru",
out: bool = True,
runtime: bool = True,
run: bool = True,
) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
"""Извлечение признаков из визуального сигнала
Args:
path (str): Путь к видеофайлу
reduction_fps (int): Понижение кадровой частоты
window (int): Размер окна сегмента сигнала (в кадрах)
step (int): Шаг сдвига окна сегмента сигнала (в кадрах)
lang (str): Язык
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
Tuple[np.ndarray, np.ndarray, np.ndarray]: Кортеж с тремя np.ndarray:
1. np.ndarray с экспертными признаками
2. np.ndarray с нейросетевыми признаками
3. np.ndarray с эмоциональными предсказаниями
:bdg-link-light:`Пример <../../user_guide/notebooks/Video-get_visual_features.ipynb>`
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
return self._get_visual_features(
path=path,
reduction_fps=reduction_fps,
window=window,
step=step,
lang=lang,
last=False,
out=out,
runtime=runtime,
run=run,
)
[docs]
def get_video_union_predictions(
self,
depth: int = 1,
recursive: bool = False,
reduction_fps: int = 5,
window: int = 10,
step: int = 5,
lang: str = "ru",
accuracy=True,
url_accuracy: str = "",
logs: bool = True,
out: bool = True,
runtime: bool = True,
run: bool = True,
) -> bool:
"""Получения прогнозов по видео
Args:
depth (int): Глубина иерархии для получения данных
recursive (bool): Рекурсивный поиск данных
reduction_fps (int): Понижение кадровой частоты
window (int): Размер окна сегмента сигнала (в кадрах)
step (int): Шаг сдвига окна сегмента сигнала (в кадрах)
lang (str): Язык
accuracy (bool): Вычисление точности
url_accuracy (str): Полный путь к файлу с верными предсказаниями для подсчета точности
logs (bool): При необходимости формировать LOG файл
out (bool): Отображение
runtime (bool): Подсчет времени выполнения
run (bool): Блокировка выполнения
Returns:
bool: **True** если прогнозы успешно получены, в обратном случае **False**
:bdg-link-light:`Пример <../../user_guide/notebooks/Video-get_video_union_predictions.ipynb>`
"""
self._clear_notebook_history_output() # Очистка истории вывода сообщений в ячейке Jupyter
# Сброс
self._df_files = pd.DataFrame() # Пустой DataFrame с данными
self._df_accuracy = pd.DataFrame() # Пустой DataFrame с результатами вычисления точности
try:
# Проверка аргументов
if (
type(depth) is not int
or depth < 1
or type(out) is not bool
or type(recursive) is not bool
or type(reduction_fps) is not int
or reduction_fps < 1
or type(window) is not int
or window < 1
or type(step) is not int
or step < 1
or not isinstance(lang, str)
or lang not in self.__lang_traslate
or type(accuracy) is not bool
or type(url_accuracy) is not str
or type(logs) is not bool
or type(runtime) is not bool
or type(run) is not bool
):
raise TypeError
except TypeError:
self._inv_args(__class__.__name__, self.get_video_union_predictions.__name__, out=out)
return False
else:
# Блокировка выполнения
if run is False:
self._error(self._lock_user, out=out)
return False
if runtime:
self._r_start()
try:
# Получение директорий, где хранятся данные
path_to_data = self._get_paths(self.path_to_dataset_, depth, out=out)
if type(path_to_data) is bool:
return False
if type(self.keys_dataset_) is not list:
raise TypeError
# Словарь для DataFrame набора данных с данными
self._dict_of_files = dict(zip(self.keys_dataset_, [[] for _ in range(0, len(self.keys_dataset_))]))
# Словарь для DataFrame набора данных с результатами вычисления точности
self._dict_of_accuracy = dict(
zip(self.keys_dataset_[1:], [[] for _ in range(0, len(self.keys_dataset_[1:]))])
)
except (TypeError, FileNotFoundError):
self._other_error(self._folder_not_found.format(self._info_wrapper(self.path_to_dataset_)), out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
# Вычисление точности
if accuracy is True:
get_video_union_predictions_info = self._get_union_predictions_info + self._get_accuracy_info
else:
get_video_union_predictions_info = self._get_union_predictions_info
get_video_union_predictions_info += self._video_modality
# Вычисление точности
if accuracy is True:
# Информационное сообщение
self._info(get_video_union_predictions_info, out=out)
if not url_accuracy:
url_accuracy = self._true_traits["sberdisk"]
try:
# Загрузка верных предсказаний
data_true_traits = pd.read_csv(url_accuracy)
except (FileNotFoundError, URLError, UnicodeDecodeError):
self._other_error(self._load_data_true_traits_error, out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
true_traits = []
self._del_last_el_notebook_history_output()
paths = [] # Пути до искомых файлов
# Проход по всем директориям
for curr_path in path_to_data:
empty = True # По умолчанию директория пустая
# Рекурсивный поиск данных
if recursive is True:
g = Path(curr_path).rglob("*")
else:
g = Path(curr_path).glob("*")
# Формирование словаря для DataFrame
for p in g:
try:
if type(self.ext_) is not list or len(self.ext_) < 1:
raise TypeError
self.ext_ = [x.lower() for x in self.ext_]
except TypeError:
self._other_error(self._wrong_ext, out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
# Расширение файла соответствует расширению искомых файлов
if p.suffix.lower() in self.ext_:
if empty is True:
empty = False # Каталог не пустой
paths.append(p.resolve())
try:
self.__len_paths = len(paths) # Количество искомых файлов
if self.__len_paths == 0:
raise TypeError
except TypeError:
self._other_error(self._files_not_found, out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
# Локальный путь
self.__local_path = lambda path: os.path.join(
*Path(path).parts[-abs((len(Path(path).parts) - len(Path(self.path_to_dataset_).parts))) :]
)
last = False # Замена последнего сообщения
with torch.no_grad():
# Проход по всем искомым файлов
for i, curr_path in enumerate(paths):
if i != 0:
last = True
# Индикатор выполнения
self._progressbar_union_predictions(
get_video_union_predictions_info,
i,
self.__local_path(curr_path),
self.__len_paths,
True,
last,
out,
)
# Извлечение признаков из визуального сигнала
hc_features, nn_features, _ = self._get_visual_features(
path=str(curr_path.resolve()),
reduction_fps=reduction_fps,
window=window,
step=step,
lang=lang,
last=True,
out=False,
runtime=False,
run=run,
)
# Признаки из акустического сигнала извлечены
if (
type(hc_features) is np.ndarray
and type(nn_features) is np.ndarray
and len(hc_features) > 0
and len(nn_features) > 0
):
# Коды ошибок нейросетевых моделей
code_error_pred_hc = -1
code_error_pred_nn = -1
try:
# Оправка экспертных признаков в нейросетевую модель
hc_features = torch.from_numpy(np.array(hc_features, dtype=np.float32))
pred_hc, _ = self.video_model_hc_(hc_features.to(self._device))
pred_hc = pred_hc.detach().cpu()
except TypeError:
code_error_pred_hc = 1
except Exception:
code_error_pred_hc = 2
try:
# Отправка нейросетевых признаков в нейросетевую модель
nn_features = torch.from_numpy(np.array(nn_features, dtype=np.float32))
pred_nn, _ = self.video_model_nn_(nn_features.to(self._device))
pred_nn = pred_nn.detach().cpu()
except TypeError:
code_error_pred_nn = 1
except Exception:
code_error_pred_nn = 2
if code_error_pred_hc != -1 and code_error_pred_nn != -1:
self._error(self._models_video_not_formation, out=out)
return False
if code_error_pred_hc != -1:
self._error(self._model_video_hc_not_formation, out=out)
return False
if code_error_pred_nn != -1:
self._error(self._model_video_nn_not_formation, out=out)
return False
# Конкатенация оценок по экспертным и нейросетевым признакам
union_pred = self.__concat_pred(pred_hc.numpy(), pred_nn.numpy(), out=out)
if len(union_pred) == 0:
return False
final_pred = []
for cnt, (name_b5, model) in enumerate(self.video_models_b5_.items()):
curr_union_pred = torch.from_numpy(np.expand_dims(union_pred[cnt], axis=0))
result = model(curr_union_pred.to(self._device)).detach().cpu().numpy()[0][0]
final_pred.append(result)
# Добавление данных в словарь для DataFrame
if self._append_to_list_of_files(str(curr_path.resolve()), final_pred, out) is False:
return False
# Вычисление точности
if accuracy is True:
try:
true_trait = (
data_true_traits[data_true_traits.NAME_VIDEO == curr_path.name][
list(self._b5["en"])
]
.values[0]
.tolist()
)
except IndexError:
self._other_error(self._expert_values_not_found, out=out)
return False
except Exception:
self._other_error(self._unknown_err, out=out)
return False
else:
true_traits.append(true_trait)
else:
# Добавление данных в словарь для DataFrame
if (
self._append_to_list_of_files(
str(curr_path.resolve()), [None] * len(self._b5["en"]), out
)
is False
):
return False
self._del_last_el_notebook_history_output()
# Индикатор выполнения
self._progressbar_union_predictions(
get_video_union_predictions_info,
self.__len_paths,
self.__local_path(paths[-1]),
self.__len_paths,
True,
last,
out,
)
# Отображение в DataFrame с данными
self._df_files = pd.DataFrame.from_dict(data=self._dict_of_files, orient="index").transpose()
self._df_files.index.name = self._keys_id
self._df_files.index += 1
self._df_files.index = self._df_files.index.map(str)
self._df_files.Path = [os.path.basename(i) for i in self._df_files.Path]
# Отображение
if out is True:
self._add_notebook_history_output(self._df_files.iloc[0 : self.num_to_df_display_, :])
# Подсчет точности
if accuracy is True:
mae_curr = []
for cnt, name_b5 in enumerate(self._df_files.keys().tolist()[1:]):
try:
mae_curr.append(
mean_absolute_error(
np.asarray(true_traits)[:, cnt], self._df_files[name_b5].to_list()
)
)
except IndexError:
continue
except Exception:
continue
mae_curr = [round(float(i), 4) for i in mae_curr]
mae_mean = round(float(np.mean(mae_curr)), 4)
accuracy_curr = [round(float(i), 4) for i in 1 - np.asarray(mae_curr)]
accuracy_mean = round(float(np.mean(accuracy_curr)), 4)
for curr_acc in [mae_curr, accuracy_curr]:
# Добавление данных в словарь для DataFrame с результатами вычисления точности
if self._append_to_list_of_accuracy(curr_acc, out) is False:
return False
self._dict_of_accuracy.update({self.__df_accuracy_mean: [mae_mean, accuracy_mean]})
# Отображение в DataFrame с данными
self._df_accuracy = pd.DataFrame.from_dict(
data=self._dict_of_accuracy, orient="index"
).transpose()
self._df_accuracy.index = self.__df_accuracy_index
self._df_accuracy.index.name = self.__df_accuracy_index_name
# Информационное сообщение
self._info(self._get_union_predictions_result, out=False)
# Отображение
if out is True:
self._add_notebook_history_output(self._df_accuracy.iloc[0 : self.num_to_df_display_, :])
self._info(
self._get_union_predictions_results_mean.format(
self._info_wrapper(str(mae_mean)), self._info_wrapper(str(accuracy_mean))
),
out=False,
)
clear_output(True)
# Отображение истории вывода сообщений в ячейке Jupyter
if out is True:
self.show_notebook_history_output()
if logs is True:
# Текущее время для лог-файла
# см. datetime.fromtimestamp()
curr_ts = str(datetime.now().timestamp()).replace(".", "_")
name_logs_file = self.get_video_union_predictions.__name__
# Сохранение LOG
res_save_logs_df_files = self._save_logs(
self._df_files, name_logs_file + "_df_files_" + curr_ts
)
# Подсчет точности
if accuracy is True:
# Сохранение LOG
res_save_logs_df_accuracy = self._save_logs(
self._df_accuracy, name_logs_file + "_df_accuracy_" + curr_ts
)
if res_save_logs_df_files is True:
# Сохранение LOG файла/файлов
if accuracy is True and res_save_logs_df_accuracy is True:
logs_s = self._logs_saves_true
else:
logs_s = self._logs_save_true
self._info_true(logs_s, out=out)
return True
finally:
if runtime:
self._r_end(out=out)