МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«РОССИЙСКИЙ УНИВЕРСИТЕТ ТРАНСПОРТА»
(РУТ(МИИТ)
Институт управления и цифровых технологий
Кафедра «Вычислительные системы, сети и информационная безопасность»
Отчет По ПРОЕКТУ
НА тему:
интеллектуальная система для регистрации и анализа траектории движения электросамокатов
Направление: 10.03.01 Информационная безопасность
Профиль: Безопасность компьютерных систем
Выполнил:
студент группы УИБ-312
Угурчиева Д.М.
Проверил:
Романенко А.Р.
МОСКВА 2023
АННОТАЦИЯ
Пояснительная записка – 32 с., 4 рис., 10 источников, 1 приложение.
Распознавание траектории электросамоката, искусственный интеллект, нейронная сеть.
Объектом исследования является анализ траектории движения электросамокатов.
Предмет исследования – 40 видеофайлов, 20 из которых с прямой траекторией электросамоката, и 20 с извилистой.
Цель работы: создать ИНС, анализирующую траекторию электросамоката на видео.
В ходе работы был проведен подбор литературы, анализ и работа с источниками, собрана общая выборка изучены различные интеллектуальные нейронные сети и программно-реализована система распознавания с контролем качества обучения.
В результате были разработаны программа, отслеживающая траекторию электросамоката на видео.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ. 4
ФОРМИРОВАНИЕ И ПОДГОТОВКА ДАННЫХ ДЛЯ ТРАЕКТОРИИ ДВИЖЕНИЯ ЭЛЕКТРОСАМОКАТА.. 5
ИНФОРМАЦИОННО ПОИСКОВАЯ СИСТЕМА.. 6
Теоретический аспект. 6
Операции над данными. 7
Выбор СУБД.. 8
Разработка ИПС.. 9
ФУНКЦИОНАЛ РАБОТЫ ИПС.. 11
АНАЛИЗ ВЫБРАННЫХ МОДЕЛЕЙ.. 14
Модель YOLOv4. 14
Модель YOLOv4-tiny. 15
Модель FASTER R-CNN.. 16
Модель OpenCV Object Tracking. 17
ТЕСТИРОВАНИЕ ВЫБРАННЫХ МОДЕЛЕЙ.. 19
ЗАКЛЮЧЕНИЕ. 20
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ.. 21
ПРИЛОЖЕНИЯ.. 22
ПРИЛОЖЕНИЕ А.. 22
ВВЕДЕНИЕ
В ходе разработки программы машинного обучения были изучены теоретические материалы, выбраны обученные модели. После чего были разобраны принципы формирования данных и применены готовые программные средства для решения задачи распознавания.
Система распознавания была настроена так, чтобы по полученном видео она находила объект и в результате выводила с какой траекторией движется электросамокат на видео.
Для обеспечения безопасности и эффективности движения электросамокатов, необходимо разработать алгоритмы, которые могут оптимально анализировать их траекторию. В этом контексте искусственный интеллект может быть использован для создания автоматических систем управления самокатами.
Одним из методов разработки алгоритма анализа траектории электросамокатов является использование машинного обучения. Данный метод позволяет основе полученных данных принимать решения на основе результатов обучения. Таким образом можно снизить количество происшествий и увеличить безопасность как пешеходов, так и самих водителей электросамокатов.
Актуальность данной программы в нынешнее время становится более востребованной. В последние годы электросамокаты стали популярным средством передвижения в городской среде, в связи с этим фактором, участились аварии. По данным статистики, которую МВД предоставило главе Совета при президенте по правам человека Валерию Фадееву, за второй квартал 2023 года произошло 496 аварий с участием электросамокатов. Это может помочь в улучшении безопасности дорожного движения и предотвращении аварий.
ФОРМИРОВАНИЕ И ПОДГОТОВКА ДАННЫХ ДЛЯ ТРАЕКТОРИИ ДВИЖЕНИЯ ЭЛЕКТРОСАМОКАТА
Для тестирования траектории движения электросамоката была сформирована выборка из 40 видеозаписей. В ходе тестирования было проведено 2 теста. В первом тесте 20 видеозаписей с извилистой траекторий, во втором тесте 20 видеозаписей с прямой траекторией электросамоката. Видео для выборки были записаны на мобильный телефон Iphone11. Формат видео mp4 в качестве 720p.
ИНФОРМАЦИОННО ПОИСКОВАЯ СИСТЕМА
Теоретический аспект
Информационно-поисковая система – это прикладная компьютерная среда для обработки, хранения, сортировки, фильтрации и поиска массивов структурированной информации.
ИПС ориентированы, как правило, на извлечение подмножества хранимых данных, удовлетворяющих некоторому поисковому критерию. Пользователя ИПС интересует извлекаемые из базы данных сведения, а не результаты их обработки.
Основные компоненты ИПС:
- программные средства,
- поисковый массив документов,
- средства поддержки информационного языка системы.
Программные средства ИПС служат для организации управления данными (ввода, хранения, защиты, поиска и выдачи). Поисковый массив документов в ИПС обычно называется базой данных. Он представляет собой набор ссылок на документы или описаний документов, хранящий основную информацию о документах. Этот набор организован так, чтобы обеспечить быстрый поиск. Описание документа определяется предметной областью и состоит из значений атрибутов, характеризующих содержание документа.
Информационный язык системы предназначен для того, чтобы пользователь мог сформулировать запрос к системе. Системными средствами запрос преобразуется в формализованное поисковое предписание – поисковый запрос. Этот запрос далее сопоставляется с поисковыми образами документов, хранимыми в системе, по критерию смыслового соответствия. Информационный язык системы может быть основан на подмножестве естественного языка, которое относится к обслуживаемой предметной области. Но чаще поиск документа осуществляется с помощью шаблонов – экранных форм, включающих поля описания документа. [И.П. Карпова ВВЕДЕНИЕ В БАЗЫ ДАННЫХ Утверждено Редакционно-издательским советом института в качестве Учебного пособия Москва 2005]
Каждая информационно-поисковая система предназначена для решения определенного класса задач, для которых характерен свой набор объектов и их признаков.
Информационно-поисковая система состоит из двух частей: базы данных (БД) и системы управления базами данных (СУБД).
Система управления базами данных – это комплекс программных и языковых средств, необходимых для создания баз данных, поддержания их в актуальном состоянии и организации поиска в них необходимой информации.
Операции над данными
Модель данных определяет множество действий, которые допустимо производить над некоторой реализацией БД для её перевода из одного состояния в другое. Это множество соотносят с языком манипулирования данными (Data Manipulation Language, DML). Любая операция над данными включает в себя селекцию данных (select), то есть выделение из всей совокупности именно тех данных, над которыми должна быть выполнена требуемая операция, и действие над выбранными данными, которое определяет характер операции. Условие селекции – это некоторый критерий отбора данных, в котором могут быть использованы логическая позиция элемента данных, его значение и связи между данными.
По типу производимых действий различают следующие операции:
- идентификация данных и нахождение их позиции в БД;
- выборка (чтение) данных из БД;
- включение (запись) данных в БД;
- удаление данных из БД;
- модификация (изменение) данных БД.
Обработка данных в БД осуществляется с помощью процедур базы данных – транзакций. Транзакция – это последовательность операций над данными, которая является логически неделимой, то есть рассматривается как единая макрооперация. Транзакция либо выполняется полностью, либо не выполняется совсем. Никакая другая процедура или операция не могут обратиться к данным, которые обрабатываются стартовавшей процедурой, до тех пор, пока последняя не закончит свою работу.
Выбор СУБД
Выбор СУБД является одним из важнейших моментов в разработке проекта, так как он принципиальным образом влияет на весь процесс проектирования БД и реализации информационной системы. Теоретически при осуществлении этого выбора нужно принимать во внимание десятки факторов. Но на практике руководствуются лишь собственной интуицией и несколькими наиболее важными критериями, к которым, в частности, относятся:
- тип модели данных, которую поддерживает данная СУБД, адекватность модели данных структуре, рассматриваемой ПО;
- характеристики производительности СУБД;
- запас функциональных возможностей для дальнейшего развития информационной системы;
- степень оснащенности СУБД инструментарием для персонала администрирования данными;
- удобство и надежность СУБД в эксплуатации;
- стоимость СУБД и дополнительного программного обеспечения.
Разработка ИПС
Данное решение использует различные библиотеки и фреймворки для создания приложения для распознавания рукописных цифр и взаимодействия с базой данных PostgreSQL.
Импорт необходимых библиотек:
- PIL - библиотека Python Imaging Library для работы с изображениями.
- Numpy – библиотека для математических вычислений.
- os - модуль для работы с операционной системой.
- glob - модуль для поиска файлов по шаблону.
- psycopg2 - библиотека для взаимодействия с базой данных PostgreSQL.
- tkinter - библиотека для создания графического интерфейса.
Загрузка предобученной модели:
Загрузка модели Загрузка модели для обнаружения объекта на видео из файла yolov4.weights.
Загрузка отредактированного конфига из файла yolov4.cfg
Определение функции AdminPanel - функция открывает панель администратора с различными элементами управления, такими как текстовые поля, кнопки и прокручиваемое текстовое поле. Она также устанавливает обработчики событий для кнопок "Просмотр" и "Удаление".
Функция AdminWork(id=None, name=None, data=None, verdict=None) - выполняет запросы к базе данных PostgreSQL в зависимости от переданных параметров. Она создает подключение к базе данных, выполняет запросы SQL и отображает результаты в графическом интерфейсе.
Функция AdminDelete(id=None, name=None, data=None, verdict=None) - удаляет данные из базы данных PostgreSQL на основе переданных параметров. Она также создает подключение к базе данных, выполняет запросы SQL для удаления данных.
Функции No_Name_Error() и No_Data_Error() - отображают сообщения об ошибке, если не были введены имя или данные для удаления
Функция Entry(name, nev) - вызывается при нажатии кнопки "Выбрать файл". Она проверяет, было ли введено имя и ожидаемая цифра, а затем вызывает функцию Choose_file(name, nev).
Функция Choose_file(name, nev) - открывает диалоговое окно для выбора видео, а затем использует модель машинного обучения для обнаружения объекта и анализа траектории с помощью функции полимиальной регрессии. Результаты сохраняются в базу данных PostgreSQL.
Код создает окно с графическим интерфейсом, в котором пользователь может вводить имя, и выбирать видео для анализа. Результат анализа выведется в отдельном окне в виде последнего кадра видео с нарисованной на нем траекторией и результатом анализа.
Данное решение сочетает в себе графический интерфейс, обработку изображений, взаимодействие с базой данных PostgreSQL и использование модели машинного обучения для анализа траектории.
ФУНКЦИОНАЛ РАБОТЫ ИПС
Рисунок 1 – главное меню ИПС
Рисунок 2 – Результат работы ИПС
Рисунок 3 – пример работы ИПС
Рисунок 4 – информация в базе данных
АНАЛИЗ ВЫБРАННЫХ МОДЕЛЕЙ
Модель YOLOv4
YOLOv4 (You Only Look Once version 4) - это алгоритм компьютерного зрения для обнаружения объектов в реальном времени. Он является последней версией серии моделей YOLO, разработанных для быстрого и точного обнаружения объектов.
Основные особенности YOLOv4:
1. Быстрота: YOLOv4 способен работать в режиме реального времени, что означает, что он может обрабатывать видеопотоки с высокой скоростью. Это достигается за счет использования единственной нейронной сети для обнаружения объектов, в отличие от других моделей, которые используют двухэтапный подход.
2. Точность: YOLOv4 достигает высокой точности обнаружения объектов благодаря использованию различных техник, таких как улучшенные архитектуры нейронных сетей, улучшенные методы обучения и предварительное обучение на больших наборах данных.
3. Универсальность: YOLOv4 может обнаруживать и классифицировать широкий спектр объектов, включая людей, автомобили, животных и другие предметы. Он может быть применен в различных областях, таких как автономные автомобили, системы видеонаблюдения, робототехника и многое другое.
4. Масштабируемость: YOLOv4 может быть масштабирован для работы на разных устройствах, включая центральные процессоры (CPU), графические процессоры (GPU) и специализированные ускорители, такие как Tensor Processing Units (TPU). Это позволяет использовать модель на различных платформах и в различных сценариях.
5. Открытость: YOLOv4 является открытым исходным кодом, что означает, что его архитектура и реализация доступны для общественности. Это способствует активной разработке и улучшению модели сообществом и позволяет адаптировать ее под конкретные потребности.
YOLOv4 стал одной из самых популярных моделей для обнаружения объектов благодаря своей быстроте, точности и универсальности. Он продолжает развиваться и улучшаться, поэтому можно ожидать еще более высокой производительности и функциональности в будущих версиях.
Модель YOLOv4-tiny
YOLOv4-tiny - это улучшенная и уменьшенная версия модели YOLOv4 которая разработана для быстрого и эффективного обнаружения объектов в реальном времени.
Модель YOLOv4-tiny имеет несколько отличий от полной версии YOLOv4. Она имеет меньшую архитектуру и меньшее количество слоев, что делает ее более легкой и быстрой в работе. Однако, у нее также есть некоторые ограничения по точности обнаружения объектов, по сравнению с полной версией.
YOLOv4-tiny использует архитектуру сети Darknet-53, которая состоит из сверточных слоев, объединений и обратных сверток. Архитектура Darknet-53 является более простой и легкой, чем архитектура Darknet-19, используемая в предыдущих версиях YOLO.
Основная идея YOLOv4-tiny заключается в том, чтобы использовать меньшую архитектуру, так можно достичь более высокой скорости обработки видео или изображений. Она может работать на более слабых системах с ограниченными вычислительными ресурсами, при этом сохраняя достаточно хорошую точность обнаружения объектов.
YOLOv4-tiny использует алгоритм обнаружения объектов, основанный на анкорных рамках и предсказаниях классов. Он разделяет изображение на сетку ячеек и каждая ячейка предсказывает несколько прямоугольников-предсказаний и их соответствующие классы. Затем применяется фильтрация предсказаний и подавление не максимумов для удаления повторных обнаружений и выбора наиболее вероятного объекта.
YOLOv4-tiny достигает хорошей производительности в обнаружении объектов, но с некоторой потерей точности по сравнению с полной версией YOLOv4. Она может быть использована во многих приложениях, таких как видеонаблюдение, автоматический контроль качества, автономные автомобили и другие системы компьютерного зрения, где требуется быстрое и эффективное обнаружение объектов в реальном времени.
Модель FASTER R-CNN
FASTER R-CNN (Region-based Convolutional Neural Network) - это модель для обнаружения объектов, которая основана на архитектуре сверточных нейронных сетей. Она является улучшенной версией R-CNN и предлагает более быстрое и точное обнаружение объектов.
Основная идея FASTER R-CNN заключается в том, чтобы использовать сверточные нейронные сети для извлечения признаков из изображений и последующего использования регионального пропозала (Region Proposal Network, RPN) для предложения кандидатов на объекты. RPN генерирует предложения регионов, которые могут содержать объекты, и затем эти предложения передаются в классификатор, который определяет класс объекта и его точное положение.
FASTER R-CNN состоит из трех основных компонентов: сверточной сети для извлечения признаков (обычно используется предобученная на ImageNet сеть, например, VGG16 или ResNet), RPN для генерации предложений регионов и классификатора для определения класса и точного положения объекта.
Процесс работы FASTER R-CNN выглядит следующим образом:
1. Входное изображение проходит через сверточную сеть, которая извлекает признаки.
2. RPN использует эти признаки для генерации предложений регионов.
3. Предложения регионов передаются в классификатор, который определяет класс объекта и его положение.
FASTER R-CNN достигает высокой точности обнаружения объектов, но требует большего времени для обработки изображений или видео по сравнению с YOLOv4-tiny. Она часто используется в задачах, где требуется высокая точность, например, в медицинском образовании, автоматическом вождении и других приложениях, где скорость не является основным фактором.
Модель OpenCV Object Tracking
OpenCV Object Tracking - это модель для отслеживания объектов на видео или в реальном времени. Она основана на использовании алгоритмов компьютерного зрения и машинного обучения.
Основная идея модели заключается в том, чтобы найти и отслеживать объекты на видео, используя информацию о их внешних признаках, таких как цвет, текстура или форма. Для этого модель использует различные алгоритмы, такие как алгоритмы фильтрации цвета, алгоритмы выделения контуров и алгоритмы отслеживания движения.
Процесс работы модели OpenCV Object Tracking выглядит следующим образом:
1. Входное видео разбивается на отдельные кадры.
2. На каждом кадре модель ищет объекты с помощью выбранного алгоритма (например, алгоритма фильтрации цвета).
3. Найденные объекты отслеживаются на последующих кадрах с помощью алгоритмов отслеживания движения.
4. Модель обновляет информацию о положении и состоянии объектов на каждом кадре.
Модель OpenCV Object Tracking обладает достаточно высокой скоростью обработки видео и может использоваться для решения различных задач, таких как отслеживание лиц, отслеживание автомобилей на дороге или отслеживание объектов в робототехнике. Однако, она может быть менее точной по сравнению с моделями, основанными на глубоком обучении, такими как FASTER R-CNN.
После выбора четырех моделей была собрана тестовая выборка, 40 видеозаписей, сделанных на камеру телефона, 20 из которых с прямой траекторией электросамоката и 20 с извилистой.
ТЕСТИРОВАНИЕ ВЫБРАННЫХ МОДЕЛЕЙ
Таблица 1 – Результат по построению траектории
Выбранные модели
правильное построение траектории (ровное)
правильное построение траектории (неровное)
YOLOv4
19 из 20
18 из 20
YOLOv4-tiny
15 из 20
12 из 20
FASTER R-CNN
17 из 20
15 из 20
OpenCV Object Tracking
16 из 20
15 из 20
Таблица 2 - Результат по распознаванию траектории
Выбранные модели
Правильное распознавание (ровное)
Правильное распознавание (неровное)
Среднее время распознавания
YOLOv4
18 из 20
18 из 20
10 сек
YOLOv4-tiny
12 из 20
9 из 20
8 сек
FASTER R-CNN
16 из 20
14 из 20
42 сек
OpenCV Object Tracking
18 из 20
15 из 20
53 сек
Каждое видео было обработано программами, по результатам которых была выбрана модель YOLOv4. Видеозапись и скриншот программы заносятся в базу данных. При загрузке видео пользователем в интерфейс программы выводятся скриншот и результат обработки видео.
ЗАКЛЮЧЕНИЕ
Рассмотрим результаты исследования, целью которого являлось разработать информационную поисковую систему на базе ИНС для автоматической постройки траектории самоката.
В первой части работы стояла задача собрать обучающую и тестовую выборку. В результате чего была собрана общая выборка для тестирования моделей.
Во второй части работы показан процесс разработки ИПС, использованные методы проектирования и необходимые библиотеки. Были изучены и усвоены теоретические аспекты ИПС и СУБД.
В третьей части работы проведен анализ четырех ИНС. Что позволило узнать больше о характеристиках существующих моделей.
Исходя из анализа, была выбрана лучшая ИНС, которая в последующем была настроение и протестирована. При оценке результатов, полученным в ходе тестирования. По проанализированным результатам была выбрана лучшая ИНС – YOLOv4, так как способна лучше всех отслеживать движущиеся объекты.
Подводя итог, после теоретических материалов, применяемые при разработке ИПС, и сравнении полученных результатов после тестирования ИНС, позволяют получать готовую информационную поисковую систему (ИПС) по анализу траектории движения электросамоката. Данная ИПС включает в себя функции хранения данных.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1) Нейронная сеть [Электронный ресурс]. – URL: https://aws.amazon.com/ru/what-is/neural-network/ (дата обращения 24.09.23)
2) Расширенное руководство FASTER R-CNNhttps://cloud.google.com/tpu/docs/fasterr-cnn (дата обращения 24.09.23)
3) Эволюция нейросетей [Электронный ресурс]. – URL: https://habr.com/ru/post/302242/ (дата обращения 24.09.23)
4) Архитектура модели OpenCV Object Tracking[Электронный ресурс]. – URL: https://iq.opengenus.org/ opencvobjecttracking -model-architecture/ (дата обращения 24.09.23)
5) Модели машинного обучения [Электронный ресурс]. – URL: https://medium.com/@bigdataschool/топ-4-моделей-машинного-обучения-для-компьютерного-зрения-8d7bb4a68812 (дата обращения 24.09.23)
6) Модель YOLOv4[Электронный ресурс]. – URL: https://proproprogs.ru/neural_network/primery-arhitektur-svertochnyh-setey- yolov4 (дата обращения 24.09.23)
7) Нейронная сеть YOLOv4-tiny[Электронный ресурс]. – URL: https://github.com/sozykin/asozykin.ru/blob/master/_posts (дата обращения 24.09.23)
8) YOLOv4-tiny [Электронный ресурс]. – URL: https://habr.com/ru/company/skillfactory/blog/541758/ (дата обращения 24.09.23)
9) Искусственный интеллект [Электронный ресурс]. – URL: https://proglib.io/p/ii-dlya-risovaniya-raskryvaem-sekrety-neyronnogo-perenosa-stilya-2022-08-29 (дата обращения 24.09.23)
10) Главная страница модели [Электронный ресурс]. – URL: https://github.com/AlexeyAB/darknet#yolo-v4-v3-and-v2-for-windows-and-linux (дата обращения 24.09.23)
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ А
from turtle import st, fd
import psycopg2
from config import host, user, password, db_name
import datetime
import os
import glob
import tkinter.filedialog as fd
import cv2
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import time
import tkinter as tk
from tkinter import *
from tkinter.messagebox import showerror
import tkinter.scrolledtext as st
import numpy as np
yolo_net = cv2.dnn.readNet('yolov4.weights', 'yolov4.cfg')
output_layer_names = yolo_net.getUnconnectedOutLayersNames()
connection = None
win = tk.Tk()
win.title('Cистема анализа траектории движения электросамоката')
win.geometry("500x500")
win.resizable(False, False)
tk.Label(win, text= 'Cистема анализа траектории движения электросамоката', font=("Times New Roman", 14)).place(x=20, y=50)
tk.Label(win,text = 'Введите ФИО').place(x=210, y=210)
Fio = tk.Entry(win, width=30)
Fio.place(x=160, y=230)
buttonload = tk.Button(win, text="Выбрать файл",width=20,height=2, command=lambda:Entry(name=Fio.get(), nev=Fio.get()))
buttonload.place(x=178,y=260)
tk.Label(win, text='Научный руководитель: Малинский С.В.', font=("Times New Roman", 10)).place(x=10, y=450)
tk.Label(win, text='Команда разработчиков: Угурчиева Д.М. font=("Times New Roman", 10)).place(x=10, y=470)
def AdminPanel():
global new_window, label2
new_window = Toplevel(win)
new_window.title('Панель Администратора')
new_window.geometry("600x600")
new_window.resizable(False, False)
tk.Label(new_window, text='ID', font=("Times New Roman", 12)).place(x=70, y=35)
slot_id = tk.Entry(new_window, width=10)
slot_id.place(x=50, y=60)
tk.Label(new_window, text='ФИО', font=("Times New Roman", 12)).place(x=212, y=35)
slot_name = tk.Entry(new_window, width=10)
slot_name.place(x=200, y=60)
tk.Label(new_window, text='Дата', font=("Times New Roman", 12)).place(x=362, y=35)
slot_date = tk.Entry(new_window, width=10)
slot_date.place(x=350, y=60)
tk.Label(new_window, text='Результат', font=("Times New Roman", 12)).place(x=497, y=35)
slot_verdict = tk.Entry(new_window, width=10)
slot_verdict.place(x=500, y=60)
buttonDelete = tk.Button(new_window,
text="Просмотр",
width=10,
height=1, command=lambda: AdminWork(id=slot_id.get(),name=slot_name.get(), data=slot_date.get(), verdict=slot_verdict.get()))
buttonDelete.place(x=200, y=550)
buttonGet = tk.Button(new_window,
text="Удаление",
width=10,
height=1, command=lambda: AdminDelete(id=slot_id.get(),name=slot_name.get(), data=slot_date.get(), verdict=slot_verdict.get()))
buttonGet.place(x=320, y=550)
def AdminWork(id=None, name=None, data=None, verdict=None):
global connection
files = glob.glob('D:/OneDrive/Desktop/AdminPhotos')
for f in files:
os.remove(f)
list1 = st.ScrolledText(new_window, wrap=tk.WORD, width=95, height=25, font=("Times New Roman", 10))
list1.place(x=10, y=130)
try:
connection = psycopg2.connect(
host=host,
user=user,
password=password,
database=db_name
)
connection.autocommit = True
with connection.cursor() as cursor:
cursor.execute("SELECT version();")
print(f"Server version: {cursor.fetchone()}")
db_get = "SELECT * FROM project"
conditions = []
values = []
if id:
conditions.append("id = %s")
values.append(id)
if name:
conditions.append("name = %s")
values.append(name)
if data:
try:
date_obj = datetime.datetime.strptime(data, '%Y-%m-%d')
conditions.append("data = %s")
values.append(date_obj)
except ValueError as ex:
print(f"Error converting data to timestamp: {ex}")
if verdict:
conditions.append("verdict = %s")
values.append(verdict)
if conditions:
db_get += " WHERE " + " AND ".join(conditions)
cursor.execute(db_get, tuple(values))
gets = cursor.fetchall()
for row in gets:
id = row[0]
name = row[1]
date = row[2]
verdict = row[3]
list1.insert(tk.INSERT, "{:^5}".format(id) + "{:^25}".format(
date.strftime('%Y-%m-%d')) + "{:^30}".format(name))
verdict = str(verdict)
list1.insert(tk.INSERT, "{:^15}".format(verdict) + "\n")
list1.configure(state='disabled')
except psycopg2.Error as ex:
print("[INFO] Error while working with PostgreSQL", ex)
finally:
if connection:
connection.close()
print("[INFO] PostgreSQL connection closed")
def AdminDelete(id=None, name=None, data=None, verdict=None):
try:
connection = psycopg2.connect(
host=host,
user=user,
password=password,
database=db_name
)
connection.autocommit = True
with connection.cursor() as cursor:
db_get = "DELETE FROM project"
conditions = []
values = []
if id:
conditions.append("id = %s")
values.append(id)
if name:
conditions.append("name = %s")
values.append(name)
if data:
try:
date_obj = datetime.datetime.strptime(data, '%Y-%m-%d')
conditions.append("data = %s")
values.append(date_obj)
except ValueError as ex:
print(f"Error converting data to timestamp: {ex}")
if verdict:
conditions.append("verdict = %s")
values.append(verdict)
if conditions:
db_get += " WHERE " + " AND ".join(conditions)
cursor.execute(db_get, tuple(values))
except psycopg2.Error as ex:
print("[INFO] Error while working with PostgreSQL", ex)
finally:
if connection:
connection.close()
print("[INFO] PostgreSQL connection closed")
def Choose_file(name, nev):
global video_filename
global verdict
global connection
video_filename = fd.askopenfilename(title="Открыть видео файл", initialdir="D:/path/to/videos")
if video_filename:
date_now = datetime.datetime.now()
date1 = date_now.strftime('%Y-%m-%d %H:%M:%S')
output_layer_names = yolo_net.getUnconnectedOutLayersNames()
trajectory = []
cap = cv2.VideoCapture(video_filename)
frame_number = 0
processing_time = 0
last_frame = None
draw_line = False
frame_skip = 15
current_frame = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
current_frame += 1
if current_frame % frame_skip != 0:
continue
frame_number += 1
height, width, channels = frame.shape
start_time = time.time()
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
yolo_net.setInput(blob)
outs = yolo_net.forward(output_layer_names)
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(class_ids[i])
confidence = confidences[i]
if label == "0":
trajectory.append((center_x, center_y))
if len(trajectory) > 1:
draw_line = True
if draw_line:
if len(trajectory) > 2:
pts = np.array(trajectory, np.int32)
pts = pts.reshape((-1, 1, 2))
frame = cv2.polylines(frame, [pts], isClosed=False, color=(0, 255, 0), thickness=2)
last_frame = frame
end_time = time.time()
processing_time += (end_time - start_time)
verdict = ""
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
trajectory = np.array(trajectory)
x = trajectory[:, 0]
y = trajectory[:, 1]
poly_features = PolynomialFeatures(degree=2)
x_poly = poly_features.fit_transform(x.reshape(-1, 1))
poly_regression_model = LinearRegression()
poly_regression_model.fit(x_poly, y)
predicted_y_poly = poly_regression_model.predict(x_poly)
r_squared_poly = poly_regression_model.score(x_poly, y)
if r_squared_poly > 0.5:
verdict = "Smooth motion"
else:
verdict = "Rough motion"
if len(trajectory) > 2:
pts = np.array(trajectory, np.int32)
pts = pts.reshape((-1, 1, 2))
last_frame = cv2.polylines(last_frame, [pts], isClosed=False, color=(220, 20, 60), thickness=2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(last_frame, verdict, (20, 50), font, 2, (220, 20, 60), 2)
# Вывод финального кадра
if last_frame is not None and last_frame.shape[0] > 0 and last_frame.shape[1] > 0:
small_last_frame = cv2.resize(last_frame, (680, 1000))
cv2.imshow("Final Frame", small_last_frame)
cv2.imwrite(f"{verdict}_{frame_number}_{processing_time}.jpeg", small_last_frame)
try:
connection = psycopg2.connect(
host=host,
user=user,
password=password,
database=db_name
)
connection.autocommit = True
with connection.cursor() as cursor:
xyz = """INSERT INTO project(data, name, verdict) VALUES (%s, %s, %s);"""
cursor.execute(xyz, (date1, name, verdict))
except Exception as _ex:
print("[INFO] Ошибка при подключении кPostgreSQL:", _ex)
print("Подключение к PostgreSQL не удалось.")
finally:
if connection:
connection.close()
print("PostgreSQL connection closed")
else:
Error()
def Error():
showerror(title="Ошибка", message="Вы не выбрали файл")
def No_Name_Error():
showerror(title="Ошибка", message="Вы не ввели имя")
def No_Data_Error():
showerror(title="Ошибка", message="Вы не ввели данные для удаления")
def Entry(name, nev):
if name == '':
No_Name_Error()
elif name == "admin":
AdminPanel()
else:
Choose_file(name, nev)
win.mainloop()