Transformers documentation
Ước lượng độ sâu đơn mục
Ước lượng độ sâu đơn mục
Ước lượng độ sâu đơn mục là một tác vụ thị giác máy tính, liên quan đến việc dự đoán thông tin độ sâu của một cảnh từ một hình ảnh duy nhất. Nói cách khác, đây là quá trình ước lượng khoảng cách của các đối tượng trong một cảnh từ một góc nhìn camera đơn.
Ước lượng độ sâu đơn mục có nhiều ứng dụng, bao gồm tái tạo 3D, thực tế tăng cường, lái xe tự hành và robot. Đây là một nhiệm vụ đầy thách thức vì nó đòi hỏi mô hình phải hiểu được các mối quan hệ phức tạp giữa các đối tượng trong cảnh và thông tin độ sâu tương ứng, vốn có thể bị ảnh hưởng bởi các yếu tố như điều kiện ánh sáng, che khuất và kết cấu.
Có hai phân loại chính về ước lượng độ sâu:
Ước lượng độ sâu tuyệt đối: Biến thể tác vụ này nhằm cung cấp các phép đo độ sâu chính xác từ camera. Thuật ngữ này được dùng thay thế cho ước lượng độ sâu theo đơn vị, trong đó độ sâu được cung cấp bằng các phép đo chính xác theo mét hoặc foot. Các mô hình ước lượng độ sâu tuyệt đối xuất ra các bản đồ độ sâu với các giá trị số đại diện cho khoảng cách thực tế.
Ước lượng độ sâu tương đối: Ước lượng độ sâu tương đối nhằm dự đoán thứ tự độ sâu của các đối tượng hoặc điểm trong một cảnh mà không cung cấp các phép đo chính xác. Các mô hình này xuất ra một bản đồ độ sâu chỉ ra phần nào của cảnh gần hơn hoặc xa hơn so với phần khác mà không có khoảng cách thực tế đến A và B.
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách suy luận với Depth Anything V2, một mô hình ước lượng độ sâu tương đối zero-shot tiên tiến, và ZoeDepth, một mô hình ước lượng độ sâu tuyệt đối.
Xem trang tác vụ Ước lượng độ sâu để xem tất cả các kiến trúc và checkpoint tương thích.
Trước khi bắt đầu, chúng ta cần cài đặt phiên bản mới nhất của Transformers:
pip install -q -U transformers
Đường ống xử lý ước lượng độ sâu
Cách đơn giản nhất để thử nghiệm suy luận với một mô hình hỗ trợ ước lượng độ sâu là sử dụng pipeline() tương ứng. Tạo một pipeline từ checkpoint trên Hugging Face Hub:
>>> from transformers import pipeline
from accelerate import Accelerator
>>> import torch
>>> device = Accelerator().device
>>> checkpoint = "depth-anything/Depth-Anything-V2-base-hf"
>>> pipe = pipeline("depth-estimation", model=checkpoint, device=device)Tiếp theo, hãy chọn một hình ảnh để phân tích:
>>> from PIL import Image
>>> import requests
>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image
Truyền ảnh vào pipeline.
>>> predictions = pipe(image)Pipeline trả về một từ điển với hai mục. Mục đầu tiên, gọi là predicted_depth, là một tensor có các giá trị biểu thị độ sâu tính bằng mét cho từng pixel.
Mục thứ hai, depth, là một hình ảnh PIL trực quan hóa kết quả ước lượng độ sâu.
Hãy cùng xem kết quả trực quan hóa:
>>> predictions["depth"]
Suy luận ước lượng độ sâu thủ công
Giờ đây, khi bạn đã thấy cách sử dụng pipeline ước lượng độ sâu, hãy cùng xem cách chúng ta có thể tái tạo cùng một kết quả bằng cách thủ công.
Bắt đầu bằng cách tải model và processor liên quan từ một checkpoint trên Hugging Face Hub. Ở đây chúng ta sẽ sử dụng cùng một checkpoint như trước đó:
>>> from transformers import AutoImageProcessor, AutoModelForDepthEstimation
>>> checkpoint = "Intel/zoedepth-nyu-kitti"
>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)
>>> model = AutoModelForDepthEstimation.from_pretrained(checkpoint).to(device)Chuẩn bị đầu vào hình ảnh cho mô hình bằng cách sử dụng image_processor, thành phần sẽ xử lý các phép biến đổi hình ảnh cần thiết
như thay đổi kích thước và chuẩn hóa:
>>> pixel_values = image_processor(image, return_tensors="pt").pixel_values.to(device)Đưa các đầu vào đã chuẩn bị qua mô hình:
>>> import torch
>>> with torch.no_grad():
... outputs = model(pixel_values)Hãy xử lý hậu kết quả để loại bỏ mọi padding và thay đổi kích thước bản đồ độ sâu cho khớp với kích thước ảnh gốc. post_process_depth_estimation trả về một danh sách các dict chứa "predicted_depth".
>>> # ZoeDepth dynamically pads the input image. Thus we pass the original image size as argument
>>> # to `post_process_depth_estimation` to remove the padding and resize to original dimensions.
>>> post_processed_output = image_processor.post_process_depth_estimation(
... outputs,
... source_sizes=[(image.height, image.width)],
... )
>>> predicted_depth = post_processed_output[0]["predicted_depth"]
>>> depth = (predicted_depth - predicted_depth.min()) / (predicted_depth.max() - predicted_depth.min())
>>> depth = depth.detach().cpu().numpy() * 255
>>> depth = Image.fromarray(depth.astype("uint8"))Trong phiên bản triển khai ban đầu, mô hình ZoeDepth thực hiện suy luận trên cả ảnh gốc và ảnh lật rồi lấy trung bình các kết quả. Hàm
post_process_depth_estimationcó thể xử lý điều này cho chúng ta bằng cách truyền các đầu ra đã lật vào tham số tùy chọnoutputs_flipped:>>> with torch.no_grad(): ... outputs = model(pixel_values) ... outputs_flipped = model(pixel_values=torch.flip(inputs.pixel_values, dims=[3])) >>> post_processed_output = image_processor.post_process_depth_estimation( ... outputs, ... source_sizes=[(image.height, image.width)], ... outputs_flipped=outputs_flipped, ... )
