В сегодняшней статье блога мы углубимся в увлекательный мир классификации изображений. Мы изучим различные методы и приемы, которые позволят нам точно идентифицировать объекты на изображениях. Независимо от того, новичок вы или опытный специалист по данным, эта статья предоставит вам ценную информацию и практические примеры кода, которые помогут вам овладеть искусством классификации изображений.
- Сверточные нейронные сети (CNN):
Одним из самых популярных и мощных методов классификации изображений является использование сверточных нейронных сетей (CNN). CNN специально разработаны для эффективной обработки изображений, фиксируя пространственные зависимости посредством сверточных слоев. Вот фрагмент кода на Python, использующий TensorFlow для классификации изображения:
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
# Load pre-trained MobileNetV2 model
model = MobileNetV2(weights='imagenet')
# Load and preprocess the image
img = image.load_img('image.jpg', target_size=(224, 224))
x = image.img_to_array(img)
x = preprocess_input(x)
x = np.expand_dims(x, axis=0)
# Predict the class probabilities
preds = model.predict(x)
top_classes = decode_predictions(preds, top=5)[0]
# Print the top 5 classes
for class_id, class_name, class_prob in top_classes:
print(f"{class_name} ({class_prob * 100:.2f}% confidence)")
- Трансферное обучение.
Трансферное обучение — еще один популярный подход к классификации изображений, при котором мы используем предварительно обученные модели CNN и настраиваем их для нашей конкретной задачи. Этот метод полезен, когда у вас ограниченные данные для обучения. Вот пример использования PyTorch:
import torch
import torchvision.models as models
import torchvision.transforms as transforms
# Load pre-trained ResNet model
model = models.resnet50(pretrained=True)
model.eval()
# Load and preprocess the image
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
img = Image.open('image.jpg')
img_tensor = transform(img)
img_tensor = torch.unsqueeze(img_tensor, 0)
# Predict the class probabilities
preds = model(img_tensor)
_, indices = torch.sort(preds, descending=True)
top_classes = [(idx, preds[0, idx].item()) for idx in indices[0][:5]]
# Print the top 5 classes
for class_id, class_prob in top_classes:
print(f"{class_id} ({class_prob * 100:.2f}% probability)")
- Машины опорных векторов (SVM):
SVM являются популярным выбором для задач классификации изображений, особенно при работе с небольшими наборами данных. SVM создают границу решения, отображая особенности изображения в многомерное пространство. Вот пример использования библиотеки scikit-learn в Python:
from sklearn import svm
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Load the MNIST digit dataset
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)
X = X / 255.0
# Split the dataset into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train an SVM classifier
svm_classifier = svm.SVC(kernel='linear')
svm_classifier.fit(X_train, y_train)
# Predict the classes for test images
y_pred = svm_classifier.predict(X_test)
# Print the top 5 classes
for class_id in range(5):
print(f"Class {class_id}: {svm_classifier.classes_[class_id]}")
# Calculate accuracy
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")
- Глубокое обучение с увеличением данных.
Дополнение данных — это метод, используемый для искусственного увеличения размера набора обучающих данных путем применения к изображениям различных преобразований, таких как вращение, масштабирование и переворачивание. Этот метод помогает повысить надежность и обобщение модели. Вот пример использования Keras и OpenCV:
import cv2
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Create an image data generator with augmentation
datagen = ImageDataGenerator(
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
# Load and preprocess the image
img = cv2.imread('image.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = img.reshape((1,) + img.shape) # Add batch dimension
# Generate augmented images
augmented_images = []
for batch in datagen.flow(img, batch_size=1):
augmented_images.append(batch)
if len(augmented_images) >= 5:
break
# Predict the class probabilities for augmented images
for augmented_img in augmented_images:
augmented_img = preprocess_input(augmented_img)
preds = model.predict(augmented_img)
top_classes = decode_predictions(preds, top=5)[0]
# Print the top 5 classes for each augmented image
for class_id, class_name, class_prob in top_classes:
print(f"{class_name} ({class_prob * 100:.2f}% confidence)")
- Ансамблевое обучение.
Ансамблевое обучение объединяет прогнозы нескольких моделей для более точной классификации. В контексте классификации изображений вы можете обучить несколько моделей, таких как CNN или SVM, а затем усреднить или объединить их прогнозы. Вот пример использования scikit-learn:
from sklearn.ensemble import VotingClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
# Load the MNIST digit dataset
digits = load_digits()
X, y = digits.data, digits.target
# Split the dataset into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create individual classifiers
svc_clf = SVC(kernel='linear', probability=True)
mlp_clf = MLPClassifier(hidden_layer_sizes=(100, 100), max_iter=500)
# Create an ensemble classifier
ensemble_clf = VotingClassifier(estimators=[('svc', svc_clf), ('mlp', mlp_clf)], voting='soft')
# Train the ensemble classifier
ensemble_clf.fit(X_train, y_train)
# Predict the classes for test images
y_pred = ensemble_clf.predict(X_test)
# Print the top 5 classes
for class_id in range(5):
print(f"Class {class_id}: {ensemble_clf.classes_[class_id]}")
# Calculate accuracy
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")
В этой статье мы рассмотрели пять различных методов классификации изображений, включая сверточные нейронные сети (CNN), трансферное обучение, машины опорных векторов (SVM), глубокое обучение с увеличением данных и ансамблевое обучение. Каждый метод имеет свои преимущества и подходит для разных сценариев. Применяя эти методы и используя предоставленные примеры кода, вы будете хорошо подготовлены к решению задач классификации изображений в своих проектах.