Для классификации бинарных изображений фигур (например, круги, квадраты, треугольники) можно использовать различные методы, начиная от классических методов обработки изображений до современных нейронных сетей. Рассмотрим основные подходы:
a. Извлечение признаков
import cv2
import numpy as np
# Загрузка бинарного изображения
image = cv2.imread('shape.png', cv2.IMREAD_GRAYSCALE)
# Нахождение контуров
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
# Вычисление моментов
moments = cv2.moments(contour)
# Вычисление моментов Ху
hu_moments = cv2.HuMoments(moments)
print("Hu Moments:", hu_moments)
a. Простая нейронная сеть
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# Пример данных и меток
X = np.array([...]) # Векторизованные изображения (например, 28x28 пикселей, преобразованные в 784-мерный вектор)
y = np.array([...]) # Метки классов (например, 0 для круга, 1 для квадрата и т.д.)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Создание модели MLP
model = Sequential([
Flatten(input_shape=(28, 28)), # Преобразование 2D-изображений в 1D-векторы
Dense(128, activation='relu'),
Dense(3, activation='softmax') # Предполагаем 3 класса: круг, квадрат, треугольник
])
# Компиляция модели
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Обучение модели
model.fit(X_train, y_train, epochs=10, validation_split=0.2)
# Оценка модели
loss, accuracy = model.evaluate(X_test, y_test)
print("Accuracy:", accuracy)
Использование предобученных моделей, таких как VGG, ResNet и других, и дообучение их на данных с бинарными изображениями фигур.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input
# Пример данных и меток
X = np.array([...]) # Векторизованные изображения (например, 224x224 пикселей)
y = np.array([...]) # Метки классов (например, 0 для круга, 1 для квадрата и т.д.)
# Преобразование данных
X = preprocess_input(X)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Загрузка предобученной модели ResNet50 без верхнего слоя
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Создание модели с Transfer Learning
model = Sequential([
base_model,
Flatten(),
Dense(128, activation='relu'),
Dense(3, activation='softmax') # Предполагаем 3 класса: круг, квадрат, треугольник
])
# Компиляция модели
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Обучение модели
model.fit(X_train, y_train, epochs=10, validation_split=0.2)
# Оценка модели
loss, accuracy = model.evaluate(X_test, y_test)
print("Accuracy:", accuracy)
Каждый из этих подходов имеет свои преимущества и недостатки, и выбор метода зависит от сложности задачи, объема данных и доступных вычислительных ресурсов.