Observed since 21 Oct, 11:21 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Görüntü sınıflandırma modelleri için hata analizi ve teşhis aracı
Görüntü sınıflandırma modelleri için hata analizi ve teşhis aracı. Tasarım
dokümanı için bkz. 01_ai_model_autopsy_development_map.md.
PyTorch tabanlıdır (dokümandaki TF/Keras'tan bilinçli bir sapma — bkz.
aşağıdaki "Dokümandan sapmalar" bölümü). v1 dokümanın ilk dört aşamasını +
kural tabanlı basit neden çıkarımını kapsıyordu; v2 buna Autopsy Score
(§18), Recommendation Engine (§14) ve gerçek embedding/Grad-CAM analizini
(§10, §16) ekledi. v3, ayrı bir kaynak doküman olan
03_model_mutation_testing_development_map.md'yi
temel alan Model Mutation Testing'i ekledi: autopsy mutate, modeli
kontrollü biçimde bozup (weight noise/zeroing, neuron ablation, activation
replacement, layer freezing, quantization) mevcut tanı sinyallerinin bu
bozulmayı fark edip etmediğini ölçer. v4, Run Comparison'ı
(autopsy compare, iki report.json'u karşılaştırıp accuracy/health-score/
sınıf bazlı delta'ları ve cause_type küme diff'ini çıkarır), hafif
Dataset Quality kontrollerini (autopsy run'a entegre; düşük çözünürlük/
tam kopya/okunamayan dosya taraması, artık Autopsy Score'un bir alt-skoru),
Smart Target Selection + Mutation Difficulty'i (autopsy mutate --smart-target-selection, gradyan-tabanlı saliency ile katman/kanal
seçimi + her mutant için easy/medium/hard zorluk etiketi), ayrı bir araç
olan Dataset Contamination Detector'ı (autopsy contaminate, kaynak
doküman 02_dataset_contamination_detector_development_map.md'nin MVP'si —
train/test split'leri arasında SHA256 exact-duplicate + dHash near-duplicate
sızıntısı arar) ve Object Detection Evaluation'ı (autopsy detect-eval,
evaluation-only bir MVP — elde var olan tahmin+ground-truth kutularından
IoU-tabanlı mAP hesaplar, tam entegrasyon DEVIR §8.5'te kapsam dışı kalmaya
devam ediyor) ekledi.
v4 yol haritasının tüm maddeleri tamamlandı:
autopsy compareautopsy run'a entegreautopsy mutate --smart-target-selectionautopsy contaminateautopsy detect-eval (evaluation-only MVP)v4 sonrası ek bir özellik olarak (resmi yol haritasının parçası değil): Input Mutation Testing (doküman 03 §15) — modeli değil girdiyi (fotoğrafı) bozar (brightness/contrast/blur/noise/crop/rotation/compression/ resize), orijinal modelin bunu fark edip etmediğini ölçer. Bkz. Input Mutation Testing.
python -m venv .venv
.venv/Scripts/pip install -e ".[dev]"
GPU'lu bir kurulum için (CUDA 12/13 uyumlu bir sürücü varsa) torch'u ayrıca
uygun --index-url ile kurmanız gerekebilir; bkz.
pytorch.org/get-started.
autopsy run \
--model model.pt \
--dataset ./test \
--output ./report
--model: TorchScript (torch.jit.script/trace ile kaydedilmiş) dosya
önerilir. Bir state_dict kaydıysa --model-def paket.modul:fonksiyon
ile model iskeletini kuran bir fabrika fonksiyonu vermeniz gerekir. Tam
pickled bir nn.Module ise --allow-unsafe-load gerekir (rastgele kod
çalıştırabileceğinden yalnızca güvendiğiniz dosyalarla kullanın).--dataset: ImageFolder düzeninde bir dizin (her sınıf kendi alt
klasöründe). Sınıf isimleri klasör adlarından alfabetik sırayla
çıkarılır — modelin eğitimdeki sınıf sırasıyla eşleşmiyorsa
--class-names a,b,c ile düzeltin.--train-dataset: opsiyonel; verilirse overfitting kontrolü (train-val
accuracy farkı) etkinleşir.--preprocess preprocess.yaml: eğitimde kullanılan resize/normalize
değerleri farklıysa mutlaka sağlayın:
resize: [224, 224]
normalize:
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
Verilmezse ImageNet varsayılanı kullanılır ve rapora bir uyarı düşülür.--output-type auto|logits|probs: model çıktınız softmax uygulanmış
olasılık değilse (PyTorch modellerinde yaygın), auto bunu tespit
etmeye çalışır ama garantili değildir; şüphede kaldığınızda açıkça belirtin.--embedding-layer LAYER_NAME (§10): modelin belirtilen katmanından
(örn. features) özellik vektörü yakalar; PCA→t-SNE ile 2 boyutlu bir
scatter plot üretir ve "class overlap" tanısını embedding benzerliğiyle
güçlendirir. Yalnızca --model-def (state_dict) ile yüklenen canlı
nn.Module'lerde güvenilir çalışır — TorchScript modellerde
(torch.jit.load) Python hook dispatch'i atlandığından ampirik bir
self-test yapılır; desteklenmezse rapora uyarı düşülür ve bölüm sessizce
atlanır (çökmez).--gradcam-layer LAYER_NAME (§16): hard example'lar için Grad-CAM
overlay'i üretir (örn. features.14 — son konvolüsyon katmanı). Aynı
TorchScript kısıtına tabidir; --gradcam-max-examples (varsayılan 8) ile
üretilecek overlay sayısı sınırlanır.Modeli veya görüntüleri paylaşamıyorsanız, doğrudan tahmin dizileriyle çalıştırabilirsiniz:
autopsy run \
--predictions probs.npy \
--labels y_true.npy \
--class-names cat,dog,bird \
--output ./report
probs.npy: (N, num_classes) şeklinde logit ya da olasılık matrisi.
labels.npy: (N,) şeklinde gerçek etiketler (0-indeksli).
report/
├── index.html # tek dosyalık, tüm görselleri gömülü rapor
├── report.json # makine tarafından işlenebilir tam sonuç
├── confusion_matrix.png
└── examples/ # hard example görüntülerinin kopyaları (varsa)
└── wrong_high_confidence/
index.html kendi kendine yeterlidir — grafikler ve örnek görüntü küçük
resimleri base64 olarak gömülüdür, harici dosyaya bağımlı değildir.
"Modelimizi bozduğumuzda mevcut tanı sinyallerimiz bunu fark edebiliyor mu?"
sorusuna cevap arar. Modeli kontrollü biçimde mutasyona uğratır (her
mutasyon modelin bir kopyası üzerinde uygulanır, orijinal asla değişmez),
her mutantı aynı run_model_inference/build_eval_result hattından
geçirip orijinalle karşılaştırır, ve mevcut tanı katmanının (accuracy,
sınıf başına recall, ECE, Autopsy Score, infer_causes'ın ürettiği
cause_type kümesi) bu bozulmayı yakalayıp yakalamadığına bakar.
autopsy mutate \
--model model.pt \
--dataset ./test \
--operators weight_noise,weight_zeroing,neuron_ablation,layer_freezing,quantization,activation_replacement \
--mutants-per-operator 20 \
--output ./mutation_report
--model-def, --allow-unsafe-load,
--device, --preprocess, --class-names, --output-type vb.)
autopsy run ile birebir aynıdır. --predictions/--labels modu
yoktur — mutasyon testi gerçek bir modeli mutasyona uğratmayı
gerektirir.--operators: weight_noise, weight_zeroing, neuron_ablation,
layer_freezing, quantization ağırlık-seviyesindedir —
model.named_parameters() üzerinden doğrudan çalışırlar, TorchScript
dahil her model türünde güvenle çalışır. activation_replacement tek
istisna: modül ağacında gerçek bir değişiklik yaptığından (setattr)
--embedding-layer/--gradcam-layer ile aynı ampirik self-test +
zarif atlama desenine tabidir — yalnızca --model-def (state_dict) ile
yüklenen canlı nn.Module'lerde güvenilir çalışır.--mutants-per-operator: operatör başına kaç rastgele mutant üretileceği
(hedef katman + parametreler --seed'e göre deterministik seçilir).--target-layers: verilmezse modeldeki weight'li katmanlardan örneklenir.--max-eval-samples: büyük test setlerinde her mutant için tüm veri
kümesini taramak yerine sabit boyutlu bir alt küme kullanır (performans).MutationThresholds (accuracy düşüşü, sınıf
recall düşüşü, ECE artışı, Autopsy Score düşüşü, yeni cause_type
belirmesi) ile verilir; çöken ya da NaN/Inf üreten mutantlar INVALID
sayılıp mutation-score paydasından hariç tutulur.Çıktı:
mutation_report/
├── index.html # tek dosyalık, tüm görselleri gömülü rapor
├── report.json # her mutant + özet (killed/survived/invalid, mutation_score)
├── mutation_score_by_operator.png
└── mutation_heatmap.png # katman x operatör
Zayıf/güçlü bir test suite'in aynı mutant kümesinde nasıl farklı mutation
score'lara ulaştığını gösteren uçtan uca bir demo için bkz.
examples/mutation_demo.py.
autopsy mutate \
--model model.pt --dataset ./test \
--smart-target-selection \
--output ./mutation_report
--smart-target-selection (opt-in, varsayılan kapalı): katman/kanal
seçimini uniform rastgele yerine gradyan-tabanlı bir "saliency" sinyaliyle
ağırlıklandırır (Optimal Brain Damage tarzı Taylor-importance,
|weight · ∂L/∂w|). Motivasyon: rastgele hedeflemenin modelin önemsiz
köşelerini mutasyona uğratması, gerçek test-suite kör noktalarını
gizliyordu. Kritik mimari bulgu: bu, torch.autograd.grad kullanır —
v2/v3'ün tekrar karşılaştığı "forward/backward HOOK TorchScript'te
atlanabilir" sorunundan (bkz. core/hooks.py) TAMAMEN FARKLI bir
mekanizma olduğundan TorchScript dahil her model türünde hiçbir self-test/
fallback gerekmeden çalışır.
--saliency-max-samples (varsayılan 256): saliency hesabında kullanılan
örnek sayısı.--saliency-temperature (varsayılan 2.0): ağırlıklandırmanın yumuşaklığı
— yüksek değer uniforma yaklaşır, düşük değer en yüksek-saliency
katmanı(ları) daha güçlü önceliklendirir.--seed reprodüktibilitesini ve committed
örnek raporları sessizce değiştirmemek.--seed diğer mutasyon adımlarında tam reprodüktibilite
sağlasa da smart-selection'ın katman dağılımı GPU'da hafifçe değişebilir.difficulty_score/
difficulty_label (easy/medium/hard) — "en ayırt edici sinyalin"
(accuracy/recall/ECE/health-score delta'sı ya da yeni cause_type) kendi
kill eşiğine göre normalize edilmiş oranı. hard (eşiğin çok altında
survived) test suite'in kör noktalarını gösterir — rapor özetinde
hard_survived sayacı ve HTML'de "Hard Survived" kartı + survived mutant
listesinde difficulty badge'i olarak görünür.Yukarıdaki operatörler modelin ağırlıklarını bozar; bu ayrı kategori
modeli hiç değiştirmeden girdiyi (fotoğrafı) bozup orijinal modelin bunu
fark edip etmediğini ölçer — "modelimiz bulanık/karanlık/gürültülü
fotoğraflara karşı dayanıklı mı?" sorusuna cevap. Aynı autopsy mutate
komutu, aynı --operators bayrağı üzerinden, ağırlık operatörleriyle
serbestçe karıştırılarak kullanılır:
autopsy mutate \
--model model.pt --dataset ./test \
--operators weight_noise,input_blur,input_noise,input_compression \
--output ./mutation_report
8 operatör (hepsi input_ önekiyle, opt-in — DEFAULT_MUTATION_OPERATORS'a
dahil DEĞİL, yalnızca açıkça --operators'a eklenirse çalışır):
input_brightness, input_contrast, input_blur, input_noise,
input_crop, input_rotation, input_compression, input_resize. Her biri
saf bir PIL-uzayı dönüşümü, --preprocess'in Resize/ToTensor/Normalize
adımlarından ÖNCE, ham piksel uzayında uygulanır (autopsy/mutation/ input_operators.py) — yeni pip bağımlılığı yok (Pillow zaten torchvision'ın
transitive bağımlılığı).
--input-blur-radii, --input-noise-sigmas) — mevcut
--weight-noise-sigmas vb. ile birebir aynı desen."(girdi)" ile görünür — verdict.py'nin zaten
layer_name=None için kullandığı "(bilinmiyor)" deseniyle aynı, gerçek
bir model katmanına karşılık gelmez.input_crop her zaman merkezden kırpar
(rastgele ofset yok); input_rotation döndürülen köşeleri siyahla doldurur
(fillcolor=(0,0,0), ImageNet-C tarzı corruption benchmark'larının da
yaptığı gibi bilinçli bir seçim, gizli bir varsayılan değil).ImageFolder zaten HER __getitem__ çağrısında
diski yeniden okuyor (caching yok) — bu, input mutasyonuna özgü yeni bir
maliyet sınıfı DEĞİL. Gerçek ek maliyet yalnızca PIL transform'unun kendisi
(en pahalısı JPEG round-trip + Gaussian blur).--smart-target-selection input operatörlerini etkilemez (hiçbir ağırlık/
gradyan sinyali kullanmazlar) — saf-input çalıştırmalarında saliency
hesaplaması otomatik olarak atlanır.İki autopsy run koşusunun report.json çıktısını karşılaştırır — "modeli
değiştirdik, gerçekten iyileşti mi?" sorusuna cevap arar. Repo geçmişi ya da
ayrı bir depolama katmanı gerektirmez, yalnızca iki report.json dosyası
okur.
autopsy compare \
--before report_a/report.json \
--after report_b/report.json \
--output ./compare_report
--before/--after: karşılaştırılacak iki autopsy run çıktısının
report.json yolu. Şema uyumu için aşağıdaki Artifact şema
versiyonlama bölümüne bakın.before
ve after farklı class_names kümelerine sahipse (örn. sınıf eklendi/
çıkarıldı) çökmez — uyarı basar, yalnızca ortak sınıfları karşılaştırır.cause_type küme diff'i — mutation/verdict.py'nin
evaluate_mutant'ta kullandığı new_cause_types deseninin (küme farkı)
doğrudan yeniden kullanımı: yeni beliren / kaybolan / kalıcı nedenler.verdict: health-score delta'sına göre improved/regressed/unchanged.Çıktı:
compare_report/
├── index.html # tek dosyalık, gömülü görselli rapor
└── report.json # makine tarafından işlenebilir tam diff
compare iki koşumu karşılaştırır; autopsy history N koşumu zaman
ekseninde dizip accuracy / Autopsy Score / alt skor trendini çıkarır —
"son bir aydır gidişat ne yönde?" sorusuna cevap arar.
compare gibi ayrı bir depolama katmanı gerektirmez: yeni bir
veritabanı, servis ya da kalıcı index yoktur. Koşum deposu, elinizde zaten
duran report.json dosyalarının kendisidir; history onları okur ve
hiçbirine dokunmaz.
# Bir çıktı ağacını tara (report.json'lar özyinelemeli bulunur)
autopsy history --scan ./reports --output ./history_report
# Ya da koşumları açıkça ver (ikisi birlikte de kullanılabilir)
autopsy history --runs run_a/report.json run_b/report.json --output ./history_report
generated_at alanından gelir (şema v2).
Alanı taşımayan eski (v1) raporlarda dosya mtime'ına düşülür ve bu her
koşum için timestamp_source olarak açıkça raporlanır — kopyalanmış
ya da checkout edilmiş dosyalarda sıranın yanıltıcı olabileceği
saklanmaz.N/A) grafikte boşluk kalır, sıfıra çevrilmez.verdict: pencerenin ilk ve son koşumu arasındaki health-score
delta'sına göre improved/regressed/unchanged — eşik compare ile
aynıdır.Farklı şema sürümleri sessizce karışmaz. Trend, tanımı gereği bir
geliştirme penceresine yayılmış koşumları okur; sürüm farkı istisna değil
normal durumdur. history bu yüzden compare'in şema
guard'ını aynen uygular:
| Durum | Davranış |
|---|---|
| Sürümsüz (v5 öncesi), okunamayan ya da ileri sürümlü rapor | Trend'in dışında bırakılır; gerekçesi excluded_runs'ta, CLI çıktısında ve HTML'de adıyla yazar |
autopsy.run olmayan bir artifact (ör. bir autopsy compare çıktısı — o da report.json adıyla yazılır) | Trend'in dışında bırakılır, ne olduğu söylenir |
| Kabul edilen ama farklı sürümlü koşumlar | Kısmi trend: yalnız tüm sürümlerin ortak alanları çizilir, KISMİ TREND banner'ı basılır, comparability bloğu atlanan bölümleri adlandırır |
comparability compare'inkinin N'li karşılığıdır ve aynı invariant'ı
taşır — partial ayrıca hesaplanmaz, sürüm çokluğundan türer:
"comparability": {
"partial": true,
"anchor": {"artifact": "autopsy.run", "version": 2},
"versions_present": [1, 2],
"compared_sections": ["autopsy_score", "class_stats", "confusion_pairs", "ece", "likely_causes", "overall_metrics"],
"skipped_sections": [
{"section": "generated_at", "reason": "yalnız şema v2 koşumlarında var, v1 koşumlarında yok"}
]
}
Çıktı:
history_report/
├── index.html # tek dosyalık, gömülü trend grafikli rapor
└── report.json # autopsy.history artifact'i: seriler, koşumlar, dışlananlar
run · mutate · contaminate · detect-eval · compare · history
komutlarının ürettiği her report.json kendini tanıtır: dosyanın
kökünde bir schema bloğu bulunur.
{
"schema": {
"artifact": "autopsy.run",
"version": 2,
"generator": {"tool": "ai-model-autopsy", "version": "0.1.0"}
}
}
artifact: sabit değerlerden biri (autopsy.run · autopsy.mutate ·
autopsy.contaminate · autopsy.detect_eval · autopsy.compare ·
autopsy.history).version: tamsayı ve her artifact türü için bağımsız sayar — bir
komutun şeması genişlediğinde yalnızca kendi sayacı artar.generator: tanılama amaçlıdır; hiçbir kararın girdisi değildir.autopsy compare bu bloğa göre davranır — bir sürüm uyuşmazlığında
sessizce "tam karşılaştırma gibi görünen" kısmi bir çıktı üretmez:
| Durum | Davranış | Exit |
|---|---|---|
| İki sürüm de var ve eşit | Tam karşılaştırma | 0 |
| İki sürüm de var, farklı, ikisi de okunabilir aralıkta | Kısmi karşılaştırma — yalnız iki şemanın ortak alanları; KISMİ KARŞILAŞTIRMA banner'ı, HTML'de uyarı şeridi, report.json'da comparability bloğu | 0 |
| Bir tarafta sürüm yok (v5 öncesi rapor) | Durur, tek satırlık mesaj: raporu autopsy run ile yeniden üretin | 1 |
| Bir taraf daha yeni bir sürüm | Durur: aracı güncelleyin | 1 |
Kısmi karşılaştırmada neyin karşılaştırıldığı report.json'da açıkça yazar:
"comparability": {
"partial": true,
"before": {"artifact": "autopsy.run", "version": 1},
"after": {"artifact": "autopsy.run", "version": 2},
"compared_sections": ["autopsy_score", "class_stats", "confusion_pairs", "ece", "likely_causes", "overall_metrics"],
"skipped_sections": [
{"section": "...", "reason": "after şeması v2'de var, before şeması v1'de yok"}
]
}
Yazma her zaman güncel sürümledir; eski sürüm üretme modu yoktur.
Sürüm geçmişi:
| Artifact | Sürüm | Değişiklik |
|---|---|---|
autopsy.run | 1 | v5 açılışı — sürümleme öncesindeki alan kümesi |
autopsy.run | 2 | generated_at eklendi (autopsy history'nin zaman ekseni) |
autopsy run'a entegre, hafif bir veri-kalite taraması (ayrı bir araç
değil) — model+dataset modunda --dataset'teki her görüntü bir kez okunup
üç şey kontrol edilir:
Düşük çözünürlük: DiagnosisThresholds.dataset_quality_min_width/
_min_height (varsayılan 64x64) altındaki görüntüler, sınıf başına
sayılır.
Tam kopya: SHA256 hash'i aynı olan dosyalar bir "duplicate group"da toplanır.
Okunamayan/bozuk dosya: PIL ile decode edilemeyen dosyalar tespit
edilir ve değerlendirmeden otomatik olarak hariç tutulur — aksi halde
tek bir bozuk dosya inference sırasında tüm autopsy run'ı çökertirdi.
Düşük çözünürlük ve tam kopyalar hariç tutulmaz, yalnızca raporlanır.
Boş / neredeyse-boş görüntü (doküman 01 §17): gri ton standart sapması
DiagnosisThresholds.dataset_quality_empty_std_threshold (varsayılan 1.0)
altındaki görüntüler. Tek renk taranmış sayfa, tamamen siyah kare gibi
örnekleri yakalar; her bulgu kendi std değeriyle raporlanır ki eşik
dataset'e göre kalibre edilebilsin. Bu kontrol her zaman koşar — dosya
zaten okunup decode edildiği için ek I/O getirmez.
Sonuçlar rapora üç şekilde yansır: (1) warnings listesine kısa özet
uyarılar, (2) Autopsy Score'un artık gerçek veriyle beslenen "Dataset
Quality" alt-skoru (önceden her zaman N/A bir placeholder'dı), (3)
index.html'de ayrı bir "Dataset Quality" bölümü (sınıf-başına tablo +
duplicate/unreadable/boş listeleri) ve report.json'da dataset_quality
anahtarı (--predictions modunda null). Alt skorun cezası dört terimden
oluşur: okunamayan + düşük çözünürlük + fazladan tam kopya + boş görüntü
oranı. Çözünürlük ve boşluk eşikleri için henüz bir CLI bayrağı yok —
DiagnosisThresholds üzerinden programatik olarak değiştirilebilir.
autopsy run --near-duplicate-scan, aynı dataset İÇİNDE dHash + Hamming
mesafesiyle yakın kopya arar. Üç bilinçli kısıt:
t ≈ 1,15e-8·n²
(10.000 görüntüde ~1 sn, 50.000'de ~29 sn). Bayrak verilmezse report.json
bu bloğu hiç taşımaz.--near-duplicate-max-images (varsayılan 50.000). Sınır
aşılırsa tarama sessizce değil, skipped_reason + warnings satırıyla
atlanır.autopsy contaminate için geçerli olan
kalibrasyon uyarısı (aşağıda) burada da geçerli: düşük görsel çeşitlilikli
bir dataset'te dHash yüz binlerce çift üretebilir. Skora bağlansaydı
dataset_quality alt skoru böyle dataset'lerde anlamını yitirirdi.Çıktı, çiftlerin listesi değil bir mesafe histogramıdır (mesafe → çift
sayısı): n=10.000'de çift listesi ~112 MB'a çıkabildiği için hiç
materyalize edilmez. Dar kova (Hamming d<=2) görüntü başına ortalama en az
bir çift içeriyorsa rapor signal_diluted bayrağını kaldırır ve warnings'e
"eşikleri kalibre etmeden bu sayıyı bulgu olarak okumayın" satırını ekler.
dHash primitifleri (compute_dhash, hamming_distance,
find_candidate_pairs, distance_histogram) autopsy/core/hashing.py'de
tek kaynak olarak durur; autopsy/contamination/hashing.py eski import
yolunu yaşatan bir re-export shim'dir.
"Model gerçekten öğreniyor mu, yoksa test verisini bir şekilde daha önce
gördü mü?" — train/validation/test split'leri arasında exact/near-duplicate
sızıntısı arayan ayrı bir araç (autopsy run'a entegre değil, model/
dataset-under-test gerektirmez). Kaynak spesifikasyon:
02_dataset_contamination_detector_development_map.md (repoya kopyalanmadı,
kapsamı tam bir "ML dataset integrity auditor" — bu MVP §1-6/§11/§15/§17'sini
kapsıyor, pretrained deep-embedding/group-video-label-leakage/FAISS
ölçeklendirme bilinçli olarak kapsam dışı, aşağıya bkz.).
autopsy contaminate \
--split train=./data/train \
--split test=./data/test \
--output ./contamination_report
--split isim=yol (tekrarlı, en az 2 kez): her split standart
<yol>/<sınıf>/<görüntü> (ImageFolder) düzeninde. Dizin isimlendirmesine
dayalı bir varsayım YOK — mevcut autopsy run'ın --dataset/
--train-dataset açıklığıyla tutarlı.imagehash
kütüphanesi kasıtlı olarak KULLANILMIYOR, PIL+numpy ile birkaç satır,
yeni bağımlılık yok) + Hamming mesafesi, iki kademeli eşik:
--near-duplicate-max-distance (varsayılan 5): yüksek güven
(resize/hafif JPEG sıkıştırma) → cross-split HIGH.--weak-similarity-max-distance (varsayılan 14): düşük güven (crop/ağır
transform — dHash'in bilinen zayıf noktası) → cross-split REVIEW,
asla CRITICAL değil.--max-pairs-in-report (varsayılan 200): report.json/index.html'e
giren çift sayısını risk sırasına göre kırpar — sayaçlar (report.json'un
summary alanı) hiçbir zaman kırpılmaz, truncated_pairs_count açıkça
gösterilir.--max-images-warning (varsayılan 5000) yalnızca uyarır,
engellemez; gerçek Rice train+test'te (12.500 görüntü) tam koşu ~40 saniye
sürdü.Evaluation-only, modelsiz bir MVP — DEVIR.md §8.5'in kendi notu
EvalResult'ın tek-etiket-per-görüntü varsayımını değiştirmeyi gerektiren
tam bir object-detection entegrasyonunu hâlâ kapsam dışı tutuyor (yeni
dataset formatı, model adaptörü, her analizörün box-seviyesine yeniden
yorumlanması gerektirirdi). Bu komut onun yerine: elinizde zaten olan
tahmin + ground-truth kutularından IoU-tabanlı mAP/AP hesaplar — inference
veya training YAPMAZ (bu yüzden bilinçli olarak detect değil
detect-eval).
autopsy detect-eval \
--predictions preds.json \
--ground-truth gt.json \
--output ./detection_report
Her iki JSON dosyası da aynı düz şema (COCO formatı DEĞİL — image_id/category_id dolaylılığından kaçınmak için):
[
{"image_id": "photo1.jpg", "class_name": "person", "bbox": [10, 10, 100, 200], "score": 0.97},
{"image_id": "photo1.jpg", "class_name": "dog", "bbox": [150, 50, 250, 180]}
]
score yalnızca --predictions için zorunlu; --ground-truth'ta
verilirse yoksayılır.--bbox-format xyxy (varsayılan, [x1,y1,x2,y2]) ya da xywh
([x,y,genişlik,yükseklik]).--iou-threshold (varsayılan 0.5, PASCAL VOC tarzı tek eşik — COCO'nun
mAP@[0.5:0.95] çoklu-eşik ortalaması YOK, MVP sadeleştirmesi).N/A işaretlenir ve
mAP ortalamasından hariç tutulur (etiketleme/taksonomi hatası uyarısı
olarak raporlanır); GT'si olup hiç tahmin edilmemeyen sınıflar AP=0.0
alır ve mAP'a dahil edilir (model o sınıfı tamamen kaçırmış demektir).--max-examples-in-report (varsayılan 50): false positive/negative
listelerini kırpar (sayaçlar tam kalır).pycocotools bilinçli olarak kullanılmadı —
C-extension build kırılganlığı; mAP algoritması manuel, numpy ile
implemente edildi ve elle hesaplanmış bir referans örnekle
doğrulandı).Repoda gerçek modellerle üretilmiş, gerçek verili örnek raporlar bulunur:
examples/rice_report/andrewmvd/face-mask-detection, orijinali
bir obje tespiti veri seti — XML kutulardan yüzler kırpılıp 3 sınıflı
with_mask/without_mask/mask_weared_incorrect bir sınıflandırma
görevine dönüştürüldü; doğal olarak çok dengesiz — mask_weared_incorrect
sınıfında yalnızca 98 örnek. Autopsy'nin class-imbalance/representation-
problem tanılarını ve Model Mutation Testing'i gerçek, zorlu bir veri
setinde doğrulayan bir örnek):
autopsy run raporu — examples/face_mask_report/autopsy mutate raporu — examples/face_mask_mutation_report/.venv/Scripts/pytest tests/ -v
Sentetik hata senaryolarını (doküman §19 test planı — gerçek bir CNN eğitip beklenen teşhisin çıktığını doğrular) çalıştırmak için:
.venv/Scripts/python examples/synthetic_faults.py
Model Mutation Testing'in "zayıf vs güçlü test suite" demosunu (03 dokümanı §26) çalıştırmak için:
.venv/Scripts/python examples/mutation_demo.py
ModelAdapter ─┐
├─→ PredictionEngine ─→ EvalResult ─┬─→ MetricsAnalyzer
DatasetLoader ┘ ├─→ ConfusionAnalyzer
├─→ ClassFailureAnalyzer
├─→ ConfidenceAnalyzer
└─→ HardExampleMiner
│
CauseInference (heuristik)
│
ReportGenerator (HTML + JSON + PNG)
EvalResult, tüm analizörlerin paylaştığı tek veri kaynağıdır; analizörler
modele veya görüntülere hiç dokunmaz. Bu sayede --predictions modu model
yüklemeyi tamamen atlayabilir.
v2'de bu ilkeye bir istisna: embedding/Grad-CAM, EvalResult üretilirken
(core/engine.py'nin tek inference geçişi içinde, core/hooks.py üzerinden)
modele dokunmak zorunda — ama sonucu yine EvalResult.embeddings'e yazıp
analizörlere (analyzers/embedding_analysis.py) modelden bağımsız,
salt-numpy bir arayüz sunuyor.
v3'te autopsy/mutation/ (inspector.py, operators.py, verdict.py,
engine.py) autopsy run'ın hiçbir koduna dokunmadan çalışır: modeli bir
kez yükler, kopyasını mutasyona uğratır, aynı run_model_inference/
build_eval_result çiftinden ve aynı analizör/infer_causes katmanından
geçirip orijinalle karşılaştırır. core/hooks.py'ye yalnızca
activation_replacement operatörü için eklenti yapıldı
(supports_module_surgery/set_submodule_by_name) — aynı "sabit
isinstance yerine ampirik self-test" ilkesiyle.
| Doküman | Durum | Gerekçe / not |
|---|---|---|
| §5: TensorFlow/Keras MVP | PyTorch | Windows'ta TF 2.11+ CPU-only; PyTorch native CUDA desteği var |
| §10 Embedding (PCA/t-SNE/UMAP) | v2'de var | --embedding-layer; UMAP yerine PCA→t-SNE (sklearn, ek bağımlılık yok) |
| §14 Recommendation Engine | v2'de var | Her hipotezin cause_type'ına göre statik öneri listesi |
| §16 Grad-CAM | v2'de var | --gradcam-layer; SHAP eklenmedi |
| §18 Autopsy Score | v2'de var, v4'te tamamlandı | 0-100 sağlık skoru + alt skorlar (Dataset Quality alt-skoru v4'e kadar N/A placeholder'dı, artık gerçek veriyle besleniyor) |
| §11 Kural 3 (class overlap) | v2'de yükseltildi | --embedding-layer verilirse embedding cosine similarity + confusion birleşik kanıt; verilmezse v1'in confusion-only sürümüyle birebir aynı |
| §17 Dataset-level diagnosis | v4'te hafif bir alt kümesi var | Tam "proje #2" entegrasyonu (bu depoda mevcut değil) hâlâ kapsam dışı; v4 yalnızca çözünürlük/tam-kopya/okunamayan-dosya taramasını autopsy run'a ekledi (bkz. "Dataset Quality Kontrolleri") |
| §20 Object detection / segmentation / NLP | Yok | Kapsam dışı — image classification odağı korunuyor |
| §20 Deney/versiyon karşılaştırma | v4'te var | autopsy compare — iki report.json'u karşılaştırır, repo geçmişi/depolama katmanı gerektirmez |
| §20 Historical autopsy | v5'te var | autopsy history — N report.json'un zaman içindeki trendi; compare ile aynı ilke, ayrı depolama katmanı yok (bkz. "Historical Autopsy") |
TorchScript kısıtı: --embedding-layer/--gradcam-layer, PyTorch'ta
register_forward_hook/register_full_backward_hook'un torch.jit.load
ile yüklenen RecursiveScriptModule'lerde çalışmaması nedeniyle yalnızca
--model-def (state_dict) yolunda garantili çalışır. Kurulu PyTorch
sürümünde gözlenen bu davranış tests/test_hooks.py'de regresyon testiyle
kilitlendi — TorchScript modellerde ampirik self-test yapılır, desteklenmezse
uyarıyla atlanır (çökmez).
v3, ana tasarım dokümanından (01) değil, ayrı bir kaynak dokümandan
(03_model_mutation_testing_development_map.md)
geliyor — bu yüzden ayrı bir sapma tablosu:
| Doküman (03) | Durum | Gerekçe / not |
|---|---|---|
| §9 Weight noise | var | apply_weight_noise — model.named_parameters() üzerinde doğrudan, TorchScript-güvenli |
| §10 Weight zeroing | var | apply_weight_zeroing — random / largest / smallest magnitude stratejileri |
| §11 Neuron ablation | var | apply_neuron_ablation — ağırlık-seviyesinde (kanal weight satırı + bias sıfırlama), forward hook değil |
| §12 Activation mutation | var | apply_activation_replacement — tek ağırlık-dışı operatör; core/hooks.py'nin ampirik self-test desenini kullanır, yalnızca --model-def yolunda garantili |
| §5 Layer freezing | yeniden yorumlandı | Bu pipeline yalnızca inference yapar (eğitim döngüsü yok) — requires_grad=False'un tek başına hiçbir çıktı etkisi olmaz. Bunun yerine "katman hiç öğrenmemiş gibi davransın": weight/bias taze (Kaiming-uniform benzeri) değerlerle değiştirilir |
| §14 Quantization | var (manuel) | torch.ao.quantization'ın QConfig/observer makinesi yerine manuel fp16/int8 round-trip — keyfi/TorchScript modellere karşı kırılgan değil, yeni bağımlılık gerektirmiyor |
| §13 Layer/mimari mutasyonlar (silme, bypass) | Yok | Dokümanın kendi §4 MVP sınırı: "İlk aşamada layer silme gibi mimari mutasyonları daha sonraya bırak" |
| §15 Input mutations | var | input_operators.py — 8 operatör (brightness/contrast/blur/noise/crop/rotation/compression/resize), modeli değil girdiyi bozar; aynı autopsy mutate --operators bayrağı üzerinden ağırlık operatörleriyle karıştırılır (bkz. "Input Mutation Testing") |
| §24 Smart/gradyan-güdümlü mutasyon seçimi | v4'te var | --smart-target-selection — gradyan-tabanlı saliency (` |
| §25 Mutation difficulty scoring | v4'te var | Her mutant için difficulty_score/difficulty_label (easy/medium/hard) — en ayırt edici sinyalin kill-eşiğine göre normalize oranı |
| §21-23 Tam robustness matrix / clustering / heatmap | basitleştirilmiş | by_operator/by_layer özeti + katman×operatör heatmap var; ayrı bir kategori-clustering katmanı yok |
| §30 V2 (transformer/attention/LoRA/adapter mutasyonları, dağıtık çalıştırma) | Yok | Kapsam dışı — bu proje CNN/image classification odaklı |
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.1 | 6 Sept 2026 | 12 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 11:21 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:0aaf6647f6d39607257d2f44e07b637c7db539fd2db47fcd6909cf8bae345b44