Введение
До начала реализации инфраструктурных проектов: строительства новых дорог, добавления полос движения, светофоров и т. д. — важно иметь реалистичную модель транспортных потоков, чтобы предлагаемые проекты имели наилучшие шансы на успех в снижении интенсивности движения.
Обнаружение объектов — это задача компьютерного зрения и обработки изображений, которая связана с обнаружением объектов на изображениях или видео. Сейчас решения подобного рода задач актуальны в самых разных реальных приложениях, включая видеонаблюдение, беспилотные автомобили, отслеживание объектов, расчет интенсивности автомобилей и т. д.
Актуальность проекта заключается в том, что данная программа позволит автоматически рассчитывать интенсивность автомобилей на дорогах, выводить их количество и анализ в графиках/диаграммах в файл 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 с