7.7. Normalization¶
ml.Model.predict() mengambil daftar input karena beberapa jaringan memiliki lebih dari satu tensor input, tetapi daftar tidak memiliki cara untuk membawa argumen per-input secara inline -- tidak ada slot kwarg untuk "crop input ini ke (x, y, w, h) tetapi biarkan input lain saja". ml.preprocessing.Normalization adalah wrapper yang mengisi celah tersebut. Instance Normalization menyimpan parameter untuk satu input; skrip meneruskan input yang dibungkus dalam daftar predict kapan pun membutuhkan sesuatu selain default.
Alasan paling umum untuk menggunakannya adalah untuk memotong wilayah tertentu dari bingkai yang diambil ke dalam jaringan, bukan seluruh citra.
7.7.1. Parameter¶
Normalization(scale=(0.0, 1.0),
mean=(0.0, 0.0, 0.0),
stdev=(1.0, 1.0, 1.0),
roi=None)
roi-- persegi panjang(x, y, w, h)dalam bingkai sumber untuk dipotong sebelum diubah ukurannya. Default ke seluruh bingkai. Sebagian besar penggunaanNormalizationhanya mengatur parameter ini.scale-- rentang(min, max)yang diharapkan tensor input floating-point setelah normalisasi. Rentang piksel0..255dipetakan secara linear ke dalam rentang ini. Nilai umum adalah(0.0, 1.0)untuk jaringan yang dilatih dengan ReLU dan(-1.0, 1.0)untuk jaringan yang dinormalisasi secara simetris.mean-- mean(R, G, B)per-saluran yang dikurangkan dari citra setelah skala. Cocok dengan statistik saluran tempat jaringan dilatih --(0.485, 0.456, 0.406)untuk jaringan turunan ImageNet adalah contoh kanonik. Jaringan skala abu-abu mereduksi mean menjadi nilai luma menggunakan rumus standar0.299*R + 0.587*G + 0.114*B.stdev-- deviasi standar(R, G, B)per-saluran yang dibagi pada citra setelah mean dikurangkan, juga cocok dengan statistik pelatihan jaringan. Direduksi menjadi luma dengan cara yang sama untuk jaringan skala abu-abu.
7.7.2. Kapan parameter penting¶
scale, mean, dan stdev diabaikan ketika input_dtype jaringan adalah int8 atau uint8. Untuk jaringan input integer, byte citra yang dipotong ditulis langsung ke dalam tensor dan input_scale dan input_zero_point jaringan menangani konversi int-ke-real. Ketiga parameter tersebut hanya penting ketika jaringan mengharapkan input floating-point.
roi dibaca dalam setiap kasus -- ia mengontrol bagian mana dari bingkai sumber yang mencapai jaringan terlepas dari dtype input.
7.7.3. ROI dan resize¶
ROI diskalakan secara bilinear dari dimensi sumbernya ke dimensi input jaringan. Citra dipusatkan di tujuan dan penskalaan mengisi tujuan -- tidak mempertahankan rasio aspek. ROI non-persegi yang dimasukkan ke input jaringan persegi akan keluar secara horizontal atau vertikal meregang.
Apakah peregangan bermasalah bergantung pada jaringan. Model deteksi wajah dan landmark seperti keluarga MediaPipe (BlazeFace, FaceLandmarks, HandLandmarks, MoveNet) dilatih terhadap potongan persegi dan menurun dengan cepat ketika rasio aspek input salah; untuk itu, aplikasi perlu memberikan ROI persegi -- baik dengan mengambil gambar pada ukuran bingkai persegi melalui window() atau dengan memotong menggunakan parameter roi=. Detektor objek keluarga YOLO biasanya dilatih dengan augmentasi yang mencakup peregangan acak dan menerima ROI non-persegi tanpa banyak kehilangan akurasi; meneruskan seluruh bingkai yang diambil secara langsung biasanya tidak masalah.
Ketika dimensi input jaringan cocok dengan ROI secara tepat, skala menciut menjadi salinan, yang merupakan kasus termurah.
7.7.4. Mengesampingkan default¶
predict() membungkus setiap input image.Image dengan Normalization() secara otomatis -- parameter default di atas. Sebagian besar model yang dikirimkan bersama kamera dilatih terhadap rentang piksel yang sudah tercakup oleh default, sehingga kasus umum adalah meneruskan citra secara langsung:
result = model.predict([img])
Untuk menggunakan ROI kustom -- override yang paling umum -- buat Normalization dengan ROI yang diatur dan ikat citra ke dalamnya:
from ml.preprocessing import Normalization
norm = Normalization(roi=(80, 60, 160, 120))
result = model.predict([norm(img)])
Untuk mencocokkan statistik saluran waktu pelatihan jaringan, atur parameter floating-point:
norm = Normalization(scale=(0.0, 1.0),
mean=(0.485, 0.456, 0.406),
stdev=(0.229, 0.224, 0.225))
result = model.predict([norm(img)])
Memanggil instance Normalization pada citra mengembalikan instance terikat baru yang diisi tensor oleh engine. Instance terikat adalah apa yang diterima predict sebagai pengganti citra mentah, dan karena ini adalah objek per-input, jaringan multi-input dapat mencampur citra dengan ROI berbeda dalam daftar predict yang sama.
Untuk jaringan yang mengharapkan input yang sudah dihasilkan aplikasi dalam bentuk tensor -- buffer dari periferal, ndarray yang dihitung oleh pipeline lain, data numerik non-citra -- lewati Normalization sepenuhnya dan teruskan ndarray atau callable yang menghasilkannya. predict() meneruskan objek tersebut langsung ke engine tanpa pembungkusan.