Как распознать цифры с изображения в Python: пошаговое руководство

Распознавание цифр с изображений — это ключевая задача в области компьютерного зрения и машинного обучения. Этот метод находит применение в различных областях, таких как банковские приложения (распознавание номеров чеков), анализ данных (оптическое распознавание символов), автоматизация обработки документов и многие другие.

В данной статье мы рассмотрим, как реализовать проект по распознаванию цифр с изображения с использованием Python. Мы будем использовать библиотеку OpenCV для предобработки изображений и TensorFlow для создания и обучения нейронной сети.

Требования и установка библиотек

Для выполнения поставленной задачи нам понадобятся следующие библиотеки: OpenCV, NumPy, и TensorFlow. Установить их можно с помощью команды pip.

pip install opencv-python-headless numpy tensorflow

Подготовка данных

Сбор данных

Прежде чем приступить к обработке изображений, нужно собрать данные. Вы можете использовать открытые датасеты, такие как MNIST, либо создать свой собственный набор изображений цифр. Важно, чтобы изображения были разнообразными и охватывали все возможные цифры от 0 до 9.

Предобработка изображений

Для повышения качества распознавания необходимо выполнить предобработку изображений. Это включает изменение размера, преобразование в градации серого и бинаризацию.

import cv2
import numpy as np

def preprocess_image(image_path: str) -> np.ndarray:
    """Предобработка изображения: изменение размера, преобразование в градации серого и бинаризация.

    Args:
        image_path (str): Путь к изображению.

    Returns:
        np.ndarray: Предобработанное изображение.
    """
    # Загрузка изображения
    image = cv2.imread(image_path)
    # Преобразование в градации серого
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # Изменение размера
    resized_image = cv2.resize(gray_image, (28, 28))
    # Бинаризация
    _, binary_image = cv2.threshold(resized_image, 128, 255, cv2.THRESH_BINARY_INV)
    return binary_image

# Пример использования функции
processed_image = preprocess_image('path/to/your/image.png')

Создание модели распознавания

Выбор архитектуры

Для распознавания цифр на изображениях часто используют сверточные нейронные сети (CNN). Они хорошо справляются с задачами распознавания объектов на изображениях благодаря использованию сверток.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

def build_model() -> Sequential:
    """Создание архитектуры CNN для распознавания цифр.

    Returns:
        Sequential: Обучаемая модель.
    """
    model = Sequential([
        Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
        MaxPooling2D((2, 2)),
        Conv2D(64, (3, 3), activation='relu'),
        MaxPooling2D((2, 2)),
        Flatten(),
        Dense(128, activation='relu'),
        Dense(10, activation='softmax')
    ])
    return model

Обучение модели

Создание модели — это только начало. Теперь нам нужно обучить её на основе собранных данных.

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

def train_model(model: Sequential) -> None:
    """Обучение модели на данных MNIST.

    Args:
        model (Sequential): Обучаемая модель.
    """
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255
    x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255
    y_train = to_categorical(y_train)
    y_test = to_categorical(y_test)

    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

# Пример использования функции
model = build_model()
train_model(model)

Тестирование и оценка модели

Для оценки модели используются различные метрики, такие как точность и полнота. Важно тестировать модель на отложенной выборке.

def evaluate_model(model: Sequential) -> None:
    """Оценка модели на тестовых данных MNIST.

    Args:
        model (Sequential): Модель для оценки.
    """
    (_, _), (x_test, y_test) = mnist.load_data()
    x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255
    y_test = to_categorical(y_test)

    loss, accuracy = model.evaluate(x_test, y_test)
    print(f'Test loss: {loss}')
    print(f'Test accuracy: {accuracy}')

# Пример использования функции
evaluate_model(model)

Использование модели для распознавания

После обучения и оценки мы можем использовать модель для распознавания цифр на новых изображениях.

def recognize_digit(image_path: str, model: Sequential) -> int:
    """Распознавание цифры на изображении с использованием обученной модели.

    Args:
        image_path (str): Путь к изображению.
        model (Sequential): Обученная модель.

    Returns:
        int: Распознанная цифра.
    """
    processed_image = preprocess_image(image_path)
    processed_image = processed_image.reshape(1, 28, 28, 1).astype('float32') / 255
    prediction = model.predict(processed_image)
    return np.argmax(prediction)

# Пример использования функции
print(recognize_digit('path/to/your/new_image.png', model))

Оптимизация и улучшение модели

Чтобы улучшить качество модели, можно использовать техники дообучения и аугментации данных. Аугментация включает вращение, сдвиг, масштабирование и отражение изображений, что помогает улучшить обобщающую способность модели.

from tensorflow.keras.preprocessing.image import ImageDataGenerator


def augment_data():
    """Аугментация данных для увеличения и разнообразия тренировочного набора."""
    datagen = ImageDataGenerator(
        rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, zoom_range=0.1
    )
    return datagen


# Использовать datagen.flow() при обучении модели
datagen = augment_data()
model.fit(
    datagen.flow(x_train, y_train, batch_size=32),
    epochs=5,
    validation_data=(x_test, y_test),
)

Заключение

Мы рассмотрели, как создать систему распознавания цифр с изображений с использованием Python и различных библиотек. Этот проект можно расширить, добавив больше функциональности, например, интегрировав его в веб-приложение или создав API для обработки изображений.

Дополнительные ресурсы для углубленного изучения темы включают официальные документации TensorFlow и OpenCV, курсы по ML и компьютерному зрению.


Добавить комментарий