# Bir video veri seti oluşturun

Bu kılavuz, `VideoFolder` ve bazı meta verilerle bir video veri seti oluşturma yöntemini gösterir. Bu, birkaç bin videodan oluşan bir video veri setini hızlıca oluşturmak için kod gerektirmeyen bir çözümdür.

> [!TIP]
> Veri setinize erişimi, kullanıcıların önce iletişim bilgilerini paylaşmasını gerektirerek kontrol edebilirsiniz. Bu özelliği Hub'da nasıl etkinleştireceğinize dair daha fazla bilgi için [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) kılavuzuna göz atın.

## VideoFolder

`VideoFolder`, kod yazmanıza gerek kalmadan birkaç bin videodan oluşan bir video veri setini hızlıca yüklemek için tasarlanmış bir veri seti oluşturucudur.

> [!TIP]
> 💡 `VideoFolder`'ün veri seti deposu yapınıza dayalı olarak veri seti bölümlerini nasıl oluşturduğunu öğrenmek için [Split pattern hierarchy](repository_structure#split-pattern-hierarchy)'a göz atın.

`VideoFolder`, veri setinizin sınıf etiketlerini dizin adına göre otomatik olarak çıkarır. Veri setinizi aşağıdaki gibi bir dizin yapısında saklayın:

```
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/v5.2.0/tr/package_reference/loading_methods#datasets.load_dataset) ile yükleyebilirsiniz:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("path/to/folder")
```

Bu, [load_dataset()](/docs/datasets/v5.2.0/tr/package_reference/loading_methods#datasets.load_dataset) içinde `videofolder`'ı ve dizini `data_dir` içinde elle geçirmeye eşdeğerdir:

```py
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder")
```

Birden fazla bölüme sahip veri setlerini yüklemek için `videofolder` kullanabilirsiniz. Bunu yapmak için veri seti dizininizin aşağıdaki yapıya sahip olması gerekir:

```
folder/train/dog/golden_retriever.mp4
folder/train/cat/maine_coon.mp4
folder/test/dog/german_shepherd.mp4
folder/test/cat/bengal.mp4
```

> [!WARNING]
> Tüm video dosyaları tek bir dizinde yer alıyorsa veya aynı dizin yapısı seviyesinde değillerse, `label` sütunu otomatik olarak eklenmez. Gerekliyse `drop_labels=False` değerini açıkça belirleyin.

Veri setiniz hakkında eklemek istediğiniz ek bilgiler varsa, örneğin metin açıklamaları veya sınırlayıcı kutular, bunları klasörünüze bir `metadata.csv` dosyası olarak ekleyin. Bu, metin açıklama veya nesne algılama gibi farklı bilgisayarla görme görevleri için veri setlerini hızlı bir şekilde oluşturmanızı sağlar. Ayrıca bir JSONL dosyası olan `metadata.jsonl` veya bir Parquet dosyası olan `metadata.parquet` kullanabilirsiniz.

```
folder/train/metadata.csv
folder/train/0001.mp4
folder/train/0002.mp4
folder/train/0003.mp4
```

`metadata.csv` dosyanız, video dosyalarını metadata ile ilişkilendiren bir `file_name` veya `*_file_name` alanına sahip olmalıdır:

```csv
file_name,additional_feature
0001.mp4,This is a first value of a text feature you added to your videos
0002.mp4,This is a second value of a text feature you added to your videos
0003.mp4,This is a third value of a text feature you added to your videos
```

veya `metadata.jsonl` kullanarak:

```jsonl
{"file_name": "0001.mp4", "additional_feature": "This is a first value of a text feature you added to your videos"}
{"file_name": "0002.mp4", "additional_feature": "This is a second value of a text feature you added to your videos"}
{"file_name": "0003.mp4", "additional_feature": "This is a third value of a text feature you added to your videos"}
```

Burada `file_name`, metadata dosyasının yanındaki video dosyasının adı olmalıdır. Daha genel olarak, metadata dosyasının bulunduğu dizinden video dosyasına göre göreli yol olmalıdır.

Veri setinizdeki her satırda birden fazla videoya işaret etmeniz mümkündür, örneğin hem girdi hem de çıktınız videolar ise:

```jsonl
{"input_file_name": "0001.mp4", "output_file_name": "0001_output.mp4"}
{"input_file_name": "0002.mp4", "output_file_name": "0002_output.mp4"}
{"input_file_name": "0003.mp4", "output_file_name": "0003_output.mp4"}
```

Video listeleri de tanımlayabilirsiniz. Bu durumda alanın adını `file_names` veya `*_file_names` olarak vermeniz gerekir. İşte bir örnek:

```jsonl
{"videos_file_names": ["0001_left.mp4", "0001_right.mp4"], "label": "moving_up"}
{"videos_file_names": ["0002_left.mp4", "0002_right.mp4"], "label": "moving_down"}
{"videos_file_names": ["0003_left.mp4", "0003_right.mp4"], "label": "moving_right"}
```

### Video altyazılama

Video açıklama veri setleri, bir videoyu tanımlayan metinler içerir. `metadata.csv` örneği şu görünüme sahip olabilir:

```csv
file_name,text
0001.mp4,This is a golden retriever playing with a ball
0002.mp4,A german shepherd
0003.mp4,One chihuahua
```

Veri setini `VideoFolder` ile yükleyin; bu işlem, video açıklamaları için bir `text` sütunu oluşturur:

```py
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"This is a golden retriever playing with a ball"
```

### Veri setini Hub'a yükle

Bir veri seti oluşturduktan sonra, örneğin `huggingface_hub` kullanarak paylaşabilirsiniz. [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) kütüphanesinin yüklü olduğundan ve Hugging Face hesabınıza giriş yaptığınızdan emin olun (daha fazla ayrıntı için [Python ile Yükleme öğreticisi](upload_dataset#upload-with-python) bölümüne bakın).

Veri setinizi `huggingface_hub.HfApi.upload_folder` ile yükleyin:

```py
from huggingface_hub import HfApi
api = HfApi()

api.upload_folder(
    folder_path="/path/to/local/dataset",
    repo_id="username/my-cool-dataset",
    repo_type="dataset",
)
```

## WebDataset

[WebDataset](https://github.com/webdataset/webdataset) formatı TAR arşivlerine dayanır ve büyük video veri kümeleri için uygundur. Gerçekten de videolarınızı TAR arşivlerinde gruplayabilirsiniz (ör. her TAR arşivi başına 1 GB video) ve binlerce TAR arşivine sahip olabilirsiniz:

```
folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...
```

Arşivlerde, her örnek aynı öneki paylaşan dosyalardan oluşur:

```
e39871fd9fd74f55.mp4
e39871fd9fd74f55.json
f18b91585c4d3f3e.mp4
f18b91585c4d3f3e.json
ede6e66b2fb59aab.mp4
ede6e66b2fb59aab.json
ed600d57fcee4f94.mp4
ed600d57fcee4f94.json
...
```

Videolarınızın etiketlerini/açıklamalarını/özelliklerini örneğin JSON veya metin dosyaları kullanarak ekleyebilirsiniz.

WebDataset formatı ve python kütüphanesi hakkında daha fazla ayrıntı için lütfen [WebDataset dokümantasyonuna](https://webdataset.github.io/webdataset) göz atın.

WebDataset'inizi yükleyin ve her dosya uzantısı için bir sütun oluşturulacaktır (burada "mp4" ve "json"):

```python
>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train")
>>> dataset[0]["json"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}
```

## Lance

[Lance](https://lance.org), açık kaynaklı çok modlu bir lakehouse tablo biçimidir. Lance tabloları, tabular verilerinizin yanı sıra metin ve skaler değerlerin yanı sıra görüntü, ses ve video gibi büyük ikili nesneleri (blob) da yerel olarak depolayabilir.

Lance, Lance veri setlerinde büyük blob'ların depolanmasını ve alınmasını kolaylaştıran bir [blob API](https://lance.org/guide/blob/) sunar. Aşağıdaki örnek, daha ağır video blob'larını yüklemeye gerek kalmadan metadata'yı verimli bir şekilde nasıl gezinebileceğinizi ve ardından ilgili video blob'larını isteğe bağlı olarak nasıl alabileceğinizi gösterir.

Videoları depolayan bir Lance tablosunun temsilî görünümü aşağıdaki gibidir (`video_blob` sütunu Lance'ın blob kodlamasını kullanır):

```text
+------------------------------------------+-----------------+-----+------------------------------------------+
| caption                                  | aesthetic_score | ... | video_blob                               |
+------------------------------------------+-----------------+-----+------------------------------------------+
| "a breathtaking view of a mounta..."     | 5.2401          | ... | {position: 0, size: 4873879}             |
| "a captivating view of the sun, b..."    | 5.2401          | ... | {position: 4873920, size: 3370571}       |
+------------------------------------------+-----------------+-----+------------------------------------------+
```

### Ham video dosyalarından bir Lance veri seti yazın

Diskteki ham video dosyaları ve ilişkili meta verilerden (örneğin, altyazılar ve puanlar) başlayarak, yerel bir `*.lance` dizinine (`.lance` ekiyle adlandırılması yaygındır) kendi kendine yeten bir Lance veri seti yazabilirsiniz:

```py
import lance
import pyarrow as pa

import urllib.request

schema = pa.schema(
    [
        pa.field("caption", pa.utf8()),
        pa.field("aesthetic_score", pa.float64()),
        pa.field(
            "video_blob",
            pa.large_binary(),
            metadata={"lance-encoding:blob": "true"},
        ),
    ]
)

# Provide video files alongside metadata
rows = [
    {
        "video_path": "/path/to/videos/0001.mp4",
        "caption": "a breathtaking view of a mountainous landscape ...",
        "aesthetic_score": 5.240138053894043,
    },
    {
        "video_path": "0002.mp4",
        "caption": "a captivating view of the sun, bathed in hues ...",
        "aesthetic_score": 5.240137100219727,
    },
]

video_bytes = []
for r in rows:
    with open(r["video_path"], "rb") as f:
        video_bytes.append(f.read())

table = pa.table(
    {
        "caption": [r["caption"] for r in rows],
        "aesthetic_score": [r["aesthetic_score"] for r in rows],
        "video_blob": video_bytes,
    },
    schema=schema,
)

ds = lance.write_dataset(
    table,
    "./videos.lance",
    schema=schema,
    mode="create",
)
```

Bu, meta verilerinizi ve video baytlarınızı `videos.lance/` içinde birlikte saklar; böylece ayrı `*.mp4` dosyalarını senkronize tutmak zorunda kalmadan tek bir dizini taşıyabilir/kopyalayabilirsiniz.

Bir video depolayan Lance tablosunun temsilî görünümü aşağıdaki gibidir (`video_blob` sütunu, Lance veri seti içinde blob olarak yerel biçimde saklanan verileri içerir):

```text
+------------------------------------------+-----------------+-----+------------------------------------------+
| caption                                  | aesthetic_score | ... | video_blob                               |
+------------------------------------------+-----------------+-----+------------------------------------------+
| "a breathtaking view of a mounta..."     | 5.2401          | ... | {position: 0, size: 4873879}             |
| "a captivating view of the sun, b..."    | 5.2401          | ... | {position: 4873920, size: 3370571}       |
+------------------------------------------+-----------------+-----+------------------------------------------+
```

Oluşturulan `videos.lance/` dizinini Hub'a yükleyebilir (örneğin `huggingface_hub.HfApi.upload_folder` ile) ve metadata ile videoları tek bir artefakt olarak bir arada tutarak bir veri seti deposu olarak paylaşabilirsiniz.

> [!TIP]
> Lance veri setleri, veriler disk üzerinde sütun tabanlı bir formatta saklandığı için çok büyük boyutlara (terabayt ve ötesi) ölçeklenebilir. Lance'ta büyük blob'ları saklama ve alma konusunda en iyi uygulamalara ilişkin güncel bilgi için [blob API](https://lance.org/guide/blob/) kılavuzuna bakın.

Büyük veri setleri yazarken, her bir `*.lance` dosyasının boyutunu genellikle en fazla birkaç gigabayt ile sınırlamak en iyisidir. Veriyi bir iteratör aracılığıyla toplayıp veri setini yazarken `max_bytes_per_file` parametresini belirtmeniz yeterlidir:

```python
MAX_BYTES_PER_FILE = 5 * 1024 * 1024 * 1024  # ~5 GB per file

# Write as Lance dataset with file size limits for each *.lance file
ds = lance.write_dataset(
    table,
    "./videos.lance",
    schema=schema,
    mode="create",
    max_bytes_per_file=MAX_BYTES_PER_FILE,
)
```

Lance veri kümeleriyle çalışma hakkında daha fazla ayrıntı için [Lance belgelerini](https://lance.org) inceleyin.

