Разработка программного обеспечения для моделирования потока дорожного движения с помощью компьютерного зрения

XVII Международный конкурс научно-исследовательских и творческих работ учащихся
Старт в науке

Разработка программного обеспечения для моделирования потока дорожного движения с помощью компьютерного зрения

Шакиров Р.И. 1
1ГАПОУ "Альметьевский политехнический техникум"
Чеснокова В.С. 1Рамазанова Ю.А. 1
1ГАПОУ "Альметьевский политехнический техникум"
Автор работы награжден дипломом победителя III степени
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

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

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

Актуальность проекта заключается в том, что данная программа позволит автоматически рассчитывать интенсивность автомобилей на дорогах, выводить их количество и анализ в графиках/диаграммах в файл MS Excel.

Цели и задачи проекта: разработка программного обеспечения для моделирования потока дорожного движения с помощью компьютерного зрения на языке программирования Python.

В разработанной программе реализованы задачи:

- получение и сбор изображений,

- распознавание и идентификация,

- сегментация изображений,

- сортировка и подсчет объектов, анализ по количеству обнаруженных объектов.

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

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

Основная часть

1 Технологии, используемые для разработки приложения

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

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

Идентификация всех объектов, которые существуют на изображении.

Фильтрация объекта, привлекающего внимание.

В данном проекте мы рассмотрим, как выполнять распознавание объектов на языке программирования Python с помощью библиотеки OpenCV.

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

Разработанное приложение будет находить объекты на изображении при помощи YOLO и отмечать их.

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

Присутствует ли объект в ячейке сетки.

Класс объекта (т.е. метка).

Предполагаемые геометрические характеристики объекта (местоположения).

Библиотеки Python, которые использовались в данном проекте:

OpenCV — это open-source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.

NumPy — это open-source модуль для python, который предоставляет общие математические и числовые операции в виде пре-скомпилированных, быстрых функций. Они объединяются в высокоуровневые пакеты. Они обеспечивают функционал, который можно сравнить с функционалом MatLab. NumPy (Numeric Python) предоставляет базовые методы для манипуляции с большими массивами и матрицами.

XlsxWriter — это модуль Python для записи файлов в формате XLSX.

XlsxWriter можно использовать для записи текста, чисел, формул и гиперссылок на несколько листов, и он поддерживает такие функции, как форматирование и многое другое, в том числе:

100% совместимые файлы Excel XLSX.

Полное форматирование.

Объединенные ячейки.

Определенные имена.

Диаграммы.

2 Функции приложения

ПО “auto_scan.py”, представляет собой консольное приложение для расчета, анализа интенсивности автомобильных дорог.

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

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

draw_object_count - вывод количества найденных на изображении объектов.

start_image_object_detection - вывод входного изображения, только с отрисованными объектами и их количеством.

Работа приложения:

Рисунок 1 - Распознавание людей, машин, светофоров

Алгоритм распознавания изображений (также известный как классификатор изображений) принимает изображение (или фрагмент изображения) в качестве входных данных и выводит то, что содержит изображение. Другими словами, вывод — это метка класса (например, «автомобиль», «кошка», «собака», «таблица» и т.д.). Как алгоритм распознавания изображений узнает содержимое изображения? Нужно обучить алгоритм, чтобы узнать различия между разными классами. Если нужно найти автомобиль на изображениях, то необходимо обучить алгоритм распознавания изображений с тысячами изображений автомобилей и тысячами изображений фона, которые не содержат автомобили. Разумеется, подобный алгоритм может понимать только те объекты/классы, которые он знает.

Рассмотрим листинг приложения для распознавания автомобилей и подсчета их.

Выполнимимпортбиблиотек:

import cv2
import numpy as np
from art import tprint
import xlsxwriter
import pandas as pd
from vincent.colors import brews

Организуем ввод данных:

n = int(input('Введите максимальный номер картинки:\n>>>'))
data = []

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

def apply_yolo_object_detection(image_to_process):
height, width, _ = image_to_process.shape
blob = cv2.dnn.blobFromImage(image_to_process, 1 / 255, (608, 608),
(0, 0, 0), swapRB=
True, crop=False)
net.setInput(blob)
outs = net.forward(out_layers)
class_indexes, class_scores, boxes = ([]
for i in range(3))
objects_count = 0

for out in outs:
for obj in out:
scores = obj[5:]
class_index = np.argmax(scores)
class_score = scores[class_index]

if class_score > 0:
center_x = int(obj[0] * width)
center_y = int(obj[1] * height)
obj_width = int(obj[2] * width)
obj_height = int(obj[3] * height)
box = [center_x - obj_width // 2, center_y - obj_height // 2,
obj_width, obj_height]
boxes.append(box)
class_indexes.append(class_index)
class_scores.append(float(class_score))

# Selection
chosen_boxes = cv2.dnn.NMSBoxes(boxes, class_scores, 0.0, 0.4)
for box_index in chosen_boxes:
box_index = box_index
box = boxes[box_index]
class_index = class_indexes[box_index]

# For debugging, we draw objects included in the desired classes
if classes[class_index] in classes_to_look_for:
objects_count += 1
image_to_process = draw_object_bounding_box(image_to_process, class_index, box)
final_image = draw_object_count(image_to_process, objects_count)
data.append(objects_count)

return final_image
def draw_object_bounding_box(image_to_process, index, box):
"""
Drawing object borders with captions
:param image_to_process: original image
:param index: index of object class defined with YOLO
:param box: coordinates of the area around the object
:return: image with marked objects
"""

x, y, w, h = box
start = (x, y)
end = (x + w, y + h)
color = (0, 255, 0)
width = 2
final_image = cv2.rectangle(image_to_process, start, end, color, width)
start = (x, y - 10)
font_size = 1
font = cv2.FONT_HERSHEY_SIMPLEX
width = 2
text = classes[index]
final_image = cv2.putText(final_image, text, start, font,
font_size, color, width, cv2.LINE_AA)

return final_image
def draw_object_count(image_to_process, objects_count):
start = (5, 70)
font_size = 1.0
font = cv2.FONT_HERSHEY_SIMPLEX
width = 3
text =
"Objects found: " + str(objects_count)
white_color = (255, 255, 255)
black_outline_color = (0, 0, 0)
final_image = cv2.putText(image_to_process, text, start, font, font_size,
black_outline_color, width * 3, cv2.LINE_AA)
final_image = cv2.putText(final_image, text, start, font, font_size,
white_color, width, cv2.LINE_AA)

return final_image
def start_image_object_detection(img_path):
try:

image = cv2.imread(img_path)
image = apply_yolo_object_detection(image)

# Displaying the processed image on the screen
cv2.imshow("Image", image)
if cv2.waitKey(0):
cv2.destroyAllWindows()

except KeyboardInterrupt:
pass
for
a in range(1, n + 1):
if __name__ == '__main__':
tprint("Program edit")
tprint(
"by")
tprint(
"Ruzal")
net = cv2.dnn.readNetFromDarknet("Resources/yolov4-tiny.cfg",
"Resources/yolov4-tiny.weights")
layer_names = net.getLayerNames()
out_layers_indexes = net.getUnconnectedOutLayers()
out_layers = [layer_names[index - 1]
for index in out_layers_indexes]
with open("Resources/coco.names.txt") as file:
classes = file.read().split(
"\n")
image = 'image\\auto{}.jpg'.format(a)
look_for = [
'car', 'truck', 'bus']
list_look_for = []
for look in look_for:
list_look_for.append(look.strip())
classes_to_look_for = list_look_for
start_image_object_detection(image)

Создадимфункциюдлясозданияграфиковидиаграммв excel:

def instensive(data, n):
cat_4 = ['Photo_' + str(x) for x in range(1, int(n) + 1)]
df = pd.DataFrame(data, index=cat_4)
excel_file = 'Авто-интенсивность.xlsx'
sheet_name = 'Sheet1'
writer = pd.ExcelWriter(excel_file, engine='xlsxwriter')
df.to_excel(writer, sheet_name=sheet_name)


workbook = writer.book
worksheet = writer.sheets[sheet_name]

chart = workbook.add_chart({'type': 'line'})
chart2 = workbook.add_chart({
'type': 'column'})
for col_num in range(1, len(cat_4) + 1):
chart.add_series({

'name': ['Sheet1', 0, col_num],
'categories': ['Sheet1', 1, 0, n, 0],
'values': ['Sheet1', 1, col_num, n, col_num],
'fill': {'color': brews['Spectral'][col_num - 1]},
'gap': 300,
})

for col_num in range(1, len(cat_4) + 1):
chart2.add_series({

'name': ['Sheet1', 0, col_num],
'categories': ['Sheet1', 1, 0, n, 0],
'values': ['Sheet1', 1, col_num, n, col_num],
'fill': {'color': brews['Spectral'][col_num - 1]},
'gap': 300,
})

chart.set_y_axis({'major_gridlines': {'visible': True}})
chart2.set_y_axis({
'major_gridlines': {'visible': True}})
worksheet.insert_chart('K2', chart)
worksheet.insert_chart(
'K22', chart2)

writer.save()
instensive(data, n)

Результат работы приложения приведен в виде графика.

Рисунок 2 -Анализ всех изображений и вывод графики в Excel

Заключение

В результате работы над созданием приложения, были проанализированы способы компьютерного обучения, выбрана для разработки библиотека OpenCV и написан программный код на языке программирования Python “auto_scan.py”, произведен сбор изображений с автомобилями, проведено тестирование и анализ на примере города Альметьевск. Анализ загруженности дороги проводился при помощи камеры и разработанного приложения с 17.00 до 18.00 и с 10.00 до 11.00.

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

Список используемой литературы

1 Статья «Записки преподавателя». Электронный ресурс: https://waksoft.susu.ru/2021/05/27/image-recognition-and-object-detection-part1/

2 Статья «Поиск объектов на фото с помощью Python». Электронный ресурс https://habr.com/ru/post/678644/

3 Компьютерное зрение на Python. Первые шаги / Э. Д. Шакирьянов. — Электрон. изд. — М. : Лаборатория знаний, 2021. — 163 с

Просмотров работы: 52