Обнаружение полосы движения в реальном времени с помощью OpenCV

машинное обучение

Автор|АБХИШЕК ШАРМА Компилировать|ВКонтакте Источник | Аналитика Видья

Около десяти лет назад, когда ребята из Google все еще экспериментировали с прототипом, я представил свой первый самоуправляемый автомобиль. Я сразу же увлекся этой идеей. По общему признанию, мне пришлось немного подождать, пока эти концепции не были открыты для сообщества, и теперь кажется, что ожидание действительно того стоило!

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

Вот система обнаружения полосы движения, которую мы создадим в этом видео:youtu.be/sYhZbhT-Smw

Круто, правда? В этом уроке я буду использовать библиотеку OpenCV для определения полосы движения и беспилотных автомобилей. Конечно, в этом уроке мы также представим код Python.

содержание

  1. Понимание концепции обнаружения полосы движения

  2. понять постановку задачи

  3. Что такое маска кадра?

  4. Предварительная обработка изображения для обнаружения дорожек

  5. Внедрение обнаружения полосы движения в Python с помощью OpenCV

Понимание концепции обнаружения полосы движения

Так что же такое обнаружение полосы движения? Ниже приводится определение переулка в энциклопедии Baidu:

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

Его определение важно, потому что оно позволяет нам перейти к концепции обнаружения полосы движения. У нас не может быть никакой двусмысленности в построении системы.

Как я упоминал ранее, обнаружение полосы движения является ключевым компонентом беспилотных автомобилей и беспилотных автомобилей. Это одна из важных тем исследования в понимании сцены вождения. Как только положение полосы движения получено, автомобиль знает, куда ехать, и избегает столкновения с другими полосами движения или выезда с дороги. Это не позволяет системе «водитель/автомобиль» покинуть полосу движения.

Вот несколько случайных изображений дорог (первая строка) и их обнаруженные полосы (вторая строка):

понять постановку задачи

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

Однако есть и более простые способы обнаружения полосы движения. В этой статье я покажу вам, как это сделать без использования каких-либо моделей глубокого обучения. Но мы будем использовать популярную библиотеку OpenCV на Python.

Вот кадр видео, которое мы будем обрабатывать:

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

Помимо разметки дорожек, в сцене много других объектов. На дороге есть транспортные средства, придорожные ограждения, уличные фонари и т. д. В видео в каждом кадре будет смена сцен. Это хорошее отражение реальных дорожных ситуаций.

Поэтому, прежде чем решать проблему обнаружения полосы движения, мы должны найти способ игнорировать нежелательные объекты в сцене вождения.

Единственное, что мы можем сделать сейчас, это сузить интересующую область. Вместо того, чтобы использовать весь кадр, просто используйте часть кадра. На изображении ниже все скрыто, кроме разметки полосы движения. По мере движения автомобиля разметка полосы движения будет более или менее попадать в зону:

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

Что такое маска кадра?

Здесь маска кадра — это просто массив NumPy. Когда мы хотим применить маску к изображению, просто измените значение пикселя нужной области изображения на 0, 255 или любое другое число. Пример маскирования изображения приведен ниже. Значение пикселя области изображения установлено равным 0:

Это очень простой, но эффективный способ удалить ненужные области и объекты с изображения.

Предварительная обработка изображения для обнаружения дорожек

Сначала мы применим маску ко всем кадрам входного видео. Затем мы применим пороговое значение изображения и преобразование линии Хафа для обнаружения разметки полосы движения.

порог изображения

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

Как показано выше, после того, как Интернет подается в Интернет, мы получаем только метки полосы движения в выходное изображение. Эти теги теперь могут быть легко обнаружены через преобразование линии HOFF.

Преобразование линии Хафа

Преобразование линии Хафа — это метод обнаружения любой формы, которая может быть представлена ​​математически.

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

Вот соответствующая документация:OpenCV-Python-TUT RO ah LS. прочитайте документ S.IO/en/latest/afraid…

После выполнения изображения, нанесенного на пороговое значение изображения, преобразование Hough обеспечит следующие выходные линии:

Нам нужно проделать эту процедуру для всех кадров, затем вшить сгенерированный кадр в новое видео.

Внедрение обнаружения полосы движения в Python с помощью OpenCV

Пришло время реализовать этот проект по обнаружению полос на Python! Я рекомендую использовать Google Colab из-за вычислительной мощности, необходимой для создания системы обнаружения полос движения.

Сначала импортируйте необходимые библиотеки:

import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt

прочитать кадр видео

Я вытащил несколько клипов из этого видео на YouTube. Вы можете скачать по этой ссылке:Drive.google.com/file/ / 1 ОН 4 из ...

# 获取帧的文件名
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))

# 加载帧
col_images=[]
for i in tqdm_notebook(col_frames):
    img = cv2.imread('frames/'+i)
    col_images.append(img)

Нарисуем рамку:

# 指定一个索引
idx = 457

# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()

создание маски кадра

Наша область интереса представляет собой полигон. Мы хотим охватить все, кроме этой области. Итак, мы сначала должны указать координаты многоугольника, а затем использовать их для подготовки маски кадра:

# 创建0矩阵
stencil = np.zeros_like(col_images[idx][:,:,0])

# 指定多边形的坐标
polygon = np.array([[50,270], [220,160], [360,160], [480,270]])

# 用1填充多边形
cv2.fillConvexPoly(stencil, polygon, 1)
# 画出多边形
plt.figure(figsize=(10,10))
plt.imshow(stencil, cmap= "gray")
plt.show()

# 应用该多边形作为掩码
img = cv2.bitwise_and(col_images[idx][:,:,0], col_images[idx][:,:,0], mask=stencil)

# plot masked frame
plt.figure(figsize=(10,10))
plt.imshow(img, cmap= "gray")
plt.show()

предварительная обработка изображений

Мы должны выполнить некоторые операции предварительной обработки изображения на видеокадрах, чтобы обнаружить нужные дорожки. К операциям предварительной обработки относятся:

  1. порог изображения

  2. Преобразование линии Хафа

1. Порог изображения
# 应用图像阈值化
ret, thresh = cv2.threshold(img, 130, 145, cv2.THRESH_BINARY)

# 画出图像
plt.figure(figsize=(10,10))
plt.imshow(thresh, cmap= "gray")
plt.show()

2. Преобразование линии Хафа
lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)

# 创建原始帧的副本
dmy = col_images[idx][:,:,0].copy()

# 霍夫线
for line in lines:
  x1, y1, x2, y2 = line[0]
  cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)

# 画出帧
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

Теперь применим все эти операции к каждому кадру. Также сохраняем полученные кадры в новую директорию:

cnt = 0

for img in tqdm_notebook(col_images):

  # 应用帧掩码
  masked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)

  # 应用图像阈值化
  ret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)

  # 应用霍夫线变换
  lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)
  dmy = img.copy()

  #画出检测到的线
  try:
    for line in lines:
      x1, y1, x2, y2 = line[0]
      cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)

    cv2.imwrite('detected/'+str(cnt)+'.png',dmy)

  except TypeError: 
    cv2.imwrite('detected/'+str(cnt)+'.png',img)

  cnt+= 1

видео подготовка

# 输入帧的路径
pathIn= 'detected/'

#输出视频路径
pathOut = 'roads_v2.mp4'

# 视频每秒的帧数
fps = 30.0
from os.path import isfile, join

# 获取帧的文件名
files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))]
files.sort(key=lambda f: int(re.sub('\D', '', f)))

Далее мы поместим все кадры на обнаруженных дорожках в список:

frame_list = []

for i in tqdm_notebook(range(len(files))):
    filename=pathIn + files[i]
    #读取每一个文件
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)

    #将帧插入图像数组
    frame_list.append(img)

Наконец, теперь мы можем объединить кадры в видео, используя следующий код:

# 写入视频
out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)

for i in range(len(frame_array)):
    out.write(frame_array[i])

out.release()

На этом система обнаружения полос в Python завершена.

конец

В этом уроке мы представили простой метод обнаружения полосы движения. Мы не использовали никаких моделей или сложных функций изображения. Вместо этого наше решение полностью основано на некоторых операциях предварительной обработки изображений.

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

Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/