Phát hiện điểm

Phát hiện điểm trả về một vị trí x, y trên mỗi đối tượng thay vì bounding box. LibreYOLO cung cấp dưới dạng tác vụ point, và một dự đoán mang một dòng x, y, lớp đối tượng cùng độ tin cậy cho mỗi đối tượng.

Định nghĩa

Tác vụ point định vị mỗi đối tượng bằng một tọa độ x, y và một lớp đối tượng, không có chiều rộng, chiều cao hoặc mặt nạ. Vì dự đoán là danh sách phẳng các đối tượng, số dòng chính là số đối tượng, đây là lý do nó trở thành tác vụ đếm.

Dự đoán điền result.points, một payload Points bọc mảng (N, 4) gồm các dòng x, y, class, confidence theo pixel ảnh gốc. .xy trả về tọa độ, .xyn trả về cùng tọa độ chia cho kích thước ảnh, .cls là index lớp đối tượng và .conf là điểm số; len() trả về số điểm. result.boxes luôn rỗng, vì vậy ioumax_det không có gì để tác động.

Mô hình

Ba family phục vụ point và không thể thay thế lẫn nhau.

FOMO là lựa chọn có từ vựng cố định: grid classifier gán nhãn từng cell của grid độ phân giải thấp thành background hoặc tâm đối tượng. Đây là point family duy nhất LibreYOLO có thể huấn luyện và cũng là family duy nhất có thể xuất.

LocateAnything nhận văn bản thay vì index lớp, vì vậy từ vựng là bất kỳ cụm từ nào bạn viết. Nó cần thành phần bổ sung vlm, được dựng dưới dạng LibreLocateAnything thay vì qua factory LibreYOLO(), còn trọng số bị giới hạn cho mục đích phi thương mại. Điều khoản chính xác cùng hai giấy phép bổ sung mà checkpoint kết hợp nằm trên trang của mô hình.

SenseNova-Vision thực hiện point qua cùng checkpoint sinh theo prompt dùng cho sáu tác vụ khác, được nạp bằng LibreVLM("sensenova-vision", task="point"). Nó cần thành phần bổ sung sensenova, và mỗi dự đoán là một generation pass trên mô hình 7B, vì vậy độ trễ trên mỗi ảnh cao hơn đáng kể so với detector chuyên dụng. Trọng số chỉ dùng cho mục đích phi thương mại; giấy phép nằm trên trang của mô hình.

Dự đoán

Trọng số LibreFOMO là ngoại lệ duy nhất của cơ chế tải tự động trên trang này. LibreYOLO("LibreFOMOs-point.pt") tìm tệp đó trên ổ đĩa và phát sinh ValueError nêu tên tệp thay vì tải. Trước hết hãy tải checkpoint từ tổ chức LibreYOLO trên Hugging Face rồi nạp bằng đường dẫn cục bộ, hoặc tự huấn luyện.

Dự đoán điểm và đếm
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Trọng số LibreFOMO không được tự động tải. Trước hết hãy tải checkpoint từ# https://huggingface.co/LibreYOLO rồi nạp bằng đường dẫn cục bộ.model = LibreYOLO("./LibreFOMOs-point.pt")result = model(SAMPLE_IMAGE, save=True) points = result.pointsprint(len(points))     # số lượng đối tượngprint(points.xy)       # tâm (N, 2) theo pixel ảnh gốcprint(points.cls, points.conf)
Tọa độ chuẩn hóa và số lượng theo lớp
from collections import Counter from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("./LibreFOMOs-point.pt")result = model(SAMPLE_IMAGE) points = result.points.numpy()print(points.xyn)                          # cùng các tâm đó trong [0, 1]print(Counter(points.cls.astype(int).tolist()))

Tên tệp phải mang hậu tố tác vụ -point để loader nhận dạng. predict(..., nms_radius=1) điều khiển khoảng cách tối thiểu theo cell grid để hai kết quả phát hiện FOMO cùng được giữ lại. Xem dự đoán để biết về nguồn, stream và cách xử lý kết quả.

Định dạng dataset

point không có định dạng nhãn riêng. Các point family đọc bố cục phát hiện YOLO chuẩn và suy ra một tâm từ từng dòng hộp, vì vậy cx cy là điểm, còn w h chỉ quyết định dòng có hợp lệ hay không.

dataset/
  data.yaml
  images/
    train/scene.jpg
    val/scene.jpg
  labels/
    train/scene.txt
    val/scene.txt

Mỗi tệp nhãn chứa một dòng trên mỗi đối tượng, với tọa độ chuẩn hóa:

<class_id> <cx> <cy> <w> <h>
yaml
path: dataset
train: images/train
val: images/val
nc: 1
names: {0: seedling}

Tệp nhãn bị thiếu hoặc rỗng nghĩa là không có đối tượng. Xem định dạng dataset để biết hợp đồng đầy đủ.

Huấn luyện

FOMO là point family duy nhất có implementation huấn luyện. train() trên LocateAnything và SenseNova-Vision phát sinh NotImplementedError; hãy tinh chỉnh chúng ở upstream rồi nạp kết quả.

Huấn luyện FOMO trên dataset YOLO
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.train(data="my-dataset.yaml", epochs=40, batch=32, lr0=3e-4)
Dự đoán bằng checkpoint đã huấn luyện
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("./LibreFOMOs-point.pt")results = model.train(data="my-dataset.yaml", epochs=40) # train() nạp lại checkpoint tốt nhất vào cùng đối tượng, vì vậy# mô hình dự đoán bằng trọng số đã huấn luyện khi lời gọi trả về.print(results["best_checkpoint"])print(model(SAMPLE_IMAGE).points.xy)

imgsz không phải lựa chọn tự do với FOMO: mặc định theo độ phân giải gốc của checkpoint đã nạp, còn truyền giá trị khác sẽ phát sinh ValueError nêu kích thước dự kiến. Xem huấn luyện để biết về dataset, logger và multi-GPU, cùng trang FOMO để biết giá trị mặc định của family.

Xác thực

val() khớp điểm dự đoán với điểm ground truth theo kiểu một-một bằng thuật toán Hungarian, trên một lượt quét ngưỡng khoảng cách. Ngưỡng là khoảng cách Euclid trong tọa độ ảnh chuẩn hóa, còn lượt quét mặc định gồm mười giá trị từ 0.01 đến 0.10.

Xác thực và đọc các key metric
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/precision"], metrics["metrics/recall"])print(metrics["metrics/f1"])print(metrics["metrics/mAP@[0.01:0.10]"])   # fitnessprint(metrics["metrics/MLE"])               # sai số định vị trung bìnhprint(metrics["metrics/MAE"], metrics["metrics/RMSE"])   # sai số số lượng
Thay đổi các ngưỡng khoảng cách
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt") # Biên lượt quét là một phần văn bản key, vì vậy lượt quét tùy chỉnh# đổi tên các key mAP được tạo ra.metrics = model.val(data="my-dataset.yaml", dist_thresholds=[0.02, 0.05]) print(metrics["metrics/mAP@0.02"])print(metrics["metrics/mAP@[0.02:0.05]"])

metrics/precision, metrics/recallmetrics/f1 được lấy macro-average trên các lớp tại ngưỡng nghiêm ngặt nhất của lượt quét, mặc định là 0.01. metrics/mAP@0.01 là average precision tại cùng ngưỡng, còn metrics/mAP@[0.01:0.10] là trung bình trên toàn lượt quét. Giá trị lượt quét cũng là fitness, con số mà cơ chế chọn checkpoint tốt nhất đọc. Cả hai key mAP được dựng từ ngưỡng đang dùng, vì vậy truyền dist_thresholds= sẽ đổi tên chúng.

metrics/MLE là khoảng cách trung bình giữa các cặp khớp tại ngưỡng nghiêm ngặt nhất, theo cùng đơn vị chuẩn hóa. metrics/MAEmetrics/RMSE là metric đếm thay vì định vị: chúng đo chênh lệch theo từng ảnh giữa số điểm dự đoán và ground truth.

FOMO bổ sung nhóm thứ hai ở cấp grid phía trên các metric này. Nó quét độ tin cậy cùng nms_radius và công bố tổ hợp F1 tốt nhất dưới dạng metrics/grid_F1, metrics/grid_precision, metrics/grid_recall, metrics/grid_mean_distance, metrics/grid_TP, metrics/grid_FPmetrics/grid_FN, với các cài đặt tạo ra kết quả nằm dưới decode/thresholddecode/nms_radius.

Xuất

FOMO xuất qua đường dẫn dùng chung, còn artifact đã xuất được nạp lại qua LibreYOLO() theo hậu tố tệp, vì vậy tệp .onnx hoặc .engine hoạt động như checkpoint và trả về cùng Results.

Xuất
from libreyolo import LibreYOLO model = LibreYOLO("./LibreFOMOs-point.pt")model.export(format="onnx")
Chạy tệp đã xuất
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Factory định tuyến theo hậu tố tệp, vì vậy artifact đã xuất được nạp# như mọi checkpoint khác và trả về cùng một đối tượng Results.model = LibreYOLO("./LibreFOMOs-point.onnx")result = model(SAMPLE_IMAGE) print(result.points.xy)

Phạm vi theo định dạng nằm trên trang FOMO và trong ma trận xuất đầy đủ. LocateAnything và SenseNova-Vision không xuất được: export() phát sinh lỗi trên cả hai vì mô hình sinh không có detection graph có thể trace.

Đã kiểm chứng với LibreYOLO v1.5.0.