Datasets documentation

Tạo bộ dữ liệu hình ảnh

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Tạo bộ dữ liệu hình ảnh

Có hai phương pháp để tạo và chia sẻ một bộ dữ liệu hình ảnh. Hướng dẫn này sẽ cho bạn biết cách:

  • Tạo bộ dữ liệu ảnh từ các tệp cục bộ bằng python với Dataset.push_to_hub(). Đây là một cách đơn giản, chỉ cần vài bước trong python.

  • Tạo một bộ dữ liệu ảnh với ImageFolder và một số metadata. Đây là giải pháp không cần viết code để nhanh chóng tạo một bộ dữ liệu ảnh với vài nghìn hình ảnh.

Bạn có thể kiểm soát quyền truy cập vào bộ dữ liệu của mình bằng cách yêu cầu người dùng chia sẻ thông tin liên hệ trước. Xem hướng dẫn Gated datasets để biết thêm thông tin về cách bật tính năng này trên Hub.

ImageFolder

ImageFolder là một trình xây dựng bộ dữ liệu được thiết kế để nhanh chóng nạp một bộ dữ liệu ảnh gồm vài nghìn hình ảnh mà không yêu cầu bạn phải viết bất kỳ mã nào.

💡 Xem Hierarchie mẫu Split để tìm hiểu thêm về cách ImageFolder tạo các phần chia dataset dựa trên cấu trúc kho dataset của bạn.

ImageFolder tự động suy luận nhãn lớp của bộ dữ liệu dựa trên tên thư mục. Hãy lưu bộ dữ liệu của bạn trong cấu trúc thư mục như sau:

folder/train/dog/golden_retriever.png
folder/train/dog/german_shepherd.png
folder/train/dog/chihuahua.png

folder/train/cat/maine_coon.png
folder/train/cat/bengal.png
folder/train/cat/birman.png

Nếu bộ dữ liệu tuân theo cấu trúc ImageFolder, bạn có thể tải nó trực tiếp bằng load_dataset():

>>> from datasets import load_dataset

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

Điều này tương đương với việc truyền imagefolder thủ công trong load_dataset() và thư mục trong data_dir:

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")

Bạn cũng có thể sử dụng imagefolder để tải các bộ dữ liệu liên quan đến nhiều phần chia (splits). Để làm điều này, thư mục bộ dữ liệu của bạn nên có cấu trúc sau:

folder/train/dog/golden_retriever.png
folder/train/cat/maine_coon.png
folder/test/dog/german_shepherd.png
folder/test/cat/bengal.png

Nếu tất cả các tệp hình ảnh nằm trong một thư mục duy nhất hoặc không ở cùng cấp trong cấu trúc thư mục, cột label sẽ không được thêm vào tự động. Nếu bạn cần cột này, hãy đặt drop_labels=False một cách tường minh.

Nếu có thêm thông tin bạn muốn bao gồm về bộ dữ liệu của mình, chẳng hạn như chú thích văn bản hoặc hộp bao quanh, hãy thêm chúng dưới dạng tệp metadata.csv trong thư mục của bạn. Điều này cho phép bạn nhanh chóng tạo các bộ dữ liệu cho các tác vụ thị giác máy tính khác nhau như chú thích văn bản hoặc phát hiện đối tượng. Bạn cũng có thể sử dụng tệp JSONL metadata.jsonl hoặc tệp Parquet metadata.parquet.

folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.png

Bạn cũng có thể nén các hình ảnh của mình thành tệp zip, và trong trường hợp này, mỗi tệp zip phải chứa cả hình ảnh và dữ liệu mô tả

folder/train.zip
folder/test.zip
folder/validation.zip

Tệp metadata.csv của bạn phải có trường file_name hoặc *_file_name để liên kết các tệp hình ảnh với metadata của chúng:

file_name,additional_feature
0001.png,This is a first value of a text feature you added to your images
0002.png,This is a second value of a text feature you added to your images
0003.png,This is a third value of a text feature you added to your images

hoặc sử dụng metadata.jsonl:

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

Ở đây, file_name phải là tên của tệp ảnh nằm cạnh tệp metadata. Nói chung, nó phải là đường dẫn tương đối từ thư mục chứa metadata đến tệp ảnh.

Bạn có thể trỏ đến nhiều hơn một hình ảnh trong mỗi hàng của bộ dữ liệu, ví dụ nếu cả đầu vào và đầu ra của bạn đều là hình ảnh:

{"input_file_name": "0001.png", "output_file_name": "0001_output.png"}
{"input_file_name": "0002.png", "output_file_name": "0002_output.png"}
{"input_file_name": "0003.png", "output_file_name": "0003_output.png"}

Bạn cũng có thể định nghĩa các danh sách hình ảnh. Trong trường hợp đó, bạn cần đặt tên trường là file_names hoặc *_file_names. Dưới đây là một ví dụ:

{"frames_file_names": ["0001_t0.png", "0001_t1.png"], label: "moving_up"}
{"frames_file_names": ["0002_t0.png", "0002_t1.png"], label: "moving_down"}
{"frames_file_names": ["0003_t0.png", "0003_t1.png"], label: "moving_right"}

Chú thích hình ảnh

Bộ dữ liệu chú thích hình ảnh có văn bản mô tả một hình ảnh. Một ví dụ về metadata.csv có thể trông như sau:

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

Tải bộ dữ liệu bằng ImageFolder, và nó sẽ tạo một cột text cho chú thích ảnh:

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

Phát hiện đối tượng

Bộ dữ liệu phát hiện đối tượng có các hộp bao và các danh mục xác định các đối tượng trong một hình ảnh. Một ví dụ về metadata.jsonl có thể trông như sau:

{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}}
{"file_name": "0002.png", "objects": {"bbox": [[810.0, 100.0, 57.0, 28.0]], "categories": [1]}}
{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}}

Tải bộ dữ liệu bằng ImageFolder, và nó sẽ tạo một cột objects chứa các hộp bao quanh và các danh mục:

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

Tải bộ dữ liệu lên Hub

Sau khi tạo xong một dataset, bạn có thể chia sẻ nó lên Hub bằng phương thức push_to_hub(). Hãy đảm bảo rằng bạn đã cài đặt thư viện huggingface_hub và đã đăng nhập vào tài khoản Hugging Face của mình (xem hướng dẫn Upload with Python để biết thêm chi tiết).

Tải bộ dữ liệu của bạn lên bằng push_to_hub():

>>> from datasets import load_dataset

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset")

WebDataset

Định dạng WebDataset dựa trên các tệp lưu trữ TAR và phù hợp cho các bộ dữ liệu ảnh lớn. Thật vậy, bạn có thể nhóm các ảnh của mình vào các tệp lưu trữ TAR (ví dụ: 1GB ảnh cho mỗi tệp lưu trữ TAR) và có hàng nghìn tệp lưu trữ TAR:

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

Trong kho lưu trữ, mỗi ví dụ được tạo thành từ các tệp chia sẻ cùng một tiền tố:

e39871fd9fd74f55.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.jpg
f18b91585c4d3f3e.json
ede6e66b2fb59aab.jpg
ede6e66b2fb59aab.json
ed600d57fcee4f94.jpg
ed600d57fcee4f94.json
...

Bạn có thể đặt nhãn/mô tả/hộp bao quanh cho hình ảnh của mình bằng cách sử dụng các tệp JSON hoặc văn bản, chẳng hạn.

Nạp WebDataset của bạn và nó sẽ tạo ra một cột cho mỗi hậu tố tệp (ở đây là “jpg” và “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]}

Bạn cũng có thể có nhiều hình ảnh cho mỗi ví dụ như sau:

e39871fd9fd74f55.input.jpg
e39871fd9fd74f55.output.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.input.jpg
f18b91585c4d3f3e.output.jpg
f18b91585c4d3f3e.json
...

Để biết thêm chi tiết về định dạng WebDataset và thư viện python, vui lòng xem tài liệu WebDataset.

Lance

Lance là định dạng bảng lakehouse đa phương thức mã nguồn mở. Bảng Lance có thể lưu trữ bản địa không chỉ văn bản và giá trị vô hướng, mà còn cả các đối tượng nhị phân lớn (blobs) như hình ảnh, âm thanh và video cùng với dữ liệu bảng của bạn.

Bắt đầu từ các tệp ảnh trên đĩa cùng với các metadata liên quan (ví dụ: chú thích và kích thước), bạn có thể viết một dataset Lance tự chứa vào một thư mục *.lance cục bộ. Bảng kết quả có thể lưu các cột metadata của bạn bên cạnh một cột image chứa các byte ảnh đã mã hóa.

Ví dụ, bạn có thể bắt đầu với các metadata như:

{'caption': 'Cordelia and Dudley on their wedding  day last year', 'height': 315, 'width': 233}
{'caption': 'Statistics on challenges for automation in 2021', 'height': 299, 'width': 701}

Bạn có thể định nghĩa schema pyarrow cho metadata và byte hình ảnh, xây dựng bảng, và ghi nó dưới dạng tập dữ liệu Lance:

import lance
import pyarrow as pa

schema = pa.schema(
    [
        pa.field("caption", pa.utf8()),
        pa.field("height", pa.int32()),
        pa.field("width", pa.int32()),
        # ... add any additional metadata columns you want here ...
        pa.field("image", pa.binary()),
    ]
)

# Provide image files alongside metadata
rows = [
    {
        "image_path": "/path/to/images/0001.jpg",
        "caption": "Cordelia and Dudley on their wedding  day last year",
        "height": 315,
        "width": 233,
    },
    {
        "image_path": "/path/to/images/0002.jpg",
        "caption": "Statistics on challenges for automation in 2021",
        "height": 299,
        "width": 701,
    },
]

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

table = pa.table(
    {
        "caption": [r["caption"] for r in rows],
        "height": [r["height"] for r in rows],
        "width": [r["width"] for r in rows],
        "image": image_bytes,
    },
    schema=schema,
)

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

Dưới đây là một cái nhìn đại diện về cách một bảng Lance lưu trữ hình ảnh có thể trông như thế nào (cột image chứa các byte đã mã hóa):

+-----------------------------------------------+--------+-------+-----+------------------------------+
| caption                                       | height | width | ... | image                        |
+-----------------------------------------------+--------+-------+-----+------------------------------+
| "Cordelia and Dudley on their wedding ..."    | 315    | 233   | ... | b"\\xff\\xd8\\xff...\\xd9"   |
| "Statistics on challenges for automation ..." | 299    | 701   | ... | b"\\xff\\xd8\\xff...\\xd9"   |
+-----------------------------------------------+--------+-------+-----+------------------------------+

Sử dụng cách tiếp cận này, bạn có thể lưu trữ các bộ dữ liệu ảnh có kích thước lớn tùy ý trong Lance. Thư mục images.lance/ kết quả với các tệp *.lance của nó có thể được tải lên Hugging Face Hub, giống như các ví dụ khác ở trên. Xem bộ dữ liệu lance-format/laion-1m trên Hub để có một ví dụ về bộ dữ liệu ảnh Lance.

Để biết thêm chi tiết về việc làm việc với bộ dữ liệu Lance, hãy xem tài liệu Lance.

Update on GitHub