云服务器内容精选

  • 逻辑场景相关操作 在“逻辑场景列表”,还可以进行以下操作。 表1 逻辑场景相关操作 任务 操作步骤 查询逻辑场景 选择“逻辑场景名称”、“场景ID”或“创建人”,在搜索输入框中输入搜索条件,按回车键即可查询。也可按照"标签筛选"查询场景具体可参考标签筛选。 删除逻辑场景 单击逻辑场景名称后操作栏内的“ 删除”,删除该场景。 勾选多个逻辑场景前勾选框,单击场景列表上方的“删除”,可批量删除场景。 说明: 被任务使用的逻辑场景不可被删除。 编辑逻辑场景 单击操作栏中的“编辑”,可编辑逻辑场景基本信息。 查看逻辑场景详情 单击逻辑场景名称,可查看逻辑场景详情。 基本信息:场景名称、创建时间,解析状态等信息。 场景参数:包括动态场景、静态场景信息,可单击文件列表后的“下载”或“替换文件”,将文件下载本地或替换场景文件。 泛化任务:平台支持逻辑场景生成泛化任务,具体操作参考泛化任务。 场景预览:根据场景文件的不同情况,场景预览会以不同的方式呈现。详见场景预览。
  • 场景预览 场景预览当前有两种呈现方式:动态场景预览和地图场景预览。 动态场景预览:版本为OpenSCENARIO1.1.1的场景预览,存在完整的逻辑场景文件时显示。 地图场景预览:逻辑场景文件缺失或部分缺失,逻辑场景文件解析失败或其他不支持动态场景预览的情况时显示。 动态场景预览 逻辑场景的动态场景预览同具体场景的动态场景预览相同,可参考具体场景的动态场景预览。 地图场景预览 逻辑场景的地图场景预览同具体场景的地图场景预览相同,可参考具体场景的地图场景预览。
  • 创建镜像仓库 用平台管理员账号登录Octopus平台。 在左侧菜单栏中,单击“镜像仓库 ”。 单击“新建”,填写基本信息。 图1 创建镜像仓库 名称:输入镜像仓库的名称,只能包含数字、英文、中文、下划线、中划线。 用途:根据需求,下拉框选择用途。 描述:简单描述镜像仓库,最大长度为255。 使用范围:仅支持团队,即租户内所有配置了该镜像相关权限的用户都可见可编辑。 单击“确定”,在镜像仓库列表即可查看新建的镜像仓库。
  • 推理服务 推理服务镜像同训练任务镜像一样,必须内置一个用户名为“ma-user”,组名为“ma-group”的普通用户,且必须确保该用户的uid=1000、gid=100。 需要明确设置镜像的启动命令。执行命令如下: CMD sh /home/mind/run.sh 服务端必须使用https协议, 且暴露在所有网络平面(0.0.0.0)的“8080”端口。 在“8080”端口,提供URL路径为“/health”的健康检查接口供健康检查使用。 接口仅支持POST、GET、PUT、DELETE 四种方法。 Dockerfile示例: FROM python:3.11 USER root RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user USER ma-user RUN pip install --progress-bar off flask cryptography WORKDIR /home/ma-user COPY server.py . CMD python server.py HTTPS Server示例: from flask import Flask, request import json app = Flask(__name__) @app.route('/greet', methods=['POST']) def say_hello_func(): print("----------- in hello func ----------") data = json.loads(request.get_data(as_text=True)) print(data) username = data['name'] rsp_msg = 'Hello, {}!'.format(username) return json.dumps({"response":rsp_msg}, indent=4) @app.route('/goodbye', methods=['GET']) def say_goodbye_func(): print("----------- in goodbye func ----------") return '\nGoodbye!\n' @app.route('/', methods=['POST']) def default_func(): print("----------- in default func ----------") data = json.loads(request.get_data(as_text=True)) return '\n called default func !\n {} \n'.format(str(data)) @app.route('/health', methods=['GET']) def healthy(): return "{\"status\": \"OK\"}" # host must be "0.0.0.0", port must be 8080 if __name__ == '__main__': # 访问创建推理服务时选择的模型版本文件 torchserve = PTVisionService(model_path=os.getenv('OCTOPUS_MODEL') + '/best.pt') # host must be "0.0.0.0", port must be 8080 app.run(host="0.0.0.0", port=8080, ssl_context='adhoc') 注意:在创建推理服务时选择的模型版本文件将在服务启动时下载到OCTOPUS_MODEL对应的路径下: 环境变量名称 含义 默认值(默认值可能会随版本变化,不建议直接使用) OCTOPUS_MODEL 模型版本文件下载目录 /home/mind/model 在本地机器调试 自定义引擎的规范可以在安装有docker的本地机器上通过以下步骤提前验证: 将自定义引擎镜像下载至本地机器,假设镜像名为custom_engine:v1。 将模型版本文件夹复制到本地机器,假设模型包文件夹名字为model。 在模型文件夹的同级目录下验证如下命令拉起服务: docker run -u 1000:100 -p 8080:8080 -v /home/model:/home/mind/model -e OCTOPUS_MODEL=/home/mind/model custom_engine:v1 在本地机器上启动另一个终端,执行以下验证指令,得到符合预期的推理结果。 curl -k https://127.0.0.1:8080/${推理服务的请求路径} 本地调试完成后,每次都需将镜像推送至新版本,使用二次推送镜像功能会导致推理服务镜像更新不生效。
  • 3D预标注类别列表 表1 3D预标注类别 功能 类别 目标检测 行人 自行车 摩托车 卡车 公交车 小汽车 目标分割 Pedestrian(行人) Bicycle(自行车) Motorcycle(摩托车) Truck(卡车) Bus(公交车) Car(小汽车) Trailer(拖车) Construction vehicle(工程车) Drivable surface(可行驶路面) Terrain(地带) Sidewalk(人行道) Vegetation(草木) Other flat(其他) Barrier(路面栅栏) Traffic cone(锥桶) Manmade(建筑)
  • 多帧识别场景列表 表2 多帧识别类别 类别 场景 描述 时间 TIME 白天Day - 夜晚Night - 日出Sunrise - 日落Sunset 天气 WEATHER 晴天Sunny - 晴空Clear sky 雾天Foggy - 雨天Rainy - 雪天Snowy - 多云Cloudy - 地点 PLACE 城市道路Urban road - 加油站Gas Station - 高速公路Highway - 停车场Parking - 住宅区Residential Area - 隧道Tunnel - 物体 OBJE CTS 小型车Small Vehicle 为个人使用而设计的小型车辆,如轿车,小型货车,suv和吉普车 卡车Truck 主要用于运输货物的车辆,包括皮卡、卡车和半挂车。 工程车Construction Vehicle 用于施工的车辆,如挖掘机、推土机。 摩托车Motorcycle 汽油或电力驱动的两轮车辆,包括所有摩托车、小型摩托车,踏板车,轻型三轮车。 自行车Bicycle 以较低速度在路面、人行道或自行车道上行驶的人力驱动的两轮车辆。 行人Pedestrian 道路上自由行动的所有人员。 交通灯Traffic Lights 交通灯,即红绿灯,标注的一个实例仅包含一个三联装的红绿灯,无论横向或纵向。 拖车Trailer 拖车,被拖拽的车辆或集装箱。 路障Road barrier 临时放置在现场的任何金属、混凝土等路障,以重新引导车辆或行人通行。
  • 工作空间隔离资源 工作空间:是Octopus自动驾驶云服务面向企业客户提供的一个高阶功能,用于进一步将用户的资源划分在多个逻辑隔离的空间中,并支持以空间维度进行访问的权限限定。 工作空间默认有一个“default”空间,在没有创建新的工作空间之前,您操作的所有资源均默认在该空间下。当您创建新的工作空间之后,相当于您拥有了一个新的“Octopus分身”,您可以通过菜单栏的左上角进行工作空间的切换,不同工作空间中的工作互不影响。只有被授权的用户才能访问特定的工作空间(在创建、编辑工作空间进行配置),像数据资产、仿真服务等,均可以借助工作空间做访问的限制。 图9 工作空间
  • Octopus CommonOperations策略内容 { "Version": "1.1", "Statement": [ { "Action": [ "octopus:annotation*:*", "octopus:common*:*", "octopus:dataCache:*", "octopus:dataCalibration:*", "octopus:dataExpress:create", "octopus:dataExpress:delete", "octopus:dataExpress:get", "octopus:dataExpress:list", "octopus:dataExpress:updateBaseInfo", "octopus:dataExpress:updateTaskConfig", "octopus:dataImportRecord:*", "octopus:dataJob:*", "octopus:dataMap:*", "octopus:dataOverview:get", "octopus:dataPackage:*", "octopus:dataProcessors:*", "octopus:dataReplay:get", "octopus:dataScenario:*", "octopus:dataset:*", "octopus:dataTag:*", "octopus:dataVehicle:*", "octopus:dataWarehouse:*", "octopus:imageRepo:*", "octopus:resource*:*", "octopus:sim*:*", "octopus:training*:*", "octopus:workspace:list", "octopus:workspace:get" ], "Effect": "Allow" } ] }
  • 理解Octopus的权限与委托 如果您需要对华为云上购买的Octopus自动驾驶云服务资源,给企业中的员工设置不同的访问权限,以达到不同员工之间的权限隔离,您可以使用 统一身份认证 服务(Identity and Access Management,简称 IAM )进行精细的权限管理。该服务提供用户身份认证、权限分配、访问控制等功能,可以帮助您安全的控制华为云资源的访问。 通过IAM,您可以在华为云账号中给员工创建IAM用户,并使用策略来控制IAM用户对华为云资源的访问范围,例如您的员工中有负责软件开发的人员,您希望他们拥有Octopus的使用权限,但是不希望他们拥有删除通道等高危操作的权限,那么您可以使用IAM为开发人员创建用户,通过授予仅能使用通道,但是不允许删除通道的权限策略,控制他们对通道资源的使用范围;在使用Octopus云资源过程中需要访问用户的其他服务,需要先获得用户的授权,这个动作就是一个“委托”,用户委托Octopus代表自己访问特定的云服务,已完成其在Octopus平台上的操作。 权限:使用Octopus自动驾驶云服务平台上的镜像仓库、运维配置、工作空间、数据资产、数据合规、数据处理、标注服务、训练服务、仿真服务的所有功能,均需要通过IAM权限体系进行正确权限授权。 委托:使用Octopus自动驾驶云服务平台上的智驾模型服务中的模型微调和2D图像生成功能需要访问 对象存储服务 (OBS),均需要获得用户的委托授权。 IAM是华为云提供权限管理的基础服务,无需付费即可使用,您只需要为您账号中的资源进行付费。关于IAM的详细介绍,请参见《IAM产品介绍》。 如果华为云账号已经能满足您的要求,不需要创建独立的IAM用户进行权限管理,您可以跳过本章节,不影响您使用Octopus的其它功能。
  • Octopus权限管理 默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。创建用户并授权使用八爪鱼自动驾驶云服务请参考创建用户并授权使用服务。 Octopus部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问Octopus时,需要先切换至授权区域。 图1 权限授权 IAM在对用户组授权的时候,并不是直接将具体的某个权限进行赋权,而是需要先将权限加入到“策略”当中,再把策略赋给用户组。为了方便用户的权限管理,各个云服务都提供了一些预置的“系统策略”供用户直接使用。如果预置的策略不能满足您的细粒度权限控制要求,则可以通过“自定义策略”来进行精细控制。请参考创建自定义策略。 如表1所示,包括了Octopus的所有系统权限。 表1 表1 Octopus系统策略 策略名称 描述 策略类别 角色/策略内容 Octopus FullAccess Octopus管理员权限,拥有该权限的用户可以操作并使用所有Octopus服务。 系统策略 Octopus FullAccess策略内容 Octopus CommonOperations Octopus操作权限,拥有该权限的用户拥有Octopus服务的除智驾模型服务、数据合规递送、创建工作空间、编辑工作空间、删除工作空间之外的所有操作权限。 系统策略 Octopus CommonOperations策略内容 表2列出了Octopus常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。 表2 Octopus常用操作与系统权限的授权关系 服务 功能 操作 Octopus FullAccess Octopus CommonOperations 镜像仓库 ALL ALL √ √ 运维配置 ALL ALL √ √ 标注服务 ALL ALL √ √ 训练服务 ALL ALL √ √ 仿真服务 ALL ALL √ √ 智驾模型服务 ALL ALL √ x 数据资产 ALL ALL √ √ 数据合规 数据合规递送 创建合规订单 √ x 获取合规订单列表 √ x 获取合规订单配置信息 √ x 更新合规订单状态 √ x 获取合规数据包列表 √ x 推送合规数据包 √ x 合规处理模板 创建合规处理模板 √ x 查询合规处理模板列表 √ x 查询合规处理模板详情 √ x 更新合规处理模板 √ x 删除合规处理模板 √ x 合规作业 查询合规作业列表 √ x 查询合规作业详情 √ x 创建合规作业 √ x 操作合规作业和作业队列 √ x 删除合规作业 √ x 数据处理 ALL ALL √ √ 工作空间 ALL 获取工作空间列表 √ √ 查看工作空间详情 √ √ 创建工作空间 √ x 编辑工作空间 √ x 删除工作空间 √ x 更详细的细粒度策略支持的授权项请参考《Octopus API参考》中“策略及授权项说明”章节。
  • 安全风险知会 自动驾驶云服务中,为了最大化资源利用率,租户的子用户可以共享计算资源用于运行容器化的作业。这意味着租户的不同子用户的容器化处理作业可以运行在同一个计算节点上,共享节点的CPU、内存、磁盘、操作系统内核等资源,这里就会存在容器逃逸的风险。 自动驾驶云服务适用于您的子用户是可控的、可信任的场合,不适用于子用户不可控、不可信的场合,例如您授权其他客户作为子用户共同使用自动驾驶云服务的情况。请确保您的子用户是可控和可信任的。 计算资源:您在自动驾驶云服务中订购的通用处理节点、AI处理节点。 容器化处理作业:数据处理任务、标注任务、训练任务、推理任务、并行仿真、场景泛化、智驾模型训练、智驾模型推理等。 父主题: 安全
  • 绘制对象 单击点云标注任务,单击任意一帧,进入人工标注。 选择标注工具。 单击左侧工具栏“AI标注”(快捷键b)。 图1 选择标注工具 选择标注类别。 标注下拉列表页选择一标注名,进入标注状态。 图2 选择标注类别 框选标注物。 图3 框选标注物 调整三视图。 依据标注规范要求,结合下方真实图片中对应标注物大小,调整点云图像中标注物三视图中标注框。 图4 调整三视图 调整2D框(只适用于联合标注)。 单击2D图片。 开启联合按钮。 图5 开启联合 针对点云框对应的2D框进行调整大小。 图6 调整2D框 修改标注类别。 右键单击目标图形,可进入选择类别的跳出框,即可修改类别。 图7 修改标注类别 修改额外属性。 右键单击目标图形,如果目标含有额外属性,单击即可选择属性。 修改对象ID。 右键单击目标图形,可以在对象ID栏手动输入数值来修改ID。 重复以上标注步骤,直至全部标注完成,切换下一张。 打开追踪双屏显示。 图8 打开追踪双屏显示 使用追踪快捷键F。 图9 追踪快捷键 调整点云框三视图,使其能完整包裹点云。 右击目标图形,修改对象ID,保证同一辆车在前后帧ID一致。
  • 基于样例的拓展 本章的场景样例可以结合第一章介绍的各模块代码样例进行修改和拓展。以straigh场景的osc为例,设定初始位置时,除了使用st坐标系(odr_point,即osc1.0中的LanePosition)还可以使用xyz坐标系(xyz_point,即osc1.0中的WorldPosition)来替代: st坐标系(odr_point)写法: 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) 对应xyz坐标系(xyz_point)写法,其中y值-1.5m和-4.5m分别对应车道宽度为3m时的'-1'和'-2'车道的中心位置: y: length = [-1.5m, -4.5m] x: length = [0m..30m] Ego_xyz: xyz_point = map.create_xyz_point(x: x, y: y, z: 0.0m) Ego_InitPosition: pose_3d with: keep(it.xyz_point == Ego_xyz) 以上对等替换仅存在于odr_point的road_id固定的情形,当road_id(仿真器A中的TrackId)是一个可泛化的值时,起点可以出现在多条道路上,对应多段x和y值的组合区间,无法使用一个xyz_point直接对等泛化。此时可以使用多个动态场景来实现同等的泛化,例如: 假设地图上存在多条road,且对odr_point的road_id进行了泛化: Ego_InitPosition_Road_id: string = ['10', '1'] Ego_InitPosition_LaneId: string = ['-1', '-2'] Ego_InitPosition_s: length = [0m..30m] Ego_Odr: odr_point = map.create_odr_point(road_id: Ego_InitPosition_Road_id, lane_id: Ego_InitPosition_LaneId, s: Ego_InitPosition_s, t: 0.0m) Ego_InitPosition: pose_3d with: keep(it.odr_point == Ego_Odr) 可以在两个动态场景文件中分别使用一组xyz_point来替代,例如: 第一组对应road_id为'10'的情况(同前例): y: length = [-1.5m, -4.5m] x: length = [0m..30m] Ego_xyz: xyz_point = map.create_xyz_point(x: x, y: y, z: 0.0m) Ego_InitPosition: pose_3d with: keep(it.xyz_point == Ego_xyz) 第二组对应road_id为'1'的情况,该道路与road_id为'10'的道路垂直,x值的101.5m和104.5m分别对应车道宽度为3m时的'-1'和'-2'车道的中心位置: y: length = [-40m..-10m] x: length = [101.5m, 104.5m] Ego_xyz: xyz_point = map.create_xyz_point(x: x, y: y, z: 0.0m) Ego_InitPosition: pose_3d with: keep(it.xyz_point == Ego_xyz) 父主题: 种子地图的逻辑场景样例(仿真器A)
  • junction 简述:地图场景为交叉口。lead_vehicle和主车Ego一前一后分别以LeadVehicle_TargetSpeed_Ve0和Ego_TargetSpeed_Ve0的初始速度向交叉口行驶,Ego设定了目标在右转车道上的目标点Target_position,仿真开始后激活Ego控制器(控制器会影响Ego去往Target_position的寻路算法,但目前仿真器B尚不支持寻路动作acquire_position)。另一路段上有一辆车vehicle1,也以LeadVehicle_TargetSpeed_Ve0的速度朝交叉口行驶。控制器有时会根据环境车的位置更改主车Ego的速度。 地图文件(odr) scenario Junction: m_scene: scenery lane_num: int = [2, 3, 4] bikeway: bool = false sidewalk: bool = false junction_type: junction_type = ["crossroad", "T-junction"] junction_1: junction with: keep(it.lane_num == lane_num) keep(it.bikeway == bikeway) keep(it.sidewalk == sidewalk) keep(it.junction_type == junction_type) 场景文件(osc) import standard scenario Junction: # map map: map map.set_map_file("./junction.odr") # parameter Ego_TargetSpeed_Ve0: speed = [50kph..60kph] Ego_InitPosition_RoadId: string = '1' Ego_InitPosition_LaneId: string = ['-1', '-2'] Ego_InitPosition_s: length = [0m..100m] Ego_Odr: odr_point = map.create_odr_point(road_id: Ego_InitPosition_RoadId, lane_id: Ego_InitPosition_LaneId, s: Ego_InitPosition_s, t: 0.0m) Ego_InitPosition: pose_3d with: keep(it.odr_point == Ego_Odr) Target_xyz: xyz_point = map.create_xyz_point(x: 225m, y: -100m ,z: 0.0m) Target_position: pose_3d with: keep(it.xyz_point == Target_xyz) LeadVehicle_TargetSpeed_Ve0: speed = 45kph Vehicle1_Odr: odr_point = map.create_odr_point(road_id: '2', lane_id: '2', s: 100.0m, t: 0.0m) m_orientation: orientation_3d with: keep(it.roll == 0.0rad) keep(it.pitch == 0.0rad) keep(it.yaw == -1.57rad) Vehicle1_InitPosition: pose_3d with: keep(it.odr_point == Vehicle1_Odr) keep(it.orientation == m_orientation) m_profile: dynamics_shape = [sinusoidal, linear, step] m_rate_peak: acceleration = [5kmphps, 10kmphps] Duration: time = [100s, 120s] # entity Ego: vehicle with: keep(it.name == "Saimo") keep(it.initial_bm == "默认驾驶员") lead_vehicle: vehicle with: keep(it.name == "Saimo") keep(it.initial_bm == "默认驾驶员") vehicle1: 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_TargetSpeed_Ve0) lead_vehicle.assign_init_position() with: lane(same_as: Ego) position(distance: 30.0m, ahead_of: Ego) lead_vehicle.assign_init_speed(LeadVehicle_TargetSpeed_Ve0) vehicle1.assign_init_position(position: Vehicle1_InitPosition) vehicle1.assign_init_speed(LeadVehicle_TargetSpeed_Ve0) Ego.activate_controller(true, true) Ego.acquire_position(target: Target_position) 父主题: 种子地图的逻辑场景样例(仿真器B)
  • 作业输入输出规范 运行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 输出描述文件,详情见下文 |--- _SUC CES S 作业完成后输出的标识文件,内容可为空 |--- 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格式定义分别如下: 父主题: Resim作业