Datasets documentation
Derinlik tahmini
Derinlik tahmini
Derinlik tahmini veri setleri, bir modelin görüntüdeki her pikselin kameraya göre yaklaşık uzaklığını, yani derinliğini tahmin etmesini sağlamak için kullanılır. Bu veri setlerinin mümkün kıldığı uygulamalar, görsel makine algılama ve robotikte algılama gibi alanlarda yoğunlaşır. Örnek uygulamalar arasında otonom araçlar için sokak haritalama yer alır. Bu kılavuz, bir derinlik tahmini veri setine dönüştürme uygulamayı gösterir.
Başlamadan önce, albumentations'ın güncel sürümlerinin yüklü olduğundan emin olun:
pip install -U albumentations
Albumentations, bilgisayar görüşü için veri artırma işlemlerini gerçekleştirmek üzere geliştirilmiş bir Python kütüphanesidir. Görsel sınıflandırma, nesne algılama, segmentasyon ve anahtar nokta tahmini gibi çeşitli bilgisayar görüşü görevlerini destekler.
Bu kılavuz, çeşitli iç mekan sahnelerinden, RGB ve derinlik kameralarıyla kaydedilen video dizilerinden oluşan NYU Depth V2 veri setini kullanır. Veri seti 3 şehrin sahnelerini içerir ve görüntüleri, etiket olarak derinlik haritalarıyla birlikte sağlar.
Veri setinin train bölümünü yükleyin ve bir örneğe göz atın:
>>> from datasets import load_dataset
>>> train_dataset = load_dataset("sayakpaul/nyu_depth_v2", split="train")
>>> index = 17
>>> example = train_dataset[index]
>>> example
{'image': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=640x480>,
'depth_map': <PIL.TiffImagePlugin.TiffImageFile image mode=F size=640x480>}Veri setinin iki alanı vardır:
image:uint8veri türüne sahip bir PIL PNG görüntü nesnesi.depth_map:float32veri türüne sahip, görüntünün derinlik haritası olan bir PIL Tiff görüntü nesnesi.
Burada derinlik haritaları, float32 verileri de dahil olmak üzere geniş bir veri tipi yelpazesini desteklediği için TIFF formatında kullanılmaktadır.
Ancak JPEG/PNG formatının yalnızca uint8 veya uint16 verilerini saklayabildiği not edilmelidir.
Dolayısıyla JPEG/PNG olarak kaydedilmiş derinlik haritalarınız varsa, bunları normal derinlik haritaları gibi tek kanallı float32 olarak yüklemek için Image(mode="F") tipini kullanın:
>>> from datasets import Image
>>> train_dataset = train_dataset.cast_column("depth_map", Image(mode="F"))Ardından, bir görüntüyü şu komutla inceleyin:
>>> example["image"]
Derinlik haritasına bakmadan önce, PIL'in float32 görüntülerini görüntüleyememesi nedeniyle veri türünü .convert('RGB') kullanarak uint8'e dönüştürmemiz gerekir. Şimdi ilgili derinlik haritasına bir göz atın:
>>> example["depth_map"].convert("RGB")
Hepsi siyah! Doğru bir şekilde görselleştirmek için derinlik haritasına renk eklemeniz gerekecek. Bunu yapmak için, plt.imshow() kullanarak görüntüleme sırasında otomatik olarak renk uygulayabilir veya plt.cm kullanarak renkli bir derinlik haritası oluşturup ardından görüntüleyebilirsiniz. Bu örnekte, renkli derinlik haritasını daha sonra kaydedebileceğimiz/yazabileceğimiz için ikincisini kullandık. (Aşağıdaki yardımcı, FastDepth deposundan alınmıştır).
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> cmap = plt.cm.viridis
>>> def colored_depthmap(depth, d_min=None, d_max=None):
... if d_min is None:
... d_min = np.min(depth)
... if d_max is None:
... d_max = np.max(depth)
... depth_relative = (depth - d_min) / (d_max - d_min)
... return 255 * cmap(depth_relative)[:,:,:3]
>>> def show_depthmap(depth_map):
... if not isinstance(depth_map, np.ndarray):
... depth_map = np.array(depth_map)
... if depth_map.ndim == 3:
... depth_map = depth_map.squeeze()
... d_min = np.min(depth_map)
... d_max = np.max(depth_map)
... depth_map = colored_depthmap(depth_map, d_min, d_max)
... plt.imshow(depth_map.astype("uint8"))
... plt.axis("off")
... plt.show()
>>> show_depthmap(example["depth_map"])
Ayrıca, birkaç farklı görüntüyü ve bunlara karşılık gelen derinlik haritalarını da görselleştirebilirsiniz.
>>> def merge_into_row(input_image, depth_target):
... if not isinstance(input_image, np.ndarray):
... input_image = np.array(input_image)
...
... d_min = np.min(depth_target)
... d_max = np.max(depth_target)
... depth_target_col = colored_depthmap(depth_target, d_min, d_max)
... img_merge = np.hstack([input_image, depth_target_col])
...
... return img_merge
>>> random_indices = np.random.choice(len(train_dataset), 9).tolist()
>>> plt.figure(figsize=(15, 6))
>>> for i, idx in enumerate(random_indices):
... example = train_dataset[idx]
... ax = plt.subplot(3, 3, i + 1)
... image_viz = merge_into_row(
... example["image"], example["depth_map"]
... )
... plt.imshow(image_viz.astype("uint8"))
... plt.axis("off")
Şimdi albumentations ile bazı artırma işlemleri uygulayın. Artırma dönüşümleri şunları içerir:
- Rastgele yatay çevirme
- Rastgele kırpma
- Rastgele parlaklık ve kontrast
- Rastgele gama düzeltmesi
- Rastgele ton doygunluğu
>>> import albumentations as A
>>> crop_size = (448, 576)
>>> transforms = [
... A.HorizontalFlip(p=0.5),
... A.RandomCrop(crop_size[0], crop_size[1]),
... A.RandomBrightnessContrast(),
... A.RandomGamma(),
... A.HueSaturationValue()
... ]Ayrıca, hedef anahtar adını daha iyi yansıtacak bir eşleme tanımlayın.
>>> additional_targets = {"depth": "mask"}
>>> aug = A.Compose(transforms=transforms, additional_targets=additional_targets)additional_targets tanımlandığında, mask yerine hedef derinlik haritalarını aug'in depth argümanına iletebilirsiniz. Bu değişikliği aşağıda tanımlanan apply_transforms() fonksiyonunda göreceksiniz.
Görsellerin ve derinlik haritalarının üzerine dönüştürmeyi uygulamak için bir fonksiyon oluşturun:
>>> def apply_transforms(examples):
... transformed_images, transformed_maps = [], []
... for image, depth_map in zip(examples["image"], examples["depth_map"]):
... image, depth_map = np.array(image), np.array(depth_map)
... transformed = aug(image=image, depth=depth_map)
... transformed_images.append(transformed["image"])
... transformed_maps.append(transformed["depth"])
...
... examples["pixel_values"] = transformed_images
... examples["labels"] = transformed_maps
... return examplesDizinin toplu verilerine (batch) dönüşümü anlık olarak uygulamak ve daha az disk alanı tüketmek için set_transform() fonksiyonunu kullanın:
>>> train_dataset.set_transform(apply_transforms)Dönüşümün çalıştığını, örnek bir görüntünün pixel_values ve labels değerlerine indeksleyerek doğrulayabilirsiniz:
>>> example = train_dataset[index]
>>> plt.imshow(example["pixel_values"])
>>> plt.axis("off")
>>> plt.show()
Görüntünün derinlik haritasındaki aynı dönüşümü görselleştirin:
>>> show_depthmap(example["labels"])
Önceki random_indices'yi yeniden kullanarak birden fazla eğitim örneğini de görselleştirebilirsiniz:
>>> plt.figure(figsize=(15, 6))
>>> for i, idx in enumerate(random_indices):
... ax = plt.subplot(3, 3, i + 1)
... example = train_dataset[idx]
... image_viz = merge_into_row(
... example["pixel_values"], example["labels"]
... )
... plt.imshow(image_viz.astype("uint8"))
... plt.axis("off")