Przejdź do głównej zawartości

Vision API Polski

Przegląd Rozwiązania

API Vision jest przeznaczone do zapewnienia kompleksowego rozwiązania dla zadań związanych z widzeniem komputerowym. Łączy ono przetwarzanie wstępne, inferencję, postprocessing i serwowanie w jednym żądaniu do endpointu. Wykorzystuje Triton jako źródło inferencji, w połączeniu z operacjami przetwarzania obrazu i wideo przyspieszonymi dzięki GPU . Do serwowania strumieni używa przyspieszonych przez GPU Serwerów Gstreamer.

Kluczowe funkcje:

  • Plik obrazu jako wejście, detekcja, przetworzony plik obrazu jako wyjście
  • Plik wideo jako wejście, detekcja, przetworzony plik wideo jako wyjście
  • Strumień jako wejście, detekcja, przetworzony strumień RTSP jako wyjście

Jak uruchomić

Ponieważ Triton jest źródłem inferencji, najpierw musisz upewnić się, że jest on skonfigurowany i włączony Triton.

uwaga

Na ten moment Vision API akceptuje tylko standardowe wyjście modelu detekcji - [x1, x2, y1, y2, score, class_1, class_2 ..], jeżeli z jakiegoś powodu twój model ma inny output, API do nie przyjmie.

API Vision jest dostępne jako zasób obliczeniowy i wymaga różnych zasobów w zależności od wybranych operacji przetwarzania i rozdzielczości źródła. Aplikacja zawsze wymaga GPU, które obsługuje operacje przetwarzania obrazu. Najlepszym wyborem będzie A5000. Na początek zalecamy 1,5 rdzenia CPU i 1,5 GB RAM na każde wideo/strumień, który będziesz przetwarzać. Te wartości mogą wzrosnąć, gdy dodasz operacje lub użyjesz źródeł o wyższej rozdzielczości.

Aby uruchomić instancję, użyj następującej komendy:

cgc compute create --name vision-api -c 8 -m 12 -g 1 -gt A5000 vision-api

Po inicjalizacji możesz uzyskać dostęp do Swagger, aby zobaczyć wszystkie endpointy pod adresem:

https://vision-api.<namespace>.cgc-waw-01.comtegra.cloud/docs

Jak używać

Każdy endpoint będzie wymagał od Ciebie przekazania tokenu aplikacji jako źródła autoryzacji. Jest to ten sam token aplikacji, który możesz zobaczyć przy użyciu:

cgc compute list -d

Jak napisano w Kluczowych funkcjach, istnieją 3 sposoby korzystania z Vision API w zależności od pożądanego wejścia i wyjścia. Pierwsze 2, w których możesz uzyskać plik jako wyjście, będą miały podobny sposób użycia.

Najpierw prześlij plik na /image/upload lub /video/upload i otrzymasz uuid, który reprezentuje źródło. Następnie możesz go uwzględnić w żądaniu do image/to-image lub video/to-video. Zwróć uwagę na treść żądania:

{
"source_file_uuid": "98ada9eb-daf6-4ee4-b4be-9fab7abdf619",
"tritonServer": {
"triton_url": "triton",
"infer_model_name": "yolov8n",
"version": "1"
},
"inference": {
"confidence_threshold": 0.25,
"iou_threshold": 0.45
},
"postprocess": {
"bbox": {
"apply": true,
"rectangle_color": "default",
"text_color": "default",
"rectangle_thickness": 2,
"text_size": 0.5,
"text_thickness": 2,
"include_text": false
},
"blur": {
"apply": false,
"blur_intensity": [99, 99]
},
"pose": {
"apply": true,
"keypoints": {
"apply": true,
"keypoint_color": [0, 165, 255],
"line_color": [
255,
165,
0
],
"radius": 5,
"line_thickness": 2
},
"pose_classifier": {
"apply": true,
"slope_threshold": 40,
"fall_detector": {
"apply": false,
"alert_threshold": 2
}
}
}
},
"output_format": "jpg"
}

Tutaj możesz wpisać otrzymane uuid i zmienić wszystko, co chcesz w inferencji i postprocessingu. Po wypełnieniu treści żądania, wyślij je i poczekaj. Gdy przetwarzanie się zakończy, otrzymasz plik zawierający przetworzony obraz lub wideo.

Dwa kolejne endpointy, które zwracają strumień RTSP, będą wymagały podobnego żądania, ale natychmiast zwrócą adres URL strumienia. Możesz go przechwycić, korzystając z tego adresu URL. Domyślnie strumień RTSP będzie dostępny tylko w Twojej przestrzeni nazw. Jeśli chcesz go zobaczyć na zewnętrznych maszynach, przejdź do sekcji Szczegółowe informacje.

Gdy nie potrzebujesz już strumienia, możesz go usunąć, przekazując stream_id do /stream/delete-stream.

Dostępny jest również endpoint informacyjny info/get-models, który pobiera modele dostępne na Triton z informacjami o nich.

Jeśli wolisz używać API nie przez Swagger, możesz wysyłać żądania w taki sposób:


curl -X 'POST' \
'https://<appname>.<namespace>.cgc-waw-01.comtegra.cloud/video/to-stream' \
-H 'accept: application/json' \
-H 'app-token: 8d23ae613a4e46119f4d52cb25e8b551' \
-H 'Content-Type: application/json' \
-d '{
"source_file_uuid": "ac839d89-14c7-4116-b5d8-30c34c714971",
"tritonServer": {
"triton_url": "triton",
...
}

Wstawiając token aplikacji w nagłówku i parametry w body.

Szczegółowe informacje

Opcjonalne parametry aplikacji

Dodatkowe opcjonalne parametry, które możesz przekazać do polecenia create w CLI:

  • MAX_STREAMS - maksymalna liczba strumieni, które mogą działać jednocześnie, domyślnie jest to liczba rdzeni CPU / 2.
  • BUFFER_SIZE - rozmiar buforów sieciowych używanych przez aplikację. Najlepiej ustawić go na rozmiar nie większy niż Twoje MTU. Domyślnie 9000.
  • GST_SERVERS - liczba serwerów Gstreamer. Domyślnie jest to MAX_STREAMS / 5. Jeśli Twoje źródło ma wyższą lub niższą rozdzielczość, możesz eksperymentować z tym parametrem, aby uzyskać optymalne zużycie zasobów.

Parametry żądania

Treść żądania ma kilka sekcji, zaczynając od sekcji Triton, gdzie musimy określić hosta Triton. W przypadku CGC, Triton postawiony w tym samym namespace będzie dostępny pod nazwą kontenera, na przykład: triton. Dodatkowo wybieramy model, którego chcemy użyć, jego wersję oraz triton_request_concurrency, który jest dostępny wyłącznie dla endpointu wideo i wskazuje, ile klientów będzie jednocześnie zapytaniać Triton. Jest to przykład parametru, który wpływa zarówno na czas wykonania zapytania, jak i zużycie zasobów, co należy wziąć pod uwagę.

Sekcja inferencji dotyczy typowych tematów dla inferencji modelu:

  • confidence threshold
  • intersection over union threshold

Sekcja postprocessingu dotyczy wszystkiego, co dzieje się po uzyskaniu wyników inferencji. Możemy wybrać nakładanie ramek w miejscach, gdzie model wykrył obiekty, rozmywanie tych obszarów lub użycie filtra Kalmana do poprawy ciągłości detekcji.

Estymację pozy można skonfigurować przez ustawienie pose na true podczas używania modeli "Pose". Sekcja estymacji pozy zawiera dwie kluczowe opcje:

  • keypoints: Ta opcja, domyślnie włączona, rysuje punkty kluczowe reprezentujące stawy ludzkie.
  • pose_classifier: Ta opcja umożliwia klasyfikację pozy, takiej jak stojący ("Standing") lub leżący ("Laying"). Dodatkowo w tej sekcji można włączyć funkcję wykrywania upadków (fall_detector), która wyświetli alert na ekranie, jeśli zostanie wykryty upadek.
uwaga

Podczas korzystania z modeli do estymacji pozycji, należy ustawić parametr pose na true, aby zapewnić prawidłowe działanie.

Obecnie funkcja estymacji pozy obsługuje tylko modele YOLO-pose z 17 punktami kluczowymi w formacie COCO.

Każda opcja ma swoje podopcje, które modyfikują ich zachowanie. Ponownie, ważne jest, aby pamiętać, że im więcej postprocessingu dodamy, tym dłużej potrwa zapytanie i tym więcej zasobów zostanie zużytych. Wszystkie opcje poza ramkami są domyślnie wyłączone. W przypadku kolorów, domyślna opcja - "default" oznacza, że każda wykryta klasa będzie miała przypisany inny losowy kolor. Jeśli chcesz użyć określonego koloru, możesz podać go w formie tablicy RGB - np.: [255, 0, 0], wtedy KAŻDA klasa będzie miała ten kolor. Może to być przydatne, gdy masz tylko jedną lub kilka klas.

Na koniec mamy format wyjścia. Obecnie zaimplementowany jest tylko jeden format, więc domyślne ustawienie nie powinno być zmieniane.

Strumienie RTSP

RTSP używa TCP do transportu, ale CGC nie zapewnia opcji otwarcia portu TCP z poziomu CLI. Jeśli chcesz zobaczyć strumień na zewnętrznych maszynach, będziesz musiał ręcznie dodać porty TCP.

uwaga

Every Gstreamer server uses separate TCP port. First one serves on 9001 and every another on the next one, so 9002, 9003, ... . You will need to add TCP port for every one of them. Każdy z serwerów Gstreamera uzywa oddzielnego portu. 1 serwuje strumienie na porcie 9001, a reszta na kolejnych - 9002. 9003 .... Będziesz musiał otworzyć port TCP dla każdego z nich.