Datasets documentation
Video verilerini yükle
Video verilerini yükle
Video desteği deneyseldir ve değişikliklere tabidir.
Video veri kümeleri, torchcodec nesnelerini içeren Video türünde sütunlara sahiptir.
Video veri setleriyle çalışmak için
torchcodecveffmpegpaketlerinin yüklü olması gerekir. Bunların nasıl yükleneceğini öğrenmek için kurulum kılavuzuna göz atın.
Bir video veri seti yükleyip video sütununu çağırdığınızda, videolar torchcodec Videoları olarak çözümlenir:
>>> from datasets import load_dataset, Video
>>> dataset = load_dataset("path/to/video/folder", split="train")
>>> dataset[0]["video"]
<torchcodec.decoders._video_decoder.VideoDecoder object at 0x14a61d5a0>Video veri setine, veri setindeki tüm video nesnelerini oluşturmayı önlemek için önce satır indeksini, ardından
videosütununu kullanarak erişin -dataset[0]["video"]- . Aksi takdirde, büyük bir veri setiniz varsa bu, yavaş ve zaman alıcı bir süreç olabilir.
Herhangi bir tür veri setinin nasıl yükleneceğine dair bir kılavuz için genel yükleme kılavuzuna göz atın.
Çerçeveleri oku
VideoReader ile next() kullanarak bir videodan karelere doğrudan erişin:
>>> video = dataset[0]["video"]
>>> first_frame = video.get_frame_at(0)
>>> first_frame.data.shape
(3, 240, 320)
>>> first_frame.pts_seconds # timestamp
0.0Birden fazla çerçeveyi aynı anda almak için .get_frames_in_range(start: int, stop: int, step: int) çağrısını kullanabilirsiniz. Bu, bir çerçeve partisi döndürür.
Uzun bir çerçeve listesini verimli bir şekilde elde etmenin yolu budur; veriyi verimli bir şekilde erişmek için daha fazla işlevi görmek üzere torchcodec belgelerine başvurun:
>>> import torch
>>> frames = video.get_frames_in_range(0, 6, 1)
>>> frames.data.shape
torch.Size([5, 3, 240, 320])Belirli bir zaman aralığında oynatılan tüm karelere erişmek için .get_frames_played_in_range(start_seconds: float, stop_seconds: float) de mevcuttur.
>>> frames = video.get_frames_played_in_range(.5, 1.2)
>>> frames.data.shape
torch.Size([42, 3, 240, 320])Yerel dosyalar
Video yolundan bir veri seti yükleyebilirsiniz. Video dosya yollarını içeren bir sütunu kabul etmek için cast_column() fonksiyonunu kullanın ve onu Video özelliğiyle torchcodec videosuna dönüştürün:
>>> from datasets import Dataset, Video
>>> dataset = Dataset.from_dict({"video": ["path/to/video_1", "path/to/video_2", ..., "path/to/video_n"]}).cast_column("video", Video())
>>> dataset[0]["video"]
<torchcodec.decoders._video_decoder.VideoDecoder object at 0x14a61e080>Video nesnesini çözmek istemeden yalnızca video veri setinin altta yatan yolunu yüklemek istiyorsanız, Video özelliğinde decode=False olarak ayarlayın:
>>> dataset = dataset.cast_column("video", Video(decode=False))
>>> dataset[0]["video"]
{'bytes': None,
'path': 'path/to/video/folder/video0.mp4'}VideoFolder
Özel bir dataloader yazma gerektirmeyen VideoFolder veri seti oluşturucusuyla da bir veri seti yükleyebilirsiniz. Bu, VideoFolder'ın farklı görü görevleri için birkaç bin videodan oluşan video veri setlerini hızlı bir şekilde oluşturup yüklemek için ideal olmasını sağlar. Video veri seti yapınız şu şekilde olmalıdır:
folder/train/dog/golden_retriever.mp4
folder/train/dog/german_shepherd.mp4
folder/train/dog/chihuahua.mp4
folder/train/cat/maine_coon.mp4
folder/train/cat/bengal.mp4
folder/train/cat/birman.mp4Veri kümesi VideoFolder yapısını izliyorsa, doğrudan load_dataset() ile yükleyebilirsiniz:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")Yerel veri kümeleri için bu, load_dataset() içinde videofolder'ı ve data_dir içinde dizini manuel olarak geçmeye eşdeğerdir:
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder")Ardından videolara torchcodec.decoders._video_decoder.VideoDecoder nesneleri olarak erişebilirsiniz:
>>> dataset["train"][0]
{"video": <torchcodec.decoders._video_decoder.VideoDecoder object at 0x14a61e080>, "label": 0}
>>> dataset["train"][-1]
{"video": <torchcodec.decoders._video_decoder.VideoDecoder object at 0x14a61e090>, "label": 1}Üstveri dosyasındaki bilgileri yok saymak için load_dataset() içinde drop_metadata=True değerini ayarlayın:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)Bir metadata dosyanız yoksa, VideoFolder etiket adını otomatik olarak dizin adından çıkarır.
Otomatik olarak oluşturulan etiketleri kaldırmak istiyorsanız, drop_labels=True olarak ayarlayın.
Bu durumda, veri setiniz yalnızca bir video sütunu içerecektir:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)Son olarak filters argümanı, etikete veya meta verilerdeki bir koşula dayalı olarak veri setinin yalnızca bir alt kümesini yüklemenizi sağlar. Bu, meta veriler Parquet formatındaysa özellikle faydalıdır, çünkü bu format hızlı filtrelemeyi mümkün kılar. Varsayılan olarak veri seti filtrelemeden önce tamamen indirildiği için, bu argümanı streaming=True ile kullanmanız da önerilir.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)Kendi
VideoFolderveri setinizi oluşturmaya ilişkin daha fazla bilgi için Bir video veri seti oluşturma kılavuzuna göz atın.
WebDataset
WebDataset biçimi, TAR arşivlerinden oluşan bir klasöre dayanır ve büyük video veri kümeleri için uygundur.
Boyutları nedeniyle WebDatasets genellikle akış modunda yüklenir (streaming=True kullanılarak).
Bir WebDataset'i şu şekilde yükleyebilirsiniz:
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)Lance
Lance, açık kaynaklı çok modlu bir lakehouse tablo biçimidir. Lance tabloları, metin ve skaler değerlerin yanı sıra görüntüler, sesler ve videolar gibi büyük ikili nesneleri (blob) de tablo verilerinizle birlikte yerel olarak saklayabilir. Bir Lance tablosunun içinde, videolar gibi büyük bloblar, ofsetlerle birlikte bayt olarak saklanır (daha fazla ayrıntı için blob kılavuzuna bakın); bu sayede daha ağır video bloblarını yüklemeye gerek kalmadan metadata taramak ve filtrelemek kolaylaşır ve yalnızca ihtiyaç duyduğunuz belirli video bloblarını talep üzerine alabilirsiniz.
Ayrıca, Lance sütun tabanlı bir format olduğu için, yalnızca ilgilendiğiniz metadata sütunlarını projeksiyonlayabilir ve filtreleyebilirsiniz (büyük video dosyalarını getirmeden) ve hazır olduğunuzda satırların küçük bir alt kümesini (video dahil) alabilirsiniz. Bu, ayrı bir dosya deposu veya harici bir indekse ihtiyaç duymadan metadata ve videolarınızı tek bir yerde tutmanızı sağlar.
import lance
ds = lance.dataset("hf://datasets/lance-format/openvid-lance/data/train.lance")
# 1. Browse metadata without loading video blobs.
metadata = ds.scanner(
columns=["caption", "aesthetic_score"],
filter="aesthetic_score >= 4.5",
limit=2,
).to_table().to_pylist()
# 2. Fetch a single video blob by row index.
selected_index = 0
blob_file = ds.take_blobs("video_blob", ids=[selected_index])[0]
with open("video_0.mp4", "wb") as f:
f.write(blob_file.read())Bu örnekte, video Lance tablosunda yerel olarak (kodlanmış baytları olarak) saklanır; bu sayede ek bir dönüştürme adımı olmadan doğrudan yerel dosya sisteminizdeki bir mp4 dosyasına yazabilirsiniz.
Lance veri kümeleriyle çalışma hakkında daha fazla ayrıntı için Lance belgelerini inceleyin.
Video çözme
Varsayılan olarak, bir veri kümesinde gezinirken videolar VideoDecoders olarak sıralı biçimde çözümlenir.
Videoların meta verileri sıralı olarak çözümlenir ve video karelerine erişene kadar okunmaz.
Ancak çok iş parçacıklı (multithreaded) kod çözme (decoding) kullanarak veri setini önemli ölçüde hızlandırmak mümkündür:
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset: # up to 20 times faster !
... ...Çok iş parçacıklı işlemi num_threads parametresiyle etkinleştirebilirsiniz. Bu, uzaktan veri akışını hızlandırmak için özellikle faydalıdır.
Ancak hızlı disklerdeki yerel veriler için num_threads=0 değerinden daha yavaş olabilir.
Eğer VideoDecoders olarak çözümlenen videolardan ilginiz yoksa ve bunun yerine yol/baytlara erişmek istiyorsanız, çözümlemeyi devre dışı bırakabilirsiniz:
>>> dataset = dataset.decode(False)Not: IterableDataset.decode() şu anda yalnızca akış veri setleri için kullanılabilir.
Update on GitHub