![9c2f31e599c091bb685eab9fa15f2aa8.png](https://i-blog.csdnimg.cn/blog_migrate/8a3fd1ff9e45c4dd0b3db09a2f7e092f.jpeg)
按照 "为多个信号贴标签 "
小明师兄:MATLAB开发自动驾驶第四课-多信号的地面真相标签zhuanlan.zhihu.com![f7640846c25f8de5c96e6748e810c9a6.png](https://i-blog.csdnimg.cn/blog_migrate/a1ace1518e69f00b1c36116fcc6a8941.jpeg)
程序给信号贴上标签后,导出标签并探索如何存储它们。
设置
打开包含标记信号的 Ground Truth Labeler 应用程序会话。 可以从 MATLAB® 命令行打开会话。例如,如果将该会话保存到名为groundTruthLabelingSession,输入此命令。
groundTruthLabeler groundTruthLabelingSession.mat
在应用程序工具条上,选择 "导出标签">"到工作区"。在 "导出到工作空间 "窗口中,使用默认的导出变量名称 gTruth,然后单击确定。应用程序会将 groundTruthMultisignal 对象 gTruth 导出到 MATLAB工作区。该对象包含从应用程序会话中捕获的地面真相标签。
如果没有将groundTruthMultisignal对象导出到工作区,请从变量gTruth中加载一个预定义对象。用于加载该对象的函数作为辅助文件附在本例中。如果使用自己的对象,标签位置等数据可能与本例中显示的数据不同。
if (~exist('gTruth','var'))
gTruth = helperLoadGTruthGetStarted;
end
显示groundTruthMultisignal对象gTruth的属性。该对象包含有关信号数据源、标签定义以及 ROI 和场景标签的信息。这些信息存储在对象的单独属性中。
gTruth =
groundTruthMultisignal with properties:
DataSource: [1x2 vision.labeler.loading.MultiSignalSource]
LabelDefinitions: [3x7 table]
ROILabelData: [1x1 vision.labeler.labeldata.ROILabelData]
SceneLabelData: [1x1 vision.labeler.labeldata.SceneLabelData]
在这个例子中,将检查每个属性的内容,以了解对象如何存储地面真相标签。
数据源
DataSource 属性包含有关数据源的信息。此属性包含两个 MultiSignalSource 对象:一个用于视频源,一个用于点云序列源。显示DataSource属性的内容。
gTruth.LabelDefinitions.Hierarchy{1}.brakeLight
ans =
1x2 heterogeneous MultiSignalSource (VideoSource, PointCloudSequenceSource) array with propert
SourceName
SourceParams
SignalName
SignalType
Timestamp
NumSignals
这些对象中存储的信息包括数据源的路径、它们所包含的信号名称以及这些信号的时间戳。显示数据源的信号名称。
gTruth.DataSource.SignalName
ans = "video_01_city_c2s_fcw_10s"
ans="lidarSequence"
标签定义
LabelDefinitions 属性包含了一个关于标签定义的信息表。显示标签定义表。每一行都包含有关 ROI 或场景标签定义的信息。汽车标签定义有两行:一行用于在图像信号上绘制矩形标签,另一行用于在点云信号上绘制立方体标签。
gTruth.LabelDefinitions
ans =
3x7 table
Name SignalType LabelType Group Description LabelColor Hierarchy
___________ __________ _________ ____________ ___________ ____________ ____________
{'car' } Image Rectangle {'Vehicles'} {0x0 char} {1x3 double} {1x1 struct}
{'car' } PointCloud Cuboid {'Vehicles'} {0x0 char} {1x3 double} {1x1 struct}
{'daytime'} Time Scene {'None' } {0x0 char} {1x3 double} {0x0 double}
层次列存储了父ROI标签的子标签和属性定义的信息。当汽车标签绘制为矩形时,显示它的子标签和属性信息。该标签包含一个子标签brakeLight,没有属性。
gTruth.LabelDefinitions.Hierarchy{1}
ans =
struct with fields:
brakeLight: [1x1 struct]
Type: Rectangle Description: ''
显示父车标签的刹车灯子标签的信息。子标签包含一个属性isOn。子标签不能有自己的子标签。
gTruth.LabelDefinitions.Hierarchy{1}.brakeLight
ans =
struct with fields:
Type: Rectangle
Description: ''
LabelColor: [0.5862 0.8276 0.3103]
isOn: [1x1 struct]
显示刹车灯子标签的 isOn 属性的信息。这个属性没有默认值,所以DefaultValue字段为空。
gTruth.LabelDefinitions.Hierarchy{1}.brakeLight.isOn
ans =
struct with fields:
DefaultValue: []
Description: ''
ROI标签数据
ROILlabelData 属性包含一个 ROILabelData 对象,其属性包含每个信号的 ROI 标签数据。属性的名称与信号的名称相匹配。显示对象属性名。
gTruth.ROILabelData
ans =
ROILabelData with properties:
video_01_city_c2s_fcw_10s: [204x1 timetable]
lidarSequence: [34x1 timetable]
每个属性都包含在每个信号时间戳处绘制的 ROI 标签的时间表,每个标签有一列。查看部分视频和激光雷达点云序列时间表。设置一个时间间隔,从8到8.5秒。该时间间隔对应于程序中 "为多个信号标注地面真值 "中标注的时间间隔的开始。视频时间表比点云序列时间表包含更多行,因为视频包含更多标签帧。
timeInterval = timerange(seconds(8),seconds(8.5));
videoLabels = gTruth.ROILabelData.video_01_city_c2s_fcw_10s(timeInterval,:)
lidarLabels = gTruth.ROILabelData.lidarSequence(timeInterval,:)
videoLabels =
10x1 timetable
Time car
8 sec {1x1 struct}
8.05 sec {1x1 struct}
8.1 sec {1x1 struct}
8.15 sec {1x1 struct}
8.2 sec {1x1 struct}
8.25 sec {1x1 struct}
8.3 sec {1x1 struct}
8.35 sec {1x1 struct}
8.4 sec {1x1 struct}
8.45 sec {1x1 struct}
lidarLabels =
2x1 timetable
Time car
8.0495 sec {1x1 struct}
8.3497 sec {1x1 struct}
查看时间间隔内第一帧视频的矩形车标签。标签数据存储在一个结构中。
videoLabels.car{1}
ans =
struct with fields:
Position: [296 203 203 144]
brakeLight: [1x2 struct]
Position(位置)字段存储汽车标签的位置。这个框架只包含一个车标,所以在这种情况下,Position只包含一个矩形边界框。边界框位置的形式为[x y w h],其中。
- x和y表示矩形的左上角。
- w指定矩形的宽度,也就是矩形沿x轴的长度。
- h指定矩形的高度,也就是矩形沿y轴的长度,其中:x和y指定矩形的左上角,w指定矩形的宽度,也就是矩形沿x轴的长度。
汽车标签在这个框架上还包含两个刹车灯子标签。查看brakeLight子标签。子标签存储在一个结构数组中,每个子标签在框架上绘制一个结构。
videoLabels.car{1}.brakeLight
ans =
1x2 struct array with fields:
Position isOn
查看子标签的边界框位置。
videoLabels.car{1}.brakeLight.Position
ans =
304 245 50 46
ans =
435 243 54 51
查看每个子标签中isOn属性的值。对于两个子标签,此属性被设置为逻辑1(true)。
videoLabels.car{1}.brakeLight.isOn
ans = logical
1
ans = logical
1
现在查看时间间隔内第一个点云序列帧的立方体车标签。点云序列不支持子标签或属性。立方体车标签不存储在结构的位置字段中,而是存储在一个M乘9的矩阵中,其中M是立方体标签的数量。因为这个框架只包含一个立方体标签,在这种情况下,M为1。
lidarLabels.car{1}
ans =
struct with fields:
Position: [-1.1559 -0.7944 1.2012 12.6196 5.9278 3.0010 0 0 0]
brakeLight: []
1乘9的边界盒位置的形式为[xctr,yctr,zctr,xlen,ylen,zlen,xrot,yrot,zrot],其中。
- xctr, yctr, and zctr specify the center of the cuboid. xlen, ylen, and zlen, xrot, yrot, zrot],其中:
- xlen, ylen, 和 zlen 分别指定了立方体在应用旋转之前沿 x-, y-, 和 z-轴的长度。
- xrot、yrot和zrot分别指定了立方体沿x轴、y轴和z轴的旋转角度。这些角度在相应轴的正向看时为顺时针正值。
此图显示了这些值如何指定立方体的位置。
场景标签数据
SceneLabelData 属性包含一个 SceneLabelData 对象,其属性包含所有信号的场景标签数据。属性的名称与场景标签的名称相匹配。显示对象属性名:
gTruth.SceneLabelData
ans =
SceneLabelData with properties:
daytime: [0 sec 10.15 sec]
日间标签适用于整个时间间隔,约为10秒。
使用 "地面真相 "标签
本例中显示的标签仅用于说明目的。对于自己的标签,在导出标签后,可以使用它们作为对象检测器的训练数据。要从groundTruthMultisignal对象中收集标签数据用于训练,请使用gatherLabelData函数。
要共享已标记的地真数据,请共享包含groundTruthMultisignal对象的地真MAT-文件,而不是包含应用程序会话的MAT-文件。
未经许可,禁止转载