Классификация ландшафтов для воздушных данных о лидаре

Этот пример показывает вам, как сегментировать и классифицировать ландшафт на воздушные данные о лидаре как земля, создание и растительность. Пример использует файл 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')

Figure contains an axes object. The axes object with title Aerial Lidar Data with Ground Truth contains an object of type scatter.

Оснуйте классификацию

Основывайтесь классификация является шагом предварительной обработки, чтобы сегментировать облако точки ввода как землю и неземлю. Сегментируйте данные, загруженные из файла 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')

Figure contains an axes object. The axes object with title Classified Ground and Non-Ground Points contains 2 objects of type scatter.

Извлечение признаков

Извлеките функции из облака точек с помощью 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

Объекты

lasFileReader

Ссылки

[1] Старр, Скотт. "Таскалуса, AL: сезонная динамика наплыва и бесхарактерные сообщества". Национальный центр бортового лазерного отображения, 1 декабря 2011. OpenTopography (https://doi.org/10.5069/G9SF2T3K)