Введение. Транспортным компаниям необходимо знать, сколько пассажиров они перевозят в разные моменты времени. Это дает возможность оценить загруженность общественного транспорта и проводить контроль оплаты проезда. Для того, чтобы правильно провести анализ, необходимо получить достоверные сведения о количестве пассажиров в конкретном автобусе. Это можно сделать путем подсчета людей на входе и на выходе. При реализации системы подсчета пассажиров решаются следующие задачи: мониторинг загруженности автобуса; оптимизация работы общественного транспорта; выявление времени, когда происходит пик или спад количества пассажиров; контроль оплаты проезда.
Цель исследования. Целью исследования является разработка алгоритма подсчета пассажиров для получения достоверных сведений о подсчете количества пассажиров для оптимизации работы маршрутных транспортных средств.
Для реализации данной системы на языке Python было разработано программное обеспечение, позволяющее подсчитывать количество входящих и выходящих пассажиров [1]. Для работы данной системы в верхней части дверного проема автобуса необходимо установить видеокамеру, направленную вниз. Данные, полученные с этой камеры обрабатываются на стационарном компьютере.
Принцип работы алгоритма подсчета пассажиропотока. Программа для обработки видеозаписи и подсчета пассажиров состоит из двух частей. В первой части видео считываются, изменяется масштаб, так как используемая нейронная сеть работает с разрешением видео 300х300 с целью обеспечения оптимальной производительности. Далее видео подается на обработку нейронной сети [2], которая возвращает список детектированных объектов [3]. Каждый объектов представлен в виде прямоугольной рамки и вероятности нахождения этого объекта внутри этой рамки.
Координаты рамок сохраняются лишь в том случае, если вероятность определения больше, чем 0,2. Данное значение установлено по умолчанию, его можно изменять. Если установить значение слишком большое, то часть детектированных пассажиров будет проигнорирована. А если установить значение слишком маленькое, то возможно ошибочное детектирование случайных областей изображения. Координаты рамок сохраняются с привязкой к конкретному кадру и далее создается файл с форматом ".json".
Вторая часть считывает этот файл с сохраненными данными. На основе этих данных с помощью центроидного метода отслеживания [4] формируются траектории движения пассажиров. Проанализировав эти траектории, можно посчитать количество вошедших и вышедших пассажиров. В алгоритме центроидного отслеживания используется библиотека OpenCV [5]. Центроид- это центр прямоугольной рамки, которая визуализируется по видеопотоку при детектировании пассажиров. Центроиды одного и того же объекта в разных кадрах формируют траекторию движения. Далее траектории визуализируются, сохраняются и происходит процесс их анализа. Суть анализа заключается в считывании вектора, направленного из начальной точки траектории в конечную. Если составляющая координаты X вектора отрицательная, то увеличивается количество вошедших пассажиров, если положительная, то количество вышедших. Если траектория состоит менее чем из двух точек, то она не учитывается в подсчете. На видеозаписи с разрешением 300х300 отображается два счетчика: "input" и "output", то есть вошедшие и вышедшие пассажиры из автобуса, ID- это уникальный идентификатор каждого объекта. Таким образом на выходе получается два значения, по которым можно оценивать загруженность общественного транспорта.
Практическая реализация алгоритма. Перед началом работы подключаются все необходимые модули и библиотеки. При запуске первой части программы загружается нейронная сеть, используя аргументы "prototxt" и "model":
Далее происходит процесс чтения первого кадра и вычисляются координаты для правильной обрезки кадра.
В ветвлении if происходит проверка, успешно ли прочитан файл. Далее создается словарь для описания конкретного кадра:
1. frame_dict = {"id": frame_id, "coord": []}
После этого запускается процесс обработки всех детектированных объектов в цикле. Если вероятность больше указанной в аргументе "confidence" (по умолчанию 0.2) и индекс класса соответствует классу "person"(человек), то координаты рамок записываются в созданный ранее словарь:
1. for i in np.arange(0, detections.shape[2]):
2. confidence = detections[0, 0, i, 2]
3. idx = int(detections[0, 0, i, 1])
4. if confidence > args["confidence"] and idx == 15:
5. coord = (detections[0, 0, i, 3:7] * 100).astype("int")
6. frame_dict["coord"].append(coord.tolist())
7. data["data"].append(frame_dict)
В последней строчке записывается в словарь "data" описание текущего кадра. Идет проверка на совпадение количества кадров. Как только номер текущего кадра равен количеству кадров цикл заканчивается и выводится сообщение, что файл обработан.
Далее создается файл с форматом ".json", в который записывается словарь "data".
При запуске второй части программы подключаются все необходимые библиотеки. Создается объект класса "CentroidTracker". Загружаются файлы, созданные первым алгоритмом и преобразуются из формата ".json" в словарь. Создается список для передачи рамок в трекер и в цикле идет процесс обработки. Рамки преобразуются в формат "numpy".
Далее добавляется преобразованная рамка в список "rects" и она визуализируется. Обновляется трекер, который возвращает список объектов. Если номер объекта больше количества траекторий, то в список"trajectory" добавляется новая траектория. В противном случае добавляется к существующей траектории новая точка(centroid).
В новом цикле создаются два счетчика:"output" и "input". После обработки траектории из списка "trajectory" программа получает количество точек траектории.Если траектория состоит менее чем из 2-х точек, то она игнорируется и начинается следующая итерация. В цикле обрабатываются все отрезки траектории, приходят координаты первой точки, второй точки, рисуется отрезок по траектории движения пассажира.
Определяется Х составляющая суммарного вектора траектории:
1. x = (tr[length - 1] - tr[0])[0]
Если X больше нуля, то увеличивается счетчик "output" на единицу, иначе увеличивается счетчик "input" на единицу. Выполняются команды:
1. ifx > 0:
2. output += 1
3. else:
4. input += 1
Оценка точности подсчета. Для определения точности детектирования и подсчета был проведен тест, который заключался в обработке часовой видеозаписи, снятой с камеры уличного видеонаблюдения. Камера была установлена так, чтобы угол наклона объектива и высота примерно совпадали с высотой и направлением камеры, установленной в общественном транспорте. Затем количество людей было подсчитано ручным методом и определен процент погрешности. После автоматического и ручного подсчета были получены результаты, приведенные в таблице 1.
Таблица 1-Анализ подсчета количества людей
|
Автоматический подсчет |
Ручной подсчет |
Счетчик "input"(вошедшие) |
76 |
76 |
Счетчик "output"(вышедшие) |
76 |
81 |
Всего, чел. |
152 |
157 |
Общая точность подсчета, % |
96,82 |
По данным этой таблицы можно увидеть, что погрешность в результате проведения теста составила примерно 3%. Соответственно, при помощи разработанного алгоритма можно производить достаточно точный подсчет пассажиров в общественном транспорте, что в дальнейшем поможет развитию транспортных предприятий и улучшит работу общественного транспорта.
Заключение. Преимущество данной системы подсчета пассажиров перед другими заключается в простоте использования и минимальных затратах на оборудование. Система проводит слежение за каждым пассажиром с момента его входа/выхода до его исчезновения из поля зрения камеры, что выгодно отличает ее от классических систем учета пассажиропотока, фиксирующими только момент пересечения некоторой границы (инфракрасный луч, ступенька на входе), в которых человек может пересечь эту границу несколько раз, например, когда пассажир находится в дверях автобуса. Также данная система помогает отслеживать размеры выручки автотранспортного предприятия. Имея данные по каждому автобусу о количестве пассажиров за какой-либо промежуток времени можно оптимизировать работу подвижного состава маршрутных транспортных средств.
Список литературы.
1.Python: официальный сайт [Электронный ресурс]. – URL: https://www.python.org/ (дата обращения: 01.12.2019).
2.Как работает нейронная сеть: алгоритмы, обучение, функции активации и потери: сайт [Электронный ресурс]. – URL:https://neurohive.io/ru/osnovy-data-science/osnovy-nejronnyh-setej-algoritmy-obuchenie-funkcii-aktivacii-i-poteri/ (дата обращения: 05.12.2019).
3.Рохит Ганди. R-CNN, Fast R-CNN, Faster R-CNN, YOLO - Алгоритмы обнаружения объектов [Электронный ресурс].-URL:https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e (дата обращения:10.12.2019).
4.Adrian Rosebrock. Simple object tracking with OpenCV [Электронный ресурс].- URL: https://www.pyimagesearch.com/2018/07/23/simple-object-tracking-with-opencv/ (date of the application: 12.12.2019).
5.OpenCV: официальный сайт [Электронный ресурс]. – URL: https://opencv.org/releases/ (дата обращения: 15.12.2019).