Инженерный тур. 2 этап
На изображении представлен фрагмент поверхности дорожного полотна. Поверхность может иметь повреждения двух типов: ямы и трещины. Каждое повреждение снижает прочность полотна. Задача — написать функцию, которая определяет прочность дорожного полотна на изображении.
Максимальную прочность имеет неповрежденное полотно из бетонных плит, ее значение принято за 1. Прочность полотна, которое непригодно к использованию из-за множества повреждений, принята за 0. Обратите внимание, что неповрежденные полотна разных типов могут иметь различную прочность.
Рекомендуется использовать методы машинного обучения для решения этой задачи.
Материалы к заданию:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача1/user_task.
Выполнение
- Скачайте материалы задания.
Ознакомьтесь с материалами задания.
В материалах подготовлены несколько файлов
.py, набор изображений и аннотации к нему.В списке подготовленных файлов содержатся:
eval.py— файл с функцией, которую вам необходимо дописать;main.py— файл, проверяющий точность работы вашего алгоритма; не редактируйте его.main.pyиспользует написанные вами функции изeval.pyи сверяет верные ответы с предсказанием вашего алгоритма;annotations.csv— файл, устанавливающий соответствие между изображениями и верными ответами; в каждой строке файла содержится путь к изображению и соответствующим ему значение прочности.
Прочитайте файл
eval.py.В файле содержатся функции
load_modelsиget_road_health:load_models— загружает из файлов модели машинного обучения;get_road_health— определяет прочность дорожного полотна на изображении, именно ее необходимо дописать.
- Допишите функции в файле
eval.py. Запустите файл
main.pyи проверьте свой алгоритм.Если программа выдала ошибку, то найдите и исправьте ее в файле
eval, вновь запустите файлmain.py.Пришлите решение на онлайн-платформу для проверки.
В качестве решения необходимо сдать отредактированный файл
eval.py, либо архив*.zipс файломeval.pyи остальными файлами, требующимися для его работы. В архиве должны находиться файлы, а не одноименная архиву папка.
Размер решения ограничен: не более 15 МБ. Если алгоритм успешно проверен платформой, то следующее решение можно прислать только через 10 мин. Если алгоритм в ходе проверки выдал сообщение об ошибке, то следующее решение можно прислать сразу.
Пакеты, ориентированные на работу с изображениями и данными, использующиеся на платформе проверки:
Python 3.8.10; catboost 1.1.1; dlib 19.24.0; gast 0.4.0; h5py 3.7.0; imutils 0.5.4; keras 2.9.0; Keras-Preprocessing 1.1.2; matplotlib 3.6.2; numpy 1.23.2; opencv-python 4.6.0.66; pandas 1.5.1; scikit-image 0.19.3; scikit-learn 1.1.3; scipy 1.9.3; tensorflow-cpu 2.9.2; torch 1.13.0; torchaudio 0.13.0; torchvision 0.14.0.
Используйте совместимые пакеты.
Для решения задания необходимо обучить модель машинного обучения, решающую задачу регрессии. В качестве данных для обучения нужно использовать материалы, предоставленные пользователям. Использование нейронной сети вполне оправдано при решении данной задачи; главное — в последнем слое оставить один нейрон и линейную функцию активации. Функции потерь при обучении: MSE, MAE, Hubel Loss, MSLE.
В приведенном решении используется полносвязная нейронная сеть со следующей архитектурой:
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(400 * 400, 128)
self.relu1 = nn.ReLU()
self.fc2 = nn.Linear(128, 64)
self.relu2 = nn.ReLU()
self.fc3 = nn.Linear(64, 1)
Предоставленный пользователю набор данных и решение:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача1.
Файл с решением — solution.py.
Устройства современной автономной транспортной системы должны обмениваться данными друг с другом. Один из возможных протоколов обмена данными — протокол MQTT. Задача — написать MQTT-клиента, который будет прослушивать несколько каналов, обрабатывать данные из них и публиковать результаты обработки в другие каналы.
Для решения задачи необходимо ознакомиться с устройством протокола MQTT. Для создания клиента используйте библиотеку paho-mqtt.
Клиент должен прослушивать каналы *2 и *3. В эти каналы приходят сообщения в формате «число; имя канала». Если сообщение пришло в канал *2, то число в нем нужно умножить на 2 и результат опубликовать в канале, название которого пришло в сообщении. Аналогично для канала *3, только число нужно умножить на 3.
Кроме того, клиент должен прослушивать каналы addend и command. В addend будут приходить сообщения с числами. В command будут приходить сообщения с названием канала. Как только в command приходит сообщение, необходимо суммировать все новые числа из канала addend и опубликовать в канале, название которого указано в сообщении.
Еще клиент должен прослушивать канал numbers. В него приходят сообщения, содержащие числа. Все нечетные числа клиент должен пересылать в канал odd.
Сообщения передаются в формате bytes, для их преобразования в текст используйте decode("utf-8").
В сообщениях всегда одно число и/или одно имя канала.
Материалы к заданию:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача2/user_task.
Выполнение
- Скачайте материалы задания.
Ознакомьтесь с материалами задания.
В материалах подготовлены несколько файлов
.py. В списке подготовленных файлов содержатся:eval.py— файл с функциями, которые необходимо дописать;main.py— файл, проверяющий точность работы вашего алгоритма; не редактируйте его.main.pyиспользует написанные вами функции изeval.pyи сверяет верные ответы с предсказанием вашего алгоритма;annotations.json— файл, устанавливающий соответствие между тестами и верными ответами.
Прочитайте файл
eval.py.В файле содержатся функции
setupиmain_loop:setup— инициализируетMQTT-клиент;main_loop— реализует цикл приема и обработки сообщений.
- Допишите функции в файле
eval.py. Запустите файл
main.pyи проверьте свой алгоритм.Если программа выдала ошибку, то найдите и исправьте ее в файле
eval, вновь запустите файлmain.py.Пришлите решение на онлайн-платформу для проверки.
В качестве решения необходимо сдать отредактированный файл
eval.py, либо архив*.zipс файломeval.pyи остальными файлами, требующимися для его работы. В архиве должны находиться файлы, а не одноименная архиву папка.
Размер решения ограничен: не более 1 МБ. Если алгоритм успешно проверен платформой, то следующее решение можно прислать только через 10 мин. Если алгоритм в ходе проверки выдал сообщение об ошибке, то следующее решение можно прислать сразу.
Пакеты, ориентированные на работу с изображениями и данными, использующиеся на платформе проверки:
Python 3.8.10; catboost 1.1.1; dlib 19.24.0; gast 0.4.0; h5py 3.7.0; imutils 0.5.4; keras 2.9.0; Keras-Preprocessing 1.1.2; matplotlib 3.6.2; numpy 1.23.2; opencv-python 4.6.0.66; pandas 1.5.1; scikit-image 0.19.3; scikit-learn 1.1.3; scipy 1.9.3; tensorflow-cpu 2.9.2; torch 1.13.0; torchaudio 0.13.0; torchvision 0.14.0.
Используйте совместимые пакеты.
Для решения задания необходимо разобраться в устройстве протокола MQTT. Понять, что брокер запускать и настраивать не нужно, он уже запущен на платформе проверки. Необходимо подписаться на каналы и обрабатывать входящие сообщения. При подключении к брокеру следует использовать адрес 127.0.0.1, а не псевдоним localhost.
Предоставленный пользователю набор данных и решение:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача2.
Файл с решением — solution.py.
Задача — написать функцию, определяющую положение квадрокоптера на изображении. На каждом изображении ровно один квадрокоптер. В качестве данных для обучения можно использовать фотографии из материалов к заданию.
Материалы к заданию:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача3/user_task.
Выполнение
- Скачайте материалы задания.
Ознакомьтесь с материалами задания.
В материалах подготовлены несколько файлов
.py, набор изображений и аннотации к нему. В списке подготовленных файлов содержатся:eval.py— файл с функциями, которые необходимо дописать;main.py— файл проверяющий, точность работы вашего алгоритма; не редактируйте его.main.pyиспользует написанные функции изeval.pyи сверяет верные ответы с предсказанием вашего алгоритма;annotations.csv— файл, устанавливающий соответствие между изображениями и верными ответами; в каждой строке файла содержится путь к изображению и параметрами ограничивающей квадрокоптер рамки.
Прочитайте файл
eval.py.В файле содержатся функции
load_modelsиdetect_drone:load_models— загружает из файлов модели машинного обучения.detect_drone— обнаруживает квадрокоптер на изображении.
- Допишите функции в файле
eval.py. Запустите файл
main.pyи проверьте свой алгоритм.Если программа выдала ошибку, то найдите и исправьте ее в файле
eval, вновь запустите файлmain.py.Пришлите решение на онлайн-платформу для проверки.
В качестве решения необходимо сдать отредактированный файл
eval.py, либо архив*.zipс файломeval.pyи остальными файлами, требующимися для его работы. В архиве должны находиться файлы, а не одноименная архиву папка.
Размер решения ограничен: не более 30 МБ. Если алгоритм успешно проверен платформой, то следующее решение можно прислать только через 10 мин. Если алгоритм в ходе проверки выдал сообщение об ошибке, то следующее решение можно прислать сразу.
Пакеты, ориентированные на работу с изображениями и данными, использующиеся на платформе проверки:
Python 3.8.10; catboost 1.1.1; dlib 19.24.0; gast 0.4.0; h5py 3.7.0; imutils 0.5.4; keras 2.9.0; Keras-Preprocessing 1.1.2; matplotlib 3.6.2; numpy 1.23.2; opencv-python 4.6.0.66; pandas 1.5.1; scikit-image 0.19.3; scikit-learn 1.1.3; scipy 1.9.3; tensorflow-cpu 2.9.2; torch 1.13.0; torchaudio 0.13.0; torchvision 0.14.0.
Используйте совместимые пакеты.
Участникам необходимо обучить нейросетевой детектор. Основная сложность заключается в выборе модели детектора, подходящей под ограничения по размеру решения — 30 МБ, и такой, которую получится использовать через библиотеки, установленные на платформе проверки.
Таких детекторов несколько, наиболее часто используемые участниками — Yolo3-tiny, Yolo4-tiny и Yolo5. Два первых детектора удобно обучать в фреймворке Darknet, а инференс выполнять через OpenCV.dnn. Для запуска и обучения Yolo5 используется библиотека Ultralytics; ее составляющие, необходимые для инференса, нужно было добавить в архив с решением.
В материалах ниже представлено решение с Yolo5 и его инференсом через PyTorch.
Предоставленный пользователю набор данных и решение:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача3.
Файл с решением — solution.py.
На рис. 1.1 представлена карта загруженности дорог.
Черные круги — перекрестки. Перекрестки соединены дорогами. Из каждого перекрестка выходит хотя бы одна дорога. Дороги не пересекаются и не ветвятся. Каждая дорога соединяет только два перекрестка. Дороги состоят из одного или более участков. Участки бывают трех видов загруженности и обозначаются разными цветами: красным, желтым и зеленым.
Красный — максимальная загруженность, кодируется числом 3.
Желтый — средняя загруженность, кодируется числом 2.
Зеленый — минимальная загруженность, кодируется числом 1.

Задача — написать функцию, получающую «описание» каждого перекрестка на изображении. «Описание» перекрестка состоит из его номера и списков, отражающих загруженность каждой дороги, выходящей из перекрестка. Перекрестки нумеруются слева направо, начиная с единицы, рис. 1.2.

Описание для перекрестка 3 будет выглядеть следующим образом:
\[«3»: [[1, 2, 3], [2, 1, 3], [1, 3]],\] где «3» — номер перекрестка, [1, 2, 3] — список участков, образующих дорогу, выходящую из перекрестка.
Порядок чисел важен и соответствует загруженности участков дороги в направлении от перекрестка.
Если из перекрестка выходит четыре дороги, то и в описании перекрестка должно быть четыре списка, неважно в каком порядке они будут идти. Для третьего перекрестка правильными будут шесть описаний.
Описания \(«3»: [[1, 2, 3], [2, 1, 3], [1, 3]]\) и \(«3»: [[1, 3], [2, 1, 3], [1, 2, 3]]\) эквивалентны.
Рекомендуем решать эту задачу без использования машинного обучения.
Материалы к заданию:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача4/user_task.
Выполнение
- Скачайте материалы задания.
Ознакомьтесь с материалами задания.
В материалах подготовлены несколько файлов
.py, набор изображений и аннотации к нему. В списке подготовленных файлов содержатся:eval.py— файл с функцией, определяющей загруженность дорог по изображению, именно эту функцию необходимо дописать;main.py— файл, проверяющий точность работы вашего алгоритма; не редактируйте его.main.pyиспользует написанные функции изeval.pyи сверяет верные ответы с предсказанием вашего алгоритма;annotations.json— файл, устанавливающий соответствие между изображениями и верными ответами.
Прочитайте файл
eval.py.В файле содержится функция
analyze_traffic. Допишите ее.Запустите файл
main.pyи проверьте свой алгоритм.Если программа выдала ошибку, то найдите и исправьте ее в файле
eval, вновь запустите файлmain.py.Пришлите решение на онлайн-платформу для проверки.
В качестве решения необходимо сдать отредактированный файл
eval.py, либо архив*.zipс файломeval.pyи остальными файлами, требующимися для его работы. В архиве должны находиться файлы, а не одноименная архиву папка.
Размер решения ограничен: не более 1 МБ. Если алгоритм успешно проверен платформой, то следующее решение можно прислать только через 10 мин. Если алгоритм в ходе проверки выдал сообщение об ошибке, то следующее решение можно прислать сразу.
Пакеты, ориентированные на работу с изображениями и данными, использующиеся на платформе проверки:
Python 3.8.10; catboost 1.1.1; dlib 19.24.0; gast 0.4.0; h5py 3.7.0; imutils 0.5.4; keras 2.9.0; Keras-Preprocessing 1.1.2; matplotlib 3.6.2; numpy 1.23.2; opencv-python 4.6.0.66; pandas 1.5.1; scikit-image 0.19.3; scikit-learn 1.1.3; scipy 1.9.3; tensorflow-cpu 2.9.2; torch 1.13.0; torchaudio 0.13.0; torchvision 0.14.0.
Используйте совместимые пакеты.
Первый шаг к решению задачи — поиск координат центров перекрестков. Центрами перекрестков считаются центры контуров, найденных на изображении, бинаризованном так, чтобы черные перекрестки стали белыми, а все остальное — черным.
Теперь необходимо попарно перебирать перекрестки. Для каждой пары вычисляется угол наклона прямой, проходящей через центры перекрестков. Он необходим для того, чтобы с некоторым шагом выбирать точки на этой прямой и анализировать их цвет. Если фиксируются изменения цвета точки, значит, начался новый участок дороги или дорога закончилась вовсе. Можно считать цвет предыдущей точки цветом участка дороги. Учитываются только красный, желтый и зеленый цвета. Если все точки белого цвета, значит, дороги нет вовсе.
Таким образом, для каждого перекрестка получается столько дорог, сколько из него выходит. И для каждой дороги определены составляющие ее участки в направлении от перекрестка.
Предоставленный пользователю набор данных и решение:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача4.
Файл с решением — solution.py.
Квадрокоптер работает на базе ОС Ubuntu и ROS Noetic. Необходимо разобраться в том, как устроено полетное задание для квадрокоптера, какие события происходят в течение полета и как обрабатывать изображение с видеокамеры. Данные, генерируемые во время реального полета квадрокоптера, записаны и сохранены в формате rosbag.
Во время полета в кадр камеры попадает AruCo метка семейства 6\(\times\)6 250. Необходимо написать программу (node), которая после взлета квадрокоптера распознает метку на изображении. Как только метка найдена, необходимо опубликовать id метки в топике /tag(std_msgs/Int32), после этого программа должна завершиться.
Файл rosbag можно проиграть встроенными средствами ROS, при проигрывании публикуются все необходимые для выполнения задания топики: /pioneer_max_camera/image_raw(sensors_msgs/Image) и /geoscan/flight/callback_event (std_msgs/Int32).
Для решения данной задачи можно использовать только следующие инструменты: Python 3.8, OpenCv, CvBridge, ROS Noetic (ROS-Base).
Для установки ROS Noetic понадобится виртуальная машина с установленной ОС Ubuntu 20.04. Инструкция по установке Virtual Box: https://virtualbox.su/kak-ustanovit-windows-v-virtualbox/.
ОС Ubuntu 20.04: https://releases.ubuntu.com/20.04/.
Инструкция по установке ROS Noetic на Ubuntu 20.04, необходима версия ROS-Base: https://wiki.ros.org/noetic/Installation/Ubuntu.
Инструкция по использованию CvBridge для конвертации изображения из ROS в OpenCV: https://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython.
Инструкция по проигрыванию rosbag: https://wiki.ros.org/rosbag/Commandline#play.
Файл rosbag, предоставленный участникам, отличается от файла для проверки решений на онлайн-платформе.
Материалы к заданию:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача5/user_task.
В качестве решения необходимо сдать файл eval.py.
Размер решения ограничен: не более 30 МБ. Если алгоритм успешно проверен платформой, то следующее решение можно прислать только через 10 мин. Если алгоритм в ходе проверки выдал сообщение об ошибке, то следующее решение можно прислать сразу.
Rosbag-файл необходимо проигрывать самостоятельно только при проверке задания локально, на собственном компьютере.
В решении для онлайн-платформы участникам необходимо подключиться к каналам, указанным в условии, и обрабатывать данные так, как при реальном полете. Система проверки выдаст ошибку, если верный ответ будет дан, например, после посадки.
Предоставленный пользователю набор данных и решение:
https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача5.
Файл с решением — solution.py.
