На тему компьютерного зрения есть множество различных публикаций, которые в основном рассказывают о применении этой технологии в разных отраслях. Однако, зачастую публикации содержат лишь общую информацию о том, что реализовано и для каких задач, но при этом отсутствует описание того, как это можно сделать.
В нашей статье мы поговорим о том, как можно реализовать на Python навигационную систему на основе машинного зрения для автономных транспортных средств, проанализировать медицинские изображения и выполнить генерацию новых изображений из набора данных уже существующих.
Ключевые концепции
Но для начала давайте рассмотрим несколько ключевых концепций. Начнем с обработки изображений. Это первый шаг в компьютерном зрении, где вы обрабатываете и анализируете визуальные данные для улучшения их качества или извлечения важной информации. Например, вы можете повысить контрастность изображения, чтобы сделать детали более заметными, или использовать фильтры для снижения уровня шума. Представьте, что вы работаете над проектом по улучшению спутниковых снимков для мониторинга окружающей среды. Применяя методы обработки изображений, вы можете сделать незначительные изменения более заметными, что способствует более точному анализу и принятию решений.
Затем идет распознавание образов. Оно заключается в выявлении закономерностей в данных. Это критически важно для таких задач, как распознавание лиц, где системе необходимо обнаруживать и сопоставлять черты лица на разных изображениях. Вспомните системы безопасности в аэропортах, которые используют распознавание лиц для быстрой и точной идентификации людей — прекрасный пример распознавания образов в действии.
И основное волшебство — машинное обучение. ML, особенно глубокое, позволяет компьютерам обучаться на основе данных и делать прогнозы или принимать решения без необходимости явного программирования для каждой задачи. В компьютерном зрении сверточные нейронные сети (CNN) обычно используются для распознавания и классификации изображений. Например, в розничной торговле модель машинного обучения можно обучить обнаруживать и классифицировать товары на полках, что помогает управлять запасами и сокращать количество случаев их отсутствия на складе.
Технологии и инструменты
Для создания эффективных проектов компьютерного зрения вам необходимы правильные инструменты и технологии. Вот некоторые из самых популярных:
1. OpenCV: библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. Она универсальна и поддерживает широкий спектр приложений, от базовой обработки изображений до обнаружения сложных объектов. Если вы только начинаете погружаться в тему, то OpenCV — отличный способ познакомиться с компьютерным зрением.
2. TensorFlow: TensorFlow, от Google, — это мощный фреймворк для построения моделей машинного обучения. Он особенно полезен для задач глубокого обучения в компьютерном зрении. Например, TensorFlow можно использовать для создания нейронной сети, способной распознавать различные породы собак на изображениях.
3. PyTorch: Фреймворк PyTorch, популярен среди исследователей и разработчиков благодаря своей гибкости и простоте использования. Он отлично подходит для экспериментов с пользовательскими нейронными сетями. Представьте, что вы работаете над проектом медицинской визуализации для обнаружения опухолей на снимках МРТ — PyTorch предоставляет инструменты, необходимые для эффективной разработки и обучения модели.
Разобравшись с ключевыми концепциями и инструментами, перейдем к рассмотрению самих проектов.
Навигация для автономных транспортных средств
Разработка навигационной системы на основе машинного зрения для автономных транспортных средств — один из самых сложных и перспективных проектов в области компьютерного зрения. Этот проект предполагает использование методов компьютерного зрения для обеспечения автономной навигации транспортного средства в различных условиях.
С одной стороны, это достаточно сложное направление, включающее в себя множество передовых концепций, таких как обнаружение объектов, определение полосы движения и планирование пути. С другой, проект имеет реальные приложения в быстрорастущей области автономного управления транспортными средствами.
Что же нам потребуется для его реализации? Прежде всего необходимо установить библиотеки OpenCV, TensorFlow или PyTorch, а также на стороне устройства необходимо будет развернуть ROS (операционная система для роботов). Последний пункт в рамках данной статьи мы не рассматриваем.
Далее, в соответствии с приведенным в начале статьи алгоритмом нам нужно захватить и обработать изображения. Здесь прежде всего необходимо установить камеры для захвата видео в реальном времени, и настроить софт, обрабатывающий эти изображения для обнаружения объектов и полосы движения.

После того, как мы объяснили нашему роботу, где находится проезжая часть (полоса движения) можно приступать к реализации навигационных алгоритмов. Эта тема также выходит за рамки непосредственно компьютерного зрения, поэтому далее давайте рассмотрим пример кода для определения полосы движения с использованием OpenCV.
import cv2
import numpy as np
def region_of_interest(img, vertices):
mask = np.zeros_like(img)
cv2.fillPoly(mask, vertices, 255)
masked = cv2.bitwise_and(img, mask)
return masked
def draw_lines(img, lines):
for line in lines:
for x1, y1, x2, y2 in line:
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 10)
cap = cv2.VideoCapture('path_to_your_video.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150)
vertices = np.array([[ (0, frame.shape[0]), (frame.shape[1]//2, frame.shape[0]//2), (frame.shape[1], frame.shape[0]) ]], dtype=np.int32)
roi = region_of_interest(edges, vertices)
lines = cv2.HoughLinesP(roi, 1, np.pi/180, 50, maxLineGap=50)
if lines is not None:
draw_lines(frame, lines)
cv2.imshow('Lane Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Этот код захватывает видео, обрабатывает его для определения линий дорожек и накладывает эти линии на исходный видеопоток. В результате мы получаем информацию о полосе движения и можем дальше обрабатывать эти данные для того, чтобы продолжать движение.
Анализ медицинских изображений
Еще одна интересная и очень нужная тема, это обработка медицинских изображений. Создание модели для анализа медицинских изображений в целях диагностики, например, обнаружения опухолей на МРТ‑снимках, является очень важной областью применением компьютерного зрения в здравоохранении. Приведенный ниже проект включает в себя обучение модели глубокого обучения для точного определения и классификации заболеваний на основе изображений.
Здесь нам потребуются библиотеки TensorFlow или PyTorch. В примере ниже мы будем использовать TensorFlow. Далее нам необходимо получить данные медицинских изображений. Это достаточно специфичная область данных, но и здесь есть общедоступные наборы данных, например, BraTS, для сегментации опухолей головного мозга.

Для того, чтобы эффективно обрабатывать изображения модель должна быть обучена. Далее нам необходимо произвести обучение модели с помощью сверточной нейронной сети (CNN) для классификации и сегментации медицинских изображений.
Пример кода с использованием TensorFlow:
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Load and preprocess the dataset
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('path_to_train_data', target_size=(150, 150), batch_size=20, class_mode='binary')
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_generator, epochs=10, steps_per_epoch=100)
Этот код настраивает и обучает сверточную нейронную сеть для двоичной классификации медицинских изображений.
Генеративно-состязательные сети (GAN)
Использование GAN для генерации новых изображений из набора данных существующих изображений это достаточно сложная задача, включающая глубокое обучение. GAN состоят из двух нейронных сетей: генератора и дискриминатора, которые работают вместе для создания реалистичных изображений.
С помощью генеративных моделей вы можете создавать интересные приложения, такие как генерация изображений и перенос стилей.
Здесь нам потребуются все те же TensorFlow или PyTorch. Также нам нужен будет подготовленный набор данных, напр��мер, MNIST, для обучения.
Затем нужно обучить GAN генерации новых изображений. Ниже приведен пример кода с использованием TensorFlow:
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
# Load and preprocess the dataset
(train_images, ), (, ) = tf.keras.datasets.mnist.loaddata()
train_images = train_images.reshape(train_images.shape[0, 28, 28, 1]).astype('float32')
train_images = (train_images - 127.5) / 127.5
BUFFER_SIZE = 60000
BATCH_SIZE = 256
train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
# Define the generator
def make_generator_model():
model = tf.keras.Sequential()
model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Reshape((7, 7, 256)))
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
return model
# Define the discriminator
def make_discriminator_model():
model = tf.keras.Sequential()
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 1]))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))
model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))
model.add(layers.Flatten())
model.add(layers.Dense(1))
return model
# Define the loss and optimizers
cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
generator = make_generator_model()
discriminator = make_discriminator_model()
generator_optimizer = tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)
# Define the training step
@tf.function
def train_step(images):
noise = tf.random.normal([BATCH_SIZE, 100])
with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
generated_images = generator(noise, training=True)
real_output = discriminator(images, training=True)
fake_output = discriminator(generated_images, training=True)
gen_loss = cross_entropy(tf.ones_like(fake_output), fake_output)
disc_loss = cross_entropy(tf.ones_like(real_output), real_output) + cross_entropy(tf.zeros_like(fake_output), fake_output)
gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))
# Train the GAN
EPOCHS = 50
for epoch in range(EPOCHS):
for image_batch in train_dataset:
train_step(image_batch)
# Generate and display images
noise = tf.random.normal([16, 100])
generated_images = generator(noise, training=False)
for i in range(16):
plt.subplot(4, 4, i+1)
plt.imshow(generated_images[i, :, :, 0], cmap='gray')
plt.axis('off')
plt.show()
Этот код обучает генеративно‑состязательную сеть (GAN) генерировать изображения, похожие на набор данных MNIST.
Заключение
Компьютерное зрение — невероятно мощная область, охватывающая различные отрасли. От базовой классификации изображений до продвинутых технологий, таких как генеративно‑состязательные сети (GAN) и автономная навигация транспортных средств, — ваши проекты могут значительно улучшить ваши навыки и открыть двери к новым возможностям.
При этом не стоит пугаться сложности этих проектов. Начните с задач начального уровня, чтобы заложить прочный фундамент, и постепенно беритесь за более сложные проекты по мере обретения уверенности.
Каждый завершенный вами проект не только повышает ваши технические навыки, но и дает ощутимые результаты, которые можно продемонстрировать в вашем портфолио.
Тем, кто уже вышел за уровень базовой классификации и pet-проектов, нужна не очередная статья, а системная прокачка. «Компьютерное зрение. Advanced» разбирает PyTorch 2.0, Vision Transformers, диффузионные модели, SAM, action detection и геометрию в CV на задачах, которые действительно живут в продакшене. На выходе — выпускной проект и понимание, как доводить CV-решения от прототипа до боевого кода.
Чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:
11 декабря: Ускоряем работу с видеопотоками при помощи TorchCodec. Записаться
15 декабря: Поднимаем YOLO модель в Triton ансамбле. Записаться