• Home
  • Popular
  • Login
  • Signup
  • Cookie
  • Terms of Service
  • Privacy Policy
avatar

Posted by User Bot


01 Dec, 2024

Updated at 05 Dec, 2024

Не работает нейрсеть на Python с библиотекой sklearn и Numpy

Мой школьный проект это нейросеть, способная распознавать цифры которые я рисую в paint, а затем загружаю в код. Проблема в том что когда я загружаю абсолютно любое изображение то всегда выдает символ 2. Подскажите как исправить, я уже другие библиотеки попробовал но в основном они не поддерживаются на моем ПК.Подскажите, что можно исправить, пожалуйста!

import os
import numpy as np
import struct
import gzip
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from PIL import Image, ImageEnhance

# Функция загрузки изображений
def load_images(filename, limit=None, new_size=(28, 28)):
    with gzip.open(filename, 'rb') as f:
        _, size, rows, cols = struct.unpack(">IIII", f.read(16))
        images = np.frombuffer(f.read(), dtype=np.uint8)
        if limit:
            images = images[:limit * rows * cols]
        images = images.reshape((limit or size, rows, cols))
        resized_images = [
            np.array(Image.fromarray(image).resize(new_size, Image.LANCZOS))
            for image in images
        ]
        return np.array(resized_images).reshape((limit or size, -1))

# Функция загрузки меток
def load_labels(filename, limit=None):
    with gzip.open(filename, 'rb') as f:
        _, size = struct.unpack(">II", f.read(8))
        labels = np.frombuffer(f.read(), dtype=np.uint8)
        return labels[:limit] if limit else labels

# Функция предобработки нового изображения
def preprocess_image(image_path, size=(28, 28)):
    image = Image.open(image_path).convert('L')
    image = ImageEnhance.Contrast(image).enhance(2)
    image = image.resize(size, Image.LANCZOS)
    return np.array(image).reshape(1, -1) / 255.0

# Загрузка данных
data_dir = r'C:\Work(Standart)\Personal Project\dataBase\gzip'
limit = 15000
X_train = load_images(os.path.join(data_dir, 'emnist-digits-train-images-idx3-ubyte.gz'), limit=limit)
y_train = load_labels(os.path.join(data_dir, 'emnist-digits-train-labels-idx1-ubyte.gz'), limit=limit)
X_test = load_images(os.path.join(data_dir, 'emnist-digits-test-images-idx3-ubyte.gz'))
y_test = load_labels(os.path.join(data_dir, 'emnist-digits-test-labels-idx1-ubyte.gz'))

# Разделение данных
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

# Стандартизация
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
X_test = scaler.transform(X_test)

# PCA
pca = PCA(n_components=97)
X_train = pca.fit_transform(X_train)
X_val = pca.transform(X_val)
X_test = pca.transform(X_test)

# Обучение модели с ядром 'rbf'
model = SVC(kernel='rbf', C=1.0, max_iter=1000)
model.fit(X_train, y_train)

# Оценка на валидационных данных
y_val_pred = model.predict(X_val)
val_accuracy = accuracy_score(y_val, y_val_pred)
print(f'Validation accuracy: {val_accuracy}')

# Оценка на тестовых данных
y_test_pred = model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_test_pred)
print(f'Test accuracy: {test_accuracy}')

# Пример использования модели
image_path = r"C:\Work(Standart)\Personal Project\testImages\TestSymbol4.png"
preprocessed_image = preprocess_image(image_path)
scaled_image = scaler.transform(preprocessed_image)
pca_transformed_image = pca.transform(scaled_image)
predicted_label = model.predict(pca_transformed_image)

print(f"Predicted symbol: {predicted_label[0]}")

# Проверка прогнозов на тестовых данных
test_predictions = model.predict(X_test)
print(f'Predicted labels for test data: {test_predictions[:10]}')
print(f'Actual labels for test data: {y_test[:10]}')