Transformers documentation
이미지 분류
이미지 분류
이미지 분류는 이미지에 라벨 또는 클래스를 할당하는 작업입니다. 텍스트나 오디오 분류와 달리 입력은 이미지를 구성하는 픽셀 값입니다. 이미지 분류에는 자연재해 발생 후 피해 탐지, 작물 건강 모니터링, 질병 징후를 가진 의료 영상 스크리닝 지원 등 다양한 응용 분야가 있습니다.
이 가이드에서는 다음 내용을 보여줍니다:
이 작업과 호환되는 모든 아키텍처와 체크포인트를 확인하려면 task-page를 확인하는 것을 권장합니다.
시작하기 전에 필요한 라이브러리가 모두 설치되어 있는지 확인하세요:
pip install transformers datasets evaluate accelerate pillow torchvision scikit-learn trackio
Hugging Face 계정에 로그인하여 모델을 업로드하고 커뮤니티와 공유하는 것을 권장합니다. 프롬프트가 표시되면 로그인할 토큰을 입력하세요:
>>> from huggingface_hub import notebook_login
>>> notebook_login()Food-101 데이터셋 로드
🤗 Datasets 라이브러리에서 Food-101 데이터셋의 더 작은 부분 집합을 로드하는 것으로 시작합니다. 이렇게 하면 전체 데이터셋으로 더 많은 시간을 들여 학습하기 전에 실험을 해보고 모든 것이 정상적으로 작동하는지 확인할 수 있습니다.
>>> from datasets import load_dataset
>>> food = load_dataset("ethz/food101", split="train[:5000]")데이터셋의 train 스플릿을 train_test_split 메서드를 사용하여 학습 세트와 테스트 세트로 분리합니다:
>>> food = food.train_test_split(test_size=0.2)다음은 예시입니다:
>>> food["train"][0]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F52AFC8AC50>,
'label': 79}데이터셋의 각 예시에는 두 개의 필드가 있습니다:
image: 음식 항목의 PIL 이미지label: 음식 항목의 라벨 클래스
에서 를 더 쉽게 가져올 수 있도록, 를 정수로 매핑하고 그 반대의 경우도 처리하는 사전(dictionary)을 생성합니다:
>>> labels = food["train"].features["label"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
... label2id[label] = str(i)
... id2label[str(i)] = label이제 label id를 label 이름으로 변환할 수 있습니다:
>>> id2label[str(79)]
'prime_rib'전처리
다음 단계는 ViT 이미지 프로세서를 로드하여 이미지를 텐서로 처리하는 것입니다:
>>> from transformers import AutoImageProcessor
>>> checkpoint = "google/vit-base-patch16-224-in21k"
>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)모델이 과적합에 더 강건하도록 이미지 변환을 적용합니다. 여기서는 transforms 모듈을 사용하지만, 원하는 이미지 라이브러리를 자유롭게 사용할 수 있습니다.
이미지의 무작위 부분을 잘라내고, 크기를 조정하며, 이미지 평균과 표준편차로 정규화합니다:
>>> from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor
>>> normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
>>> size = (
... image_processor.size["shortest_edge"]
... if "shortest_edge" in image_processor.size
... else (image_processor.size["height"], image_processor.size["width"])
... )
>>> _transforms = Compose([RandomResizedCrop(size), ToTensor(), normalize])그런 다음 변환을 적용하고 이미지의 pixel_values - 모델의 입력 - 을 반환하는 전처리 함수를 만듭니다:
>>> def transforms(examples):
... examples["pixel_values"] = [_transforms(img.convert("RGB")) for img in examples["image"]]
... del examples["image"]
... return examples전체 데이터셋에 전처리 함수를 적용하려면 🤗 Datasets의 with_transform 메서드를 사용합니다. 데이터셋의 요소를 로드할 때 변환이 즉시 적용됩니다:
>>> food = food.with_transform(transforms)이제 DefaultDataCollator를 사용하여 예시 배치(batch)를 생성합니다. 🤗 Transformers의 다른 데이터 콜레이터와 달리, DefaultDataCollator는 패딩(padding)과 같은 추가 전처리를 적용하지 않습니다.
>>> from transformers import DefaultDataCollator
>>> data_collator = DefaultDataCollator()평가
학습 중에 메트릭을 포함하는 것은 모델 성능을 평가하는 데 도움이 되는 경우가 많습니다. 🤗 Evaluate 라이브러리를 사용하면 평가 방법을 빠르게 로드할 수 있습니다. 이 작업에서는 accuracy 메트릭을 로드합니다(메트릭을 로드하고 계산하는 방법에 대해 자세히 알아보려면 🤗 Evaluate quick tour를 참고하세요):
>>> import evaluate
>>> accuracy = evaluate.load("accuracy")이후 예측값과 라벨을 compute에 전달하여 정확도를 계산하는 함수를 만듭니다:
>>> import numpy as np
>>> def compute_metrics(eval_pred):
... predictions, labels = eval_pred
... predictions = np.argmax(predictions, axis=1)
... return accuracy.compute(predictions=predictions, references=labels)compute_metrics 함수가 이제 준비되었습니다. 학습을 설정할 때 이 함수를 다시 사용하게 됩니다.
학습
Trainer를 사용하여 모델을 fine-tuning하는 방법에 대해 잘 모르신다면, 여기의 기본 튜토리얼을 참고하세요!
이제 모델 학습을 시작할 준비가 되었습니다! AutoModelForImageClassification로 ViT를 로드하세요. 예상 레이블 수와 함께 레이블 수를 지정하고, 레이블 매핑을 설정하세요:
>>> from transformers import AutoModelForImageClassification, TrainingArguments, Trainer
>>> model = AutoModelForImageClassification.from_pretrained(
... checkpoint,
... num_labels=len(labels),
... id2label=id2label,
... label2id=label2id,
... )이 시점에서 남은 단계는 단 세 가지입니다:
- TrainingArguments에서 학습 하이퍼파라미터를 정의합니다. 사용하지 않는 컬럼을 제거하지 않는 것이 중요합니다. 제거하면
image컬럼이 삭제되기 때문입니다.image컬럼이 없으면pixel_values를 생성할 수 없습니다. 이 동작을 방지하려면remove_unused_columns=False를 설정하세요! 나머지 필수 파라미터는 모델 저장 위치를 지정하는output_dir입니다.push_to_hub=True를 설정하여 이 모델을 Hub에 업로드할 수 있습니다(모델 업로드를 위해 Hugging Face에 로그인되어 있어야 합니다). 각 에포크가 끝나면 Trainer가 정확도를 평가하고 학습 체크포인트를 저장합니다. - 모델, 데이터셋, 토크나이저, 데이터 콜레이터,
compute_metrics함수와 함께 학습 인수를 Trainer에 전달합니다. - 모델을 파인튜닝하려면 train()을 호출하세요.
>>> training_args = TrainingArguments(
... output_dir="my_awesome_food_model",
... remove_unused_columns=False,
... eval_strategy="epoch",
... save_strategy="epoch",
... learning_rate=5e-5,
... per_device_train_batch_size=16,
... gradient_accumulation_steps=4,
... per_device_eval_batch_size=16,
... num_train_epochs=3,
... warmup_steps=0.1,
... logging_steps=10,
... report_to="trackio",
... run_name="food101",
... load_best_model_at_end=True,
... metric_for_best_model="accuracy",
... push_to_hub=True,
... )
>>> trainer = Trainer(
... model=model,
... args=training_args,
... data_collator=data_collator,
... train_dataset=food["train"],
... eval_dataset=food["test"],
... processing_class=image_processor,
... compute_metrics=compute_metrics,
... )
>>> trainer.train()학습이 완료되면 push_to_hub() 메서드를 사용하여 모델을 Hub에 공유하여 누구나 모델을 사용할 수 있도록 하세요:
>>> trainer.push_to_hub()이미지 분류를 위한 모델의 fine-tuning 방법을 더 자세히 살펴보고 싶다면, 해당 PyTorch notebook을 참고하세요.
추론
좋습니다. 이제 모델을 fine-tuning 했으므로 추론에 사용할 수 있습니다!
추론을 실행할 이미지를 로드합니다:
>>> ds = load_dataset("ethz/food101", split="validation[:10]")
>>> image = ds["image"][0]
파인튜닝한 모델을 추론에 적용해 보는 가장 간단한 방법은 pipeline()을 사용하는 것입니다. 모델로 이미지 분류용 pipeline을 생성한 후, 이미지를 전달하세요:
>>> from transformers import pipeline
>>> classifier = pipeline("image-classification", model="my_awesome_food_model")
>>> classifier(image)
[{'score': 0.31856709718704224, 'label': 'beignets'},
{'score': 0.015232225880026817, 'label': 'bruschetta'},
{'score': 0.01519392803311348, 'label': 'chicken_wings'},
{'score': 0.013022331520915031, 'label': 'pork_chop'},
{'score': 0.012728818692266941, 'label': 'prime_rib'}]원하시는 경우 pipeline의 결과를 수동으로 재현할 수도 있습니다:
input을 PyTorch 텐서로 반환하도록 이미지를 전처리하는 이미지 프로세서를 로드합니다:
>>> from transformers import AutoImageProcessor
>>> import torch
>>> image_processor = AutoImageProcessor.from_pretrained("my_awesome_food_model")
>>> inputs = image_processor(image, return_tensors="pt")입력을 모델에 전달하고 logits를 반환합니다:
>>> from transformers import AutoModelForImageClassification
>>> model = AutoModelForImageClassification.from_pretrained("my_awesome_food_model")
>>> with torch.no_grad():
... logits = model(**inputs).logits가장 높은 확률을 가진 예측 라벨을 가져오고, 모델의 id2label 매핑을 사용하여 라벨로 변환합니다:
>>> predicted_label = logits.argmax(-1).item()
>>> model.config.id2label[predicted_label]
'beignets'