157 lines
10 KiB
Markdown
157 lines
10 KiB
Markdown
|
---
|
|||
|
title: Пример обучения и запуска навыка Object Detection
|
|||
|
---
|
|||
|
|
|||
|
## Унифицированное API
|
|||
|
|
|||
|
Вначале попытаемся описать полную последовательность действий по подготовке и использованию навыка обнаружения объектов. Задача обнаружения объектов сенсорами робота (в частности, RGB камерой в нашем случае) ставится в случае, например, когда необходимо в заданном окружении (сцене) определить наличие или отсутствие необходимых деталей для сборки изделия. Такие детали представлены в информационной среде в виде ассетов, хранимых в базе данных с заданными характеристиками. Поэтому входным параметром навыка обнаружения объектов является список ассетов, экземпляры которых в текущей задаче необходимо обнаруживать. Результатом использования навыка в информационной системе будет являться получение данных о заданном ассете на конкретном изображении, полученном с помощью RGB камеры.
|
|||
|
|
|||
|
Начальным этапом навыка является создание датасета, состоящего из синтетических изображений, полученных с использованием пакета [BlenderProc](https://github.com/DLR-RM/BlenderProc). Этот датасет представляет из себя набор файлов изображений и файлов меток к ним, а также файл аннотации, описывающий весь датасет в целом. Он имеет определённую структуру папок и будет использован для обучения нейросетевой модели обнаружения объектов на реальных изображениях в работе (runtime-режим). После создания такой датасет должен быть помещён в базу данных, как единый объект, с заданными характеристиками. В дальнейшем датасет может быть пополнен другими изображениями (например, фото из реального окружения робота), позволяющими произвести дообучение нейросети и улучшить качество работы навыка.
|
|||
|
|
|||
|
На втором этапе происходит обучение нейросетевой модели [YOLOv8](https://github.com/ultralytics/ultralytics). На выходе получаем файл весов модели, который также помещается в базу данных, с указанием версии этого файла и параметров обучения.
|
|||
|
|
|||
|
Теперь мы имеем всё необходимое для использования навыка обнаружения объектов (Object Detection) в реальном сценарии при управлении роботом в режиме runtime.
|
|||
|
|
|||
|
Рассмотрим наиболее общий вариант использования этого навыка в среде ROS2.
|
|||
|
|
|||
|
Первым шагом будет являться первоначальный запуск lifecycle-узла ROS2, отвечающего за работу навыка. Чтобы начать процесс обнаружения конкретной детали на изображении нужно выполнить стартовые действия по шаблону в дереве поведения, задав необходимые параметры процесса (топики получения изображения и выдачи результатов обнаружения, режим работы и другие). После решения поставленной задачи обнаружения конкретного объекта выполняются действия по шаблону приостановки работы навыка. Данные шаблоны деревьев поведения выполняются с помощью исполнителя [BehaviorTree](https://github.com/BehaviorTree/BehaviorTree.ROS2). Затем можно начать обнаружение другого объекта, вновь выполнив стартовый шаблон действий и подготовив новые параметры процесса.
|
|||
|
|
|||
|
Теперь перейдём к полному описанию данного API.
|
|||
|
|
|||
|
## Этап 1. Создание датасета
|
|||
|
|
|||
|
См. раздел [Генерация датасетов](../dataset-generator#датасет-для-обучения-обнаружению-в-формате-bop-challenge)
|
|||
|
|
|||
|
## Этап 2. Обучение модели Yolov8
|
|||
|
|
|||
|
Для обучения модели используется модуль на Python. Внешним параметром для модуля является:
|
|||
|
- каталог с датасетом, сгенерированный на первом этапе.
|
|||
|
|
|||
|
Пример запуска модуля обучения:
|
|||
|
```bash
|
|||
|
python train_Yolo.py --path /home/user/path/to/dataset --epoch 11 --outpath /home/user/path/to/weights
|
|||
|
```
|
|||
|
- path: путь к каталогу с датасетом
|
|||
|
- epoch 11: количество эпох обучения (пока рекомендуем 30-50)
|
|||
|
В результате работы создается файл весов нейросети с лучшими характеристиками обнаружения best.pt
|
|||
|
|
|||
|
## Этап 3. Использование навыка в ROS2 для обнаружения объекта на изображении (runtime)
|
|||
|
|
|||
|
### Подготовить папку с файлами BT v.4
|
|||
|
* Папка /path/to/bt/
|
|||
|
* bt.xml
|
|||
|
```xml
|
|||
|
<root BTCPP_format="4">
|
|||
|
<BehaviorTree ID="Main">
|
|||
|
<Sequence>
|
|||
|
<Action ID="RbsAction" do="ObjectDetection" command="odConfigure" sid="a"></Action>
|
|||
|
</Sequence>
|
|||
|
</BehaviorTree>
|
|||
|
</root>
|
|||
|
```
|
|||
|
* skills.json
|
|||
|
```json
|
|||
|
{"skills": [
|
|||
|
{
|
|||
|
"sid": "a",
|
|||
|
"SkillPackage": {
|
|||
|
"name": "Robossembler", "version": "1", "format": "1.0"
|
|||
|
},
|
|||
|
"Module": {
|
|||
|
"node_name": "lc_yolo", "name": "ObjectDetection", "description": "Object detection skill with YOLOv8"
|
|||
|
},
|
|||
|
"BTAction": [
|
|||
|
{
|
|||
|
"name": "odConfigure",
|
|||
|
"type": "run",
|
|||
|
"param": [
|
|||
|
{
|
|||
|
"type": "weights",
|
|||
|
"dependency": {"object_name": "board", "weights_file": "/home/shalenikol/0_rbs/w_od_board.pt"}
|
|||
|
},
|
|||
|
{
|
|||
|
"type": "topic",
|
|||
|
"dependency": {
|
|||
|
"type": "topic",
|
|||
|
"topicType": "sensor_msgs/msg/Image",
|
|||
|
"sid": "7b832b17-3030-4758-aab5-96a5046797f7",
|
|||
|
"topicOut": "/robot_camera/image"
|
|||
|
},
|
|||
|
"isFilled": true
|
|||
|
}
|
|||
|
],
|
|||
|
"result": [],
|
|||
|
"typeAction": "ACTION"
|
|||
|
}
|
|||
|
],
|
|||
|
"topicsOut": [
|
|||
|
{
|
|||
|
"name": "lc_yolo/object_detection",
|
|||
|
"type": "rbs_skill_interfaces/msg/BoundBox"
|
|||
|
}
|
|||
|
],
|
|||
|
"Launch": {
|
|||
|
"executable": "od_yolo_lc.py",
|
|||
|
"package": "rbss_objectdetection"
|
|||
|
}
|
|||
|
}
|
|||
|
]}
|
|||
|
```
|
|||
|
|
|||
|
### Запуск интерфейсной ноды с сервером навыка, реализующего алгоритм обнаружения объектов.
|
|||
|
|
|||
|
```bash
|
|||
|
ros2 launch rbs_bt_executor interface.launch.py bt_path:=/path/to/bt
|
|||
|
```
|
|||
|
|
|||
|
### Запуск процесса обнаружения заданного объекта через дерево поведения.
|
|||
|
Выполняется командой:
|
|||
|
```bash
|
|||
|
ros2 launch rbs_bt_executor rbs_executor.launch.py bt_path:=/path/to/bt
|
|||
|
```
|
|||
|
После этого узел начинает публиковать в выходной топик информацию об обнаружении объекта на каждом полученном с камеры изображении.
|
|||
|
|
|||
|
### Прекращение процесса обнаружения объекта.
|
|||
|
|
|||
|
Для завершения навыка нужно выполнить дерево поведения:
|
|||
|
```xml
|
|||
|
<root BTCPP_format="4">
|
|||
|
<BehaviorTree ID="Main">
|
|||
|
<Sequence>
|
|||
|
<Action ID="RbsAction" do="ObjectDetection" command="odStop" sid="b"></Action>
|
|||
|
</Sequence>
|
|||
|
</BehaviorTree>
|
|||
|
</root>
|
|||
|
```
|
|||
|
Файл skills.json
|
|||
|
```json
|
|||
|
{"skills": [
|
|||
|
{
|
|||
|
"sid": "b",
|
|||
|
"SkillPackage": { "name": "Robossembler", "version": "1", "format": "1.0" },
|
|||
|
"Module": {"node_name": "lc_yolo", "name": "ObjectDetection", "description": "Object detection skill with YOLOv8"},
|
|||
|
"BTAction": [
|
|||
|
{
|
|||
|
"name": "odStop",
|
|||
|
"type": "stop",
|
|||
|
"param": [],
|
|||
|
"result": [],
|
|||
|
"typeAction": "ACTION"
|
|||
|
}
|
|||
|
],
|
|||
|
"topicsOut": [
|
|||
|
{
|
|||
|
"name": "lc_yolo/object_detection",
|
|||
|
"type": "rbs_skill_interfaces/msg/BoundBox"
|
|||
|
}
|
|||
|
],
|
|||
|
"Launch": {
|
|||
|
"executable": "od_yolo_lc.py",
|
|||
|
"package": "rbss_objectdetection"
|
|||
|
}
|
|||
|
}
|
|||
|
]}
|
|||
|
```
|
|||
|
Команда запуска этого дерева та же, что и в пункте 3.
|
|||
|
После выполнения этих действий lifecycle-узел навыка перейдёт в начальное состояние и можно, повторив пункт 1-3, вновь запустить процесс обнаружения уже с другим объектом.
|