Files
AIM_PIbd-31_Egorov_M.A/lab9/lab9.ipynb
2025-08-27 16:54:52 +04:00

2.4 MiB
Raw Blame History

Начало лабораторной

В данной лабораторной используется набор данных с классификацией персонажей из Скуби-Ду

В наборе данных 5 классов: Дафна, Фред, Скуби, Шегги и Велма

Ссылка: https://www.kaggle.com/datasets/esmanurdeli/scooby-doo-classification-dataset?resource=download

Задача: классификации персонажей из Скуби-Ду

Загрузка изображений (Отображение первых 10-ти)

In [3]:
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt

def load_images_from_folder(folder, target_size=(512, 512)):
    images = []
    labels = []
    for label in os.listdir(folder):
        if label in ['Daphne', 'Fred', 'Scooby', 'Shaggy', 'Velma']:
            label_folder = os.path.join(folder, label)
            if os.path.isdir(label_folder):
                for filename in os.listdir(label_folder):
                    img_path = os.path.join(label_folder, filename)
                    img = cv2.imread(img_path)
                    if img is not None:
                        # Изменяем размер изображения
                        img_resized = cv2.resize(img, target_size)
                        images.append(img_resized)
                        labels.append(label)
    return images, labels

# Путь к папке с изображениями
folder_path = "C://AIM//static//csv//dataset"
images, labels = load_images_from_folder(folder_path)

# Ограничиваем вывод до первых 10 изображений
num_images_to_display = min(10, len(images))  # выводим максимум 10 изображений

# Вывод изображений для визуализации
if images:
    cols = 4  # Количество столбцов в сетке
    rows = num_images_to_display // cols + (num_images_to_display % cols > 0)  # Вычисляем количество строк

    plt.figure(figsize=(15, 5 * rows))  # Настраиваем фигуру для отображения
    for i in range(num_images_to_display):
        plt.subplot(rows, cols, i + 1)
        plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
        plt.axis('off')
    plt.tight_layout()
    plt.show()

# Преобразование в массивы
images = np.array(images)  
labels = np.array(labels)
No description has been provided for this image
In [2]:
pip install opencv-python
Collecting opencv-python
  Downloading opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl.metadata (19 kB)
Requirement already satisfied: numpy<2.3.0,>=2 in c:\aim\aimenv\lib\site-packages (from opencv-python) (2.1.3)
Downloading opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl (39.0 MB)
   ---------------------------------------- 0.0/39.0 MB ? eta -:--:--
   ---------------------------------------- 0.3/39.0 MB ? eta -:--:--
   -- ------------------------------------- 2.1/39.0 MB 6.9 MB/s eta 0:00:06
   --- ------------------------------------ 3.7/39.0 MB 7.3 MB/s eta 0:00:05
   ---- ----------------------------------- 4.7/39.0 MB 7.0 MB/s eta 0:00:05
   ------ --------------------------------- 6.0/39.0 MB 6.7 MB/s eta 0:00:05
   ------- -------------------------------- 7.1/39.0 MB 6.5 MB/s eta 0:00:05
   -------- ------------------------------- 8.4/39.0 MB 6.5 MB/s eta 0:00:05
   --------- ------------------------------ 9.7/39.0 MB 6.4 MB/s eta 0:00:05
   ----------- ---------------------------- 11.0/39.0 MB 6.4 MB/s eta 0:00:05
   ------------ --------------------------- 12.6/39.0 MB 6.4 MB/s eta 0:00:05
   -------------- ------------------------- 13.9/39.0 MB 6.4 MB/s eta 0:00:04
   --------------- ------------------------ 15.2/39.0 MB 6.4 MB/s eta 0:00:04
   ---------------- ----------------------- 16.5/39.0 MB 6.4 MB/s eta 0:00:04
   ------------------ --------------------- 18.1/39.0 MB 6.4 MB/s eta 0:00:04
   ------------------- -------------------- 19.4/39.0 MB 6.5 MB/s eta 0:00:04
   --------------------- ------------------ 20.7/39.0 MB 6.5 MB/s eta 0:00:03
   ---------------------- ----------------- 22.3/39.0 MB 6.5 MB/s eta 0:00:03
   ------------------------ --------------- 23.6/39.0 MB 6.5 MB/s eta 0:00:03
   ------------------------- -------------- 25.2/39.0 MB 6.6 MB/s eta 0:00:03
   --------------------------- ------------ 26.5/39.0 MB 6.6 MB/s eta 0:00:02
   ---------------------------- ----------- 27.8/39.0 MB 6.6 MB/s eta 0:00:02
   ------------------------------ --------- 29.4/39.0 MB 6.6 MB/s eta 0:00:02
   ------------------------------- -------- 30.7/39.0 MB 6.6 MB/s eta 0:00:02
   --------------------------------- ------ 32.2/39.0 MB 6.6 MB/s eta 0:00:02
   ---------------------------------- ----- 33.6/39.0 MB 6.6 MB/s eta 0:00:01
   ------------------------------------ --- 35.1/39.0 MB 6.6 MB/s eta 0:00:01
   ------------------------------------- -- 36.7/39.0 MB 6.7 MB/s eta 0:00:01
   -------------------------------------- - 38.0/39.0 MB 6.7 MB/s eta 0:00:01
   ---------------------------------------- 39.0/39.0 MB 6.6 MB/s eta 0:00:00
Installing collected packages: opencv-python
Successfully installed opencv-python-4.12.0.88
Note: you may need to restart the kernel to use updated packages.
[notice] A new release of pip is available: 24.2 -> 25.2
[notice] To update, run: python.exe -m pip install --upgrade pip

Применение методов предобработки изображений (пример для первого изображения)

код включает несколько этапов предобработки изображений, таких как изменение размера, преобразование в оттенки серого и увеличение контраста

In [4]:
import cv2
import numpy as np
import matplotlib.pyplot as plt

def preprocess_images(images):
    processed_images = []
    for img in images:
        # Изменение размера
        img_resized = cv2.resize(img, (128, 128))
        # Преобразование в оттенки серого
        img_gray = cv2.cvtColor(img_resized, cv2.COLOR_BGR2GRAY)
        # Увеличение контраста с помощью выравнивания гистограммы
        img_eq = cv2.equalizeHist(img_gray)
        processed_images.append(img_eq)
    return np.array(processed_images)

# Применяем обработку к набору изображений
processed_images = preprocess_images(images)

# Отображаем только одно изображение из обработанного набора
def display_single_image(original, processed, index):
    plt.figure(figsize=(10, 5))
    
    # Отображение оригинального изображения
    plt.subplot(1, 2, 1)
    plt.imshow(cv2.cvtColor(original[index], cv2.COLOR_BGR2RGB))
    plt.title('Оригинальное изображение')
    plt.axis('off')

    # Отображение обработанного изображения
    plt.subplot(1, 2, 2)
    plt.imshow(processed[index], cmap='gray')
    plt.title('Обработанное изображение')
    plt.axis('off')

    plt.show()

index = 0  
display_single_image(images, processed_images, index)
No description has been provided for this image

Проверка фильтрации и восстановления изображений (пример для первого изображения)

Код включает в себя:

  • Удаления шумов с помощью размытия Гаусса.

  • Повышения резкости изображения с помощью ядра.

  • Определения границ с использованием алгоритма Canny.

In [5]:
import cv2
import numpy as np
import matplotlib.pyplot as plt

def apply_filters(img):
    # Удаление шумов
    img_blur = cv2.GaussianBlur(img, (5, 5), 0)
    # Повышение резкости
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
    img_sharp = cv2.filter2D(img_blur, -1, kernel)
    # Определение границ
    img_edges = cv2.Canny(img_sharp, 100, 200)
    return img_edges

def preprocess_images(images):
    processed_images = []
    for img in images:
        # Изменение размера
        img_resized = cv2.resize(img, (128, 128))
        # Преобразование в оттенки серого
        img_gray = cv2.cvtColor(img_resized, cv2.COLOR_BGR2GRAY)
        # Увеличение контраста с помощью выравнивания гистограммы
        img_eq = cv2.equalizeHist(img_gray)
        processed_images.append(img_eq)
    return np.array(processed_images)


# Выполнение предобработки изображений
processed_images = preprocess_images(images)

# Применяем фильтры к каждому изображению
filtered_images = np.array([apply_filters(img) for img in processed_images])

# Функция для отображения одного изображения
def display_single_image(original, processed, index):
    plt.figure(figsize=(10, 5))
    
    # Отображение оригинального изображения
    plt.subplot(1, 2, 1)
    plt.imshow(cv2.cvtColor(original[index], cv2.COLOR_BGR2RGB))
    plt.title('Оригинальное изображение')
    plt.axis('off')

    # Отображение обработанного изображения
    plt.subplot(1, 2, 2)
    plt.imshow(processed[index], cmap='gray')
    plt.title('Обработанное изображение')
    plt.axis('off')

    plt.show()

index = 0  
display_single_image(images, filtered_images, index)
No description has been provided for this image

Извлечение признаков

код включает функции для извлечения цветовых и текстурных признаков. извлечение среднего значения, стандартного отклонения и гистограммы для каждого цветового канала, а также характеристики Харалика для текстур

In [8]:
import os
import cv2
import numpy as np
import mahotas
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix

def load_images_from_folder(folder):
    images = []
    labels = []
    for label in os.listdir(folder):
        label_folder = os.path.join(folder, label)
        if os.path.isdir(label_folder):
            for filename in os.listdir(label_folder):
                img_path = os.path.join(label_folder, filename)
                img = cv2.imread(img_path)
                if img is not None:
                    img = cv2.resize(img, (512, 512))  
                    images.append(img)
                    labels.append(label)
    return images, labels

def extract_color_features(img):
    color_features = []
    for i in range(3):  # Для каждого канала B, G, R
        channel = img[:, :, i]
        mean = np.mean(channel)
        stddev = np.std(channel)
        hist = cv2.calcHist([channel], [0], None, [256], [0, 256]).flatten()
        color_features.extend([mean, stddev])
        color_features.extend(hist)
    return np.array(color_features)

def extract_texture_features(img):
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    haralick_features = mahotas.features.haralick(gray_img).mean(axis=0)
    return haralick_features

def extract_features(images):
    features = []
    for img in images:
        color_features = extract_color_features(img)
        texture_features = extract_texture_features(img)
        combined_features = np.hstack([color_features, texture_features])
        features.append(combined_features)
    return np.array(features)


data_folder = "C://AIM//static//csv//dataset"  
images, labels = load_images_from_folder(data_folder)

# Извлечение признаков для всех загруженных изображений
features_array = extract_features(images)

# Преобразование меток в массив NumPy
labels_array = np.array(labels)

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(features_array, labels_array, test_size=0.2, random_state=42)

# Обучение классификатора SVM
clf = SVC(kernel='linear')
clf.fit(X_train, y_train)

# Предсказание на тестовых данных
y_pred = clf.predict(X_test)

# Оценка результата
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
[[5 2 0 0 0]
 [6 3 0 2 1]
 [2 1 6 1 0]
 [2 2 0 4 1]
 [0 3 0 1 3]]
              precision    recall  f1-score   support

      Daphne       0.33      0.71      0.45         7
        Fred       0.27      0.25      0.26        12
      Scooby       1.00      0.60      0.75        10
      Shaggy       0.50      0.44      0.47         9
       Velma       0.60      0.43      0.50         7

    accuracy                           0.47        45
   macro avg       0.54      0.49      0.49        45
weighted avg       0.54      0.47      0.48        45

In [7]:
pip install mahotas
Collecting mahotas
  Downloading mahotas-1.4.18-cp312-cp312-win_amd64.whl.metadata (14 kB)
Requirement already satisfied: numpy in c:\aim\aimenv\lib\site-packages (from mahotas) (2.1.3)
Downloading mahotas-1.4.18-cp312-cp312-win_amd64.whl (1.7 MB)
   ---------------------------------------- 0.0/1.7 MB ? eta -:--:--
   ------ --------------------------------- 0.3/1.7 MB ? eta -:--:--
   ---------------------------------------- 1.7/1.7 MB 6.3 MB/s eta 0:00:00
Installing collected packages: mahotas
Successfully installed mahotas-1.4.18
Note: you may need to restart the kernel to use updated packages.
[notice] A new release of pip is available: 24.2 -> 25.2
[notice] To update, run: python.exe -m pip install --upgrade pip

Обучение модели (дублирование из извлечения признаков)

In [9]:
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix

data_folder = "C://AIM//static//csv//dataset"  
images, labels = load_images_from_folder(data_folder)
features_array = extract_features(images)  

# Преобразование меток в массив NumPy
labels_array = np.array(labels)

# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(features_array, labels_array, test_size=0.2, random_state=42)

# Стандартизируем данные
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Обучаем классификатор SVM
model = SVC(kernel='linear', C=1)
model.fit(X_train, y_train)

# Предсказание на тестовых данных
y_pred = model.predict(X_test)

# Оценка качества
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
[[5 2 0 0 0]
 [6 3 0 3 0]
 [1 1 7 1 0]
 [2 2 0 4 1]
 [1 2 0 1 3]]
              precision    recall  f1-score   support

      Daphne       0.33      0.71      0.45         7
        Fred       0.30      0.25      0.27        12
      Scooby       1.00      0.70      0.82        10
      Shaggy       0.44      0.44      0.44         9
       Velma       0.75      0.43      0.55         7

    accuracy                           0.49        45
   macro avg       0.57      0.51      0.51        45
weighted avg       0.56      0.49      0.50        45

Решение задачи аугментации данных для 10 случайных изображений

In [14]:
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, confusion_matrix

def extract_color_features(img):
    color_features = []
    
    # Если изображение черно-белое (1 канал)
    if img.shape[-1] == 1:
        channel = img[:, :, 0]
        mean = np.mean(channel)
        stddev = np.std(channel)
        color_features.extend([mean, stddev])
    else:
        # Обрабатываем цветное изображение с 3 каналами (B, G, R)
        for i in range(3):
            channel = img[:, :, i]
            mean = np.mean(channel)
            stddev = np.std(channel)
            color_features.extend([mean, stddev])
    
    return np.array(color_features)

def extract_texture_features(img):
    return np.random.rand(5) 

def augment_data(images, labels):
    datagen = ImageDataGenerator(rotation_range=10,
                                 width_shift_range=0.1,
                                 height_shift_range=0.1,
                                 shear_range=0.1,
                                 zoom_range=0.1,
                                 horizontal_flip=True,
                                 fill_mode='nearest')

    augmented_images = []
    augmented_labels = []
    
    labels = np.array(labels)  # Преобразуем метки в numpy-массив
    
    for label in np.unique(labels):
        label_images = images[labels == label]
        if len(label_images) == 0:
            continue  # Пропускаем класс без изображений
        
        for img in label_images:
            if len(img.shape) == 2:  # Если чёрно-белое изображение
                img = np.expand_dims(img, axis=-1)  # (H, W) → (H, W, 1)
            
            img = img.reshape((1,) + img.shape)  # (1, H, W, C)
            for _ in range(10):  # Генерируем 10 аугментированных копий
                aug_iter = datagen.flow(img, batch_size=1)
                aug_img = next(aug_iter)[0].astype(np.uint8)
                augmented_images.append(aug_img.squeeze())  # Убираем лишние размерности
                augmented_labels.append(label)
    
    if len(augmented_images) == 0 or len(augmented_labels) == 0:
        raise ValueError("Ошибка: после аугментации нет изображений или меток.")
    
    return np.array(augmented_images), np.array(augmented_labels)

# Проверка входных данных
if len(processed_images) == 0 or len(labels) == 0:
    raise ValueError("Ошибка: входные данные пусты.")

# Аугментация данных
augmented_images, augmented_labels = augment_data(processed_images, labels)
print(f"Количество аугментированных изображений: {len(augmented_images)}")

# Извлечение признаков
augmented_features = []
for img in augmented_images:
    if len(img.shape) == 2:  # Чёрно-белые изображения
        img = np.expand_dims(img, axis=-1)  # (H, W) → (H, W, 1)
    
    color_features = extract_color_features(img)
    texture_features = extract_texture_features(img)
    combined_features = np.hstack([color_features, texture_features])
    
    augmented_features.append(combined_features)

augmented_features = np.array(augmented_features)
print(f"Размерность признаков: {augmented_features.shape}")

# Проверка признаков перед обучением
if len(augmented_features) == 0:
    raise ValueError("Ошибка: отсутствуют признаки для обучения.")

# Разделение данных
X_aug_train, X_aug_test, y_aug_train, y_aug_test = train_test_split(
    augmented_features, augmented_labels, test_size=0.1, random_state=42)

# Масштабирование признаков
scaler = StandardScaler()
X_aug_train = scaler.fit_transform(X_aug_train)
X_aug_test = scaler.transform(X_aug_test)

# Обучение модели (указываем, что модель должна быть определена заранее)
model.fit(X_aug_train, y_aug_train)

# Оценка качества модели
y_aug_pred = model.predict(X_aug_test)
print("Отчет по классификации:")
print(classification_report(y_aug_test, y_aug_pred))
print("Матрица ошибок:")
print(confusion_matrix(y_aug_test, y_aug_pred))
Количество аугментированных изображений: 2210
Размерность признаков: (2210, 7)
Отчет по классификации:
              precision    recall  f1-score   support

      Daphne       0.29      0.48      0.36        54
        Fred       0.12      0.02      0.03        52
      Scooby       0.34      0.37      0.35        30
      Shaggy       0.37      0.60      0.46        55
       Velma       0.00      0.00      0.00        30

    accuracy                           0.32       221
   macro avg       0.22      0.29      0.24       221
weighted avg       0.24      0.32      0.26       221

Матрица ошибок:
[[26  0  4 24  0]
 [20  1  8 23  0]
 [13  2 11  4  0]
 [16  3  3 33  0]
 [16  2  6  6  0]]
c:\AIM\aimenv\Lib\site-packages\sklearn\metrics\_classification.py:1731: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
c:\AIM\aimenv\Lib\site-packages\sklearn\metrics\_classification.py:1731: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
c:\AIM\aimenv\Lib\site-packages\sklearn\metrics\_classification.py:1731: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
In [12]:
pip install tensorflow
Requirement already satisfied: tensorflow in c:\aim\aimenv\lib\site-packages (2.20.0)
Requirement already satisfied: absl-py>=1.0.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (2.3.1)
Requirement already satisfied: astunparse>=1.6.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (1.6.3)
Requirement already satisfied: flatbuffers>=24.3.25 in c:\aim\aimenv\lib\site-packages (from tensorflow) (25.2.10)
Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\aim\aimenv\lib\site-packages (from tensorflow) (0.6.0)
Requirement already satisfied: google_pasta>=0.1.1 in c:\aim\aimenv\lib\site-packages (from tensorflow) (0.2.0)
Requirement already satisfied: libclang>=13.0.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (18.1.1)
Requirement already satisfied: opt_einsum>=2.3.2 in c:\aim\aimenv\lib\site-packages (from tensorflow) (3.4.0)
Requirement already satisfied: packaging in c:\aim\aimenv\lib\site-packages (from tensorflow) (24.2)
Requirement already satisfied: protobuf>=5.28.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (6.32.0)
Requirement already satisfied: requests<3,>=2.21.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (2.32.5)
Requirement already satisfied: setuptools in c:\aim\aimenv\lib\site-packages (from tensorflow) (80.9.0)
Requirement already satisfied: six>=1.12.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (1.16.0)
Requirement already satisfied: termcolor>=1.1.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (3.1.0)
Requirement already satisfied: typing_extensions>=3.6.6 in c:\aim\aimenv\lib\site-packages (from tensorflow) (4.13.2)
Requirement already satisfied: wrapt>=1.11.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (1.17.3)
Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\aim\aimenv\lib\site-packages (from tensorflow) (1.74.0)
Requirement already satisfied: tensorboard~=2.20.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (2.20.0)
Requirement already satisfied: keras>=3.10.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (3.11.3)
Requirement already satisfied: numpy>=1.26.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (2.1.3)
Requirement already satisfied: h5py>=3.11.0 in c:\aim\aimenv\lib\site-packages (from tensorflow) (3.14.0)
Requirement already satisfied: ml_dtypes<1.0.0,>=0.5.1 in c:\aim\aimenv\lib\site-packages (from tensorflow) (0.5.3)
Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\aim\aimenv\lib\site-packages (from astunparse>=1.6.0->tensorflow) (0.45.1)
Requirement already satisfied: rich in c:\aim\aimenv\lib\site-packages (from keras>=3.10.0->tensorflow) (14.1.0)
Requirement already satisfied: namex in c:\aim\aimenv\lib\site-packages (from keras>=3.10.0->tensorflow) (0.1.0)
Requirement already satisfied: optree in c:\aim\aimenv\lib\site-packages (from keras>=3.10.0->tensorflow) (0.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in c:\aim\aimenv\lib\site-packages (from requests<3,>=2.21.0->tensorflow) (3.4.3)
Requirement already satisfied: idna<4,>=2.5 in c:\aim\aimenv\lib\site-packages (from requests<3,>=2.21.0->tensorflow) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in c:\aim\aimenv\lib\site-packages (from requests<3,>=2.21.0->tensorflow) (2.4.0)
Requirement already satisfied: certifi>=2017.4.17 in c:\aim\aimenv\lib\site-packages (from requests<3,>=2.21.0->tensorflow) (2025.4.26)
Requirement already satisfied: markdown>=2.6.8 in c:\aim\aimenv\lib\site-packages (from tensorboard~=2.20.0->tensorflow) (3.8.2)
Requirement already satisfied: pillow in c:\aim\aimenv\lib\site-packages (from tensorboard~=2.20.0->tensorflow) (11.0.0)
Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\aim\aimenv\lib\site-packages (from tensorboard~=2.20.0->tensorflow) (0.7.2)
Requirement already satisfied: werkzeug>=1.0.1 in c:\aim\aimenv\lib\site-packages (from tensorboard~=2.20.0->tensorflow) (3.1.3)
Requirement already satisfied: MarkupSafe>=2.1.1 in c:\aim\aimenv\lib\site-packages (from werkzeug>=1.0.1->tensorboard~=2.20.0->tensorflow) (3.0.2)
Requirement already satisfied: markdown-it-py>=2.2.0 in c:\aim\aimenv\lib\site-packages (from rich->keras>=3.10.0->tensorflow) (4.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\aim\aimenv\lib\site-packages (from rich->keras>=3.10.0->tensorflow) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in c:\aim\aimenv\lib\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.10.0->tensorflow) (0.1.2)
Note: you may need to restart the kernel to use updated packages.
[notice] A new release of pip is available: 24.2 -> 25.2
[notice] To update, run: python.exe -m pip install --upgrade pip

Можно сделать вывод, что модель имеет проблемы с прогнозированием классов:

Значения точности колеблются от 0.00 до 0.37, что указывает на то, что модель не всегда точно предсказывает классы.

Показатели полноты также колеблются, причем наименьший результат показывает "Velma" (0.00), что означает, что модель не распознает этот класс

Общая точность модели составляет 0.24 или 24%, что говорит о том, что модель очень часто ошибается.