# Video verilerini yükle

> [!WARNING]
> Video desteği deneyseldir ve değişikliklere tabidir.

Video veri kümeleri, `torchcodec` nesnelerini içeren [Video](/docs/datasets/main/tr/package_reference/main_classes#datasets.Video) türünde sütunlara sahiptir.

> [!TIP]
> Video veri setleriyle çalışmak için `torchcodec` ve `ffmpeg` paketlerinin yüklü olması gerekir. Bunların nasıl yükleneceğini öğrenmek için [kurulum](https://github.com/meta-pytorch/torchcodec#installing-torchcodec) 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:

```py
>>> 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>
```

> [!WARNING]
> Video veri setine, veri setindeki tüm video nesnelerini oluşturmayı önlemek için önce satır indeksini, ardından `video` sü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:

```python
>>> video = dataset[0]["video"]
>>> first_frame = video.get_frame_at(0)
>>> first_frame.data.shape
(3, 240, 320)
>>> first_frame.pts_seconds  # timestamp
0.0
```

Birden 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](https://meta-pytorch.org/torchcodec/stable/generated/torchcodec.decoders.VideoDecoder.html) başvurun:

```python
>>> 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.

```python
>>> 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()](/docs/datasets/main/tr/package_reference/main_classes#datasets.Dataset.cast_column) fonksiyonunu kullanın ve onu [Video](/docs/datasets/main/tr/package_reference/main_classes#datasets.Video) özelliğiyle `torchcodec` videosuna dönüştürün:

```py
>>> 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](/docs/datasets/main/tr/package_reference/main_classes#datasets.Video) özelliğinde `decode=False` olarak ayarlayın:

```py
>>> 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.mp4
```

Veri kümesi `VideoFolder` yapısını izliyorsa, doğrudan [load_dataset()](/docs/datasets/main/tr/package_reference/loading_methods#datasets.load_dataset) ile yükleyebilirsiniz:

```py
>>> 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()](/docs/datasets/main/tr/package_reference/loading_methods#datasets.load_dataset) içinde `videofolder`'ı ve `data_dir` içinde dizini manuel olarak geçmeye eşdeğerdir:

```py
>>> 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()](/docs/datasets/main/tr/package_reference/loading_methods#datasets.load_dataset) içinde `drop_metadata=True` değerini ayarlayın:

```py
>>> 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` değerini ayarlayın. Bu durumda veri setiniz yalnızca bir video sütunu içerecektir:

```py
>>> 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.

```python
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
```

> [!TIP]
> Kendi `VideoFolder` veri setinizi oluşturmaya ilişkin daha fazla bilgi için [Bir video veri seti oluşturma](./video_dataset) kılavuzuna göz atın.

## WebDataset

[WebDataset](https://github.com/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:

```python
>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)
```

## Lance

[Lance](https://lance.org), 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 blob'lar, ofsetlerle birlikte bayt olarak saklanır (daha fazla ayrıntı için [blob kılavuzu](https://lance.org/guide/blob/)na bakın); bu sayede daha ağır video blob'larını yüklemeye gerek kalmadan metadata'yı taramak ve filtrelemek kolaylaşır ve yalnızca ihtiyacınız olan belirli video blob'ları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.

```python
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](https://lance.org) 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:

```python
>>> 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:

```python
>>> dataset = dataset.decode(False)
```

Not: [IterableDataset.decode()](/docs/datasets/main/tr/package_reference/main_classes#datasets.IterableDataset.decode) şu anda yalnızca akış veri setleri için kullanılabilir.

