티스토리 뷰
Hugging Face Datasets 에 이미지, 텍스트 멀티모달 데이터셋을 업로드 해보"자이아파트"
developer0hye 2024. 11. 27. 14:51
짱구도 살고 싶은 문화자이sk뷰아파트를 억지로 제목에 녹여봤습니다.
짱구는 한국에서 자기 이미지가 이렇게 소비되는 걸 알긴알까요? 단독 주택에 잘 살고 있는 짱구가 왜 아파트에 살고 싶겠어요?
각설하고
이 글에서는 멀티모달(이미지, 텍스트) 데이터셋을 허깅 페이스에 업로드하는 방법에 대해 다룹니다. 최종적으로 아래와 같은 형태의 데이터셋이 구축되고 허깅 페이스에 업로드 됩니다!
https://huggingface.co/datasets/developer0hye/korocr
1. Hugging Face dataset repository 생성
https://huggingface.co/new-dataset
저는 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
우선 위의 공식 가이드를 정독해보시는 걸 추천드립니다. 저는 저걸 안 읽고 제멋대로 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
https://runpod.io/?ref=hxy1q5uk
RunPod 사용시 이 링크로 들어가셔서 가입 후 결제해서 사용해주신다면 저에게도 큰 힘이 됩니다. 감사합니다.
'Deep Learning' 카테고리의 다른 글
unsloth/LaTeX_OCR 데이터셋 주의사항...? (1) | 2024.11.30 |
---|---|
Hugging Face 이미지, 텍스트 멀티모달 OCR 데이터셋 업로드 하루종일 삽질 (0) | 2024.11.27 |
VLM 성능 파악하기 좋은 리더 보드 사이트 (0) | 2024.11.26 |
runpod network storage 용량 수정 방법 (0) | 2024.11.22 |
huggingface transformers cache directory 변경(웨이트 저장되는 폴더 변경) 방법 (0) | 2024.11.19 |
- Total
- Today
- Yesterday
- Lowest Common Ancestor
- ㅂ
- C++ Deploy
- 이분탐색
- MOT
- 인공지능을 위한 선형대수
- 조합
- 백준 1766
- 백준 11437
- 백준
- 문제집
- LCA
- PyCharm
- 백트래킹
- FairMOT
- 파이참
- 순열
- 위상 정렬 알고리즘
- 백준 11053
- 자료구조
- cosine
- 단축키
- 가장 긴 증가하는 부분 수열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |