framework/docs/randomization.md

7.3 KiB
Raw Permalink Blame History

Рандомизация

При обучении робота (Илья Ураев)

  • Гравитация
  • Положение камеры
  • Конфигурацию робота (положение джоинтов так называется)
  • Положение объекта или точки куда надо дотянутся
  • Текстуру поверхности размещения
  • Ну и я думаю чтобы с robot_builder смотрелось, то можно рандомизировать число степеней свободы робота.
  • Можно рандомизировать позиции спавна робота

При создании датасета (Александр Шушпанов)

  • Зона локации (спавна) активных объектов

  • Позиция камеры: радиус сферы размещения и наклон, центр этой сферы

  • Источники света: количество, тип, локализация в пространстве, цветность, сила света

  • Свойства материала по отражению света: зеркальность, шероховатость, металлизация, цвет

    Гиперпараметры.

  • количество серий (спавна активных объектов)

  • количество позиций камеры на одну серию

  • количество сдвигов камеры на 1 позу

Общий список параметров рандомизации

  • Положение искомого(активного) объекта(-ов) в рабочей зоне
  • Позиция камеры: радиус сферы размещения и наклон, центр этой сферы
  • Текстуры повехностей объектов и/или свойства материала по отражению света: зеркальность, шероховатость, металлизация, цвет
  • Источники света: количество, тип, локализация в пространстве, цветность, сила света
  • Конфигурация робота (положение джоинтов), число степеней свободы и его начальное расположение
  • Гравитация

Web-сервис для генерации датасетов

Для реализации пользовательского интерфейса web-сервиса нами была разработана схема описания параметров рандомизации. Её использование позволяет изменять конфигурацию параметров в зависимости от задачи. Предполагается в дальнейшем использовать модуль ввода параметров в том числе и в задачах обучения с подкреплением.

Пример такой схемы:

ENUM T = "ObjectDetection","PoseEstimation"
ENUM C = "","BOX","SPHERE","CAPSULE","CYLINDER","CONE","CONVEX_HULL","MESH","COMPOUND"
ENUM L = "POINT","SUN"
ENUM F = "JPEG","PNG"

MODELS = {
  "id": ${ID:number:1},
  "name": ${NAME:string:""},
  "model": ${MODEL:string:"models/1.fbx"}
}
OBJECTS_SCENE = {
  "name": ${NAME:string:""},
  "collision_shape": ${enum:C:"BOX"},
  "loc_xyz": [${LOC_XYZ_1:number:0}, ${LOC_XYZ_2:number:0}, ${LOC_XYZ_3:number:0}],
  "rot_euler": [${ROT_EULER_1:number:0}, ${ROT_EULER_2:number:0}, ${ROT_EULER_3:number:0}],
  "material_randomization": {
    "specular": [${SPECULAR_1:number:0}, ${SPECULAR_2:number:1}],
    "roughness": [${ROUGHNESS_1:number:0}, ${ROUGHNESS_2:number:1}],
    "metallic": [${METALLIC_1:number:0}, ${METALLIC_2:number:1}],
    "base_color": [
          [
            ${BASE_COLOR_1:number:0},
            ${BASE_COLOR_2:number:0},
            ${BASE_COLOR_3:number:0},
            ${BASE_COLOR_4:number:1}
          ],
          [
            ${BASE_COLOR_5:number:1},
            ${BASE_COLOR_6:number:1},
            ${BASE_COLOR_7:number:1},
            ${BASE_COLOR_8:number:1}
          ]
        ]
  }
}
LIGHTS = {
  "id": ${ID:number:1},
  "type": ${enum:L:"POINT"},
  "loc_xyz": [${LOC_XYZ_1:number:5}, ${LOC_XYZ_2:number:5}, ${LOC_XYZ_3:number:5}],
  "rot_euler": [${ROT_EULER_1:number:-0.06}, ${ROT_EULER_2:number:0.61}, ${ROT_EULER_3:number:-0.19}],
  "color_range_low": [${COLOR_RANGE_LOW_1:number:0.5}, ${COLOR_RANGE_LOW_2:number:0.5}, ${COLOR_RANGE_LOW_3:number:0.5}],
  "color_range_high":[${COLOR_RANGE_HIGH_1:number:1}, ${COLOR_RANGE_HIGH_2:number:1}, ${COLOR_RANGE_HIGH_3:number:1}],
  "energy_range":[${ENERGY_RANGE_1:number:400},${ENERGY_RANGE_2:number:900}]
}

{
  "typedataset": ${enum:T:"ObjectDetection"},
  "dataset_path": ${DATASET_PATH:string},
  "models":${ARRAY:MODELS:[]},
  "models_randomization":{
    "loc_range_low":  [${LOC_RANGE_LOW_1:number:-1}, ${LOC_RANGE_LOW_2:number:-1}, ${LOC_RANGE_LOW_3:number:0}],
    "loc_range_high": [${LOC_RANGE_HIGH_1:number:1}, ${LOC_RANGE_HIGH_2:number:1}, ${LOC_RANGE_HIGH_3:number:2}]
  },
  "scene":{
    "objects": ${ARRAY:OBJECTS_SCENE:[]},
    "lights": ${ARRAY:LIGHTS:[]},
  },
  "camera_position":{
    "center_shell": [${CENTER_SHELL_1:number:0}, ${CENTER_SHELL_2:number:0}, ${CENTER_SHELL_3:number:0}],
    "radius_range": [${RADIUS_RANGE_1:number:0.4}, ${RADIUS_RANGE_2:number:1.4}],
    "elevation_range": [${ELEVATION_RANGE_1:number:10}, ${ELEVATION_RANGE_2:number:90}]
  },
  "generation":{
    "n_cam_pose": ${N_CAM_POSE:number:5},
    "n_sample_on_pose": ${N_SAMPLE_ON_POSE:number:3},
    "n_series": ${N_SERIES:number:100},
    "image_format": ${enum:F:"jpg"},
    "image_size_wh": [${IMAGE_SIZE_WH_1:number:640}, ${IMAGE_SIZE_WH_2:number:480}]
  }
}

Вначале описываются перечисления - ENUM, которым присваиваются имена и список возможных значений. Затем описываются составные именованные объекты, а затем основной блок описания параметров. Этот блок представляет из себя JSON-словарь параметров, который будет подготовлен на выходе модуля ввода параметров. Каждый ключ этого словаря дополняется мини-схемой описания вводимого значения.
Формат:

${<имя_переменной>:<тип>:<значение_по_умолчанию>}

либо массив объектов

${ARRAY:<имя_объекта>:[]}

В нашем алгоритме формирования датасета для задач компьютерного зрения (ObjectDetection, PoseEstimation) выбран формат BOP: Benchmark for 6D Object Pose Estimation, в его BOP-Classic версии.
Он содержит в своей аннотации все необходимые данные (ground truth) для обучения нейросетевых моделей поиску объектов на изображении, а также распознавания поз искомых объектов.