Datasets documentation
Bir video veri seti oluşturun
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.
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 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.
💡
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'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.mp4Veri kümesi VideoFolder yapısını izliyorsa, doğrudan load_dataset() ile yükleyebilirsiniz:
>>> from datasets import load_dataset
>>> dataset = load_dataset("path/to/folder")Bu, load_dataset() içinde videofolder'ı ve dizini data_dir içinde elle geçirmeye eşdeğerdir:
>>> 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.mp4Tüm video dosyaları tek bir dizinde yer alıyorsa veya aynı dizin yapısı seviyesinde değillerse,
labelsütunu otomatik olarak eklenmez. Gerekliysedrop_labels=Falsedeğ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 metadata.csv dosyası olarak ekleyin. Bu sayede metin açıklama veya nesne algılama gibi farklı bilgisayarlı görme görevleri için veri setlerini hızla oluşturabilirsiniz. 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.mp4metadata.csv dosyanız, video dosyalarını metadata ile ilişkilendiren bir file_name veya *_file_name alanına sahip olmalıdır:
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 videosveya metadata.jsonl kullanarak:
{"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:
{"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:
{"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:
file_name,text
0001.mp4,This is a golden retriever playing with a ball
0002.mp4,A german shepherd
0003.mp4,One chihuahuaVeri setini VideoFolder ile yükleyin; bu işlem, video açıklamaları için bir text sütunu oluşturur:
>>> 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 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’ne bakın).
Veri setinizi huggingface_hub.HfApi.upload_folder ile yükleyin:
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 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 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”):
>>> 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, 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 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ı talep üzerine 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):
+------------------------------------------+-----------------+-----+------------------------------------------+
| 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:
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.
Lance tablosunda videoların nasıl saklandığına dair temsilî bir görünüm aşağıdadır (video_blob sütunu, Lance veri seti içinde blob olarak yerel biçimde saklanan verileri içerir):
+------------------------------------------+-----------------+-----+------------------------------------------+
| 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.
Lance veri setleri, veriler diskte 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ın saklanması ve alınması için en iyi uygulamalara ilişkin güncel bilgi için blob API kılavuzuna bakın.
Büyük veri setleri yazarken, her bir *.lance dosyasının boyutunu en fazla birkaç gigabayt ile sınırlamak genellikle en iyisidir.
Veriyi bir iteratör aracılığıyla toplayıp veri setini yazarken max_bytes_per_file parametresini belirtmeniz yeterlidir:
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 inceleyin.
Update on GitHub