Phát hiện vật thể nhỏ bằng cách chia ảnh thành tile trong Ultralytics YOLO, từ Python đến Rust
Xem khi nào chia ảnh thành tile giúp YOLO phát hiện vật thể nhỏ, so sánh chi phí và chạy suy luận chia tile tích hợp sẵn bằng Python hoặc Rust mà không cần SAHI.
Onuralp Sezer19 phút đọc
Vì sao detector hoạt động tốt trên ảnh thông thường lại bỏ sót hầu hết mọi người trong khung hình drone? Thường là vì detector không bao giờ nhìn thấy họ ở kích thước đầy đủ. Với imgsz=640 mặc định, Ultralytics YOLO thu nhỏ khung hình 1920 x 1080 ba lần trước khi model xử lý, khiến người đi bộ cao 15 pixel chỉ còn khoảng 5 pixel.
Chia ảnh thành tile có thể giữ lại chi tiết của vật thể nhỏ bằng cách chạy model trên các cửa sổ chồng lấn của ảnh độ phân giải đầy đủ rồi gộp kết quả. Trên một khung hình VisDrone trong tài liệu của chúng tôi, cách này giúp Ultralytics YOLO26s tăng số phát hiện từ 35 lên 161. Đổi lại, mỗi khung hình cần xử lý nhiều hơn: tám đầu vào tile thay vì một ảnh.
Tiling hiện được tích hợp sẵn ở cả hai đầu của quy trình triển khai. Package Python đã có đối số tile từ Ultralytics 8.4.204 vào ngày 6 tháng 11, còn crate Rust bổ sung cờ --tile trong Ultralytics Inference 0.0.57 vào ngày 9 tháng 11. Hướng dẫn này trình bày khi nào tiling khôi phục được vật thể nhỏ, chi phí ra sao và cách chạy trên từng nền tảng.
Việc đổi kích thước làm vật thể nhỏ bị che khuất#
Phát hiện vật thể nhỏ khó vì một lý do đơn giản: vật thể chỉ có số pixel vốn có của nó. Model phát hiện vật thể học hình dạng từ một vài pixel trên mỗi vật thể; khi toàn bộ khung hình được thu nhỏ sao cho cạnh dài nhất chỉ còn 640 pixel, người, phương tiện và lỗi ở xa sẽ nhỏ hơn mức mà mạng có thể phân biệt với kết cấu và nhiễu.
Điều này thể hiện rõ nhất trong ảnh chụp từ trên không, phân tích ảnh vệ tinh, camera giao thông góc rộng và camera an ninh, cũng như ảnh kiểm tra độ phân giải cao. VisDrone là bộ benchmark ảnh chụp từ trên không công khai được sử dụng rộng rãi: tài liệu mô tả các vật thể thường chỉ rộng vài chục pixel trong khung hình, tập trung dày đặc và bị che khuất nhiều.
Tiling giữ lại những pixel đó. Khi đặt tile bằng kích thước đầu vào của model, model sẽ xử lý nhiều cửa sổ ở độ phân giải gốc thay vì chạy một lượt trên khung hình đã thu nhỏ. Ý tưởng này tương tự phương pháp mà bài báo SAHI gọi là suy luận tăng cường bằng lát cắt; các tác giả đã đánh giá phương pháp này trên các bộ dữ liệu ảnh chụp từ trên không VisDrone và xView.
Trong hướng dẫn High Resolution Tiling, YOLO26s trên một khung hình VisDrone 1920 x 1080 với ngưỡng confidence mặc định trả về 35 phát hiện trên toàn ảnh tại imgsz=640, và 161 phát hiện với tile=640, bao gồm người đi bộ, người đi xe đạp và ô tô ở xa. Hướng dẫn hiển thị hai ảnh cạnh nhau. Đây là số lượng dự đoán, không phải kết quả đánh giá có chấm điểm. Cả hai số lượng đều được tạo bằng cùng một bộ trọng số; tiling cũng làm thay đổi ngữ cảnh mà mỗi cửa sổ nhìn thấy.

Một khung hình xác thực VisDrone 1920 x 1080 khác, YOLO26s với confidence mặc định: 8 phát hiện trên toàn khung hình tại imgsz=640, 128 phát hiện với tile=640. Hiển thị phần đường được cắt ra, các khung không có nhãn lớp.
Tiling thêm một đầu vào model cho mỗi cửa sổ#
Hướng dẫn mô tả chính xác cách chia cửa sổ. Các cửa sổ chồng lấn 20% theo mặc định; hàng và cột cuối cùng được căn theo ranh giới ảnh, vì vậy các cửa sổ ở mép có thể chồng lấn nhiều hơn. Ảnh nhỏ hơn cửa sổ sẽ chỉ có một cửa sổ bao trọn ảnh.
Nhờ vậy, chi phí có thể dự đoán dễ dàng. Khung hình 1920 x 1080 tại tile=640 chạy qua tám cửa sổ, bốn cửa sổ theo chiều ngang và hai theo chiều dọc. Khung hình 3840 x 2160 tại tile=1280 cũng chạy qua tám cửa sổ. Áp dụng cùng quy tắc 20% cho khung hình 3840 x 2160 tại tile=640 sẽ tạo ra tám cột và bốn hàng, tổng cộng 32 cửa sổ; do đó, giảm một nửa kích thước cửa sổ trên khung hình 4K sẽ làm số đầu vào tile tăng gấp bốn.

Tám cửa sổ tile=640 trên khung hình 1920 x 1080: các cột bắt đầu tại x = 0, 512, 1024 và 1280; các hàng bắt đầu tại y = 0 và 440. Các dải được tô bóng là vùng xuất hiện trong nhiều cửa sổ.
Batching thay đổi cách các đầu vào này được đưa vào model. Trong Python, batch đặt số cửa sổ được đưa vào model cùng lúc trong một lệnh gọi suy luận; crate Rust làm tương tự bằng --batch trên bản export hỗ trợ dynamic batch. Batching có thể cải thiện throughput, nhưng hãy đo latency trên phần cứng của bạn; hướng dẫn suy luận theo batch với Ultralytics YOLO giải thích lý do.
Sau đây là so sánh giữa tiling và các cách khác để cung cấp thêm pixel cho vật thể nhỏ:
| Phương thức | Đầu vào model cho khung hình 1920 x 1080 | Model nhìn thấy gì | Phù hợp nhất khi |
|---|---|---|---|
Toàn bộ ảnh, imgsz=640 | 1 | Khung hình thu nhỏ 3 lần | Vật thể vẫn hiển thị rõ sau khi đổi kích thước |
Toàn bộ ảnh, imgsz=1280 | 1, với lượng tính toán xấp xỉ gấp 4 lần so với 640 | Khung hình thu nhỏ 1,5 lần | Bộ nhớ và latency cho phép dùng đầu vào lớn hơn |
tile=True cùng với imgsz=640 | 8 | Các cửa sổ 640 pixel ở độ phân giải gốc | Ảnh lớn hơn đầu vào model nhiều lần |
tile=400 cùng với imgsz=640 | Trên 8 | Các cửa sổ được phóng to lên 640 | Vật thể chỉ rộng vài pixel ngay cả ở độ phân giải gốc |
Mỗi tile là một đầu vào model có kích thước thông thường, vì vậy tiling xử lý được ảnh rất lớn mà không cần tăng imgsz. Các đầu ra có kích thước bằng ảnh nguồn như mask và bản đồ độ sâu vẫn cần bộ nhớ tỷ lệ thuận với ảnh gốc, còn max_det giới hạn số mask instance được giữ lại.
Khi nào tiling có ích và khi nào gây bất lợi#
Tiling hữu ích khi vật thể nhỏ so với khung hình và khung hình lớn hơn nhiều so với đầu vào model. Ảnh từ drone và vệ tinh, giao thông nhìn từ trên cao, đám đông, ảnh chụp góc rộng các kệ hàng bán lẻ và ảnh kiểm tra bằng thị giác toàn bộ bo mạch hoặc tấm panel đều phù hợp.
Tiling gây bất lợi khi vật thể lớn. Một cửa sổ chỉ nhìn thấy một phần chiếc xe tải chiếm nửa khung hình, và hướng dẫn nêu rõ điều này: vật thể lớn hơn phần chồng lấn vẫn có thể bị chia cắt vì không cửa sổ nào nhìn thấy toàn bộ vật thể; việc gộp cũng không nối các phần rời nhau. Tiling cũng loại bỏ ngữ cảnh toàn cục, điều đặc biệt quan trọng với phân loại và độ sâu, vì đầu ra của các tile có thể không nhất quán trên toàn ảnh.
Cửa sổ nhỏ hơn tạo thêm một sự đánh đổi. Phóng to cửa sổ 400 pixel lên 640 giúp phát hiện vật thể chỉ rộng vài pixel, nhưng cũng phóng to các chi tiết nền lộn xộn, có thể tạo ra false positive. Hãy so sánh hai hoặc ba kích thước tile trên tập xác thực của riêng bạn và theo dõi cả precision lẫn recall.
Cách gộp tile thành một kết quả duy nhất#
Mỗi cửa sổ tạo ra dự đoán riêng theo tọa độ cửa sổ. Tiling ánh xạ chúng trở lại ảnh nguồn và trả về một đối tượng Results cho mỗi ảnh gốc, vì vậy mã downstream đọc result.boxes vẫn hoạt động như cũ.
Do có vùng chồng lấn, một vật thể gần đường ghép có thể bị phát hiện hai lần. Với tác vụ phát hiện, các kết quả trùng lặp được loại bỏ bằng non-maximum suppression theo các thiết lập iou, agnostic_nms và max_det của bạn; do đó, hướng dẫn tinh chỉnh ngưỡng IoU của NMS áp dụng trực tiếp cho đầu ra chia tile. Một khung bị cắt ở mép cửa sổ sẽ bị loại khi cửa sổ khác nhìn thấy vật thể không sát mép và có khung được giữ lại bao phủ nó, nhờ vậy kết quả ở đường ghép sẽ giữ lại dự đoán đầy đủ hơn. Khung bị cắt mà không có kết quả phù hợp hơn sẽ được giữ lại.

Minh họa cách xử lý đường ghép tại y = 640 trong cùng khung hình. Các khung màu cyan bị cắt ở cạnh dưới của cửa sổ hàng trên, các khung màu magenta đến từ cửa sổ hàng dưới; bảng bên phải hiển thị khung đầy đủ hơn được giữ lại cho mỗi ô tô sau khi gộp.
Mỗi tác vụ Ultralytics YOLO gộp kết quả theo cách riêng:
- Detect, segment, pose và OBB khôi phục box, mask, keypoint hoặc box xoay về tọa độ ảnh nguồn rồi chọn box; OBB dùng NMS xoay.
- Phân đoạn ngữ nghĩa ghép các bản đồ lớp, chọn tile nằm gần tâm nhất tại vùng các cửa sổ chồng lấn.
- Độ sâu hòa trộn các bản đồ độ sâu chồng lấn bằng trọng số tăng dần về phía tâm của mỗi tile.
- Phân loại lấy trung bình xác suất của các tile.
Pipeline Python cũng chia tile khi dự đoán bằng YOLO-World, YOLOE, RT-DETR và FastSAM. SAM dùng pipeline cắt ảnh riêng và không chấp nhận tile.
Suy luận chia tile trong Python với đối số tile#
Tiling yêu cầu Ultralytics 8.4.204 trở lên và không cần package bổ sung. Trong chế độ predict, truyền tile=True để dùng imgsz làm kích thước cửa sổ, hoặc truyền số nguyên để đặt riêng kích thước cửa sổ:
from ultralytics import YOLO
model = YOLO("yolo26s.pt")
# Cơ sở: chạy một lượt trên khung hình được thu nhỏ còn 640 pixel
full = model.predict("intersection.jpg", imgsz=640)
# Chia tile: cửa sổ 640 pixel ở độ phân giải gốc, 8 cửa sổ mỗi batch
tiled = model.predict("intersection.jpg", imgsz=640, tile=640, batch=8)
print(len(full[0].boxes), len(tiled[0].boxes))Đối số này cũng hoạt động với CLI thông qua yolo predict model=yolo26s.pt source=large-image.tif tile=640 imgsz=640 batch=8. Với video, truyền stream=True để giới hạn mức sử dụng bộ nhớ. Trong chế độ track, tracker chạy một lần mỗi khung hình trên các dự đoán đã gộp.
Tiling không chỉ dành cho dự đoán. Khi ảnh lớn hơn nhiều so với imgsz, hãy huấn luyện và xác thực bằng cùng thiết lập:
- Huấn luyện trên tile bằng
model.train(data="aerial.yaml", tile=True, imgsz=640). Nhãn được cắt theo từng cửa sổ; các instance còn lại dưới 10% diện tích box ban đầu sẽ bị loại bỏ, còn các cửa sổ trống vẫn được giữ làm ví dụ âm. - Xác thực trên kết quả đã gộp bằng
model.val(data="aerial.yaml", tile=True, imgsz=640). Dự đoán được gộp trước khi chấm điểm với annotation gốc, nhờ đó mAP phản ánh đúng những gì bạn sẽ triển khai. - Cache ảnh nguồn lớn bằng
cache="ram", vì quá trình huấn luyện xáo trộn các tile; nếu không, cùng một ảnh lớn sẽ phải được giải mã nhiều lần. - So sánh với baseline toàn ảnh trên cùng tập chia xác thực trước khi giữ lại model chia tile. Để biết thêm cách cải thiện điểm số cho vật thể nhỏ, xem checklist mAP cho vật thể nhỏ của chúng tôi.
Huấn luyện trên tile giúp model nhìn thấy vật thể ở đúng tỷ lệ mà model sẽ gặp khi dự đoán bằng tile. Hướng dẫn về bộ dữ liệu phát hiện bằng drone của chúng tôi hướng dẫn toàn bộ quy trình huấn luyện, chia tile và đánh giá trên khung hình 4K.
Model đã export cũng hỗ trợ tiling. Tiling chạy trong pipeline dự đoán Python, vì vậy model được export sang ONNX hoặc TensorRT vẫn giữ graph đầu vào thông thường; YOLO("yolo26s.onnx").predict(source, tile=640) hoạt động như thường lệ, bao gồm kích thước batch export cố định và batch cuối không đầy.

Bộ dữ liệu VisDrone trong Ultralytics Platform, một bộ benchmark có sẵn để thử nghiệm kích thước tile trước khi gán nhãn dữ liệu của riêng bạn.
Để thử kích thước tile trước trên dữ liệu công khai, hãy bắt đầu từ bộ dữ liệu VisDrone trên Ultralytics Platform. Để theo dõi một lần chạy chia tile bên cạnh baseline, hãy sao chép lệnh Local Training từ hộp thoại huấn luyện trên Platform, đặt project thành project Platform của baseline rồi thêm tile=True để truyền metric của lần chạy chia tile đến đó.
Suy luận chia tile trong Rust với cờ --tile mới#
Ultralytics Inference là crate Rust và CLI của chúng tôi để chạy model ONNX đã export thông qua ONNX Runtime và model OpenVINO IR theo cách native, không cần runtime Python khi suy luận. Công cụ này dành cho server, container và thiết bị edge, hỗ trợ CPU, CUDA, TensorRT, CoreML, OpenVINO và các execution provider khác. Phiên bản 0.0.57 mang đến phương pháp tiling tương tự Python: cửa sổ chồng lấn cơ sở 20%, ánh xạ kết quả về ảnh nguồn và loại bỏ kết quả trùng lặp theo từng lớp.

Hình minh họa. Camera ven đường cùng máy tính edge, đại diện cho kiểu triển khai không cần Python mà crate Rust hướng đến.
Nhóm đã đối chiếu đầu ra chia tile với Ultralytics Python trên ONNX Runtime CPU, OpenVINO CPU, GPU và NPU, CUDA và TensorRT, với ảnh, video và webcam. Các model phát hiện, phân đoạn, phân đoạn ngữ nghĩa, độ sâu, phân loại, pose và OBB đều được hỗ trợ.
Trong CLI, thêm --tile kèm kích thước cửa sổ hoặc chỉ truyền cờ này để dùng --imgsz. Export model là bước Python chỉ cần thực hiện một lần; bản thân quá trình suy luận chỉ cần binary Rust:
# One-time export in Python: a dynamic-batch ONNX model so several windows run per call
pip install -U "ultralytics[export-base]>=8.4.204"
yolo export model=yolo26s.pt format=onnx dynamic=True
# Install the Rust CLI
cargo install ultralytics-inference
# Tiled inference on a large image: 640-pixel windows, 8 per batch
ultralytics-inference predict --model yolo26s.onnx --source aerial.jpg --tile 640 --batch 8Khi dùng dưới dạng thư viện, hãy đặt tiling một lần trong InferenceConfig; mọi lệnh gọi predict đều sẽ chia tile. with_tile(0) sử dụng kích thước suy luận:
use ultralytics_inference::{InferenceConfig, YOLOModel};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = InferenceConfig::new().with_tile(640);
let mut model = YOLOModel::load_with_config("yolo26s.onnx", config)?;
let results = model.predict("aerial.jpg")?;
if let Some(ref boxes) = results[0].boxes {
println!("{} detections", boxes.len());
}
Ok(())
}Các box trùng lặp giữa các cửa sổ được loại bỏ bằng NMS theo từng lớp tại giá trị --iou đã cấu hình, mặc định là 0.5 kể từ cùng bản phát hành đó và khớp với mặc định dự đoán của Ultralytics. Tiling mặc định tắt vì mỗi cửa sổ là một đầu vào model bổ sung. Hãy bật tính năng này khi chi tiết quan trọng, đo latency suy luận trên thiết bị mục tiêu và chọn execution provider phù hợp; so sánh ONNX với TensorRT của chúng tôi hữu ích với phần cứng NVIDIA, còn hướng dẫn NVIDIA Jetson trình bày cách thiết lập trên thiết bị.
Người dùng SAHI có thể chuyển sang đối số tile tích hợp sẵn#
Nếu bạn đã dùng thư viện SAHI để chia ảnh, đối số tích hợp sẵn thực hiện cùng chức năng bên trong Ultralytics mà không cần package thứ hai hay định dạng kết quả riêng. Hướng dẫn tích hợp SAHI của chúng tôi hiện không còn được khuyến nghị và đã được thay thế bằng tile.
Chuyển đổi script SAHI chủ yếu là thay đổi đối số:
| SAHI | Tiling tích hợp sẵn |
|---|---|
AutoDetectionModel.from_pretrained(model_type="ultralytics", ...) | YOLO("yolo26s.pt") |
get_sliced_prediction(image, model, slice_height=256, slice_width=256, ...) | model.predict(image, tile=256) |
overlap_height_ratio, overlap_width_ratio | Mức chồng lấn cơ sở cố định 20%, cửa sổ ở mép được căn theo ranh giới ảnh |
SAHI PredictionResult | Results tiêu chuẩn của Ultralytics |
Các cửa sổ có dạng vuông; quy tắc chồng lấn và gộp được mô tả ở trên, thay vì dùng cơ chế hậu xử lý có thể cấu hình của SAHI, vì vậy kết quả box sẽ tương tự chứ không hoàn toàn giống nhau. Sau khi chuyển đổi, hãy kiểm tra lại các ngưỡng trên tập xác thực.
Khác biệt thực tế nằm ở khả năng tích hợp. tile kết nối với quy trình huấn luyện, xác thực, dự đoán và tracking của Ultralytics bằng cùng một đối số, trả về các đối tượng Results tiêu chuẩn và có tùy chọn tương ứng trong crate Rust; nhờ vậy, kích thước tile đã xác thực trong notebook có thể được chuyển sang binary Rust trên thiết bị edge.
Ai nên bật tiling#
Hãy bật tiling nếu bạn chạy Ultralytics YOLO trên ảnh lớn hơn đầu vào model nhiều lần và kết quả xác thực cho thấy bỏ sót vật thể nhỏ: các nhóm dùng drone và vệ tinh, đơn vị tích hợp hệ thống giao thông và an ninh dùng camera góc rộng, cùng các nhóm kiểm tra chụp toàn bộ bo mạch, tấm panel hoặc kệ hàng. Người dùng Rust có thể áp dụng cùng phương pháp tiling trên phần cứng edge mà không cần runtime Python.
Hãy tắt tính năng này khi vật thể lớn so với khung hình, khi imgsz lớn hơn đã phát hiện được vật thể chỉ trong một lượt, hoặc khi ngân sách latency không thể đáp ứng nhiều đầu vào tile cho mỗi khung hình. Trong mọi trường hợp, hãy so sánh kết quả chia tile và toàn ảnh trên cùng tập chia xác thực, với cùng ngưỡng confidence; đánh giá recall, false positive và latency, rồi chỉ giữ tiling ở những nơi lợi ích xứng đáng với chi phí bổ sung.
Ultralytics Platform tập hợp việc so sánh tại một nơi: gán nhãn ảnh độ phân giải cao của riêng bạn hoặc bắt đầu với VisDrone, huấn luyện baseline toàn ảnh trên GPU đám mây, huấn luyện một baseline khác với imgsz lớn hơn, rồi ghi log lần chạy chia tile từ máy của bạn vào cùng project. Hướng dẫn High Resolution Tiling trình bày chi tiết các tùy chọn tiling, còn tài liệu Ultralytics Inference hướng dẫn triển khai Rust.
Cả package Python lẫn crate Rust đều được cung cấp theo AGPL-3.0. Nếu bạn đưa tính năng phát hiện chia tile vào sản phẩm mã nguồn đóng hoặc thiết bị edge bán cho khách hàng, Giấy phép Ultralytics Enterprise cho phép sử dụng thương mại phần mềm Ultralytics thuộc phạm vi giấy phép mà không phải đáp ứng yêu cầu công bố mã nguồn của AGPL-3.0, tùy theo các điều khoản của giấy phép.
Câu hỏi thường gặp
Chia ảnh thành tile là tách ảnh lớn thành các cửa sổ chồng lấn, chạy detector trên từng cửa sổ rồi gộp các box trở lại ảnh gốc. Khi cửa sổ có kích thước bằng đầu vào model, vật thể nhỏ giữ được những pixel mà chúng sẽ mất nếu toàn bộ ảnh bị đổi kích thước. Trong Ultralytics YOLO, đối số
tilethực hiện việc này với mức chồng lấn cơ sở 20% và trả về một kết quả cho mỗi ảnh.Trước tiên, hãy kiểm tra xem đổi kích thước có phải là vấn đề hay không: nếu vật thể chỉ còn vài pixel tại
imgsz=640, hãy thửimgszhoặctile=Truelớn hơn. Huấn luyện với cùng thiết lập sẽ dùng khi dự đoán để model học vật thể ở tỷ lệ triển khai, đồng thời xác thực theo kích thước và lớp. Tiling phù hợp với ảnh lớn hơn đầu vào model nhiều lần.Tiling thêm một đầu vào model cho mỗi cửa sổ: khung hình 1920 x 1080 tại
tile=640tạo ra tám đầu vào tile thay vì một ảnh. Chạy nhiều tile trong một lệnh gọi theo batch, vớibatchtrong Python hoặc--batchcùng bản export hỗ trợ dynamic batch trong Rust, có thể cải thiện throughput. Hãy đo latency trên phần cứng mục tiêu.Không. Từ Ultralytics 8.4.204, đối số
tiletích hợp sẵn xử lý suy luận bằng cách chia ảnh mà không cần package bổ sung; tính năng này cũng chia tile khi huấn luyện, xác thực và tracking. Hướng dẫn SAHI trong tài liệu của chúng tôi không còn được khuyến nghị và đã được thay thế bằngtile.Có. Trong Python, model đã export vẫn giữ graph đầu vào thông thường; bạn truyền
tilechopredictnhư thường lệ. Trong Rust, Ultralytics Inference 0.0.57 bổ sung--tilevào CLI vàwith_tilevàoInferenceConfig; tính năng này đã được kiểm tra đối chiếu với Python trên ONNX Runtime CPU, OpenVINO, CUDA và TensorRT.Bắt đầu với
tile=True, sử dụngimgszlàm kích thước cửa sổ. Dùng cửa sổ nhỏ hơn, chẳng hạn nhưtile=400cùng vớiimgsz=640, khi các đối tượng chỉ rộng vài pixel ngay cả ở độ phân giải gốc; dùng cửa sổ lớn hơn khi có nguy cơ đối tượng bị cắt ở các đường nối. So sánh một vài kích thước trên tập validation, đồng thời theo dõi recall và số lượng dự đoán dương tính giả.
Được viết bởi
Bình luận
Đặt câu hỏi, chia sẻ kết quả hoặc giúp đỡ người khác.










