Opisz gęstą chmurę punktów za pomocą SageMaker Ground Truth

Węzeł źródłowy: 834877

Autonomiczne pojazdy zwykle używają LiDAR czujniki do generowania trójwymiarowego zrozumienia środowiska wokół ich pojazdów. Na przykład montują czujnik LiDAR w swoich pojazdach, aby w sposób ciągły przechwytywać migawki z określonego punktu w czasie otaczającego środowiska 3D. Wyjście czujnika LiDAR to sekwencja klatek chmury punktów 3D (typowa szybkość przechwytywania wynosi 3 klatek na sekundę). Amazon SageMaker Ground Prawda ułatwia etykietowanie obiektów w pojedynczej ramce 3D lub w sekwencji ramek chmury punktów 3D w celu tworzenia zestawów danych szkoleniowych uczenia maszynowego (ML). Ground Truth obsługuje również fuzję czujnika danych z kamery i LiDAR z maksymalnie ośmioma wejściami kamer wideo.

W miarę jak czujniki LiDAR stają się bardziej dostępne i opłacalne, klienci coraz częściej używają danych z chmury punktów w nowych przestrzeniach, takich jak robotyka, mapowanie sygnałów i rzeczywistość rozszerzona. Niektóre nowe urządzenia mobilne zawierają nawet czujniki LiDAR, z których jeden dostarczył dane do tego postu! Rosnąca dostępność czujników LiDAR spowodowała wzrost zainteresowania danymi chmury punktów dla zadań ML, takich jak wykrywanie i śledzenie obiektów 3D, segmentacja 3D, synteza i rekonstrukcja obiektów 3D, a nawet wykorzystanie danych 3D do weryfikacji szacowania głębokości 2D.

Chociaż gęste dane chmury punktów są bogate w informacje (ponad 1 milion chmur punktów), etykietowanie jest trudne, ponieważ stacje robocze do etykietowania często mają ograniczoną pamięć, a możliwości graficzne i adnotatory są zwykle rozproszone geograficznie, co może zwiększyć opóźnienia. Chociaż duża liczba punktów może być renderowana na stacji roboczej etykieciarki, przepustowość etykieciarki może zostać zmniejszona ze względu na czas renderowania w przypadku wielomilionowych chmur punktów, co znacznie zwiększa koszty etykietowania i zmniejsza wydajność.

Sposobem na zmniejszenie tych kosztów i czasu jest przekształcenie zadań etykietowania chmury punktów w mniejsze, łatwiejsze do renderowania zadania, które zachowują większość oryginalnych informacji chmury punktów na potrzeby adnotacji. Mówimy ogólnie o tych podejściach jako próbkowanie w dół, podobny do próbkowanie w dół w dziedzinie przetwarzania sygnałów. Podobnie jak w dziedzinie przetwarzania sygnałów, metody próbkowania w dół chmury punktów mają na celu usunięcie punktów przy jednoczesnym zachowaniu wierności oryginalnej chmury punktów. Podczas opisywania chmur punktów próbkowanych w dół można użyć wyjściowego obrazu 3D prostopadłościany dla śledzenie obiektów i wykrywanie obiektów zadania bezpośrednio do szkolenia lub walidacji w pełnowymiarowej chmurze punktów z niewielkim lub zerowym wpływem na wydajność modelu, przy jednoczesnej oszczędności czasu na etykietowanie. W przypadku innych modalności, takich jak segmentacja semantyczna, w których każdy punkt ma własną etykietę, można użyć etykiet o zmniejszonej próbkowaniu, aby przewidzieć etykiety dla każdego punktu w oryginalnej chmurze punktów, umożliwiając kompromis między kosztem etykieciarki (a tym samym ilością oznaczonych danych) a niewielką ilością błędne klasyfikacje punktów w pełnowymiarowej chmurze punktów.

W tym poście omówimy, jak wykonać techniki próbkowania w dół, aby przygotować dane chmury punktów do etykietowania, a następnie pokażemy, jak zwiększyć próbkowanie etykiet wyjściowych, aby zastosować je do oryginalnego pełnowymiarowego zestawu danych, korzystając z wnioskowania w próbce za pomocą prostego modelu ML. Aby to osiągnąć, używamy Ground Truth i Instancje notatników Amazon SageMaker do wykonywania etykiet i wszystkich etapów przetwarzania wstępnego i końcowego.

Dane

Dane, których używamy w tym poście, to skan dachu budynku mieszkalnego wygenerowany za pomocą aplikacji 3D Scanner na iPhone12 Pro. Aplikacja umożliwia wykorzystanie wbudowanych skanerów LiDAR na urządzeniach mobilnych do przeskanowania danego obszaru i wyeksportowania pliku chmury punktów. W tym przypadku dane chmury punktów są w formacie xyzrgb, który jest akceptowanym formatem chmury punktów Ground Truth. Aby uzyskać więcej informacji na temat typów danych dozwolonych w chmurze punktów Ground Truth, zobacz Akceptowane surowe formaty danych 3D.

Poniższy obraz przedstawia nasz skan 3D.

Metody

Najpierw omówimy kilka podejść, aby zmniejszyć rozmiar zestawu danych do etykietowania chmur punktów: kafelkowanie, stała próbka krokowa i średnia woksela. Pokazujemy, dlaczego techniki próbkowania w dół mogą zwiększyć przepustowość etykietowania bez znaczącego obniżenia jakości adnotacji, a następnie pokazujemy, jak używać etykiet utworzonych w chmurze punktów o zmniejszonej próbkowaniu i stosować je do oryginalnej chmury punktów z podejściem upsamplingu.

Podejścia do próbkowania w dół

Próbkowanie w dół polega na pobraniu pełnowymiarowego zbioru danych i albo wybraniu podzbioru punktów z niego do etykietowania, albo utworzeniu reprezentatywnego zestawu nowych punktów, które niekoniecznie znajdują się w oryginalnym zbiorze danych, ale są wystarczająco blisko, aby umożliwić etykietowanie.

Dekarstwo

Jednym naiwnym podejściem jest rozbicie przestrzeni chmury punktów na kostki 3D, znane również jako woksele, z (na przykład) 500,000 XNUMX punktów, z których każdy jest oznaczony niezależnie i równolegle. To podejście, tzw Dachówka, skutecznie zmniejsza rozmiar sceny do etykietowania.

Może to jednak znacznie wydłużyć czas i koszty etykietowania, ponieważ typowa scena o rozdzielczości 8 milionów punktów może wymagać rozbicia na ponad 16 pod-scen. Duża liczba niezależnych zadań wynikających z tej metody oznacza, że ​​adnotator spędza więcej czasu na przełączaniu kontekstu między zadaniami, a pracownicy mogą stracić kontekst, gdy scena jest zbyt mała, co skutkuje nieprawidłowymi etykietami danych.

Naprawiono próbkę kroku

Alternatywnym podejściem jest wybranie lub utworzenie zredukowanej liczby punktów za pomocą liniowej podpróbki zwanej a naprawiono próbkę kroku. Załóżmy, że chcesz osiągnąć cel 500,000 XNUMX punktów (zauważyliśmy, że można to generalnie renderować na laptopie konsumenckim - patrz Zaakceptowany format nieprzetworzonych danych 3D), ale masz chmurę punktów z 10 milionami punktów. Możesz obliczyć rozmiar kroku jako step = 10,000,000 / 500,000 = 20. Po ustaleniu rozmiaru kroku możesz wybrać co dwudziesty punkt w zestawie danych, tworząc nową chmurę punktów. Jeśli dane chmury punktów mają wystarczająco dużą gęstość, osoby zajmujące się etykietowaniem powinny nadal być w stanie dostrzec wszelkie istotne funkcje do etykietowania, nawet jeśli w oryginalnej scenie może przypadać tylko 20 punkt na każde 1.

Wadą tego podejścia jest to, że nie wszystkie punkty wpływają na ostateczny wynik o zmniejszonej próbkowaniu, co oznacza, że ​​jeśli punkt jest jednym z kilku ważnych, ale nie jest częścią próbki, adnotatorzy mogą całkowicie pominąć tę funkcję.

Woksel oznacza

Alternatywną formą próbkowania w dół, która wykorzystuje wszystkie punkty do wygenerowania chmury punktów próbkowanej w dół, jest wykonanie filtrowanie siatki. Filtrowanie siatkowe oznacza, że ​​dzielisz przestrzeń wejściową na zwykłe kostki 3D (lub woksele) w chmurze punktów i zastępujesz wszystkie punkty w wokselu jednym reprezentatywnym punktem (na przykład średnim punktem). Poniższy diagram przedstawia przykładowy czerwony prostokąt woksela.

Jeśli w danym wokselu nie istnieją żadne punkty z wejściowego zestawu danych, żaden punkt nie jest dodawany do próbkowanej w dół chmury punktów dla tego woksela. Filtrowanie siatkowe różni się od stałej próbki krokowej, ponieważ można go użyć do redukcji szumów i dalszego dostrojenia przez dostosowanie rozmiaru jądra i funkcji uśredniania, aby uzyskać nieco inne końcowe chmury punktów. Poniższe chmury punktów przedstawiają wyniki prostego (próbka ze stałym krokiem) i zaawansowanego (średnia woksela) próbkowania w dół. Chmura punktów próbkowana w dół za pomocą metody zaawansowanej jest gładsza, co jest szczególnie widoczne przy porównaniu ściany z czerwonej cegły z tyłu obu scen.

Podejście Upsampling

Po zmniejszeniu próbkowania i oznaczeniu danych możesz chcieć zobaczyć etykiety utworzone na mniejszej, próbkowanej w dół chmury punktów rzutowanej na pełnowymiarową chmurę punktów, którą nazywamy upsampling. Zadania wykrywania lub śledzenia obiektów nie wymagają do tego przetwarzania końcowego. Etykiety w chmurze punktów o zmniejszonej próbkowaniu (jak prostopadłościany) są bezpośrednio stosowane do większej chmury punktów, ponieważ są zdefiniowane w globalnej przestrzeni współrzędnych współdzielonej przez pełnowymiarową chmurę punktów (x, y, z, wysokość, szerokość, długość). Etykiety te są w minimalnym stopniu podatne na bardzo małe błędy wzdłuż granic obiektów, gdy punkt granicy nie znajduje się w zbiorze danych o zmniejszonej próbkowaniu, ale takie sporadyczne i drobne błędy są przeważane przez liczbę dodatkowych, prawidłowo oznaczonych punktów w prostopadłościanie, które również mogą być przeszkolony.

Jednak w przypadku zadań segmentacji semantycznej chmury punktów 3D etykiety nie mają bezpośredniego zastosowania do pełnowymiarowego zestawu danych. Mamy tylko podzbiór etykiet, ale chcemy przewidzieć pozostałe etykiety pełnego zestawu danych na podstawie tego podzbioru. Aby to zrobić, możemy użyć prostego pliku Klasyfikator K-Nearest Neighbors (K-NN) z już oznaczonymi punktami służącymi jako zbiór uczący. K-NN jest prostym nadzorowanym algorytmem ML, który przewiduje etykietę punktu przy użyciu „K” najbliższych oznaczonych punktów i głosowania ważonego. Dzięki K-NN możemy przewidzieć klasę punktów pozostałych nieoznakowanych punktów w pełnowymiarowym zbiorze danych w oparciu o klasę większości trzech najbliższych (według odległości euklidesowej) punktów. Możemy dodatkowo udoskonalić to podejście, zmieniając hiperparametry klasyfikatora K-NN, takie jak liczba najbliższych punktów do rozważenia, a także metryka odległości i schemat ważenia punktów.

Po zmapowaniu przykładowych etykiet do pełnego zestawu danych można wizualizować kafelki w pełnowymiarowym zbiorze danych, aby zobaczyć, jak dobrze działała strategia upsamplowania.

Teraz, gdy przejrzeliśmy metody użyte w tym poście, demonstrujemy te techniki w notatniku SageMaker na przykładowej scenie chmury punktów segmentacji semantycznej.

Wymagania wstępne

Aby przejść przez to rozwiązanie, potrzebujesz:

  • An Konto AWS.
  • Notatnik AWS Zarządzanie tożsamością i dostępem (IAM) z uprawnieniami wymaganymi do ukończenia tego przewodnika. Twoja rola uprawnień musi mieć dołączone następujące zasady zarządzane przez AWS:
    • AmazonS3FullAccess
    • AmazonSageMakerFullAccess
  • An Usługa Amazon Simple Storage (Amazon S3) zasobnik, w którym przechowywane są artefakty notebooka (dane wejściowe i etykiety).
  • Zespół roboczy SageMaker. W tym poście korzystamy z prywatnego zespołu roboczego. Możesz stworzyć zespół roboczy na konsoli SageMaker.

Konfiguracja notebooka

Używamy notebooka ground_truth_annotation_dense_point_cloud_tutorial.ipynb Przykłady SageMaker sekcji instancji notebooka, aby zademonstrować te podejścia do próbkowania w dół i w górę. Ten notatnik zawiera cały kod wymagany do wykonywania wstępnego przetwarzania, etykietowania i przetwarzania końcowego.

Aby uzyskać dostęp do notatnika, wykonaj następujące czynności:

  1. Utwórz instancję notesu. Do uruchomienia instancji notebooka można użyć typu instancji ml.t2.xlarge. Wybierz instancję z co najmniej 16 GB pamięci RAM.
    1. Musisz użyć wcześnie utworzonej roli notesu. Ta rola umożliwia notebookowi przesłanie zbioru danych do Amazon S3 i wywołanie interfejsów API rozwiązania.
  2. Otwórz Jupyter Lab lub Jupyter, aby uzyskać dostęp do instancji notatnika.
  3. W Jupyter wybierz plik Przykłady SageMaker W Jupyter Lab wybierz ikonę SageMaker.
  4. Dodaj Praca w zakresie etykietowania prawdy naziemnej a następnie wybierz ipynb notatnik.
  5. Jeśli używasz Jupyter, wybierz Zastosowanie skopiuj notatnik do swojej instancji i uruchom go. Jeśli jesteś w laboratorium Jupyter, wybierz Utwórz kopię.

Zapewnij wejścia do notebooka

Najpierw modyfikujemy notatnik, aby dodać nasz prywatny zespół roboczy ARN i lokalizację wiadra, której używamy do przechowywania naszego zestawu danych, a także naszych etykiet.

Sekcja 1: Pobierz zestaw danych i zwizualizuj chmurę punktów

Pobieramy nasze dane, uruchamiając sekcję 1 naszego notebooka, która pobiera nasz zestaw danych z Amazon S3 i ładuje chmurę punktów do naszej instancji notebooka. Pobieramy niestandardowe dane z zasobnika należącego do AWS. Obiekt o nazwie rooftop_12_49_41.xyz powinien znajdować się w katalogu głównym zasobnika S3. Te dane to skan dachu budynku mieszkalnego wygenerowany na urządzeniu mobilnym. W tym przypadku dane chmury punktów są w formacie xyzrgb.

Możemy wizualizować naszą chmurę punktów za pomocą Matplotlib rozproszenie3d funkcjonować. Plik chmury punktów zawiera wszystkie poprawne punkty, ale nie jest prawidłowo obrócony. Możemy obracać obiekt wokół jego osi, mnożąc chmurę punktów przez macierz obrotu. Macierz rotacji możemy otrzymać za pomocą scipy i określ stopień zmian, jakie chcemy wprowadzić na każdej osi za pomocą from_euler metoda:

!aws s3 cp s3://smgt-downsampling-us-east-1-322552456788/rooftop_12_49_41.xyz pointcloud.xyz # Let's read our dataset into a numpy file pc = np.loadtxt("pointcloud.xyz", delimiter=",") print(f"Loaded points of shape {pc.shape}") # playing with view of 3D scene from scipy.spatial.transform import Rotation def plot_pointcloud(pc, rot = [[30,90,60]], color=True, title="Simple Downsampling 1", figsize=(50,25), verbose=False): if rot: rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() if verbose: print('Rotation matrix:','n',R1) # matrix multiplication between our rotation matrix and pointcloud pc_show = np.matmul(R1, pc.copy()[:,:3].transpose() ).transpose() if color: try: rot_color1 = np.matmul(R1, pc.copy()[:,3:].transpose() ).transpose().squeeze() except: rot_color1 = np.matmul(R1, np.tile(pc.copy()[:,3],(3,1))).transpose().squeeze() else: pc_show = pc fig = plt.figure( figsize=figsize) ax = fig.add_subplot(111, projection="3d") ax.set_title(title, fontdict={'fontsize':20}) if color: ax.scatter(pc_show[:,0], pc_show[:,1], pc_show[:,2], c=rot_color1[:,0], s=0.05) else: ax.scatter(pc_show[:,0], pc_show[:,1], pc_show[:,2], c='blue', s=0.05) # rotate in z direction 30 degrees, y direction 90 degrees, and x direction 60 degrees rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) print('Rotation matrix:','n', rot1.as_matrix()) plot_pointcloud(pc, rot = [[30,90,60]], color=True, title="Full pointcloud", figsize=(50,30)) 

Sekcja 2: Próbkowanie zbioru danych w dół

Następnie zmniejszamy zbiór danych do mniej niż 500,000 XNUMX punktów, co jest idealną liczbą punktów do wizualizacji i etykietowania. Aby uzyskać więcej informacji, zobacz Limity rozdzielczości chmury punktów in Akceptowane surowe formaty danych 3D. Następnie wykreślamy wyniki naszego downsamplingu, wykonując sekcję 2.

Jak omówiliśmy wcześniej, najprostszą formą próbkowania w dół jest wybranie wartości przy użyciu stałego rozmiaru kroku w oparciu o to, jak duża ma być nasza wynikowa chmura punktów.

Bardziej zaawansowanym podejściem jest podzielenie przestrzeni wejściowej na kostki, zwane inaczej wokselami, i wybranie jednego punktu na pudełko za pomocą funkcji uśredniania. Poniższy kod przedstawia prostą implementację tego rozwiązania.

Możesz dostroić docelową liczbę punktów i rozmiar ramki, aby zobaczyć zmniejszenie przejrzystości chmury punktów, gdy wykonywane jest bardziej agresywne próbkowanie w dół.

#Basic Approach target_num_pts = 500_000 subsample = int(np.ceil(len(pc) / target_num_pts)) pc_downsample_simple = pc[::subsample] print(f"We've subsampled to {len(pc_downsample_simple)} points") #Advanced Approach boxsize = 0.013 # 1.3 cm box size. mins = pc[:,:3].min(axis=0) maxes = pc[:,:3].max(axis=0) volume = maxes - mins num_boxes_per_axis = np.ceil(volume / boxsize).astype('int32').tolist() num_boxes_per_axis.extend([1]) print(num_boxes_per_axis) # For each voxel or "box", use the mean of the box to chose which points are in the box. means, _, _ = scipy.stats.binned_statistic_dd( pc[:,:4], [pc[:,0], pc[:,1], pc[:,2], pc[:,3]], statistic="mean", bins=num_boxes_per_axis, ) x_means = means[0,~np.isnan(means[0])].flatten() y_means = means[1,~np.isnan(means[1])].flatten() z_means = means[2,~np.isnan(means[2])].flatten() c_means = means[3,~np.isnan(means[3])].flatten() pc_downsample_adv = np.column_stack([x_means, y_means, z_means, c_means]) print(pc_downsample_adv.shape) 

Sekcja 3: Wizualizacja renderowania 3D

Możemy wizualizować chmury punktów za pomocą trójwymiarowego wykresu punktowego punktów. Chociaż nasze chmury punktów mają kolor, nasze transformacje mają różny wpływ na kolor, więc porównanie ich w jednym kolorze zapewnia lepsze porównanie. Widzimy, że zaawansowana metoda średniej wokseli tworzy gładszą chmurę punktów, ponieważ uśrednianie ma wpływ na redukcję szumów. W poniższym kodzie możemy spojrzeć na nasze chmury punktów z dwóch oddzielnych perspektyw, mnożąc chmury punktów przez różne macierze rotacji.

Po uruchomieniu sekcji 3 w notatniku zobaczysz również porównanie podejścia liniowego krokowego z podejściem siatki skrzynkowej, w szczególności w odniesieniu do tego, w jaki sposób filtr siatki pudełkowej ma niewielki wpływ na wygładzanie ogólnej chmury punktów. To wygładzanie może być ważne w zależności od poziomu szumów w zestawie danych. Modyfikacja funkcji filtrowania siatki od średniej do mediany lub innej funkcji uśredniającej może również poprawić ostateczną klarowność chmury punktów. Przyjrzyj się uważnie tylnej ścianie prostych (stały rozmiar kroku) i zaawansowanych (średnia woksela) próbkowanych w dół, zwróć uwagę na efekt wygładzania metody średniej wokseli w porównaniu z metodą ze stałą wielkością kroku.

rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() simple_rot1 = pc_downsample_simple.copy() simple_rot1 = np.matmul(R1, simple_rot1[:,:3].transpose() ).transpose() advanced_rot1 = pc_downsample_adv.copy() advanced_rot1 = np.matmul(R1, advanced_rot1[:,:3].transpose() ).transpose() fig = plt.figure( figsize=(50, 30)) ax = fig.add_subplot(121, projection="3d") ax.set_title("Simple Downsampling 1", fontdict={'fontsize':20}) ax.scatter(simple_rot1[:,0], simple_rot1[:,1], simple_rot1[:,2], c='blue', s=0.05) ax = fig.add_subplot(122, projection="3d") ax.set_title("Voxel Mean Downsampling 1", fontdict={'fontsize':20}) ax.scatter(advanced_rot1[:,0], advanced_rot1[:,1], advanced_rot1[:,2], c='blue', s=0.05) # to look at any of the individual pointclouds or rotate the pointcloud, use the following function plot_pointcloud(pc_downsample_adv, rot = [[30,90,60]], color=True, title="Advanced Downsampling", figsize=(50,30)) 

Sekcja 4: Uruchom zadanie segmentacji semantycznej

Uruchom sekcję 4 w notatniku, aby pobrać tę chmurę punktów i za jej pomocą uruchomić zadanie etykietowania semantycznej segmentacji chmury punktów Ground Truth. Te komórki generują wymagany wejściowy plik manifestu i formatują chmurę punktów w reprezentacji zgodnej z Ground Truth.

Aby dowiedzieć się więcej o formacie wejściowym Ground Truth w odniesieniu do danych chmury punktów, zobacz Dane wejściowe i Akceptowane surowe formaty danych 3D.

W tej sekcji wykonujemy również etykietowanie w portalu pracownika. Oznaczamy podzbiór chmury punktów, aby mieć pewne adnotacje do wykonania upsamplingu. Po zakończeniu zadania ładujemy adnotacje z Amazon S3 do tablicy NumPy w celu dalszego przetwarzania. Poniżej znajduje się zrzut ekranu z narzędzia segmentacji semantycznej chmury punktów Ground Truth.

Sekcja 5: Wykonaj upsampling etykiet

Teraz, gdy mamy obniżone próbki etykiet, trenujemy klasyfikator K-NN od SKLearn, aby przewidywać etykiety pełnego zestawu danych, traktując nasze punkty z adnotacjami jako dane szkoleniowe i wykonując wnioskowanie na pozostałych nieoznakowanych punktach w naszej pełnowymiarowej chmurze punktów.

Możesz dostroić liczbę użytych punktów, a także metrykę odległości i schemat ważenia, aby wpłynąć na sposób przeprowadzania wnioskowania o etykietach. Jeśli oznaczysz kilka kafelków w pełnowymiarowym zbiorze danych, możesz użyć tych oznaczonych kafelków jako prawdy o gruncie, aby ocenić dokładność prognoz K-NN. Następnie można użyć tej miary dokładności do strojenia hiperparametrów K-NN lub wypróbować różne algorytmy wnioskowania w celu zmniejszenia liczby błędnie sklasyfikowanych punktów między granicami obiektów, co skutkuje najniższym możliwym współczynnikiem błędów w próbce. Zobacz poniższy kod:

# There's a lot of possibility to tune KNN further # 1) Prevent classification of points far away from all other points (random unfiltered ground point) # 2) Perform a non-uniform weighted vote # 3) Tweak number of neighbors knn = KNeighborsClassifier(n_neighbors=3) print(f"Training on {len(pc_downsample_adv)} labeled points") knn.fit(pc_downsample_adv[:,:3], annotations) print(f"Upsampled to {len(pc)} labeled points") annotations_full = knn.predict(pc[:,:3]) 

Sekcja 6: Wizualizacja upsamplowanych etykiet

Teraz, gdy wykonaliśmy upsamplowanie naszych oznaczonych danych, możemy zwizualizować kafelek oryginalnej, pełnowymiarowej chmury punktów. Nie renderujemy całej chmury punktów w pełnym rozmiarze, ponieważ może to uniemożliwić renderowanie naszego narzędzia do wizualizacji. Zobacz poniższy kod:

pc_downsample_annotated = np.column_stack((pc_downsample_adv[:,:3], annotations)) pc_annotated = np.column_stack((pc[:,:3], annotations_full)) labeled_area = pc_downsample_annotated[pc_downsample_annotated[:,3] != 255] min_bounds = np.min(labeled_area, axis=0) max_bounds = np.max(labeled_area, axis=0) min_bounds = [-2, -2, -4.5, -1] max_bounds = [2, 2, -1, 256] def extract_tile(point_cloud, min_bounds, max_bounds): return point_cloud[ (point_cloud[:,0] > min_bounds[0]) & (point_cloud[:,1] > min_bounds[1]) & (point_cloud[:,2] > min_bounds[2]) & (point_cloud[:,0] < max_bounds[0]) & (point_cloud[:,1] < max_bounds[1]) & (point_cloud[:,2] < max_bounds[2]) ] tile_downsample_annotated = extract_tile(pc_downsample_annotated, min_bounds, max_bounds) tile_annotated = extract_tile(pc_annotated, min_bounds, max_bounds) rot1 = Rotation.from_euler('zyx', [[30,90,60]], degrees=True) R1 = rot1.as_matrix() down_rot = tile_downsample_annotated.copy() down_rot = np.matmul(R1, down_rot[:,:3].transpose() ).transpose() down_rot_color = np.matmul(R1, np.tile(tile_downsample_annotated.copy()[:,3],(3,1))).transpose().squeeze() full_rot = tile_annotated.copy() full_rot = np.matmul(R1, full_rot[:,:3].transpose() ).transpose() full_rot_color = np.matmul(R1, np.tile(tile_annotated.copy()[:,3],(3,1))).transpose().squeeze() fig = plt.figure(figsize=(50, 20)) ax = fig.add_subplot(121, projection="3d") ax.set_title("Downsampled Annotations", fontdict={'fontsize':20}) ax.scatter(down_rot[:,0], down_rot[:,1], down_rot[:,2], c=down_rot_color[:,0], s=0.05) ax = fig.add_subplot(122, projection="3d") ax.set_title("Upsampled Annotations", fontdict={'fontsize':20}) ax.scatter(full_rot[:,0], full_rot[:,1], full_rot[:,2], c=full_rot_color[:,0], s=0.05) 

Ponieważ nasz zbiór danych jest gęsty, możemy zwizualizować upsamplowane etykiety na kafelku, aby zobaczyć próbki z próbkowaniem w dół i upsamplowane do pełnowymiarowej chmury punktów. Chociaż wzdłuż regionów granicznych między obiektami może występować niewielka liczba błędnych klasyfikacji, w chmurze punktów o pełnym rozmiarze znajduje się o wiele więcej poprawnie oznakowanych punktów niż w początkowej chmurze punktów, co oznacza, że ​​ogólna dokładność ML może ulec poprawie.

Oczyszczanie

Instancja notebooka: masz dwie opcje, jeśli nie chcesz, aby utworzona instancja notatnika działała. Jeśli chcesz zachować go na później, możesz go zatrzymać, zamiast usuwać.

  • Do Zatrzymaj się instancja notatnika: kliknij plik Instancje notebooków łącze w lewym panelu strony głównej konsoli SageMaker. Następnie kliknij Stop link w kolumnie „Działania” po lewej stronie nazwy instancji notatnika. Po zatrzymaniu instancji notatnika możesz uruchomić ją ponownie, klikając plik Start połączyć. Pamiętaj, że jeśli go zatrzymasz, a nie usuniesz, zostanie naliczona opłata za związane z nim miejsce.
  • Do usunąć instancja notebooka: najpierw zatrzymaj ją zgodnie z powyższą instrukcją. Następnie kliknij przycisk opcji obok instancji notatnika, a następnie wybierz Usuń z Akcje rozwijane menu.

Wnioski

Próbkowanie chmur punktów w dół może być realną metodą podczas wstępnego przetwarzania danych w celu wykrywania obiektów i etykietowania śledzenia obiektów. Może obniżyć koszty etykietowania, jednocześnie generując wysokiej jakości etykiety wyjściowe, szczególnie w przypadku zadań związanych z wykrywaniem i śledzeniem obiektów 3D. W tym poście pokazaliśmy, jak metoda próbkowania w dół może wpłynąć na przejrzystość chmury punktów dla pracowników i pokazaliśmy kilka podejść, które mają kompromisy oparte na poziomie szumu zbioru danych.

Na koniec pokazaliśmy, że można wykonywać zadania segmentacji semantycznej chmury punktów 3D na próbkowanych w dół zbiorach danych i mapować etykiety na pełnowymiarową chmurę punktów za pomocą prognozowania w próbce. Osiągnęliśmy to, ucząc klasyfikator, aby przeprowadzał wnioskowanie na podstawie pozostałych punktów rozmiaru pełnego zestawu danych, używając już oznaczonych punktów jako danych szkoleniowych. Takie podejście umożliwia opłacalne etykietowanie bardzo gęstych scen chmur punktów przy jednoczesnym zachowaniu dobrej ogólnej jakości etykiet.

Przetestować ten notatnik z własnymi scenami z gęstymi chmurami punktów w Ground Truth, wypróbuj nowe techniki próbkowania w dół, a nawet wypróbuj nowe modele poza K-NN do ostatecznej prognozy w próbce, aby sprawdzić, czy techniki próbkowania w dół i w górę mogą obniżyć koszty etykietowania.


O autorach

 Widja Sagar Rawipati jest architektem Deep Learning w Laboratorium rozwiązań Amazon ML, gdzie wykorzystuje swoje bogate doświadczenie w wielkoskalowych systemach rozproszonych i swoją pasję do uczenia maszynowego, aby pomóc klientom AWS z różnych branż w przyspieszeniu wdrażania sztucznej inteligencji i chmury. Wcześniej był inżynierem uczenia maszynowego w Connectivity Services w Amazon, który pomagał budować platformy do personalizacji i konserwacji predykcyjnej.

Izaak Privitera jest architektem rozwiązań specjalizującym się w uczeniu maszynowym i pomaga klientom projektować i budować rozwiązania wizyjne klasy korporacyjnej w AWS. Isaac ma doświadczenie w wykorzystywaniu uczenia maszynowego i przyspieszonych obliczeń do przetwarzania obrazu i analizy sygnałów. Isaac lubi także gotować, wędrować i śledzić najnowsze postępy w uczeniu maszynowym w wolnym czasie.

Jeremiego Feltracco jest inżynierem ds. rozwoju oprogramowania w Amazon ML Solutions Lab w Amazon Web Services. Wykorzystuje swoje doświadczenie w dziedzinie widzenia komputerowego, robotyki i uczenia maszynowego, aby pomóc klientom AWS przyspieszyć wdrażanie sztucznej inteligencji.

Źródło: https://aws.amazon.com/blogs/machine-learning/annotate-dense-point-cloud-data-using-sagemaker-ground-truth/

Znak czasu:

Więcej z Blog dotyczący uczenia maszynowego AWS