NVIDIA Holoscan SDK'da OpenCV ile Sıfır Kopyalı Yapay Zeka Sensör İşleme Hattı Oluşturun

3


NVIDIA Holoscan geliştiricilere uçtan uca sensör işleme hattını oluşturmaları için temel sağlayan, NVIDIA etki alanından bağımsız, çok modlu, gerçek zamanlı yapay zeka sensör işleme platformudur. NVIDIA Holoscan SDK'nın özellikleri şunları içerir:

  • Düşük gecikmeli sensör ve ağ bağlantısı için birleşik donanım sistemleri
  • Veri işleme ve yapay zeka için optimize edilmiş kitaplıklar
  • Esnek dağıtım: uç veya bulut
  • Python ve C++ gibi çeşitli programlama dilleri

Holoscan SDK, tıbbi cihazlar, uçta yüksek performanslı bilgi işlem ve endüstriyel denetim dahil olmak üzere çeşitli endüstriler ve kullanım durumları için akışlı yapay zeka ardışık düzenleri oluşturmak için kullanılabilir. Daha fazla bilgi için bkz. NVIDIA Holoscan ile Üretime Hazır Yapay Zeka Sensör İşleme Uygulamaları Geliştirme.

Holoscan SDK, yazılım ve donanımdan yararlanarak yapay zeka uygulamalarının akışını hızlandırır. İle işbirliği yapabilir RDMA teknolojisi GPU hızlandırmayla uçtan uca işlem hattı performansını daha da geliştirmek. Uçtan uca sensör işleme hattı tipik olarak şunları içerir:

  • Sensör veri girişi
  • Hızlandırılmış bilgi işlem ve yapay zeka çıkarımı
  • Gerçek zamanlı görselleştirme, çalıştırma ve veri akışı çıkışı

Bu işlem hattındaki tüm veriler GPU belleğinde depolanır ve ana cihazdan bellek aktarımı olmadan Holoscan yerel operatörleri tarafından doğrudan erişilebilir.

İş akışı, VideoStreamReplayOp -> uint8'den float32'ye Format Dönüştürme ile giriş kaynağı dahil olmak üzere Ultrason Segmentasyon uygulaması için tipik bir ardışık düzen gösterir ve görüntüyü FormatConverterOp -> InferenceOp -> SegmentationPostprocessorOP -> HolovizIo aracılığıyla görselleştirme aracılığıyla çıkarım sonuçlarında yeniden boyutlandırma aracılığıyla yeniden boyutlandırır.” class=”wp-image-83126″  data-srcset=”https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline.png 1600w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-300×35.png 300w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-625×74.png 625w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-179×21.png 179w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-768×91.png 768w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-1536×181.png 1536w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-645×76.png 645w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-500×59.png 500w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-160×19.png 160w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-362×43.png 362w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-931×110.png 931w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/ultrasound-segmentation-app-pipeline-1024×121.png 1024w” sizes=”(max-width: 1600px) 100vw, 1600px”/><figcaption class=Şekil 1. Ultrason segmentasyonu uygulaması için tipik bir boru hattı

Bu gönderide, Holoscan SDK'yı ve açık kaynak kitaplığı OpenCV'yi entegre ederek ek bellek aktarımı olmadan uçtan uca GPU ile hızlandırılmış iş akışlarının nasıl elde edileceği açıklanmaktadır.

OpenCV nedir?

OpenCV (Açık Kaynak Bilgisayarlı Görme Kitaplığı), Görüntü ve Video İşleme, Nesne ve Yüz Algılama ve OpenCV Derin Öğrenme Modülü dahil olmak üzere 2.500'den fazla algoritma içeren kapsamlı bir açık kaynaklı bilgisayarlı görme kitaplığıdır.

OpenCV GPU hızlandırmayı desteklerCUDA hesaplama yeteneklerini kullanmak için bir dizi sınıf ve işlev sağlayan bir CUDA modülü içerir. NVIDIA CUDA Çalışma Zamanı API'si kullanılarak uygulanır ve yardımcı işlevler, düşük seviyeli görme temelleri ve yüksek seviyeli algoritmalar sağlar.

OpenCV'de sağlanan kapsamlı GPU hızlandırmalı algoritmalar ve operatörler sayesinde geliştiriciler, Holoscan SDK'yı temel alan daha karmaşık işlem hatlarını uygulayabilirler (Şekil 2).

İş akışı, OpenCV ve Holoscan SDK ile entegre olan ultrason segmentasyonu uygulamasına yönelik geliştirilmiş bir işlem hattını göstermektedir.  VideoStreamReplayOp ile giriş kaynağı dahil -> uint8'den float32'ye Format Dönüştürme ve FormatConverterOp aracılığıyla görüntüyü yeniden boyutlandırın -> OpenCV ile ön işleme -> InferenceOp -> SegmentationPostprocessorOP aracılığıyla çıkarım sonuçlarında sonradan işleme -> HolovizOp aracılığıyla görselleştirme.” class=”wp-image-83131″  data-srcset=”https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk.png 1600w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-300×73.png 300w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-625×152.png 625w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-179×44.png 179w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-768×187.png 768w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-1536×374.png 1536w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-645×157.png 645w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-500×122.png 500w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-160×39.png 160w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-362×88.png 362w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-451×110.png 451w, https://developer-blogs.nvidia.com/wp-content/uploads/2024/05/enhanced-pipeline-ultrasound-segmentation-opencv-holoscan-sdk-1024×250.png 1024w” sizes=”(max-width: 1600px) 100vw, 1600px”/><figcaption class=şekil 2. OpenCV ve Holoscan SDK'ya dayalı ultrason segmentasyonu için geliştirilmiş işlem hattı

OpenCV operatörlerini Holoscan SDK hattına entegre edin

OpenCV operatörlerini Holoscan SDK hattına entegre etmeye başlamak için aşağıdakilere ihtiyacınız vardır:

  • OpenCV >= 4.8.0
  • Holoscan SDK'sı >= v0.6

OpenCV'yi CUDA modülüyle kurmak için şu adreste bulunan kılavuzu izleyin: opencv/opencv_contrib. Holoscan SDK ve OpenCV CUDA ile bir görüntü oluşturmak için bkz. nvidia-holoscan/holohub Docker dosyası.

Holoscan SDK içerisinde veri türü olarak görev yapan Tensor, tek bir veri türünün çok boyutlu öğeleri dizisi olarak tanımlanır. Tensor sınıfı, etrafını saran bir sarmalayıcıdır. DLManagedTensorCtx DLManagedTensor nesnesini tutan yapı. Tensor sınıfı hem DLPack'i hem de NumPy dizi arayüzünü destekler (__array_interface__ Ve __cuda_array_interface__) böylece diğer Python kütüphaneleriyle birlikte kullanılabilir.CuPy,PyTorch,JAX,TensorFlowVeNumba.

Ancak OpenCV'nin veri türü GPUMather ikisini de uygulamayan __cuda_array_interface__ ne de standart DLPack. Uçtan uca GPU ile hızlandırılmış işlem hattına veya uygulamaya ulaşmak, GpuMat'ı CuPy dizisine dönüştürmek için iki işlevin uygulanmasını gerektirir; buna doğrudan Holoscan Tensor ile erişilebilir veya tam tersi de mümkündür.

GpuMat'tan CuPy dizisine kusursuz sıfır kopyalama

OpenCV Python bağlamalarının GpuMat nesnesi şunları sağlar: cudaPtr Bir GpuMat nesnesinin GPU bellek adresine erişmek için kullanılabilecek yöntem. Bu bellek işaretçisi, bir CuPy dizisini doğrudan başlatmak için kullanılabilir ve ana bilgisayar ile aygıt arasındaki gereksiz veri aktarımlarını önleyerek verimli veri işlemeyi mümkün kılar.

Aşağıdaki fonksiyon GpuMat'tan bir CuPy dizisi oluşturmak için kullanılır. Kaynak kodu şurada verilmiştir: HoloHub Endoskopi Derinlik Tahmini uygulaması.

import cv2 
import cupy as cp 
 
def gpumat_to_cupy(gpu_mat: cv2.cuda.GpuMat) -> cp.ndarray: 
    w, h = gpu_mat.size() 
    size_in_bytes = gpu_mat.step * w 
    shapes = (h, w, gpu_mat.channels()) 
    assert gpu_mat.channels() <=3, "Unsupported GpuMat channels" 
 
    dtype = None 
    if gpu_mat.type() in [cv2.CV_8U,cv2.CV_8UC1,cv2.CV_8UC2,cv2.CV_8UC3]: 
        dtype = cp.uint8 
    elif gpu_mat.type() == cv2.CV_8S: 
        dtype = cp.int8 
    elif gpu_mat.type() == cv2.CV_16U: 
        dtype = cp.uint16 
    elif gpu_mat.type() == cv2.CV_16S: 
        dtype = cp.int16 
    elif gpu_mat.type() == cv2.CV_32S: 
        dtype = cp.int32 
    elif gpu_mat.type() == cv2.CV_32F: 
        dtype = cp.float32 
    elif gpu_mat.type() == cv2.CV_64F: 
        dtype = cp.float64  
 
assert dtype is not None, "Unsupported GpuMat type" 
     
    mem = cp.cuda.UnownedMemory(gpu_mat.cudaPtr(), size_in_bytes, owner=gpu_mat) 
    memptr = cp.cuda.MemoryPointer(mem, offset=0) 
    cp_out = cp.ndarray( 
    	shapes, 
    	dtype=dtype, 
    	memptr=memptr, 
    	strides=(gpu_mat.step, gpu_mat.elemSize(), gpu_mat.elemSize1()), 
	) 
    return cp_out

kullandığımızı unutmayın. Sahipsiz Bellek Bu işlevde CuPy dizisini oluşturmak için API. Bazı durumlarda OpenCV operatörleri, CuPy tarafından işlenmesi gereken yeni bir cihaz belleği oluşturacaktır ve kullanım ömrü tek bir operatörle değil tüm işlem hattıyla sınırlı olacaktır. Bu durumda GpuMat'tan başlatılan CuPy dizisi sahibini tanır ve nesneye olan referansı saklar. Daha fazla ayrıntı için bkz. CuPy birlikte çalışabilirlik belgeleri.

Holoscan Tensor'dan GpuMat'a kusursuz sıfır kopyalama

OpenCV 4.8'in piyasaya sürülmesiyle birlikte OpenCV için Python bağlamaları artık GpuMat nesnelerinin doğrudan GPU bellek işaretçilerinden başlatılmasını destekliyor. Bu özellik, ana bilgisayar ile cihaz belleği arasındaki veri aktarımı ihtiyacını ortadan kaldırarak, GPU'da yerleşik verilerle doğrudan etkileşimi mümkün kılarak, daha verimli veri işleme ve işlemeyi kolaylaştırır.

Holoscan SDK'yı temel alan ardışık düzen uygulamalarında GPU bellek işaretçisi, __cuda_array_interface__ CuPy dizileri tarafından sağlanır. CuPy dizilerini kullanarak GpuMat nesneleri oluşturmak için aşağıda özetlenen işlevlere bakın. Ayrıntılı bir uygulama için, burada sağlanan kaynak koduna bakın. HoloHub Endoskopi Derinlik Tahmini uygulaması.

import cv2 
import cupy as cp 
 
def gpumat_from_cp_array(arr: cp.ndarray) -> cv2.cuda.GpuMat: 
    assert len(arr.shape) in (2, 3), "CuPy array must have 2 or 3 dimensions to be a valid GpuMat" 
    type_map = { 
        cp.dtype('uint8'): cv2.CV_8U, 
        cp.dtype('int8'): cv2.CV_8S, 
        cp.dtype('uint16'): cv2.CV_16U, 
        cp.dtype('int16'): cv2.CV_16S, 
        cp.dtype('int32'): cv2.CV_32S, 
        cp.dtype('float32'): cv2.CV_32F, 
        cp.dtype('float64'): cv2.CV_64F 
    } 
    depth = type_map.get(arr.dtype) 
    assert depth is not None, "Unsupported CuPy array dtype" 
    channels = 1 if len(arr.shape) == 2 else arr.shape[2] 
    mat_type = depth + ((channels - 1) << 3) 
     
 	mat = cv2.cuda.createGpuMatFromCudaMemory( 
  	arr.__cuda_array_interface__['shape'][1::-1],  
  	mat_type,  
  	arr.__cuda_array_interface__['data'][0] 
  ) 
    return mat

OpenCV operatörlerini entegre edin

Önceki iki işlevle herhangi birini kullanabilirsiniz. OpenCV-CUDA işlemi Holoscan SDK tabanlı bir işlem hattında bellek aktarımı olmadan. Aşağıdaki adımları kullanın:

  • OpenCV operatörünün çağrıldığı özelleştirilmiş bir operatör oluşturun. Ayrıntılar için bkz. Holoscan SDK örnek belgeleri.
  • Operatördeki hesaplama işlevinde:
    • Önceki operatörden mesajı alın ve Holoscan Tensöründen bir CuPy dizisi oluşturun.
    • Arama gpumat_from_cp_array GpuMat'ı oluşturmak için.
    • Özel OpenCV operatörünüzle işlem yapın.
    • Arama gpumat_to_cupy GpuMat'tan bir CuPy dizisi oluşturmak için.

Aşağıdaki gösteri koduna bakın. Kaynak kodunun tamamı için bkz. HoloHub Endoskopi Derinlik Tahmini uygulaması.

def compute(self, op_input, op_output, context): 
    	stream = cv2.cuda_Stream() 
    	message = op_input.receive("in") 
 
    	cp_frame = cp.asarray(message.get(""))  # CuPy array 
    	cv_frame = gpumat_from_cp_array(cp_frame)  # GPU OpenCV mat 
 
     	## Call OpenCV Operator  
    	cv_frame = cv2.cuda.XXX(hsv_merge, cv2.COLOR_HSV2RGB) 
 
    	cp_frame = gpumat_to_cupy(cv_frame) 
    	cp_frame = cp.ascontiguousarray(cp_frame) 
 
    	out_message = Entity(context) 
    	out_message.add(hs.as_tensor(cp_frame), "") 
    	op_output.emit(out_message, "out")

Özet

OpenCV CUDA operatörlerini Holoscan SDK üzerine kurulu uygulamalara dahil etmek, OpenCV GpuMat ve CuPy dizileri arasındaki dönüşümü kolaylaştıran iki fonksiyonun uygulanmasını gerektirir. Bu işlevler, özelleştirilmiş operatörler dahilinde Holoscan Tensörlerine doğrudan erişim sağlar. Bu işlevleri çağırarak, gelişmiş performans için bellek aktarımı olmadan uçtan uca GPU ile hızlandırılmış uygulamaları sorunsuz bir şekilde oluşturabilirsiniz.

Başlamak,Holoscan SDK 2.0'ı indirinve kontrol edinsürüm notları. NVIDIA Geliştirici forumlarında sorular sorun ve bilgi paylaşın.

Yardımcı NVIDIA'da diğer harici kitaplıkların Holoscan SDK hattına nasıl entegre edileceği hakkında daha fazla bilgi edinin HoloHub öğreticisi. Ayrıca şu adresteki örnek kod ve uygulamalardan da başlayabilirsiniz: nvidia-holoscan/holohubNVIDIA Holoscan AI sensör işleme topluluğunun merkezi deposu.

Kaynak: Nvidia

Doğrudan cihazınızda gerçek zamanlı güncellemeleri alın, şimdi abone olun.

Yorumlar