7.7. Normalizacija¶
ml.Model.predict() prima popis ulaza jer neke mreže imaju više od jednog ulaznog tenzora, ali popis nema načina da inline nosi argumente po ulazu – ne postoji kwarg utor za „izreži ovaj ulaz na (x, y, w, h) ali ostavi druge ulaze na miru”. ml.preprocessing.Normalization je omotač koji popunjava tu prazninu. Instanca Normalization drži parametre za jedan ulaz; skripta prosljeđuje omotani ulaz u predict popisu kad god treba bilo što drugo osim zadanih vrijednosti.
Najčešći razlog za njegovu upotrebu je izrezivanje određenog područja snimljene sličice u mrežu umjesto cijele slike.
7.7.1. Parametri¶
Normalization(scale=(0.0, 1.0),
mean=(0.0, 0.0, 0.0),
stdev=(1.0, 1.0, 1.0),
roi=None)
roi– pravokutnik(x, y, w, h)u izvornoj sličici koji se izrezuje prije mijenjanja veličine. Zadano je cijela sličica. Većina upotrebaNormalizationpostavlja samo ovaj parametar.scale– raspon(min, max)koji ulazni tenzori s pomičnim zarezom očekuju nakon normalizacije. Raspon piksela0..255linearno se preslikava u taj raspon. Uobičajene vrijednosti su(0.0, 1.0)za mreže trenirane s ReLU i(-1.0, 1.0)za simetrično normalizirane mreže.mean– srednja vrijednost po kanalu(R, G, B)koja se oduzima od slike nakon skaliranja. Odgovara statistici kanala na kojoj je mreža trenirana –(0.485, 0.456, 0.406)za mreže izvedene iz ImageNeta kanonski je primjer. Mreže sa sivim tonovima svode srednju vrijednost na vrijednost luminancije koristeći standardni0.299*R + 0.587*G + 0.114*B.stdev– standardna devijacija po kanalu(R, G, B)kojom se slika dijeli nakon što je srednja vrijednost oduzeta, opet odgovarajući statistici treniranja mreže. Svodi se na luminanciju na isti način za mreže sa sivim tonovima.
7.7.2. Kada su parametri važni¶
scale, mean i stdev zanemaruju se kada je mrežin input_dtype int8 ili uint8. Za mreže s cjelobrojnim ulazom bajtovi izrezane slike upisuju se izravno u tenzor, a mrežini vlastiti input_scale i input_zero_point obrađuju pretvorbu iz cijelog broja u stvarni. Ta tri parametra važni su samo kada mreža očekuje ulaz s pomičnim zarezom.
roi se čita u svakom slučaju – kontrolira koji dio izvorne sličice dolazi do mreže bez obzira na ulazni dtype.
7.7.3. ROI i mijenjanje veličine¶
ROI se bilinearno skalira iz svojih izvornih dimenzija na ulazne dimenzije mreže. Slika je centrirana u odredištu, a skaliranje ispunjava odredište – ne čuva omjer stranica. Nekvadratni ROI dostavljen kvadratnom ulazu mreže izlazi vodoravno ili okomito rastegnut.
Je li rastezanje važno ovisi o mreži. Modeli za detekciju lica i orijentirâ poput obitelji MediaPipe (BlazeFace, FaceLandmarks, HandLandmarks, MoveNet) trenirani su na kvadratnim izrezima i brzo se degradiraju kad je omjer stranica ulaza pogrešan; za njih aplikacija mora dati kvadratni ROI – bilo snimanjem na kvadratnoj veličini sličice kroz window() ili izrezivanjem parametrom roi=. Detektori objekata iz obitelji YOLO obično su trenirani s augmentacijom koja uključuje nasumična rastezanja i prihvaćaju nekvadratne ROI bez velikog gubitka točnosti; prosljeđivanje cijele snimljene sličice ravno unutra obično je u redu.
Kada se ulazne dimenzije mreže točno podudaraju s ROI-jem, skaliranje se svodi na kopiranje, što je najjeftiniji slučaj.
7.7.4. Nadjačavanje zadanog¶
predict() automatski omota svaki image.Image ulaz s Normalization() – gore navedeni zadani parametri. Većina modela koji se isporučuju s kamerom trenirana je na rasponima piksela koje zadane vrijednosti već pokrivaju, pa je uobičajeni slučaj proslijediti sliku izravno:
result = model.predict([img])
Za upotrebu prilagođenog ROI-ja – najčešće nadjačavanje – izgradite Normalization s postavljenim ROI-jem i povežite sliku s njim:
from ml.preprocessing import Normalization
norm = Normalization(roi=(80, 60, 160, 120))
result = model.predict([norm(img)])
Za podudaranje sa statistikom kanala iz vremena treniranja mreže, postavite parametre s pomičnim zarezom:
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)])
Pozivanje instance Normalization nad slikom vraća novu povezanu instancu iz koje mehanizam puni tenzor. Povezana instanca je ono što predict prihvaća umjesto sirove slike, a budući da je objekt po ulazu, mreža s više ulaza može miješati slike s različitim ROI-jevima u istom predict popisu.
Za mreže koje očekuju ulaze koje je aplikacija već proizvela u tenzorskom obliku – međuspremnik s periferije, ndarray izračunat drugim cjevovodom, numeričke podatke koji nisu slika – u potpunosti preskočite Normalization i proslijedite ndarray ili pozivnu funkciju koja ga proizvodi. predict() ih prosljeđuje mehanizmu bez omatanja.