Этот пример показывает вам, как сегментировать и классифицировать ландшафт на воздушные данные о лидаре как земля, создание и растительность. Пример использует файл LAZ, полученный бортовой системой лидара, как введено. Во-первых, классифицируйте данные об облаке точек на файл LAZ в наземные и неназемные точки. Затем далее классифицируйте неназемные точки в создание и точки растительности на основе функций искривления и нормалей. Этот рисунок предоставляет обзор процесса.
Загрузите данные об облаке точек и соответствующие метки основной истины из файла LAZ, aerialLidarData.laz
, полученный из Открытого Набора данных Топографии [1]. Облако точек состоит из различных классов, включая землю, создание и растительность. Загрузите данные об облаке точек и соответствующие метки основной истины в рабочую область с помощью readPointCloud
объектная функция lasFileReader
объект. Визуализируйте облако точек, на которое наносят цветную маркировку согласно меткам основной истины, с помощью pcshow
функция.
lazfile = fullfile(toolboxdir('lidar'),'lidardata','las','aerialLidarData.laz'); % Read LAZ data from file lazReader = lasFileReader(lazfile); % Read point cloud and corresponding ground truth labels [ptCloud,pointAttributes] = readPointCloud(lazReader, ... 'Attributes','Classification'); grdTruthLabels = pointAttributes.Classification; % Visualize the input point cloud with corresponding ground truth labels figure pcshow(ptCloud.Location,grdTruthLabels) title('Aerial Lidar Data with Ground Truth')
Основывайтесь классификация является шагом предварительной обработки, чтобы сегментировать облако точки ввода как землю и неземлю. Сегментируйте данные, загруженные из файла LAZ в наземные и неназемные точки с помощью segmentGroundSMRF
функция.
[groundPtsIdx,nonGroundPtCloud,groundPtCloud] = segmentGroundSMRF(ptCloud); % Visualize ground and non-ground points in green and magenta, respectively figure pcshowpair(nonGroundPtCloud,groundPtCloud) title('Classified Ground and Non-Ground Points')
Извлеките функции из облака точек с помощью helperExtractFeatures
функция. Все функции помощника присоединены к этому примеру как к вспомогательным файлам. Функция помощника оценивает нормальные значения и значения искривления для каждой точки в облаке точек. Эти функции предоставляют информацию о глубинной структуре в каждой точке путем корреляции его с точками в ее окружении.
Можно задать количество соседей, чтобы рассмотреть. Если количество соседей является слишком низким, точки растительности сверхкластеров функции помощника. Если количество соседей слишком высоко, нет никакого контура определения между созданиями и растительностью, когда точки растительности около точек создания неправильно классифицируются.
neighbors = 10;
[normals,curvatures,neighInds] = helperExtractFeatures(nonGroundPtCloud, ...
neighbors);
Функция помощника использует изменение нормалей и искривления, чтобы различать создания и растительность. Создания являются более плоскими по сравнению с растительностью, таким образом, изменение в искривлении и относительной разнице нормалей между соседями меньше для точек, принадлежащих созданиям. Точки растительности более рассеиваются, который приводит к более высокому изменению в искривлениях по сравнению с созданиями. helperClassify
функция классифицирует неназемные точки в создание и растительность. Функция помощника классифицирует точки как создающий на основе следующих критериев:
Искривление каждой точки должно быть малым, в заданном пороге искривления, curveThresh
.
Соседние точки должны иметь подобные нормали. Подобие косинуса между соседними нормалями должно быть больше заданного нормального порога, normalThresh
.
Точки, которые не удовлетворяют указанным выше критериям, отмечены как растительность. Функция помощника помечает точки, принадлежащие растительности как 1
и создание как 2
.
% Specify the normal threshold and curvature threshold normalThresh = 0.85; curveThresh = 0.02; % Classify the points into building and vegetation labels = helperClassify(normals,curvatures,neighInds, ... normalThresh,curveThresh);
Извлеките создание и метки класса растительности из данных о метке основной истины. Когда файл LAZ имеет много классов, необходимо сначала изолировать землю, создание и классы растительности. Метки классификации соответствуют стандарту ASPRS для форматов файлов LAZ.
Значение классификации 2 — Представляет наземные точки
Значения классификации 3, 4, и 5 — Представляют низко, носитель и высокие точки растительности
Значение классификации 6 — Представляет точки создания
Задайте maskData
извлекать точки, принадлежащие земле, созданиям и растительности от облака точки ввода.
maskData = grdTruthLabels>=2 & grdTruthLabels<=6;
Измените метки основной истины облака точки ввода в виде grdTruthLabels
.
% Compress low, medium, and high vegetation to a single value grdTruthLabels(grdTruthLabels>=3 & grdTruthLabels<=5) = 4; % Update grdTruthLabels for metrics calculation grdTruthLabels(grdTruthLabels == 2) = 1; grdTruthLabels(grdTruthLabels == 4) = 2; grdTruthLabels(grdTruthLabels == 6) = 3;
Сохраните предсказанные метки, полученные от предыдущих шагов классификации в estimatedLabels
.
estimatedLabels = zeros(ptCloud.Count,1); estimatedLabels(groundPtsIdx) = 1; estimatedLabels(labels == 1) = 2; estimatedLabels(labels == 2) = 3;
Извлеките метки, принадлежащие земле, созданиям и растительности.
grdTruthLabels = grdTruthLabels(maskData); estimatedLabels = estimatedLabels(maskData);
Визуализируйте ландшафт с основной истиной и оцененными метками.
ptCloud = select(ptCloud,maskData); hFig = figure('Position',[0 0 900 400]); axMap1 = subplot(1,2,1,'Color','black','Parent',hFig); axMap1.Position = [0 0.2 0.5 0.55]; pcshow(ptCloud.Location,grdTruthLabels,'Parent',axMap1) axis off title(axMap1,'Aerial Lidar Data with Ground Truth Labels') axMap2 = subplot(1,2,2,'Color','black','Parent',hFig); axMap2.Position = [0.5,0.2,0.5,0.55]; pcshow(ptCloud.Location,estimatedLabels,'Parent',axMap2) axis off title(axMap2,'Aerial Lidar Data with Classified Labels')
Подтвердите классификацию путем вычисления общей точности на данном облаке точек наряду с точностью класса, пересечением по объединению (IoU), и взвесил IoU.
confusionMatrix = segmentationConfusionMatrix(estimatedLabels,double(grdTruthLabels)); ssm = evaluateSemanticSegmentation({confusionMatrix}, ... {'Ground' 'Vegetation' 'Building'},'Verbose',0); disp(ssm.DataSetMetrics)
GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU ______________ ____________ _______ ___________ 0.99762 0.99417 0.98168 0.99533
disp(ssm.ClassMetrics)
Accuracy IoU ________ _______ Ground 0.99996 0.99996 Vegetation 0.99195 0.9898 Building 0.99059 0.95526
readPointCloud
| segmentGroundSMRF
| pcnormals
| pcshow
| pcshowpair
| segmentationConfusionMatrix
| evaluateSemanticSegmentation
[1] Старр, Скотт. "Таскалуса, AL: сезонная динамика наплыва и бесхарактерные сообщества". Национальный центр бортового лазерного отображения, 1 декабря 2011. OpenTopography (https://doi.org/10.5069/G9SF2T3K)