티스토리 뷰

 

짱구도 살고 싶은 문화자이sk뷰아파트를 억지로 제목에 녹여봤습니다.

 

짱구는 한국에서 자기 이미지가 이렇게 소비되는 걸 알긴알까요? 단독 주택에 잘 살고 있는 짱구가 왜 아파트에 살고 싶겠어요?

 

각설하고

 

이 글에서는 멀티모달(이미지, 텍스트) 데이터셋을 허깅 페이스에 업로드하는 방법에 대해 다룹니다. 최종적으로 아래와 같은 형태의 데이터셋이 구축되고 허깅 페이스에 업로드 됩니다!

 

https://huggingface.co/datasets/developer0hye/korocr

 

developer0hye/korocr · Datasets at Hugging Face

["OpenAI", "Playground를", "활용한", "실전", "프롬프트", "작성", "과정", "유튜브/블로그", "제목", "다듬기", "영어", "단어장", "만들기", "채용", "인터뷰", "질문", "생성하기"]

huggingface.co

 

 

 

1. Hugging Face dataset repository 생성

https://huggingface.co/new-dataset

 

Hugging Face – The AI community building the future.

 

huggingface.co

 

 

저는 Dataset name 은 korocr로, License는 MIT로 기입했습니다.


2. 이미지, 텍스트(query, label=Ground Truth) 셋을 준비해줍니다.

 

저는 컬럼을 ChartQA 데이터셋을 따라서 image, query, label 로 정의할것입니다. 그리고 query는 ocr을 수행할것이기에 일괄적으로 모두 동일한 query를 사용할 것입니다. OCR 이면 단순히 입력이 이미지고 출력이 텍스트지 않냐! 왜 입력 도메인이 1개인데 제목에 멀티모달이 포함되냐?라는 의문을 가지셨을수도 있겠습니다. 제가 다루려는 모델이 VLM 이다보니 이미지와, 쿼리(=텍스트)를 동시에 받아서 제목에 멀티모달이라는 키워드를 포함시켰습니다.

 

label(=Ground Truth)은 저의 주관적인 reading order와 space기준으로 split하여 키워드 단위로 인식된 결과가 반환될 수 있도록 구축했습니다. (좋은 방식인지는 모르겠습니다. 전 차번인식에 특화된 OCR 모델을 개발한 경험과 Pretrained VLM 갖고 놀아본 걸 제외하고는 OCR분야에 대한 경험과 지식이 크게 없습니다. 우선은 빠르게 VLM 모델의 파인튜닝을 시도해볼 수 있는 데이터셋을 구축해보고 파인튜닝을 해보는 것이 목적입니다.)

 

데이터 예시 2개입니다.


 

image

 

query: 이미지의 모든 문자를 인식하세요. 반환 포맷: ["문자 1", "문자 2", ..., "문자 n"] 인식된 문자가 없는 경우 [] 를 반환하세요."

 

label: ["건강", "기능식품"]


image

query: 이미지의 모든 문자를 인식하세요. 반환 포맷: ["문자 1", "문자 2", ..., "문자 n"] 인식된 문자가 없는 경우 [] 를 반환하세요."

 

label: []


이런 데이터로 구성된 64장의 데이터 샘플을 만들어보겠습니다.

 

저는 OCR 데이터셋을 구축하기 위해 (*.jpg, *.txt) Pair 로 데이터셋을 구축해봤습니다. txt 파일에 정답을 기록하였습니다.


3. Hugging Face에 업로드 하기위한 데이터셋 포맷 변환 및 업로드

 

https://huggingface.co/docs/datasets/image_dataset

 

Create an image dataset

There are two methods for creating and sharing an image dataset. This guide will show you how to: You can control access to your dataset by requiring users to share their contact information first. Check out the Gated datasets guide for more information ab

huggingface.co

 

우선 위의 공식 가이드를 정독해보시는 걸 추천드립니다. 저는 저걸 안 읽고 제멋대로 Pandas Dataframe을 제 데이터셋에 맞게 정의해주고 Parquet 파일로 변환하고 업로드하는등의 삽질로 하루를 버렸거든요.

 

Hugging Face에 이미지 데이터셋을 업로드하기 위해서는 우선 데이터셋을 아래와 같은 형태로 구성해야합니다.

 

path/
    train/
    	*.jpg png ...
        metadata.csv
    validation/
    	*.jpg png ...
        metadata.csv
    test/
    	*.jpg png ...
        metadata.csv

- 꼭 validation, test 폴더가 있어야 할 필요는 없습니다. 예시입니다.

 

그리고, metadata.csv 는

 

file_name, class

img.jpg,  dog

...

 

이런식으로 읽었을때 파일에 매칭되는 어떠한 annotated value들이 매칭될 수 있도록 작성돼있어야합니다.

 

제 경우에는 class가 아닌 query와 label이 되는 것이기에 아래와 같은 metadata.csv파일이 split된 폴더(train, validation, test)에 포함돼야 하는 것입니다.

 

이 metadata.csv 파일을 만드는 것을 코드로 구현하고 이를 생성하고 바로 허깅페이스에 올리는 예제입니다. huggingface_id, huggingface_dataset_name 는 업데이트 하고자하는 dataset repository에 맞게 수정하시면 됩니다.

 

import pathlib
import pandas as pd
import tqdm
from huggingface_hub import login
from datasets import load_dataset

def read_label_file(txt_file: pathlib.Path) -> str:
    """Read and clean label from text file"""
    with open(txt_file, 'r', encoding='utf-8') as f:
        return f.read().rstrip()

def process_split(root: pathlib.Path, split: str, query: str) -> pd.DataFrame:
    """Process a single data split"""
    # Create lists to store the data
    file_names = []
    queries = []
    labels = []
    
    jpg_files = sorted(root.glob(f'{split}/*.jpg'))
    print(f'Processing {len(jpg_files)} files in {split} split')
    for jpg_file in tqdm.tqdm(jpg_files):
        
        txt_file = jpg_file.with_suffix('.txt')
        if not txt_file.exists():
            continue
        label = read_label_file(txt_file)
        
        # Append to lists instead of creating individual DataFrames
        file_names.append(jpg_file.name)
        queries.append(query)
        labels.append(label)
    
    # Create DataFrame once with all the data
    return pd.DataFrame({
        'file_name': file_names,
        'query': queries,
        'label': labels
    })

def main():
    root = pathlib.Path('data')
    huggingface_id = 'developer0hye'
    huggingface_dataset_name = 'korocr'

    query = '이미지의 모든 문자를 인식하세요. 반환 포맷: ["문자 1", "문자 2", ..., "문자 n"] 인식된 문자가 없는 경우 [] 를 반환하세요.'
    
    for split in ['train', 'validation']:
        df = process_split(root, split, query)
        df.to_csv(f'{root}/{split}/metadata.csv', index=False)
        
    dataset = load_dataset('imagefolder', data_dir=root)
    dataset.push_to_hub(f'{huggingface_id}/{huggingface_dataset_name}')

if __name__ == '__main__':
    main()

 

해당 코드를 실행하면 아래와 같은 결과가 출력되고 허깅 페이스에 업로드가 될 것입니다!

 

그리고 업로드가 될때 알아서 Parquet 포맷으로 변환이되고 README가 업데이트 됩니다.

 

 

 

허깅 페이스에 업로드 하기 전 데이터셋과 업로드에 사용된 코드는 아래 깃헙 리포에서 확인 가능하십니다.

 

https://github.com/developer0hye/hugging-face-image-ocr-dataset-upload-example

 

GitHub - developer0hye/hugging-face-image-ocr-dataset-upload-example

Contribute to developer0hye/hugging-face-image-ocr-dataset-upload-example development by creating an account on GitHub.

github.com

 


https://runpod.io/?ref=hxy1q5uk

 

 

 

RunPod 사용시 이 링크로 들어가셔서 가입 후 결제해서 사용해주신다면 저에게도 큰 힘이 됩니다. 감사합니다. 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함