search icon search icon ВЕРСИЯ ДЛЯ СЛАБОВИДЯЩИХ

Инженерный тур. 2 этап

Задача 1.1.(20 баллов)
Определение прочности дороги
Темы: компьютерное зрение, машинное обучение, сверточные нейронные сети, регрессия

Условие

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

Максимальную прочность имеет неповрежденное полотно из бетонных плит, ее значение принято за 1. Прочность полотна, которое непригодно к использованию из-за множества повреждений, принята за 0. Обратите внимание, что неповрежденные полотна разных типов могут иметь различную прочность.

Рекомендуется использовать методы машинного обучения для решения этой задачи.

Материалы к заданию:

https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача1/user_task.

Выполнение

  1. Скачайте материалы задания.
  2. Ознакомьтесь с материалами задания.

    В материалах подготовлены несколько файлов .py, набор изображений и аннотации к нему.

    В списке подготовленных файлов содержатся:

    • eval.py — файл с функцией, которую вам необходимо дописать;
    • main.py — файл, проверяющий точность работы вашего алгоритма; не редактируйте его. main.py использует написанные вами функции из eval.py и сверяет верные ответы с предсказанием вашего алгоритма;
    • annotations.csv — файл, устанавливающий соответствие между изображениями и верными ответами; в каждой строке файла содержится путь к изображению и соответствующим ему значение прочности.
  3. Прочитайте файл eval.py.

    В файле содержатся функции load_models и get_road_health:

    • load_models — загружает из файлов модели машинного обучения;
    • get_road_health — определяет прочность дорожного полотна на изображении, именно ее необходимо дописать.
  4. Допишите функции в файле eval.py.
  5. Запустите файл main.py и проверьте свой алгоритм.

    Если программа выдала ошибку, то найдите и исправьте ее в файле eval, вновь запустите файл main.py.

  6. Пришлите решение на онлайн-платформу для проверки.

    В качестве решения необходимо сдать отредактированный файл 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.

Задача 1.2.(10 баллов)
Обмен данными через MQTT
Темы: обмен данными, обработка сообщений, MQTT, подписчик-издатель

Условие

Устройства современной автономной транспортной системы должны обмениваться данными друг с другом. Один из возможных протоколов обмена данными — протокол 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.

Выполнение

  1. Скачайте материалы задания.
  2. Ознакомьтесь с материалами задания.

    В материалах подготовлены несколько файлов .py. В списке подготовленных файлов содержатся:

    • eval.py — файл с функциями, которые необходимо дописать;
    • main.py — файл, проверяющий точность работы вашего алгоритма; не редактируйте его. main.py использует написанные вами функции из eval.py и сверяет верные ответы с предсказанием вашего алгоритма;
    • annotations.json — файл, устанавливающий соответствие между тестами и верными ответами.
  3. Прочитайте файл eval.py.

    В файле содержатся функции setup и main_loop:

    • setup — инициализирует MQTT-клиент;
    • main_loop — реализует цикл приема и обработки сообщений.
  4. Допишите функции в файле eval.py.
  5. Запустите файл main.py и проверьте свой алгоритм.

    Если программа выдала ошибку, то найдите и исправьте ее в файле eval, вновь запустите файл main.py.

  6. Пришлите решение на онлайн-платформу для проверки.

    В качестве решения необходимо сдать отредактированный файл 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.

Задача 1.3.(35 баллов)
Детектирование квадрокоптеров
Темы: компьютерное зрение, детектирование объектов на изображении, нейросетевые детекторы, YOLO

Условие

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

Материалы к заданию:

https://disk.yandex.ru/d/zUqLGZ-yTR1Tbg/Задача3/user_task.

Выполнение

  1. Скачайте материалы задания.
  2. Ознакомьтесь с материалами задания.

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

    • eval.py — файл с функциями, которые необходимо дописать;
    • main.py — файл проверяющий, точность работы вашего алгоритма; не редактируйте его. main.py использует написанные функции из eval.py и сверяет верные ответы с предсказанием вашего алгоритма;
    • annotations.csv — файл, устанавливающий соответствие между изображениями и верными ответами; в каждой строке файла содержится путь к изображению и параметрами ограничивающей квадрокоптер рамки.
  3. Прочитайте файл eval.py.

    В файле содержатся функции load_models и detect_drone:

    • load_models — загружает из файлов модели машинного обучения.
    • detect_drone — обнаруживает квадрокоптер на изображении.
  4. Допишите функции в файле eval.py.
  5. Запустите файл main.py и проверьте свой алгоритм.

    Если программа выдала ошибку, то найдите и исправьте ее в файле eval, вновь запустите файл main.py.

  6. Пришлите решение на онлайн-платформу для проверки.

    В качестве решения необходимо сдать отредактированный файл 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.4.(20 баллов)
Определение загруженности дорог
Темы: компьютерное зрение, бинаризация, поиск и анализ контуров, цветовые пространства

Условие

На рис. 1.1 представлена карта загруженности дорог.

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

Красный — максимальная загруженность, кодируется числом 3.

Желтый — средняя загруженность, кодируется числом 2.

Зеленый — минимальная загруженность, кодируется числом 1.

Рис. 1.1. Карта загруженности дорог

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

Рис. 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.

Выполнение

  1. Скачайте материалы задания.
  2. Ознакомьтесь с материалами задания.

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

    • eval.py — файл с функцией, определяющей загруженность дорог по изображению, именно эту функцию необходимо дописать;
    • main.py — файл, проверяющий точность работы вашего алгоритма; не редактируйте его. main.py использует написанные функции из eval.py и сверяет верные ответы с предсказанием вашего алгоритма;
    • annotations.json — файл, устанавливающий соответствие между изображениями и верными ответами.
  3. Прочитайте файл eval.py.

    В файле содержится функция analyze_traffic. Допишите ее.

  4. Запустите файл main.py и проверьте свой алгоритм.

    Если программа выдала ошибку, то найдите и исправьте ее в файле eval, вновь запустите файл main.py.

  5. Пришлите решение на онлайн-платформу для проверки.

    В качестве решения необходимо сдать отредактированный файл 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.

Задача 1.5.(15 баллов)
Полет квадрокоптера
Темы: ROS, полетное задание квадрокоптера, взаимодействие нод в ROS, обработка изображения в ROS

Условие

Квадрокоптер работает на базе ОС 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.

text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image