华为云用户手册

  • Octopus 目录 标注文件目录结构 +--- 1599625710056 | +--- 1599625710056.jpg | +--- 1599625710056.json +--- 1599625740054 | +--- 1599625740054.jpg | +--- 1599625740054.json 推理文件目录结构 +--- 1599625710056 | +--- 1599625710056.json +--- 1599625740054 | +--- 1599625740054.json 示例标注/推理文件 2D语义分割-Octopus.json { "image_meta_info": { "size": { "height": 1024, "width": 2048 } }, "labels": [ { "shape_type": "polygon", "label_meta_name": "road", "serial_number": 1, "label_meta_id": 0, "polygon": {"size": 3, "points": [{"xpoint": 1706, "ypoint": 1023}, {"xpoint": 1709, "ypoint": 1023}, {"xpoint": 1709, "ypoint": 1020}]} }, { "shape_type": "polygon", "label_meta_name": "bicycle", "serial_number": 25, "label_meta_id": 18, "polygon": {"size": 20, "points": [{"xpoint": 1006, "ypoint": 476}, {"xpoint": 1002, "ypoint": 476}, {"xpoint": 997, "ypoint": 479}, {"xpoint": 994, "ypoint": 483}, {"xpoint": 994, "ypoint": 491}, {"xpoint": 990, "ypoint": 497}, {"xpoint": 989, "ypoint": 500}, {"xpoint": 988, "ypoint": 502}, {"xpoint": 979, "ypoint": 503}, {"xpoint": 971, "ypoint": 507}, {"xpoint": 971, "ypoint": 524}, {"xpoint": 979, "ypoint": 533}, {"xpoint": 992, "ypoint": 534}, {"xpoint": 1004, "ypoint": 530}, {"xpoint": 1009, "ypoint": 525}, {"xpoint": 1009, "ypoint": 514}, {"xpoint": 1007, "ypoint": 497}, {"xpoint": 1007, "ypoint": 490}, {"xpoint": 1011, "ypoint": 483}, {"xpoint": 1008, "ypoint": 478}]} } ] }
  • Palette 目录 标注文件目录结构 +--- images | +--- 000000.png | +--- 000001.png | +--- 000002.png +--- labels | +--- 000000.png | +--- 000001.png | +--- 000002.png 推理文件目录结构 +--- 000000.png +--- 000001.png +--- 000002.png 示例标注/推理文件 2D语义分割-palette.png
  • 资源占用情况 在任务运行中,资源占用情况模块显示任务占用的CPU、内存百分比的折线图。默认显示CPU占用情况折线图。 双击任一图例:显示全部资源占用折线图。 单击指定图例:只显示该图例折线图。 此模块也可显示多个计算节点运行任务时,资源占用的情况。 如果选择2个计算节点运行任务,则可选择查看单个节点资源占用情况。 资源占用情况功能模块,需要用户在制作自定义镜像时安装psutil与pynvml,参考命令:pip install psutil pynvml 如果未安装psutil与pynvml,则页面无法显示资源使用状况。
  • 编译任务日志查看下载 编译任务运行过程中生成日志,编译任务模块提供了日志的查看以及下载功能,支持用户查看编译任务的运行情况。编译任务生成的日志文件有以下四种: compile-{id}.log:用户实际训练任务的训练日志。 compile-{id}-init.log:Octopus平台提供的前置数据的准备日志。 compile-{id}-sidecar.log:Octopus平台提供的任务流程控制日志,包括日志同步、结果上传。 octopus-compile-{id}-supplemental.logs: Octopus平台任务异常退出或停止产生的错误信息输出日志,运行正常时不产生该日志。 在编译任务的详情页面,单击“任务日志”,可查看该编译任务日志详情。支持下载至本地。如果日志较多,用户可在搜索框中输入关键字,查找指定日志内容。 在日志服务页面中的日志列表部分详细展示了该编译任务包含的日志文件的大小以及最新写入时间。单击文件后的“查看”,该文件的详细执行过程则在日志详情部分展示。用户也可在日志文件后的“操作”栏中,单击“下载”,即可将该日志文件下载到本地查看。
  • 编译任务相关操作 在“编译任务”列表,可对任务进行以下操作。 表2 编译任务相关操作 任务 操作步骤 查找任务 在搜索输入框中输入搜索条件,按回车键即可查询。 查看任务详情 单击任务名称,可在任务详情页查看该任务详情、参数详情、编译版本、任务日志和资源在占用情况。 任务详情:任务ID、名称、描述、状态、资源类型等信息。 参数详情:训练算法参数以及环境参数信息。 编译版本:同一个源模型使用不同芯片编译,生成的结果为该模型的不同版本。 任务日志:任务运行过程中生成的日志信息,详情请查看编译任务日志查看下载。 资源占用情况:显示任务占用的CPU、内存、GPU及显存占用率百分比的折线图,详情请查看资源占用情况。 删除任务 单击操作栏的“删除”,删除单个任务。 勾选多个任务,单击列表上方的“删除”,可批量删除任务。 重建任务 单击操作栏内的“重建”,输入新任务名称(以“任务组名-自定义名称”的形式)和是否删除原任务选项,同时可重新选择需要修改的参数。 停止任务 单击该条任务后的“停止”,对停止编译任务。 编译任务相关操作与任务所处状态约束关系请见下表: 表3 操作与状态约束关系 作业状态 重建 删除 停止 排队中 - √ √ 等待中 - - √ 提交中 - - - 提交失败 √ √ - 运行中 - - √ 运行异常 √ √ - 已完成 √ √ - 停止中 - - - 停止失败 - √ - 已停止 √ √ - 删除中 - - - 删除失败 - √ -
  • split匝道分流 用途:创建split高速匝道合流的静态场景(地图) 参数:参数如下表 表1 split参数 Parameter Type Mandatory Description lane_width length yes 每个车道宽度 left_lane_num int yes 左侧车道数量 right_lane_num int yes 右侧车道数量 ramp_lane_num int yes 匝道车道数量 main_speed speed yes 主路的限速值 ramp_speed speed yes 匝道的限速值 radius_of_curvature length yes 匝道的曲率半径 ramp_length length yes 匝道的长度 road_aids_type road_aids_type yes 道路辅助设施类型,匝道分流时匝道和主路的连接方式,目前共有三种:DType-1(直接式1)、DType-2(直接式2)和PType(平行式)。 参数取值范围: lane_width: length = [3m..4m] left_lane_num: int = [0, 1, 2, 3, 4] right_lane_num: int = [3, 4] ramp_lane_num: int = [1, 2] main_speed: speed = [80kph..120kph] ramp_speed: speed = [40kph..60kph] radius_of_curvature: length = [150m..1000m] ramp_length: length = [200m..500m] road_aids_type: road_aids_type = ["DType-1", "DType-2", "PType"] keep创建 my_road_aids_type: road_aids_type = "DType-1" my_merge: merge with: keep(it.lane_width == 3m) keep(it.left_lane_num == 0) keep(it.right_lane_num == 3) keep(it.ramp_lane_num == 1) keep(it.main_speed == 120kph) keep(it.ramp_speed == 60kph) keep(it.radius_of_curvature == 200m) keep(it.ramp_length == 250m) keep(it.road_aids_type == my_road_aids_type) create创建 my_road_aids_type: road_aids_type = "DType-1" my_merge: merge = scenery.create_merge(lane_width: 3m, left_lane_num: 0, right_lane_num: 3, main_speed: 120kph, ramp_speed: 60kph, radius_of_curvature: 200m, ramp_length: 250m, road_aids_type: my_road_aids_type) merge和split场景使用的road_aids_type为enum类型,详见附录Enum lists的road_aids_type一节。 在road_aids_type为"DType-2"时,right_lane_num必须大于ramp_lane_num。 如果希望车道属性需要搭建同一方向,不能存在left和right属性同时出现,可以将left_lane_num设置为0。 父主题: 领域模型设计
  • 急刹(Emergency Braking)检测 自动驾驶车辆急刹有两个典型阈值:ACC(Adaptive Cruise Control)的最大减速度,和AEB(Autonomous Emergency Braking)的最大减速度。 急刹检测的目的是判断主车在行驶过程中是否达到ACC和AEB的最大减速度。 ACC的最大减速度通常为。 AEB的最大减速度通常为。 该两项子指标关联的内置可视化时间序列数据均为:accX。 该指标的异常时间点记录类型为:POINT_TYPE_POINT。
  • 蛇行(Snake Driving)检测 自动驾驶车辆在行驶过程中,当车道的曲率发生较大变化时,可能会出现横向控制效果不佳导致的长时间车辆横向振荡。 蛇行检测的目的是判断车辆是否出现横向振荡,利用车辆的横向加速度的正负变化来判断蛇行是否发生。 正值大于和负值小于的比例都大于该时间段的10%时,则判断此时间段发生蛇行。 在及少数的连续S型弯道情况下,可能会出现假阳性结果,这会在评测报告中进行体现。 该指标关联的内置可视化时间序列数据为:accY。 该指标的异常时间点记录类型为:POINT_TYPE_REGION。
  • 平顺性(Ride Comfort)检测 平顺性检测通常指汽车的垂向平顺性。平顺性用加速度均方根值来衡量。 加速度均方根值计算公式如下所示。 表示变量的均方根值,表示第个值,表示值的个数。 汽车的垂向平顺性是由悬架系统决定的,自动驾驶算法对垂向平顺性几乎没有影响,其影响的是车辆的纵向和侧向平顺性。 因此,本设计平顺性检测从纵向平顺性和侧向平顺性进行考量。 平顺性检测考虑的是整个仿真时间段的加速度均方根值。当纵向或侧向加速度均方根值大于,则认为对应的纵向/侧向平顺性检测不通过。 纵向平顺性关联的内置可视化时间序列数据为:accX。横向平顺性关联的内置可视化时间序列数据为:accY。 该指标的异常时间点记录类型为:POINT_TYPE_ALL。
  • 乘员舒适性(Driving Comfort)检测 乘员舒适性检测关注的是自动驾驶车辆行驶过程中,驾驶员感受到的舒适程度。 舒适程度通常可以利用整个行驶过程中的速度方差来进行客观反映,而变异系数是可以对不同速度区间舒适程度进行比较。 变异系数的公式如下所示。 表示变异系数,表示标准差,表示均值。 本设计当主车速度的变异系数大于0.15时,判定乘员舒适性检测不通过。 该指标关联的内置可视化时间序列数据为:speedX。 该指标的异常时间点记录类型为:POINT_TYPE_ALL。
  • 平稳起步(Gentle Start)检测 汽车起步时加速度太大会给人带来不舒适的感受。平稳起步检测的目的是判断自动驾驶车辆起步过程中加速度是否过大。 起步过程的判定是指车辆当前速度为0,并在0.5s后速度大于,这个0.5s内的时间段为起步过程。 起步过程中如果加速度大于一定阈值(本设计取),则判定起步加速度过大,起步不平稳。 该指标关联的内置可视化时间序列数据为:speedX,accX。 该指标的异常时间点记录类型为:POINT_TYPE_POINT。
  • one_way_junction单行线路口 单行线路口是指该路口的所有road均为单行线,比如一个普通的十字路口由8条road组成. 用途:创建junction城区路口的静态场景(地图) 参数:参数如下表. Parameter Type Mandatory Description lane_num int yes 单方向车道数量. bikeway bool yes 是否有自行车道. sidewalk bool yes 是否有人行道. junction_type junction_type yes 路口的类型,目前支持两种类型crossroad(十字路口)和T-junction(丁字路口) 参数取值范围: lane_num: int = [1, 2, 3, 4] bikeway: bool = [true, false] sidewalk: bool = [true, false] junction_type: junction_type = ["crossroad", "T-junction"] keep创建 my_junction_type: junction_type = "crossroad" my_junction: one_way_junction with: keep(it.lane_num == 2) keep(it.bikeway == false) keep(it.sidewalk == false) keep(it.junction_type == my_junction_type) 父主题: 领域模型设计
  • 标签管理相关操作 在“标签管理”界面,还可以进行以下操作。 表1 标签管理相关操作 任务 操作步骤 新建根标签 单击“新增标签”,输入标签名称。 新建标签 单击标签后的,输入标签名称。 修改标签 单击标签后的,可对标签的名称进行修改。 删除标签 单击标签后的,可删除标签或其子节点标签。 说明: 平台预置场景标签暂不支持编辑、删除。 导出标签 单击根标签后的,可导出标签至本地。 搜索标签 在搜索框输入搜索内容,可模糊搜索标签。 多项搜索:可根据需要决定是否启用多项搜索,输入多个关键字,中间用“;”隔开,可搜索多个关键字。
  • 工作空间简介 在使用Octopus自动驾驶云服务之前,用户可通过工作空间实现资源隔离管理。 default工作空间为系统预置默认主工作空间,授权类型为Public,默认主账号和所有子账号子用户可用,不支持创建、编辑和删除。 Octopus预置3种系统策略类型的角色,方便用户创建用户组时进行授权。 Octopus FullAccess:包含Octopus服务和依赖的云服务(不包含OBS)所有权限。被授权该角色的应为八爪鱼管理员用户组。 Octopus CommonOperations:包含Octopus服务除“工作空间管理”外所有权限和依赖的云服务(不包含OBS)所有权限。被授权该角色的应为八爪鱼普通用户组。 Octopus ReadOnlyAccess:包含Octopus服务和依赖云服务(不包含OBS)的只读权限。被授权该角色的应为八爪鱼浏览者或演示用户组。 当前仿真服务、运维配置暂未适配工作空间。 父主题: 工作空间
  • 任务配置相关操作 在任务配置详情页的“仿真任务列表”或“仿真任务”页签,可对仿真任务进行以下操作。 表1 任务配置相关操作 任务 操作步骤 查看任务进度 将鼠标移动至进度条处,显示当前任务所包含场景中成功/失败/总场景数量。 查看任务状态 可在列表根据任务状态查询任务。 查询任务 可按照“任务ID”、“任务名称”、“任务状态”、“任务描述”、“算法版本”查询任务。 停止任务 对于任务状态为“运行中”“排队中”和“调度中”的任务,因为某种原因需要停止运行时,可单击操作栏“停止”选项,即可停止该任务。 删除任务 在任务创建有误,或任务生命周期结束,可删除任务。处于“运行中”的任务不可删除。单击操作栏“ 删除”选项,删除该任务。删除后不可恢复,请谨慎操作。 编辑任务 单击操作栏“编辑”以修改任务名称和描述信息。
  • 具体场景(Concrete scenario) 具体场景的参数声明支持基础类型、标量(scalar)类型、枚举(enum)类型,和结构(struct)类型: 基础类型包含int、float、bool,和string类型。可以直接在等号后赋值。 scalar类型包含speed、acceleration、length、time,和angle类型。赋值时需要在值后加上OSC2.0支持的单位(见附录Scalar units)。 enum类型包含side_left_right、distance_direction、distance_mode、 lane_change_side、 dynamics_shape和catalog。赋值时必须使用枚举列表内的值(见附录Enum list) 。 struct类型包含odr_point、xyz_point、position_3d、road_point、orientation_3d和pose_3d等,可以使用keep创建。此外,odr_point、xyz_point,和road_point分别可以使用map的成员函数create_odr_point 、 create_xyz_point和create_road_point来创建(OSC2.0支持的struct类型详见附录Struct)。 给bool型赋值时必须使用“true”和“false”,如果使用“True”或“False”或拼写错误将使语句无效。 例1:基础类型 m_road_id: string = '0' Ego_name: string = "Audi_A3_2009_black" m_lateral: bool = true 例2:scalar类型 v: speed = 5mps delay: time = 40s distance: length = 30.0m m_a: acceleration = 0.01mpss 例3:enum类型 m_side: side_left_right = right m_direction: distance_direction = longitudinal 例4:struct类型,keep创建 my_odr: odr_point with: keep(it.road_id == 0) keep(it.lane_id == -1) keep(it.s == 3.0m) keep(it.t == 0.0m) my_pos: position_3d with: keep(it.x == 1.0m) keep(it.y == 2.0m) keep(it.z == 3.0m) my_xyz: xyz_point with: keep(it.position == my_pos) my_road: road_point with: keep(it.road_id == '1') keep(it.s == 3.0m) keep(it.t == 0.0m) my_orientation: orientation_3d with: keep(it.roll == 1.0rad) keep(it.pitch == 2.0rad) keep(it.yaw == 3.0rad) my_pose: pose_3d with: keep(it.xyz_point == my_xyz) keep(it.orientation == m_orientation) m_trajectory: trajectory with: keep(it.points == [my_pose1, my_pose2, my_pose3]) keep(it.time_stamps == [0s, 5s, 20s] ) 例5:struct类型,map创建 my_odr: odr_point = map.create_odr_point(road_id: m_road_id,lane_id:'-4',s: 5.0m, t: 0.0m) my_xyz: xyz_point = map.create_xyz_point(x: 2.5m, y: 10.0m ,z: 0.0m) my_point: road_point = map.create_road_point(road_id: '1', s: 5.0m, t: 0.0m)
  • 逻辑场景(Logical scenario) 逻辑场景的参数声明通过:范围型[最小值..最大值] 和枚举型[值1, 值2] 的方式来实现泛化: 范围型支持float和scalar类型。 枚举型支持int, float, bool, str, enum和scalar类型,且需要保证枚举列表中的元素均为相同类型。 例1:范围型 m_value: float = [2.0..3.0] v: speed = [5mps..10mps] delay: time = [40s..60s] m_a: acceleration = [0.00mpss..0.03mpss] 例2:枚举型 m_ id: int = [-1, 2] m_value: float = [2.0, 3.0] m_on_road: bool = [true, false] Ego_name: string = ["Audi_A3_2009_black", "Audi_A3_2009_red"] m_shape: dynamics_shape = [linear, sinusoidal] m_side: side_left_right = [left, right] v: speed = [5mps, 7mps, 10mps] m_a: acceleration = [0.01mpss, 0.03mpss] delay: time = [40s, 60s, 100s] 通过泛化参数,可以实现实体entity 、动作act ,以及修饰器modifier的泛化。 Struct类型不能直接泛化,而是通过泛化参数来进行泛化。 例1:entity泛化 Ego_name: string = ["Audi_A3_2009_black", "Audi_A3_2009_red"] Ego_controller: string = "DefaultDriver" Ego: vehicle with: keep(it.name == Ego_name) keep(it.initial_bm == Ego_controller) 例2:act泛化 m_lateral: bool = [true, false] m_speed: speed = [5mps..15mps] m_rate_profile: dynamics_shape = linear Ego.activate_controller(m_lateral, true) Ego.change_speed(target: m_speed, rate_peak: 0.0mpss, rate_profile: m_rate_profile) 例3:modifier泛化 m_speed: speed = [5mps..15mps] Ego.assign_init_speed() with: speed(speed: m_speed) 例4:Struct类型泛化 m_lane_id: int = [-1, 2] m_odr: odr_point = map.create_odr_point(road_id: '0', lane_id:m_lane_id, s: 5.0m, t: 0.0m) m_x: distance = [2m..7.5m] m_position_3d: position_3d = map.create_xyz_point(x: m_x, y: 10.0m ,z: 0.0m) m_pose_3d: pose_3d with: keep(it.odr_point == m_odr)
  • 标注数据.json文件说明 数据集中必含“.json”文件,用于集合该音频文件的所有标注数据信息,包括该音频所在的项目id、数据包id、音频上所有标注信息等。上传数据集前请保证“.json”文件内容正确。“.json”文件编写的参考样例如下: { "frame_id": 1, #帧序号 "batch_task_id": 1368, #批次任务id "project_id": "ee...3d", #资源域ID "label_mode": "manual", #标注类型:auto和manual两种 "status": "labeled", #标注任务状态:unlabeled、labeled、unconfirmed、confirmed、all五种 "sample_type": "AUDIO", #样本类型:包含“IMAGE”,“POINT_CLOUD”,“AUDIO”,“TEXT” "des_order": "", #此份数据对应的原始数据包描述 "tag_names": [], #标签名称 "valid": true, #是否有效,包含“true”和“false”两种 "create_time": 1708657733087, #标注的创建时间 "difficult": false, #是否难例,包含“true”难例和“false”非难例 "label_counts": [ #各类标注物的个数统计 { "label_meta_id": 7900, #标注物使用的标签ID "label_num": 1, #标注物个数 "label_meta_name": "奇怪的声音1", #标注物名称 "label_meta_desc": "1233", #标注物描述 "label_meta_attr": "{\"声音1\":\"2333,4444\",\"声音2\":\"334455,1121333\"}", #标注物额外属性 "label_meta_shape": "audio", #标注物形状,包含“bndbox、line、circle、polygon、points、dashed、cube_3d、multiBox、polygon_3d_v2、audio、text” "label_meta_color": "#496832", #标注物颜色信息 "level": 0 }, { "label_meta_id": 7901, "label_num": 1, "label_meta_name": "噪声", "label_meta_desc": "11", "label_meta_attr": "{\"text1\":\"111,222,333\",\"额鹅鹅鹅\":\"1111,333\"}", "label_meta_shape": "audio", "label_meta_color": "#391c1c", "level": 0 } ], "audio_meta_info": { #音频信息 "id": "49...bd", "name": "0000.mp3", #音频名称 "source": "https://octopus-raw-ee.../label-data/task-1368/data/mp3/0000.mp3", #音频源的obs路径url "duration": "180.0s" #音频时长 }, "label_task_id": 1691, #批次子任务ID "partitionId": 20240222, "label_update_time": 1708944569975, #标注最近更新时间 "prefix_folder": "mp3", "image_id": "88...91", "inspection": 0, "labels": [ { "label_meta_id": 7900, #标注物对应的标签ID "create_time": 0, "shape_type": "audio", #标注物形状 "serial_number": 1, #该帧中标注物唯一自增id "label_object_id": -1, "attribute": "{\"声音1\":\"2333\"}", #标注物属性 "audio": { #音频子段落标注信息 "xmin": 48.957073, #段落开始时间 "xmax": 80.938614, #段落结束时间 "gender": "MALE", #讲话人性别, 允许不存在此字段 "author": "role1", #讲话人角色, 允许不存在此字段 "text": "aaaaabbb" #音频对应的文本 }, "label_meta_name": "奇怪的声音1" #标注物名称 }, { "label_meta_id": 7901, "create_time": 0, "shape_type": "audio", "serial_number": 2, "label_object_id": -1, "attribute": "{}", "audio": { "xmin": 126.331764, "xmax": 138.0552 }, "label_meta_name": "噪声" } ] }
  • OCTOPUS格式文件基本要求(音频标注) 上传的OCTOPUS格式数据集需包含以下文件(以mp3格式为例)。音频文件支持的格式包含:wav、mp3、flac、m4a。 . ├─ 文件夹1 ├─ audio1.mp3 #音频文件 ├─ audio1.json #该音频文件的所有标注信息 ├─ 文件夹2 ├─ audio2.mp3 #音频文件 ├─ audio2.json #该音频文件的所有标注信息
  • 作业输入输出规范 用户完成自定义场景挖掘镜像上传后,在运行作业容器时,Octopus平台会向作业容器中注入以下环境变量: rosbag_path: 作为数据源的rosbag存放路径,例如/tmp/data/20220620.bag output_dir: 场景挖掘作业运行结果输出目录,例如/tmp/output 用户的作业容器的作用是解析Rosbag,并将场景挖掘结果以csv格式输出到output_dir指定的目录,并以“segments.csv”作为文件名,文件完整路径示例:/tmp/output/segments.csv。 图1 csv文件内容示例 Csv文件表头固定为“tag_name,start,end”,指定该表的四列数据分别为“标签名”、“开始时间戳”、“结束时间戳”。 tag_name:标签名对应Octopus平台标签管理模块内的标签,没有预先创建的标签会自动创建。 start,end:开始和结束时间戳指定该打标片段的时间范围。 folder:目录名指示OpenData数据包内的特定数据目录,对应为某个传感器。如果需要在相同时间片段上对多个传感器打标,需要为每个传感器输出一行打标信息。 输出结果完成后,作业容器需要在output目录创建一个名为“_SUC CES S”的标识文件,用于通知系统作业已完成。如果作业主动捕获到异常并失败退出,可在output目录创建一个名为“_FAILURE”的标识文件,用于通知系统作业已失败。 运行完成并上传的挖掘结果可以在“数据场景”模块进行检索、查看。选中一个场景片段后可以通过“回放”按键跳转到数据包的对应时间点进行回放,长度在10秒到99秒之间的场景片段可以生成仿真场景。选中片段后的预览样本图根据挖掘片段所对应的传感器类型选择相应的传感器样本来进行展示。
  • 构建镜像 Octopus平台依赖算子镜像内的/bin/bash、stdbuf、tee软件,请确保基础镜像内包含上述软件且能通过PATH找到。 Dockerfile示例。 FROM ros:noetic COPY ros_hard_mining.py /home/main/ # 算法启动示例: # python3 /home/main/ros_hard_mining.py --tags tag1,tag2 --time_range 1673231275000,1673261275000 --sensors camera_encoded_1,pandar --number 10 USER root 构建镜像。 运行命令: docker build -f Dockerfile -t ros-hard-mining:0.1 本地调试。 运行如下命令(基于上述示例镜像): docker run -v ${HOME}/tmp/output:/tmp/output --env output_dir=/tmp/output --env tmp_dir=/tmp/workspace ros-hard-mining:0.1 /bin/sh -c “python3 /home/main/ros_hard_mining.py --tags tag1,tag2 --time_range 1673231275000,1673261275000 --sensors camera_encoded_1,pandar --number 10” 完成后在${HOME}/tmp/output目录查看运行结果文件: 图3 运行结果
  • 绘制对象 单击文本标注任务名称,选择任意一个文件进入文本标注模板工具进行人工标注。 设置文档属性和意图。 单击“文档属性”,增加文档的属性描述。单击“意图”,增加文档意图描述; 添加标注。 在文本展示区域,按下鼠标左键在文本展示区域拖动,松开鼠标后,标注列表中将增加一个标注信息。 修改标注类别。 鼠标右键单击已标注的文本,打开标注类型弹窗,修改标注类型。可以为标注文本增加额外属性和审核属性,当标注有问题,可以在审核错误描述中增加错误描述。 删除标注。 在标注列表,单击目标标注后面的,即可删除当前标注,文本标注模板工具中的标注同步删除。 设置关系标注。 文本默认为实体标注,在文本标注模板工具左上角,单击“实体标注”开关,可以切换为“关系标注”。在进行关系标注之前,需要提前在关系管理列表中创建关系类别,详情操作请参考关系管理。 在“关系标注”状态下,先单击一段已标注文本,再选中另一段已标注文本,即可建立两段标注文本之前的关系。 鼠标右键单击关系类别标签,打开类别弹窗,修改关系类别。 删除关系。 在关系列表,单击目标关系后面的,即可删除当前关系,文本标注模板工具中的关系同步删除。
  • merge 简述:地图场景为匝道合流。主车Ego在主道行驶,初始速度为Ego_InitSpeed_Ve0,Ego设定了目标在主道右侧2车道上的目标点Target_position,仿真开始后激活Ego控制器(控制器会影响Ego去往Target_position的寻路算法,但目前仿真器B尚不支持寻路动作acquire_position),从车side_vehicle在匝道行驶,初始速度为SideVehicle_InitSpeed_Ve0.side_vehicle从匝道汇入主道。控制器有时会根据side_vehicle的位置更改主车Ego的速度。 地图文件(odr) scenario Merge: m_scene: scenery lane_width: length = [3m, 4m] radius_of_curvature: length = [200m..1000m] ramp_lane_num: int = 1 ramp_length: length = [200m..300m] main_speed: speed = 120kph ramp_speed: speed = 60kph road_aids_type: road_aids_type = ["DType-1", "DType-2", "PType"] merge_1: merge with: keep(it.lane_width == lane_width) keep(it.left_lane_num == 0) keep(it.right_lane_num == 2) keep(it.ramp_lane_num == ramp_lane_num) keep(it.main_speed == main_speed) keep(it.ramp_speed == ramp_speed) keep(it.radius_of_curvature == radius_of_curvature) keep(it.ramp_length == ramp_length) keep(it.road_aids_type == road_aids_type) 场景文件(osc) import standard scenario Merge: # map map: map map.set_map_file("./merge.odr") # parameter Ego_InitSpeed_Ve0: speed = [90kph..110kph] Ego_InitPosition_LaneId: string = ['-1', '-2'] Ego_InitPosition_s: length = [0m..30m] Ego_Odr: odr_point = map.create_odr_point(road_id: '10', lane_id: Ego_InitPosition_LaneId, s: Ego_InitPosition_s, t: 0.0m) Ego_InitPosition: pose_3d with: keep(it.odr_point == Ego_Odr) SideVehicle_InitSpeed_Ve0: speed = [45kph, 50kph, 55kph] SideVehicle_s: length = [30.0m..80.0m] SideVehicle_Odr: odr_point = map.create_odr_point(road_id: '1', lane_id: '-1', s: SideVehicle_s, t: 0.0m) SideVehicle_InitPosition: pose_3d with: keep(it.odr_point == SideVehicle_Odr) Target_xyz: xyz_point = map.create_xyz_point(x: 530m, y: -2m ,z: 0.0m) Target_position: pose_3d with: keep(it.xyz_point == Target_xyz) Duration: time = 100s # entity Ego: vehicle with: keep(it.name == "Saimo") keep(it.initial_bm == "默认驾驶员") side_vehicle: vehicle with: keep(it.name == "Saimo") keep(it.initial_bm == "默认驾驶员") # storyboard do parallel(duration: Duration): # init Ego.assign_init_position(position: Ego_InitPosition) Ego.assign_init_speed(Ego_InitSpeed_Ve0) side_vehicle.assign_init_position(position: SideVehicle_InitPosition) side_vehicle.assign_init_speed(SideVehicle_InitSpeed_Ve0) Ego.activate_controller(true, true) Ego.acquire_position(target: Target_position) 父主题: 种子地图的逻辑场景样例(仿真器B)
  • 构建镜像 Octopus平台依赖算子镜像内的/bin/bash、stdbuf、tee软件,请确保基础镜像内包含上述软件且能通过PATH找到。 Dockerfile示例。 图4 Dockerfile示例 启动命令: bash /home/Octopus/run.sh 镜像构建: docker build -f Dockerfile -t guikong:0.1 容器启动脚本示例。 图5 启动脚本示例 Resim结果转json示例 图6 Resim结果转json示例 Json转pb文件示例 图7 Json转pb文件示例 本地调试。 命令示例: docker run -v ${HOME}/workspace/guikong/2022-09-23-15-26-54_6.bag_pnc.bag:/tmp/input.bag -v ${HOME}/workspace/output:/tmp/output --env rosbag_path=/tmp/input.bag --env output_dir=/tmp/output --entrypoint /bin/sh guikong-demo:0.1 “-c” “bash /home/Octopus/run.sh” 运行后查看输出结果: 图8 输出结果 确定算法输出、yaml和_SUCCESS标识文件都存在,且文件所有人可读。
  • 作业输入输出规范 运行resim容器时,Octopus平台向容器中注入以下环境变量: rosbag_path: 作为输入的rosbag存放路径,例如/tmp/data/20220620.bag output_dir: resim作业的运行结果输出的目录,例如/tmp/output tmp_dir: 供resim作业存放临时文件的目录,例如/tmp/workspace 用户的resim作业需要输出的文件类似如下结构: |--- /tmp/output 环境变量output_dir指定的输出目录 |--- opendata_to_platform.yaml 输出描述文件,详情见下文 |--- _SUCCESS 作业完成后输出的标识文件,内容可为空 |--- planning 以下各文件夹为resim算法输出内容,按照topic分隔,命名可自定义,与opendata_to_platform.yaml内一致即可,尽量用常见字符 |--- planning.pb |--- perception |--- perception.pb |--- prediction |--- prediction.pb |--- … opendata_to_platform.yaml内容描述输出的文件夹内的输出内容分别对应哪种数据类型,内容示例如下: folders: - folder: planning # 与实际输出的目录名一致 sensor_type: planning_trajectory # 路径规划类型 - folder: perception # 与实际输出的目录名一致 sensor_type: object_array_vision # 感知类型 - folder: prediction # 与实际输出的目录名一致 sensor_type: predicted_objects # 感知物预测类型 当前resim作业支持的输出类型为planning_trajectory 、object_array_vision 、predicted_objects 3种,Proto格式定义分别如下: 图1 planning_trajectory格式定义 图2 object_array_vision格式定义 图3 predicted_objects格式定义
  • Scalar Units Units单位详解: speed units SPEED_UNIT = { "meter_per_second": 1.0, "mps": 1.0, "kilometer_per_hour": 0.277777778, "kmph": 0.277777778, "kph": 0.277777778, "mile_per_hour": 0.447038889, "mph": 0.447038889, "miph": 0.447038889, "mmph": 0.000000278, "millimeter_per_hour": 0.000000278 } acceleration units ACCELERATION_UNIT = { "meter_per_sec_sqr": 1.0, "mpsps": 1.0, "mpss": 1.0, "kilometer_per_hour_per_sec": 0.5270462769, "kmphps": 0.5270462769, "mile_per_hour_per_sec": 0.6686096686, "miphps": 0.6686096686 } length units LENGTH_UNIT = { "nanometer": 0.000000001, "nm": 0.000000001, "micrometer": 0.000001, "millimeter": 0.001, "mm": 0.001, "centimeter": 0.01, "cm": 0.01, "meter": 1.0, "m": 1.0, "kilometer": 1000.0, "km": 1000.0, "inch": 0.0254, "feet": 0.3048, "mile": 1609.344, "mi": 1609.344 } time units TIME_UNIT = { "millisecond": 0.001, "ms": 0.001, "second": 1.0, "sec": 1.0, "s": 1.0, "minute": 60.0, "min": 60.0, "hour": 3600.0, "h": 3600.0 } angle units ANGLE_UNIT = { "degree": 57.295779513, "deg": 57.295779513, "radian": 1.0, "rad": 1.0 } 父主题: 附录(Appendix)
  • 加载算法 加载算法的主要目的是在进行联合仿真时,接入外部控制算法实现闭环控制。通过引入外部的算法,可以提高仿真的精度和复杂度,同时由于算法的分离,可以加快开发进度。 单击进入在线仿真页面,单击页面右上方的“加载算法”。 在弹出框中选择算法镜像和版本,单击“确认”即可运行算法。 需提前准备相关可用算法,算法运行失败不会再次运行算法,创建算法可参考算法列表相关操作。 算法加载成功后,可以展开界面右侧子窗口,查看仿真器相关信息和算法信息。可单击算法信息中的“停止”按钮来停止使用该算法。也可以再次单击“加载算法”选择其他的算法。
  • 加载场景 Octopus平台支持用户在仿真器中加载场景库中的场景,在线编辑、运行并回放。 单击进入在线仿真页面,单击页面右上方的“加载场景”。 选择加载场景方式。 选择需要加载的场景、泛化场景或测试用例。 如果场景数量多,用户也可根据场景的标签进行过滤,并选择需要加载的场景。 在搜索框中输入搜索内容,单击搜索,并在筛选出的场景、测试用例或泛化场景列表中勾选中需要加载的场景。 多项搜索:可根据需要决定是否启用多项搜索,输入多个关键字,中间用“;”隔开,可搜索多个关键字。 单击“确认”,仿真场景加载成功。 查看加载场景过程文件。 使用仿真器在线加载场景后,会在“/home/{user}/workspace/Data/Project/Current/Scenarios/”目录下出现加载过的场景文件,打开指定日期的场景文件夹。单击打开该场景文件夹下的“.xml”文件,即可查看下载下来的“osgb”以及“xodr”文件所在路径。 图2 文件所在路径
  • Octopus 目录 标注文件目录结构 +--- 1611801018801 | +--- 1611801018801.json | +--- 1611801018801.pcd +--- 1611801024401 | +--- 1611801024401.json | +--- 1611801024401.pcd 推理文件目录结构 +--- 1611801018801 | +--- 1611801018801.json +--- 1611801024401 | +--- 1611801024401.json 示例标注文件 3D目标追踪-Octopus标注.json { "frame_id": 0, "labels": [ { "cube_3d": { "location": { "z": -0.010374438202406334, "y": 54.14756705529089, "x": 3.386641177177716 }, "serial_number": 0, "dimensions": { "height": 2.6135754585266113, "width": 2.7737574577331543, "length": 5.917389392852783 }, "rotation": {"x": 0, "y": 0, "z": 4.729842272904634} }, "serial_number": 0, "shape_type": "cube_3d", "label_meta_name": "厢式货车", "label_meta_id": 598 }, { "cube_3d": { "location": { "z": 1.1376991421138332, "y": 40.2855870175903, "x": -3.224063568250358 }, "serial_number": 1, "dimensions": { "height": 2.3640241622924805, "width": 1.4068853855133057, "length": 11.719782829284668 }, "rotation": {"x": 0, "y": 0, "z": 4.71238898038469} }, "serial_number": 0, "shape_type": "cube_3d", "label_meta_name": "大型车", "label_meta_id": 493 } ] } 示例推理文件 3D目标检测-Octopus推理.json { "frame_id": 0, "labels": [ { "label_meta_name": "厢式货车", "cube_3d": { "serial_number": 1, "location": { "x": 3.38, "y": 54.14, "z": -0.010 }, "dimensions": { "length": 5.91, "width": 2.77, "height": 2.61 }, "rotation": { "x": 0, "y": 0, "z": 4.72 } }, "score": 0.89 }, { "label_meta_name": "厢式货车", "cube_3d": { "serial_number": 1, "location": { "z": 0.07, "y": -12.98, "x": 3.84 }, "dimensions": { "height": 3.23, "width": 2.64, "length": 6.50 }, "rotation": { "x": 0, "y": 0, "z": 4.71 } }, "score": 0.82 } ] }
  • 绘制对象 单击点云标注任务,单击任意一帧,进入人工标注。 选择标注工具。 单击左侧工具栏“智能缩框标注”(快捷键B)。 选择标注类别。 标注下拉列表页选择一标注名,进入标注状态。 框选标注物。 调整三视图。 依据标注规范要求,结合下方真实图片中对应标注物大小,调整点云图像中标注物三视图中标注框。 调整2D框(只适用于联合标注)。 单击2D图片。 开启联合按钮。 图1 开启联合按钮 针对点云框对应的2D框进行调整大小。 修改标注类别。 左键单击目标图形,可进入选择类别的跳出框,即可修改类别。 修改额外属性。 左键单击目标图形,如果目标含有额外属性,单击即可选择属性。 修改对象ID。 左键单击目标图形,可以在对象ID栏手动输入数值来修改ID。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全