📌 Как можно классифицировать бинарные картинки фигур ?



💬 Спрашивают в 14% собеседований



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



1️⃣ Классические методы обработки изображений



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



Контуры: Извлечение контуров с помощью алгоритма Кэнни или других методов и анализ формы.



Моменты изображений: Вычисление моментов изображения, таких как моменты Ху, которые описывают форму объекта.



Формальные дескрипторы: Использование различных дескрипторов формы, таких как Fourier Descriptors или Zernike Moments.



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)




2️⃣ Современные методы с использованием нейронных сетей



a. Простая нейронная сеть



MLP (Multi-Layer Perceptron): Прямая нейронная сеть для классификации изображений.



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)




3️⃣ Transfer Learning



Использование предобученных моделей, таких как 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)




Каждый из этих подходов имеет свои преимущества и недостатки, и выбор метода зависит от сложности задачи, объема данных и доступных вычислительных ресурсов.



🔥 ТОП ВОПРОСОВ С СОБЕСОВ



🔒 База собесов | 🔒 База тестовых