Transformers documentation

Trích xuất đặc trưng 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 (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Trích xuất đặc trưng hình ảnh

Trích xuất đặc trưng hình ảnh là nhiệm vụ trích xuất các đặc trưng mang ý nghĩa ngữ nghĩa từ một hình ảnh. Việc này có nhiều trường hợp sử dụng, bao gồm so sánh độ tương đồng giữa các hình ảnh và truy xuất hình ảnh. Hơn nữa, hầu hết các mô hình thị giác máy tính đều có thể được sử dụng để trích xuất đặc trưng hình ảnh, trong đó người ta có thể loại bỏ phần đầu (head) dành riêng cho từng tác vụ (phân loại hình ảnh, phát hiện đối tượng, v.v.) để lấy các đặc trưng. Những đặc trưng này rất hữu ích ở cấp độ cao hơn: phát hiện cạnh, phát hiện góc, v.v. Chúng cũng có thể chứa thông tin về thế giới thực (ví dụ: một con mèo trông như thế nào) tùy thuộc vào độ sâu của mô hình. Do đó, các đầu ra này có thể được sử dụng để huấn luyện các bộ phân loại mới trên một tập dữ liệu cụ thể.

Trong hướng dẫn này, bạn sẽ:

  • Học cách xây dựng một hệ thống tìm kiếm hình ảnh tương tự đơn giản dựa trên pipeline image-feature-extraction.
  • Hoàn thành cùng một tác vụ bằng suy luận mô hình thô.

Độ tương đồng hình ảnh bằng Pipeline image-feature-extraction

Chúng ta có hai hình ảnh mèo ngồi trên lưới cá, một trong số đó được tạo ra.

from PIL import Image
import requests

img_urls = ["https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png", "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.jpeg"]
image_real = Image.open(requests.get(img_urls[0], stream=True).raw).convert("RGB")
image_gen = Image.open(requests.get(img_urls[1], stream=True).raw).convert("RGB")

Hãy xem pipeline hoạt động. Trước tiên, khởi tạo pipeline. Nếu bạn không truyền bất kỳ model nào, pipeline sẽ được khởi tạo tự động với google/vit-base-patch16-224. Nếu bạn muốn tính độ tương tự, hãy đặt pool thành True.

import torch
from transformers import pipeline
from accelerate import Accelerator
# automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.)
device = Accelerator().device
pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-384", device=device, pool=True)

Để suy luận bằng pipe, hãy truyền cả hai hình ảnh vào nó.

outputs = pipe([image_real, image_gen])

Đầu ra chứa các embedding đã được pool của hai hình ảnh đó.

# get the length of a single output
print(len(outputs[0][0]))
# show outputs
print(outputs)

# 768
# [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577,

Để lấy điểm tương đồng, chúng ta cần truyền chúng vào một hàm tương đồng.

from torch.nn.functional import cosine_similarity

similarity_score = cosine_similarity(torch.Tensor(outputs[0]),
                                     torch.Tensor(outputs[1]), dim=1)

print(similarity_score)

# tensor([0.6043])

Nếu bạn muốn lấy các trạng thái ẩn cuối cùng trước khi pooling, hãy tránh truyền bất kỳ giá trị nào cho tham số pool, vì mặc định nó được đặt thành False. Các trạng thái ẩn này hữu ích để huấn luyện các bộ phân loại hoặc mô hình mới dựa trên các đặc trưng từ mô hình.

pipe = pipeline(task="image-feature-extraction", model="google/vit-base-patch16-224", device=device)
outputs = pipe(image_real)

Vì các đầu ra không được pool, chúng ta nhận được các trạng thái ẩn cuối cùng trong đó chiều đầu tiên là kích thước batch, và hai chiều cuối cùng là hình dạng embedding.

import numpy as np
print(np.array(outputs).shape)
# (1, 197, 768)

Lấy đặc trưng và độ tương đồng bằng AutoModel

Chúng ta cũng có thể sử dụng lớp AutoModel của transformers để lấy các đặc trưng. AutoModel nạp bất kỳ model transformers nào không có đầu (head) dành riêng cho tác vụ, và chúng ta có thể dùng nó để lấy các đặc trưng.

from transformers import AutoImageProcessor, AutoModel

processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = AutoModel.from_pretrained("google/vit-base-patch16-224").to(device)

Hãy viết một hàm suy luận đơn giản. Chúng ta sẽ truyền các đầu vào vào processor trước, sau đó truyền kết quả đầu ra của nó vào model.

def infer(image):
  inputs = processor(image, return_tensors="pt").to(device)
  outputs = model(**inputs)
  return outputs.pooler_output

Chúng ta có thể truyền trực tiếp các hình ảnh vào hàm này và nhận được các vector nhúng.

embed_real = infer(image_real)
embed_gen = infer(image_gen)

Chúng ta có thể lấy lại độ tương tự trên các vector nhúng.

from torch.nn.functional import cosine_similarity

similarity_score = cosine_similarity(embed_real, embed_gen, dim=1)
print(similarity_score)

# tensor([0.6061], device='cuda:0', grad_fn=<SumBackward1>)
Update on GitHub