COCO Araçları¶
SAHI, COCO formatındaki veri kümelerini oluşturmak, işlemek ve dönüştürmek için kapsamlı bir araç seti sağlar.
Veri Kümesi Oluşturma¶
from sahi.utils.coco import Coco, CocoCategory, CocoImage, CocoAnnotation, CocoPrediction
from sahi.utils.file import save_json
# Initialize a COCO dataset and add categories
coco = Coco()
coco.add_category(CocoCategory(id=0, name="human"))
coco.add_category(CocoCategory(id=1, name="vehicle"))
# Create an image entry
coco_image = CocoImage(file_name="image1.jpg", height=1080, width=1920)
# Add ground-truth annotations
coco_image.add_annotation(
CocoAnnotation(bbox=[x_min, y_min, width, height], category_id=0, category_name="human")
)
coco_image.add_annotation(
CocoAnnotation(bbox=[x_min, y_min, width, height], category_id=1, category_name="vehicle")
)
# Add model predictions (with confidence scores)
coco_image.add_prediction(
CocoPrediction(score=0.86, bbox=[x_min, y_min, width, height], category_id=0, category_name="human")
)
# Add the image to the dataset
coco.add_image(coco_image)
# Export as JSON
save_json(coco.json, "coco_dataset.json")
# Export predictions in COCO result format
save_json(coco.prediction_array, "coco_predictions.json")
SAHI ile Değerlendirme (Evaluation)¶
SAHI'nin değerlendirme komutu varsayılan olarak pycocotools kullanır. İsteğe bağlı ultrafast-pycocotools backend'ini (0.1.11 veya daha yeni sürüm) kullanmak için:
pip install "sahi[ultrafast]"
sahi coco evaluate --dataset_json_path coco_dataset.json \
--result_json_path coco_predictions.json --backend ultrafast
Segmentation için --type segm ekleyin. Backend, Python API üzerinden de çalışır:
from sahi.scripts.coco_evaluation import evaluate
result = evaluate(
"coco_dataset.json",
"coco_predictions.json",
backend="ultrafast",
max_detections=500,
classwise=True,
return_dict=True,
)
İki backend de SAHI'nin mevcut özel alan aralıklarını, IoU eşiklerini, sınıf bazında metrikleri ve eval.json çıktısını kullanır. Backend seçimi yalnızca bu değerlendirme çağrısı için geçerlidir ve süreç genelindeki import'ların yerini almaz. Ultrafast değerlendirme yolu pycocotools gerektirmez; diğer komutların kendi bağımlılıkları olabilir.
Doğrudan pycocotools ile Değerlendirme¶
from pycocotools.cocoeval import COCOeval
from pycocotools.coco import COCO
coco_gt = COCO(annotation_file="coco_dataset.json")
coco_dt = coco_gt.loadRes("coco_predictions.json")
evaluator = COCOeval(coco_gt, coco_dt, "bbox")
evaluator.evaluate()
evaluator.accumulate()
evaluator.summarize()
Veri Kümesi Yükleme¶
Görselleri ve Annotations'ları Dilimleme (Slicing)¶
Büyük görselleri ve COCO annotation'larını daha küçük dilimlerden (tiles) oluşan bir ızgaraya dilimleyin:
from sahi.slicing import slice_coco
coco_dict, coco_path = slice_coco(
coco_annotation_file_path="coco.json",
image_dir="source/coco/image/dir",
slice_height=256,
slice_width=256,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
)
Train/Val Olarak Bölme¶
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco = Coco.from_coco_dict_or_path("coco.json")
result = coco.split_coco_as_train_val(train_split_rate=0.85)
save_json(result["train_coco"].json, "train_split.json")
save_json(result["val_coco"].json, "val_split.json")
Veri Kümelerini Birleştirme (Merging)¶
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco_1 = Coco.from_coco_dict_or_path("coco1.json", image_dir="images_1/")
coco_2 = Coco.from_coco_dict_or_path("coco2.json", image_dir="images_2/")
coco_1.merge(coco_2)
save_json(coco_1.json, "merged_coco.json")
Filtreleme ve Güncelleme¶
Kategorilere göre¶
Belirli kategorileri seçin ve ID'lerini yeniden haritalandırın:
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco = Coco.from_coco_dict_or_path("coco.json")
desired_name2id = {"big_vehicle": 1, "car": 2, "human": 3}
coco.update_categories(desired_name2id)
save_json(coco.json, "updated_coco.json")
Annotation alanına (area) göre¶
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco = Coco.from_coco_dict_or_path("coco.json")
# Filter by minimum area
area_filtered = coco.get_area_filtered_coco(min=50)
# Filter by min and max area
area_filtered = coco.get_area_filtered_coco(min=50, max_val=10000)
# Per-category area intervals
intervals = {
"human": {"min": 20, "max": 10000},
"vehicle": {"min": 50, "max": 15000},
}
area_filtered = coco.get_area_filtered_coco(intervals_per_category=intervals)
save_json(area_filtered.json, "area_filtered_coco.json")
Annotation içermeyen görselleri koruma¶
Varsayılan olarak annotation içermeyen görseller hariç tutulur. Bunları korumak için:
Bounding box'ları görsel boyutlarına kırpma (clipping)¶
# On load
coco = Coco.from_coco_dict_or_path("coco.json", clip_bboxes_to_img_dims=True)
# Or on an existing object
coco = coco.get_coco_with_clipped_bboxes()
Örnekleme (Sampling)¶
Alt Örnekleme (Subsample)¶
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco = Coco.from_coco_dict_or_path("coco.json")
# Keep 1/10 of images
subsampled = coco.get_subsampled_coco(subsample_ratio=10)
# Subsample only images containing a specific category
subsampled = coco.get_subsampled_coco(subsample_ratio=10, category_id=0)
# Reduce negative samples (images without annotations) to 1/10
subsampled = coco.get_subsampled_coco(subsample_ratio=10, category_id=-1)
save_json(subsampled.json, "subsampled_coco.json")
Üst Örnekleme (Upsample)¶
from sahi.utils.coco import Coco
from sahi.utils.file import save_json
coco = Coco.from_coco_dict_or_path("coco.json")
# Repeat each sample 10 times
upsampled = coco.get_upsampled_coco(upsample_ratio=10)
# Upsample only images containing a specific category
upsampled = coco.get_upsampled_coco(upsample_ratio=10, category_id=0)
save_json(upsampled.json, "upsampled_coco.json")
YOLO Formatına Dönüştürme¶
Otomatik bölmeli tek veri kümesi¶
from sahi.utils.coco import Coco
coco = Coco.from_coco_dict_or_path("coco.json", image_dir="coco_images/")
coco.export_as_yolo(output_dir="output/folder/dir", train_split_rate=0.85)
Önceden bölünmüş train/val veri kümeleri¶
from sahi.utils.coco import Coco, export_coco_as_yolo
train_coco = Coco.from_coco_dict_or_path("train_coco.json", image_dir="coco_images/")
val_coco = Coco.from_coco_dict_or_path("val_coco.json", image_dir="coco_images/")
data_yml_path = export_coco_as_yolo(
output_dir="output/folder/dir",
train_coco=train_coco,
val_coco=val_coco,
)
Veri Kümesi İstatistikleri¶
from sahi.utils.coco import Coco
coco = Coco.from_coco_dict_or_path("coco.json")
print(coco.stats)
# {
# 'num_images': 6471,
# 'num_annotations': 343204,
# 'num_categories': 2,
# 'num_negative_images': 0,
# 'num_images_per_category': {'human': 5684, 'vehicle': 6323},
# 'num_annotations_per_category': {'human': 106396, 'vehicle': 236808},
# 'min_num_annotations_in_image': 1,
# 'max_num_annotations_in_image': 902,
# 'avg_num_annotations_in_image': 53.04,
# 'min_annotation_area': 3,
# 'max_annotation_area': 328640,
# 'avg_annotation_area': 2448.41,
# 'min_annotation_area_per_category': {'human': 3, 'vehicle': 3},
# 'max_annotation_area_per_category': {'human': 72670, 'vehicle': 328640},
# }
Geçersiz Sonuçları Temizleme¶
Bir COCO sonuçları JSON dosyasındaki geçersiz prediction'ları kaldırın:
from sahi.utils.coco import remove_invalid_coco_results
from sahi.utils.file import save_json
coco_results = remove_invalid_coco_results("coco_result.json")
save_json(coco_results, "fixed_coco_result.json")
# Also filter out bboxes exceeding image dimensions
coco_results = remove_invalid_coco_results("coco_result.json", "coco_dataset.json")
Ek Kaynaklar¶
- Etkileşimli Notebook'lar: COCO veri kümesi dilimleme dahil uygulamalı örnekler
- CLI dokümantasyonu: COCO veri kümeleri için komut satırı operasyonları