Компьютерное зрение Python: техники обработки изображений и детекции

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

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

    Компьютерное зрение — одна из самых захватывающих областей искусственного интеллекта, позволяющая машинам "видеть" и интерпретировать визуальную информацию. Python стал языком №1 для разработчиков в этой сфере благодаря богатой экосистеме библиотек и фреймворков. От распознавания лиц в смартфонах до беспилотных автомобилей и диагностики заболеваний по медицинским снимкам — все это создается с использованием алгоритмов машинного зрения. Готовы научиться создавать подобные системы? Давайте погрузимся в мир пикселей, фильтров и нейронных сетей! 🔍

Хотите быстро освоить компьютерное зрение и другие востребованные навыки Python-разработки? Обучение Python-разработке от Skypro даст вам именно то, что нужно для старта карьеры. Программа составлена практикующими разработчиками, включает модули по обработке изображений и машинному обучению, а поддержка менторов поможет избежать типичных ошибок. Ваш первый проект по компьютерному зрению может появиться уже через 3 месяца после начала обучения!

Основы компьютерного зрения Python: с чего начать

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

Прежде чем погрузиться в код, важно понять фундаментальные концепции обработки изображений. Изображение в цифровом виде представляет собой матрицу пикселей, где каждый пиксель содержит информацию о цвете. В случае RGB-изображения каждый пиксель определяется тремя значениями: интенсивностью красного, зеленого и синего.

Александр Петров, технический директор стартапа в области компьютерного зрения

Когда я только начинал работать с компьютерным зрением, я потратил месяцы, пытаясь понять, почему моя система распознавания дорожных знаков работает превосходно в тестовой среде, но полностью проваливается в полевых условиях. Оказалось, все дело было в базовом понимании предобработки изображений. Я не учитывал различия в освещении, угле съемки и зашумленности реальных изображений. Только после того, как я вернулся к основам и освоил методы нормализации, сегментации и фильтрации, мне удалось создать по-настоящему работающее решение. Не повторяйте моей ошибки — сначала освойте фундаментальные техники, а затем переходите к сложным алгоритмам.

Для работы с компьютерным зрением в Python вам потребуется установить необходимые библиотеки. Вот базовые инструменты для старта:

  • NumPy — для эффективных операций с многомерными массивами (изображениями)
  • OpenCV-Python — мощная библиотека компьютерного зрения
  • Pillow (PIL) — простая библиотека для манипуляций с изображениями
  • scikit-image — расширенные алгоритмы обработки изображений

Установка этих библиотек выполняется через pip:

pip install numpy opencv-python pillow scikit-image

Вот простой пример загрузки и отображения изображения с помощью OpenCV:

Python
Скопировать код
import cv2

# Загружаем изображение
img = cv2.imread('example.jpg')

# Преобразуем из BGR в RGB (OpenCV использует BGR формат)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Отображаем изображение
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Для начинающих крайне важно понимать структуру данных изображения. В Python с помощью NumPy изображение представляется как многомерный массив. Для черно-белого изображения это двумерный массив, а для цветного — трехмерный (высота, ширина, цветовые каналы).

Тип изображения Размерность массива Диапазон значений Пример формы
Черно-белое (Grayscale) 2D 0-255 (480, 640)
Цветное RGB 3D 0-255 для каждого канала (480, 640, 3)
Цветное RGBA 3D 0-255 для каждого канала (480, 640, 4)

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

Пошаговый план для смены профессии

Библиотеки OpenCV и PIL: инструменты машинного зрения

Python предоставляет несколько мощных библиотек для работы с изображениями и видео. Наиболее популярные из них — OpenCV и PIL/Pillow. Каждая имеет свои сильные стороны и идеально подходит для определенных задач.

OpenCV (Open Source Computer Vision Library) — самая популярная и мощная библиотека компьютерного зрения. Изначально написанная на C++, она предоставляет Python-интерфейс через модуль opencv-python. OpenCV специализируется на обработке изображений в реальном времени и включает более 2500 оптимизированных алгоритмов.

Python
Скопировать код
import cv2

# Загрузка изображения
image = cv2.imread('sample.jpg')

# Преобразование в оттенки серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Применение размытия по Гауссу
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# Обнаружение краев с помощью алгоритма Кэнни
edges = cv2.Canny(blurred, 50, 150)

# Сохранение результата
cv2.imwrite('edges.jpg', edges)

PIL/Pillow (Python Imaging Library) — более простая библиотека, идеальная для базовых манипуляций с изображениями, таких как изменение размера, кадрирование, применение фильтров и форматов преобразования.

Python
Скопировать код
from PIL import Image, ImageFilter

# Открытие изображения
image = Image.open('sample.jpg')

# Изменение размера
resized = image.resize((300, 200))

# Применение фильтра размытия
blurred = image.filter(ImageFilter.BLUR)

# Поворот изображения на 90 градусов
rotated = image.rotate(90)

# Сохранение результата
rotated.save('rotated.jpg')

При выборе библиотеки следует учитывать конкретные требования проекта. Вот сравнение основных характеристик:

Характеристика OpenCV PIL/Pillow
Скорость обработки Очень высокая (оптимизирована на C/C++) Средняя
Функциональность компьютерного зрения Обширная (обнаружение объектов, слежение, 3D-реконструкция) Ограниченная (базовая обработка)
Кривая обучения Крутая Пологая
Работа с видео Да Нет (только изображения)
Интеграция с глубоким обучением Встроенная поддержка DNN модулей Требует дополнительных библиотек

Часто эти библиотеки используются в тандеме: PIL/Pillow для простой обработки изображений и OpenCV для продвинутого анализа и компьютерного зрения. Перекодировка между форматами этих библиотек возможна через NumPy:

Python
Скопировать код
import cv2
import numpy as np
from PIL import Image

# Конвертация из OpenCV в PIL
img_cv = cv2.imread('image.jpg')
img_pil = Image.fromarray(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))

# Конвертация из PIL в OpenCV
img_pil = Image.open('image.jpg')
img_cv = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

Помимо этих основных библиотек, стоит обратить внимание на scikit-image — библиотеку, предоставляющую алгоритмы для сегментации, геометрических преобразований, манипуляций с цветовым пространством, анализа, фильтрации и морфологии изображений. Она отлично интегрируется с научными инструментами Python, такими как NumPy и SciPy. 📚

Базовая обработка изображений: фильтры и трансформации

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

Начнем с базовых геометрических трансформаций, которые позволяют изменять размер, поворачивать и кадрировать изображения:

Python
Скопировать код
import cv2
import numpy as np

img = cv2.imread('input.jpg')

# Изменение размера
resized = cv2.resize(img, (300, 200))

# Поворот изображения на 45 градусов
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
rotated = cv2.warpAffine(img, M, (cols, rows))

# Кадрирование (вырезание прямоугольной области)
cropped = img[50:200, 100:300]

Следующий важный этап — фильтрация изображений. Фильтры используются для удаления шума, выделения краев или определенных структур. Наиболее распространенные фильтры:

  • Размытие по Гауссу — сглаживает изображение, уменьшает шум, но может размыть края
  • Медианный фильтр — эффективно удаляет "соль и перец" шум, сохраняя края
  • Фильтр Собеля — выделяет края, подчеркивая изменения интенсивности
  • Фильтр Лапласа — обнаруживает области быстрых изменений интенсивности
Python
Скопировать код
# Размытие по Гауссу
gaussian_blur = cv2.GaussianBlur(img, (5, 5), 0)

# Медианный фильтр
median_blur = cv2.medianBlur(img, 5)

# Обнаружение краев с помощью фильтра Собеля
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)

# Обнаружение краев с помощью фильтра Лапласа
laplacian = cv2.Laplacian(img, cv2.CV_64F)

Преобразования цветовых пространств позволяют работать с изображениями в различных цветовых моделях: RGB, HSV, оттенки серого и других. Это особенно полезно для сегментации объектов определенного цвета:

Python
Скопировать код
# Преобразование RGB в оттенки серого
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Преобразование RGB в HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Выделение объектов определенного цвета (красного)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)
red_objects = cv2.bitwise_and(img, img, mask=mask)

Морфологические операции позволяют модифицировать форму объектов на бинарных изображениях. Основные операции включают эрозию, дилатацию, открытие и закрытие:

Python
Скопировать код
# Бинаризация изображения
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# Создание структурирующего элемента
kernel = np.ones((5, 5), np.uint8)

# Эрозия (уменьшение объектов, удаление мелких деталей)
eroded = cv2.erode(binary, kernel, iterations=1)

# Дилатация (увеличение объектов, заполнение дыр)
dilated = cv2.dilate(binary, kernel, iterations=1)

# Открытие (эрозия, затем дилатация — удаляет шум)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# Закрытие (дилатация, затем эрозия — заполняет отверстия)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

Мария Соколова, инженер компьютерного зрения

В процессе разработки системы контроля качества на производстве электронных плат я столкнулась с проблемой: наша система часто пропускала микродефекты в условиях нестабильного освещения. Решением стало комплексное применение базовых техник обработки изображений. Я создала конвейер, который сначала нормализовал освещение через гистограммное выравнивание, затем применял адаптивную бинаризацию, а для выделения дефектов использовал морфологические операции с тщательно подобранными параметрами. Этот подход повысил точность обнаружения дефектов с 78% до 96%. Меня удивило, что решение нашлось не в сложных нейронных сетях, а в грамотном применении базовых алгоритмов. Иногда возвращение к основам и их методичная настройка дает лучшие результаты, чем использование модных сложных техник.

Гистограмма изображения — мощный инструмент для анализа распределения яркости и контраста. Манипуляции с гистограммой позволяют улучшить видимость деталей:

Python
Скопировать код
# Вычисление и отображение гистограммы
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

# Эквализация гистограммы (улучшение контраста)
equalized = cv2.equalizeHist(gray)

# Адаптивная эквализация гистограммы (CLAHE)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_result = clahe.apply(gray)

Эти базовые техники обработки изображений являются строительными блоками для более сложных алгоритмов компьютерного зрения и машинного обучения. Освоив их, вы сможете эффективно подготавливать данные для последующего анализа и распознавания образов. 🛠️

Сегментация и детекция объектов в Python

Сегментация и детекция объектов представляют собой более продвинутый уровень компьютерного зрения, позволяющий выделять и идентифицировать объекты на изображении. Эти техники — основа для создания систем распознавания лиц, автономных транспортных средств, медицинской диагностики и многих других приложений.

Сегментация — это процесс разделения изображения на значимые области или сегменты. Существует несколько подходов к сегментации:

  • Пороговая сегментация — разделение изображения на основе значений интенсивности пикселей
  • Сегментация на основе краев — выделение объектов по их контурам
  • Сегментация на основе регионов — группировка пикселей со схожими характеристиками
  • Сегментация с помощью водораздела — рассматривает изображение как топографическую карту
  • Семантическая сегментация — классификация каждого пикселя изображения

Начнем с простейшего метода — пороговой сегментации:

Python
Скопировать код
import cv2
import numpy as np

# Загрузка и преобразование в оттенки серого
image = cv2.imread('objects.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Бинаризация с постоянным порогом
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# Адаптивная бинаризация
adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
cv2.THRESH_BINARY, 11, 2)

# Метод Оцу для автоматического определения порога
_, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

Для более сложных сцен эффективна сегментация на основе контуров:

Python
Скопировать код
# Обнаружение краев
edges = cv2.Canny(gray, 50, 150)

# Поиск контуров
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Отрисовка контуров
contour_img = image.copy()
cv2.drawContours(contour_img, contours, -1, (0, 255, 0), 2)

# Фильтрация контуров по размеру
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 100]

Алгоритм водораздела (Watershed) особенно полезен для сегментации соприкасающихся объектов:

Python
Скопировать код
# Подготовка маркеров для алгоритма водораздела
ret, markers = cv2.connectedComponents(binary)

# Добавление 1, чтобы избежать значения 0, зарезервированного для водораздела
markers = markers + 1

# Отметка область, гарантированно принадлежащую фону, как 1
markers[binary == 0] = 1

# Применение алгоритма водораздела
cv2.watershed(image, markers)
image[markers == -1] = [0, 0, 255] # Отмечаем границы водораздела красным

Для детекции объектов существуют более специализированные методы. Один из классических подходов — каскады Хаара, которые эффективны для обнаружения лиц и других объектов с устойчивыми визуальными паттернами:

Python
Скопировать код
# Загрузка предобученного каскадного классификатора для лиц
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# Обнаружение лиц
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

# Отрисовка прямоугольников вокруг обнаруженных лиц
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

Для более универсального обнаружения объектов можно использовать HOG (Histogram of Oriented Gradients) дескрипторы с SVM (Support Vector Machine) классификатором:

Python
Скопировать код
# Настройка HOG-дескриптора
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

# Обнаружение людей на изображении
boxes, weights = hog.detectMultiScale(image, winStride=(8, 8))

# Отрисовка прямоугольников вокруг обнаруженных людей
for (x, y, w, h) in boxes:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

Сравнение различных методов детекции объектов по ключевым характеристикам:

Метод Скорость Точность Сложность реализации Универсальность
Каскады Хаара Высокая Средняя Низкая Ограниченная (требуется обучение для каждого типа объектов)
HOG + SVM Средняя Средняя-высокая Средняя Средняя
YOLO (You Only Look Once) Высокая Высокая Средняя-высокая Высокая
SSD (Single Shot Detector) Высокая Высокая Высокая Высокая
Faster R-CNN Низкая Очень высокая Высокая Высокая

Современные методы детекции объектов, такие как YOLO, SSD и Faster R-CNN, основаны на глубоком обучении и будут рассмотрены в следующем разделе. Однако даже классические методы, описанные здесь, могут быть чрезвычайно эффективны для многих практических приложений, особенно когда вычислительные ресурсы ограничены. 👁️

Нейронные сети и машинное зрение Python: практика

Нейронные сети произвели революцию в области компьютерного зрения, обеспечив беспрецедентную точность в задачах классификации изображений, детекции объектов и семантической сегментации. Python предоставляет множество фреймворков для работы с нейронными сетями, среди которых наиболее популярны TensorFlow, PyTorch и Keras.

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

Первый шаг — установка необходимых библиотек:

pip install tensorflow keras opencv-python numpy matplotlib

Теперь рассмотрим простой пример классификации изображений с использованием предобученной модели:

Python
Скопировать код
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
import cv2

# Загрузка предобученной модели
model = MobileNetV2(weights='imagenet')

# Загрузка и предобработка изображения
image_path = 'sample.jpg'
image = cv2.imread(image_path)
image = cv2.resize(image, (224, 224))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = preprocess_input(np.expand_dims(image, axis=0))

# Получение предсказания
predictions = model.predict(image)
decoded = decode_predictions(predictions, top=3)[0]

# Вывод результатов
for i, (imagenet_id, label, score) in enumerate(decoded):
print(f"{i+1}: {label} ({score:.2f})")

Для более сложных задач, таких как обнаружение объектов, современные подходы используют специализированные архитектуры нейронных сетей. Например, YOLO (You Only Look Once) — один из самых популярных и эффективных алгоритмов для обнаружения объектов в реальном времени:

Python
Скопировать код
import cv2
import numpy as np

# Загрузка модели YOLO
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')
layer_names = net.getLayerNames()
output_layers = [layer_names[i – 1] for i in net.getUnconnectedOutLayers()]

# Загрузка списка классов
with open('coco.names', 'r') as f:
classes = [line.strip() for line in f.readlines()]

# Загрузка и предобработка изображения
image = cv2.imread('street.jpg')
height, width, channels = image.shape
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)

# Прямой проход через сеть
net.setInput(blob)
outs = net.forward(output_layers)

# Обработка результатов
class_ids = []
confidences = []
boxes = []

for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]

if confidence > 0.5:
# Координаты объекта
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)

# Координаты прямоугольника
x = int(center_x – w / 2)
y = int(center_y – h / 2)

boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)

# Подавление немаксимальных откликов
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

# Отрисовка результатов
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
confidence = confidences[i]
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, f"{label} {confidence:.2f}", (x, y + 30), 
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Для задач семантической сегментации, где требуется классифицировать каждый пиксель изображения, используются архитектуры типа U-Net или DeepLab. Вот пример использования предобученной модели DeepLabV3 из TensorFlow:

Python
Скопировать код
import tensorflow as tf
import numpy as np
import cv2

# Загрузка предобученной модели
model = tf.saved_model.load('deeplab_model')

# Функция для сегментации изображения
def segment_image(image_path):
# Загрузка изображения
image = cv2.imread(image_path)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
input_tensor = tf.convert_to_tensor(image_rgb)
input_tensor = tf.cast(input_tensor, tf.uint8)
input_tensor = tf.expand_dims(input_tensor, 0)

# Получение предсказания
predictions = model(input_tensor)
predictions = predictions['output_class']
predictions = tf.argmax(predictions, axis=-1)
predictions = tf.squeeze(predictions).numpy()

# Визуализация результатов
colormap = np.array([[0, 0, 0], [128, 0, 0], [0, 128, 0], ...]) # Определите свою цветовую карту
colored_segmentation = colormap[predictions]

# Наложение сегментации на оригинальное изображение
alpha = 0.6
overlay = cv2.addWeighted(image_rgb, alpha, colored_segmentation, 1 – alpha, 0)

return overlay

# Применение сегментации
segmented = segment_image('city.jpg')
cv2.imshow("Segmented Image", cv2.cvtColor(segmented, cv2.COLOR_RGB2BGR))
cv2.waitKey(0)
cv2.destroyAllWindows()

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

Python
Скопировать код
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Создание модели
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(512, activation='relu'),
Dropout(0.5),
Dense(10, activation='softmax') # 10 классов
])

model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])

# Генераторы данных для обучения и валидации
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
'train_data',
target_size=(150, 150),
batch_size=32,
class_mode='categorical')

validation_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(
'validation_data',
target_size=(150, 150),
batch_size=32,
class_mode='categorical')

# Обучение модели
model.fit(
train_generator,
steps_per_epoch=len(train_generator),
epochs=10,
validation_data=validation_generator,
validation_steps=len(validation_generator))

# Сохранение модели
model.save('my_custom_model.h5')

Трансферное обучение — мощный подход, позволяющий использовать предобученные на больших датасетах модели и адаптировать их для конкретных задач с меньшим количеством данных. Это особенно полезно, когда у вас ограниченный набор данных или вычислительные ресурсы:

Python
Скопировать код
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D

# Загрузка базовой модели (без верхних слоев)
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# Замораживание весов базовой модели
for layer in base_model.layers:
layer.trainable = False

# Добавление новых слоев
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(5, activation='softmax')(x) # 5 классов

# Создание новой модели
model = Model(inputs=base_model.input, outputs=predictions)

# Компиляция модели
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])

# Обучение только добавленных слоев
model.fit(
train_generator,
steps_per_epoch=len(train_generator),
epochs=5,
validation_data=validation_generator,
validation_steps=len(validation_generator))

# Разморозка некоторых слоев базовой модели для тонкой настройки
for layer in base_model.layers[-20:]:
layer.trainable = True

# Повторная компиляция с меньшей скоростью обучения
model.compile(optimizer=tf.keras.optimizers.Adam(1e-5),
loss='categorical_crossentropy',
metrics=['accuracy'])

# Дообучение всей модели
model.fit(
train_generator,
steps_per_epoch=len(train_generator),
epochs=5,
validation_data=validation_generator,
validation_steps=len(validation_generator))

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

Компьютерное зрение на Python — это не просто набор технических навыков, а мощный инструмент трансформации отраслей и создания инновационных решений. От базовых манипуляций с изображениями до продвинутых нейросетевых моделей — ваше путешествие в мир машинного зрения только начинается. Главное понять: за каждым алгоритмом и каждой строкой кода стоит реальная задача и потенциал улучшения жизни людей. Компьютерное зрение — это не технология будущего, а технология настоящего, доступная каждому разработчику, готовому изучать и экспериментировать.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод используется для загрузки изображения в OpenCV?
1 / 5

Загрузка...