15 valittua tietokonenäön haastattelukysymystä ryhmiteltynä kokemustason mukaan. Käytä niitä kertaamaan perusasioita, käytännön kompromisseja ja senioritason tuotantopäätösten logiikkaa.
1Mikä on diskreetti 2D-konvoluutio kuvassa, ja miten se liittyy ytimiin (kerneleihin), suodattimiin ja ristikorrelaatioon?
Diskreetti 2D-konvoluutio kuvassa on lineaarinen, spatiaalinen suodatusoperaatio, jossa painokertoimien matriisi (ydin eli kerneli) liukuu syötekuvan yli. Jokaisessa spatiaalisessa sijainnissa se laskee alkiokohtaisen tulon ytimen painokertoimien ja päällekkäisen paikallisen kuvapätkän (reseptiivisen kentän) välillä ja summaa tulokset (usein lisäämällä harhatermin) tuottaakseen yhden pikseliarvon ulostulon piirrekarttaan. Klassisessa matematiikassa ja signaalinkäsittelyssä aito konvoluutio sisältää ytimen kääntämisen (180 astetta kiertäminen) vaaka- ja pystysuunnassa ennen liukuvan sisätulon laskemista: $(I * K)(i, j) = \sum_m \sum_n I(i - m, j - n) K(m, n)$. Sen sijaan ristikorrelaatio laskee liukuvan pistetulon suoraan kääntämättä ydintä: $(I \star K)(i, j) = \sum_m \sum_n I(i + m, j + n) K(m, n)$. Syväoppimiskehyksissä, kuten PyTorchissa ja TensorFlowssa, "konvoluutio"-nimellä toteutettu operaatio on itse asiassa ristikorrelaatio. Koska ytimen painokertoimet ovat opittavia parametreja, jotka optimoidaan suoraan takaisinpropagoinnin avulla, verkko oppii yksinkertaisesti asianmukaisesti suunnatut painokertoimet, mikä tekee matemaattisen ytimen kääntämisestä laskennallisesti tarpeetonta sekä harjoituksen että päättelyn aikana.
Eri väriavaruudet erottelevat visuaalisen datan spesifisiä fysikaalisia, havainnollisia ja tilastollisia ominaisuuksia, mikä tekee niistä soveltuvia tiettyihin näköjärjestelmän tehtäviin:
1. **RGB / BGR**: Kamerakennojen ja näyttölaitteistojen standardimuoto, joka edustaa additiivisia päävärejä (punainen, vihreä, sininen). Värikanavat korreloivat voimakkaasti luminanssin (valaistuksen muutokset vaikuttavat kaikkiin kolmeen kanavaan samanaikaisesti) kanssa. Se on standardisyöte syville neuroverkoille (kuten CNN-verkoille (Convolutional Neural Network) ja Vision Transformer -verkoille). Merkittävä tuotanto-ongelma on RGB- vs. BGR-kanavien vaihto (esim. OpenCV lataa BGR, kun taas PIL/PyTorch odottavat RGB:tä), mikä heikentää hiljaisesti mallin tarkkuutta.
2. **HSV / HSL**: Erottaa eksplisiittisesti kromaattisuuden (Hue = värisävy, Saturation = värikylläisyys) intensiteetistä (Value/Lightness). Se on ihanteellinen klassiseen värikynnyksen määrittelyyn, kohteen seurantaan värin perusteella ja värisegmentointiin vaihtelevassa valaistuksessa, koska Hue on suhteellisen invariantti varjostuksille ja kirkkauden muutoksille.
3. **CIE Lab**: Havainnollisesti yhtenäinen väriavaruus, jossa kahden pisteen välinen euklidinen etäisyys ($\Delta E$) heijastaa suoraan ihmisen havaitsemaa eroa. Se erottaa vaaleuden ($L^*$) vastaväriakseleista ($a^*$ vihreä-punainen, $b^*$ sininen-keltainen). Sitä käytetään värierotarkastuksissa, värinkorjauksessa, kuvanlaadun arvioinnissa ja väritystehtävissä.
4. **YCbCr**: Erottaa luminanssin ($Y$) sinisyyden eron ($Cb$) ja punaisuuden eron ($Cr$) kroma-komponenteista. Se on videon ja kuvan pakkausstandardien (JPEG, MPEG, H.264/H.265) perusta, koska ihmisen näköjärjestelmä on vähemmän herkkä kroman yksityiskohdille, mikä mahdollistaa kroman alinäytteistyksen (esim. 4:2:0) kaistanleveyden ja laskennan vähentämiseksi.
5. **Harmaasävy**: Yksikanavainen intensiteettiesitys ($Y \approx 0.299R + 0.587G + 0.114B$). Se on ihanteellinen geometria- ja tekstuuripohjaisiin tehtäviin, joissa väri on epäolennainen (esim. optinen virtaus, SLAM (Simultaneous Localization and Mapping), klassinen piirteiden poiminta kuten SIFT/ORB, reunan tunnistus) säästääkseen 66% muistista ja laskentatehosta. Sitä ei kuitenkaan tulisi käyttää, kun väri on avain erottava tekijä (esim. liikennevalojen tilan luokittelu).
import cv2
import numpy as np
# Sample image: saturated red under normal and shaded lighting
img_bgr = np.zeros((100, 100, 3), dtype=np.uint8)
img_bgr[:, :50] = [0, 0, 255] # Bright Red in BGR
img_bgr[:, 50:] = [0, 0, 120] # Shaded/Dark Red in BGR
# Convert to HSV (OpenCV H: 0-179, S: 0-255, V: 0-255)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
# Red Hue wraps around 0/180; track red with single Hue range [0, 10] & high saturation
lower_red = np.array([0, 100, 50])
upper_red = np.array([10, 255, 255])
mask_hsv = cv2.inRange(img_hsv, lower_red, upper_red)
print("HSV segmented pixels:", np.count_nonzero(mask_hsv), "out of", mask_hsv.size)
3Miksi kanavakohtainen kuvien normalisointi, kuvakohtainen normalisointi ja yhdenmukainen pikseliskaalaus ovat tärkeitä näköjärjestelmissä?
Kuvien normalisointi on elintärkeää näköjärjestelmissä numeerisen vakauden ylläpitämiseksi, gradientin laskeutumisen konvergenssin nopeuttamiseksi ja harjoitus- ja palveluympäristön jakaumien erojen (train-serving distribution shift) ehkäisemiseksi:
1. **Pikseliskaalaus ([0, 1] tai [-1, 1])**: Raakapikselit tallennetaan allekirjoittamattomina 8-bittisinä kokonaislukuina (`uint8` $\in [0, 255]$). Raakojen $[0, 255]$ arvojen syöttäminen neuroverkkoihin aiheuttaa erittäin suuria varhaisia aktivaatioita ja gradientin räjähdyksen tai kyllästymisen. Skaalaaminen välille $[0.0, 1.0]$ (jakamalla 255.0:lla) tai $[-1.0, 1.0]$ keskittää syötteet nollan ympärille, mikä on linjassa standardien painoarvojen alustamismenetelmien (He, Xavier) kanssa.
2. **Kanavan normalisointi datatasolla (keskiarvo-keskihajonta-standardointi)**: Standardoi syötteet kaavalla $x_{norm} = \frac{x - \mu_c}{\sigma_c}$ käyttäen ennalta laskettuja kanavakohtaisia globaaleja tilastoja (esim. ImageNet-keskiarvo `[0.485, 0.456, 0.406]` ja keskihajonta `[0.229, 0.224, 0.225]`). Tämä keskittää jokaisen kanavan nollakeskiarvoon ja yksikkövarianssiin koko datajoukossa, varmistaen tasapainoisen gradienttivirran kanavien välillä. Kriittinen toiminnallinen epäonnistuminen on **harjoitus- ja palveluympäristön ero (train-serving skew)**: jos päättelyssä unohdetaan jako 255:llä, käytetään yhteensopimattomia keskiarvo-/keskihajonta-vakioita tai niitä sovelletaan väärässä kanavajärjestyksessä (RGB vs BGR), mallin suorituskyky heikkenee merkittävästi.
3. **Kuvakohtainen normalisointi (instanssin normalisointi / Min-Max / Z-pistemäärä)**: Laskee keskiarvon ja keskihajonnan jokaiselle yksittäiselle kuvalle: $x_{norm} = \frac{x - \mu_{img}}{\sigma_{img}}$. Tämä poistaa globaalit kontrasti- ja valaistusvaihtelut eri kuvausolosuhteista. Vaikka se on tehokas tyylinsiirrossa, MRI/TT-lääketieteellisessä kuvantamisessa tai satelliittikuvissa, se voi olla haitallista, kun absoluuttisella pikselin intensiteetillä on fyysinen merkitys (esim. päivä-yö-luokittelu, materiaalin heijastavuus tai vikojen tunnistus kalibroidussa valaistuksessa).
import torch
import torchvision.transforms as T
from PIL import Image
import numpy as np
# Create a mock uint8 RGB image
raw_img = Image.fromarray(np.random.randint(0, 256, (224, 224, 3), dtype=np.uint8))
# Standard transform pipeline:
# 1. ToTensor scales uint8 [0, 255] -> float32 [0.0, 1.0] and permutes HWC -> CHW
# 2. Normalize standardizes per-channel using dataset mean and std
preprocess = T.Compose([
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
tensor_img = preprocess(raw_img)
print("Tensor shape:", tensor_img.shape)
print("Tensor dtype:", tensor_img.dtype)
print("Channel 0 min/max:", round(tensor_img[0].min().item(), 2), round(tensor_img[0].max().item(), 2))
4Miten geometriset ja fotometriset augmentaatiot edistävät invarianttiutta, ja miten päätät, säilyttääkö augmentaatio luokitukset?
Geometriset augmentaatiot (kuten rotaatio, translaatio, skaalaus ja peilaus) muuttavat pikselien spatiaalisten koordinaattien kartoitusta, kun taas fotometriset augmentaatiot (kuten kirkkaus, kontrasti, sävyn vaihtelu ja sumennus) muuttavat pikselin intensiteettiä ja värikanavia muuttamatta spatiaalisia koordinaatteja. Luokittelussa molemmat kategoriat altistavat mallin realistisille vaihteluille, kannustaen sitä oppimaan invariantteja representaatioita, joissa ennusteet pysyvät vakaina huolimatta asennon, näkökulman tai valaistusolosuhteiden muutoksista. Spatiaalisissa ennustustehtävissä (tunnistus ja segmentointi) geometriset muunnokset vaativat vastaavia muunnoksia todellisiin rajauslaatikoihin tai maskeihin ekvivarianssin säilyttämiseksi. Päätös siitä, säilyttääkö augmentaatio luokitukset, vaatii toimialueen semantiikan ja fysikaalisten ennakkotietojen arviointia. Muunnos on luokituksen säilyttävä, jos tuloksena oleva kuva pysyy uskottavana esimerkkinä alkuperäisestä kohdeluokasta muuttamatta sen semanttista identiteettiä. Esimerkiksi vaakapeilaus säilyttää yleisten objektien (kuten autojen tai eläinten) identiteetin, mutta muuttaa identiteettiä tai tekee merkit virheellisiksi optisessa merkintunnistuksessa (OCR) ja numeroiden luokittelussa. Samoin täysi 360 asteen rotaatio on pätevä histologian tai satelliittikuvien yhteydessä, joissa ei ole kanonista suuntaa, mutta luonnoton autonomisessa ajamisessa, jossa ylösalaisin olevat objektit rikkovat todellisen maailman fysikaalisia rajoituksia.
5Mitä ovat lähimmän naapurin (nearest-neighbor), bilineaarinen (bilinear), bikubinen (bicubic) ja alue (area) -interpolaatio, ja miten koon muuttaminen voi aiheuttaa aliasing-ilmiötä tai sumennusta?
Interpolaatiomenetelmät arvioivat pikseli-intensiteettejä jatkuvissa koordinaateissa, kun kuvaa uudelleennäytteistetään uudelle diskreetille ruudukolle:
- **Lähimmän naapurin interpolaatio:** Määrittää lähimmän diskreetin pikselin intensiteetin. Se on laskennallisesti $O(1)$ ja säilyttää tarkat alkuperäiset arvot, mutta luo lohkomaisia virheitä ylinäytteistyksessä ja vakavia sahareunaisia reunoja alinäytteistyksessä.
- **Bilineaarinen interpolaatio:** Laskee etäisyyksillä painotetun keskiarvon $2 \times 2$ (4 lähimmän) naapuripikselin perusteella käyttämällä lineaarista interpolaatiota molempia akseleita pitkin, tuottaen tasaisia siirtymiä kohtalaisella sumennuksella.
- **Bikubinen interpolaatio:** Näytteistää $4 \times 4$ (16 lähimmän) naapuruston käyttäen kubisia polynomikerneleitä. Se kaappaa paikalliset intensiteettigradientit tuottaen terävämpiä reunoja ja tasaisempia käyriä kuin bilineaarinen, mutta voi aiheuttaa ylityksiä ja rengasmaisia virheitä terävien siirtymien ympärille.
- **Alue (Box) -interpolaatio:** Laskee kohdepikselien, jotka projisoidaan lähdepikseleihin, murto-osan pinta-alan päällekkäisyyden ja ottaa keskiarvon alapuolisista lähdeintensiteeteistä. Se on erityisen tehokas alinäytteistyksessä ilman moiré-ilmiötä.
**Aliasing- ja sumennusmekanismit:**
- **Aliasing-ilmiö** ilmenee alinäytteistyksessä, kun korkeataajuinen sisältö ylittää uuden näytteenottotaajuuden Nyquist-taajuuden ($f_s / 2$) ilman riittävää alipäästösuodatusta. Korkeat taajuudet taittuvat takaisin matalampiin taajuuskaistoihin, tuottaen virheellisiä kuvioita, moiré-ilmiötä ja sahareunaisia reunoja.
- **Sumennus** ilmenee, kun interpolaatiokerneelit toimivat alipäästösuodattimina, jotka vaimentavat aidot korkeat taajuudet (esim. bilineaarinen sumennus) tai kun korkeataajuiset yksityiskohdat tasataan keskiarvolla alinäytteistyksen aikana.
6Mitä todellisen maailman visuaalisia vikatiloja näköjärjestelmää tulisi arvioida vastaan, ja miten ne muuttavat syötedistribuutiota?
Todellisen maailman visuaaliset vikatilat jaetaan useisiin laajoihin luokkiin: ympäristöolosuhteet (alhainen valaistus, suora häikäisy, sade, lumi, sumu), anturi- ja optiset vaikutukset (liikesumeus, epätarkkuussumeus, korkean ISO-arvon anturimelu, rullalukijavinouma), pakkaus- ja siirron heikkeneminen (JPEG-lohkoisuus, videon bittinopeuden kuristus, alikvantisointi) sekä semanttiset/spatiaaliset muutokset (osittainen peittyminen, katkaisu, jakautuman ulkopuoliset kohteen asennot). Nämä vikatilat siirtävät syötedistribuutiota poispäin nimellisistä koulutusalueista useilla tasoilla. Pikselitasolla ne muuttavat luminanssi- ja krominanssihistogrammeja, tuhoavat paikallista kontrastia, heikentävät kohinasuhdetta (SNR) ja tuovat mukanaan keinotekoisia korkeataajuisia artefakteja tai sumentumaytimiä. Rakenteellisella ja semanttisella tasolla ne vaimentavat reunagradientteja, peittävät keskeisiä visuaalisia piirteitä, vääristävät siluetteja ja piilottavat kriittisiä diagnostisia alueita. Kun puhtaalla datalla koulutetut mallit kohtaavat näitä muuttuneita syötteitä, matalan tason konvoluutio- tai huomiopohjaiset piirrevedostajat eivät aktivoidu oikein, mikä johtaa menetettyihin havaintoihin, hallusinoituihin vääriin positiivisiin kohinakuvioissa ja ylivarmoihin virheisiin.
7Miten klassiset kuvaajat, kuten HOG (Histogram of Oriented Gradients), esittävät kuvien rakennetta, ja mitä rajoituksia niillä on verrattuna opittuihin CNN (Convolutional Neural Network) -piirteisiin?
HOG (Histogram of Oriented Gradients) on klassinen käsin suunniteltu piirrekuvaaja, joka on suunniteltu taltioimaan paikallista kohteen muotoa ja ulkonäköä intensiteettigradienttien suuntien jakautumisen kautta. HOG-laskentaputki sisältää: (1) vaaka- ja pystysuuntaisten kuvagradienttien laskemisen (esim. 1D-derivatiivisuodattimilla [-1, 0, 1]) gradientin suuruuden ja suunnan saamiseksi; (2) kuvan jakamisen pieniin alueellisiin alueisiin, joita kutsutaan 'soluiksi' (kuten 8x8 pikseliä), ja 1D-histogrammien keräämisen gradienttien suunnista painotettuna gradientin suuruudella; (3) vierekkäisten solujen ryhmittelyn suurempiin päällekkäisiin 'lohkoihin' (kuten 2x2 solua) ja lohkopiirrevektoreiden normalisoinnin (käyttäen L2-normia tai L1-neliöjuurta) kestävyyden saavuttamiseksi paikallisia valaistuksen, kontrastin ja varjostuksen vaihteluita vastaan; ja (4) normalisoitujen lohkovektoreiden yhdistämisen lopulliseksi 1D-piirreesitykseksi, joka on historiallisesti yhdistetty lineaarisiin SVM (Support Vector Machine) -luokittelijoihin jalankulkijoiden ja kohteiden tunnistuksessa.
Verrattuna opittuihin CNN (Convolutional Neural Network) -piirteisiin, HOG:lla on merkittäviä rajoituksia: Ensinnäkin, HOG-piirteet ovat kiinteitä ja käsin suunniteltuja, taltioiden vain matalan tason paikallisia reunojen suuntatilastoja ilman kykyä oppia tehtäväkohtaisia hierarkkisia esityksiä (kuten tekstuurit, kohteen osat ja semanttiset käsitteet). Toiseksi, HOG tarjoaa hyvin rajallisen geometrisen invarianttiuden: vaikka lohkon normalisointi käsittelee monotonisia valaistuksen muutoksia ja pieniä tilallisia siirtymiä solujen sisällä, HOG on hauras 3D-kierrosten, merkittävien mittakaavavaihteluiden, joustamattomien asennonmuutosten ja voimakkaan taustakuvion alla. Sen sijaan CNN:t oppivat monikerroksisia epälineaarisia abstraktioita, jotka on optimoitu päästä päähän kohdetavoitteen mukaan.
9Miten konvoluutioydin (convolution kernel) vastaa klassista lineaarista kuvansuodatinta, ja milloin 2D-suodatin voidaan tehdä separoituvaksi?
Klassisessa lineaarisessa signaalin- ja kuvankäsittelyssä konvoluutioydin (convolution kernel) edustaa lineaarisen siirtoinvariantin (LSI) järjestelmän spatiaalista impulssivastetta (point spread function). Ytimen soveltaminen on spatiaalisen alueen lineaarinen suodatusoperaatio, joka muokkaa kuvan taajuusvastetta (sen 2D Fourier-muunnosta). Alipäästöytimet (esim. Gaussin, sumennuslaatikko) vaimentavat korkeita spatiaalisia taajuuksia kohinan vaimentamiseksi ja tekstuurien tasoittamiseksi, kun taas ylipäästö- tai kaistanpäästöytimet (esim. Sobel, Laplace, Prewitt) vahvistavat korkeita taajuuksia reunojen ja gradienttien havaitsemiseksi. Kaksiulotteinen suodatinydin $K \in \mathbb{R}^{M \times N}$ on spatiaalisesti separoituva, jos se voidaan hajottaa kahden yksiulotteisen suodattimen ulkotuloksi: $K = u \cdot v^T$, missä $u \in \mathbb{R}^{M \times 1}$ ja $v \in \mathbb{R}^{N \times 1}$. Lineaarialgebran termein 2D-matriisi on separoituva, jos ja vain jos sen matriisin asteikko on 1. Tämä voidaan varmistaa singulaariarvohajotelman (SVD) avulla, jossa tasan yksi singulaariarvo on nollasta poikkeava ($\sigma_1 > 0, \sigma_2 = \dots = 0$). Separointuvuus vähentää merkittävästi laskennallista kompleksisuutta. Ei-separoitavan $K \times K$ -ytimen soveltaminen $H \times W$ -kuvaan vaatii $O(H \cdot W \cdot K^2)$ kertolaskua ja yhteenlaskua. Kun se hajotetaan kahdeksi peräkkäiseksi 1D-käsittelyksi (ensiksi vaakasuora, sitten pystysuora), kompleksisuus putoaa tasolle $O(H \cdot W \cdot 2K)$. Esimerkiksi $15 \times 15$ -ytimen tapauksessa tämä tuottaa noin $7.5\times$ nopeamman suorituksen.
10Miten kuvan koon muuttaminen (`resizing`), keskeltä rajaaminen (`center cropping`), satunnainen koonmuutoksella rajaaminen (`random-resized cropping`), venyttäminen (`stretching`) ja mustien palkkien lisääminen (`letterboxing`) muuttavat syötteen jakaumaa?
Erilaiset koonmuutos- ja rajausstrategiat muuttavat syötteen datajakaumaa geometrian, skaalan, sisällön peittävyyden ja spatiaalisten rajojen suhteen:
1. **Suora koonmuutos (venyttäminen/litistäminen):** Skaalaa kuvaa epäisotrooppisesti kohdemittoihin $(H, W)$, vääristäen alkuperäisiä kuvasuhteita. Tämä pakottaa mallin käsittelemään epämuodostuneita objektien muotoja (esim. ympyrän muotoiset kohteet muuttuvat pitkänomaisiksi ellipseiksi).
2. **Keskeltä rajaaminen:** Poimii keskeisen rajauksen kiinteällä koolla tai suhteella. Se säilyttää alkuperäisen kuvasuhteen ja paikallisen skaalan, mutta tuo mukaan vahvan keskelle sijoittumisen harhan (olettaen kohteiden olevan keskeisesti kehystettyjä) ja hylkää reuna-alueiden kontekstin tai leikkaa reunoilla olevia kohteita.
3. **Satunnainen koonmuutoksella rajaaminen (RRC):** Poimii satunnaisia alialueita vaihtelevilla pinta-alaskaaloilla ja kuvasuhteilla, minkä jälkeen ne skaalataan kiinteään kokoon. Tämä laajentaa harjoituksen skaalajakaumaa ja edistää osiin perustuvaa ominaisuuksien oppimista, mutta äärimmäiset rajaukset voivat jättää kohdeobjektin kokonaan pois.
4. **Mustien palkkien lisääminen (isotrooppinen koonmuutos täyttämällä):** Skaalaa kuvaa tasaisesti, kunnes sen pisin ulottuvuus sopii tavoitekokoon, ja täyttää sitten jäljelle jääneet reunat vakiovärillä. Se säilyttää objektien todelliset mittasuhteet ja kuvasuhteet, mutta tuo mukaan keinotekoisia korkeakontrastisia reunoja ja epäinformatiivisia täytettyjä pikseleitä.
11Mitä annotointikohinan tyyppejä esiintyy konenäköaineistoissa, ja miten ne voidaan tunnistaa tai lieventää?
Konenäköaineistoissa esiintyy yleisesti neljä ensisijaista annotointikohinan tyyppiä:
1. **Kategorinen etikettikohina:** Kuvalle tai kohteelle on määritetty väärä luokkaetiketti (esim. kissan luokittelu koiraksi tai hienovaraisten, yksityiskohtaisten luokkien sekoittaminen).
2. **Puuttuvat annotaatiot (puutoskohina):** Kelvollisia etualan objekteja jätetään annotoimatta. Objektintunnistuksessa pois jätetyt kohteet käsitellään tausta-negatiiveina, mikä rankaisee suoraan mallin oikeista tunnistuksista koulutuksen aikana.
3. **Rajauslaatikon / avainpisteen värinä (lokalisointikohina):** Epätarkat, löysät tai siirtyneet rajauslaatikon koordinaatit ja maamerkkien sijainnit, jotka johtuvat ihmisannotointien epäjohdonmukaisuudesta.
4. **Maskin rajan epäselvyys:** Epäjohdonmukaiset tai karkeat segmentointiääriviivat monimutkaisten tai sumentuneiden rajojen varrella (esim. hiukset, puoliläpinäkyvät pinnat, liikesumeus).
**Tunnistus- ja lievennysstrategiat:**
- **Häviön poikkeamien seuranta ja Confident Learning:** Näytekohinan seuranta koulutusepokkien yli tunnistaa jatkuvat korkean häviön poikkeamat, jotka usein viittaavat virheellisesti etiketöityihin tai puuttuviin tapauksiin. Confident Learningin kaltaiset algoritmit arvioivat kohinajakaumia virheiden karsimiseksi tai korjaamiseksi.
- **Out-of-Fold (OOF) -ennusteiden erot:** Kouluttamalla ristiinvalidointimallit ja vertailemalla erillisten ennusteita (holdout predictions) todellisiin arvoihin (ground truth) korostetaan virheellisesti etiketöityjä kuvia ja puuttuvia rajauslaatikoita.
- **Annotaattoreiden välinen yhteisymmärrys (IAA) ja sovittelu:** Mittaamalla tunnuslukuja, kuten Cohenin Kappa (luokittelu) tai keskimääräinen Intersection-over-Union (lokalisointi) useiden annotaattoreiden kesken, merkitään alhaisen yhteisymmärryksen näytteet konsensusarviointia varten.
- **Robustit häviöfunktiot:** Käyttämällä etiketin tasoitusta, kohinaa sietäviä luokitteluhäviöitä tai robusteja IoU-pohjaisia regressiohäviöitä vähennetään herkkyyttä värinälle ja virheelliselle etiketöinnille.
import torch
import torch.nn.functional as F
def find_label_noise_candidates(model, dataloader, device, top_k=50):
model.eval()
sample_losses = []
with torch.no_grad():
for batch_idx, (images, targets, sample_ids) in enumerate(dataloader):
images, targets = images.to(device), targets.to(device)
logits = model(images)
loss_per_sample = F.cross_entropy(logits, targets, reduction='none')
for sid, l, target, pred in zip(sample_ids, loss_per_sample.cpu(), targets.cpu(), logits.argmax(dim=-1).cpu()):
sample_losses.append({'id': sid, 'loss': l.item(), 'target': target.item(), 'pred': pred.item()})
sample_losses.sort(key=lambda x: x['loss'], reverse=True)
return sample_losses[:top_k]
12Miten luokkaepätasapaino vaikuttaa kuvaluokittelun, tunnistuksen ja tiheän ennustamisen (dense prediction) koulutukseen?
Luokkaepätasapaino vaikuttaa optimoinnin dynamiikkaan ja häviöfunktioiden maisemiin kaikissa vision tehtävissä:
1. **Kuvaluokittelu:** Kun enemmistöluokat ovat vähemmistöluokkia suurempia, empiirisen riskin minimointi (empirical risk minimization) saa parametri-päivitykset hallitsemaan enemmistöluokan gradienttien avulla. Malli oppii empiirisen luokka-priorijakauman $P(Y)$ ja vinouttaa päätösrajansa harvinaisia luokkia vastaan. Tämä tuottaa korkean kokonaisvaltaisen top-1-tarkkuuden, mutta kärsii vakavasta vähemmistön palautuksen (recall) romahtamisesta.
2. **Objektien tunnistus:**
* *Etualan ja taustan epätasapaino:* Tiheissä yksivaiheisissa ja ankkuripohjaisissa tunnistimissa arvioidaan satoja tuhansia ehdokassijainteja kuvaa kohti, joista >99 % on taustaa. Vaikka yksittäiset helpot tausta-ankkurit tuottavat pieniä häviöitä, niiden valtava aggregoidut gradientit hukuttavat informatiiviset gradienttisignaalit harvoista etualan kohteista.
* *Etualan luokkien epätasapaino:* Yleiset objektikategoriat esiintyvät suuruusluokkia useammin kuin harvinaiset kategoriat, mikä vähentää tehokasta otoskokoa ja oppimissignaalia harvinaisille luokille.
3. **Tiheä ennustaminen (segmentointi):** Pikselitason epätasapaino on vakava, koska suuret tausta- ja 'stuff'-luokat (esim. tie, taivas) kattavat miljoonia pikseleitä, kun taas pienet 'thing'-luokat (esim. liikennemerkit, jalankulkijat) saattavat kattaa alle 0,1 % kuvan pikseleistä. Standardi pikselikohtainen ristientropiahäviö (cross-entropy loss) on suurten alueiden luokkien hallitsema, mikä johtaa pienten, ohuiden rakenteiden ali-segmentaatioon tai täydelliseen katoamiseen.
13Miten debuggaisit NaN-arvoja (Not a Number) tai epävakaata häviötä suurikokoisessa hajautetussa kuvantamisen harjoittelussa?
NaN-arvojen (Not a Number) tai häviön epävakauden debuggaus suurikokoisessa hajautetussa dataparallel (DDP) kuvantamisen harjoittelussa edellyttää sen eristämistä, johtuuko juurisyy huonoista syötetiedoista, numeerisesta yli- tai alivuodosta sekoitetussa tarkkuudessa (AMP) vai optimoinnin epävakaudesta eri työntekijöiden (worker) välillä. Ensin on luotava determinismi ja turvakytkimet: ota käyttöön poikkeamien havaitseminen (`torch.autograd.set_detect_anomaly(True)`), rekisteröi gradientti-/aktivointikytkimet (gradient/activation hooks) havaitsemaan tarkka kerros, jossa NaN-arvot ilmestyvät, ja lisää tiukka tietojen validointi DataLoaderiin (varmista rajalliset arvot, tarkista 0-tavun vioittuneet kuvat, tyhjät rajauslaatikot tai nolla-varianssin normalisointijakajat). Minipatch-tason lokituksen tulisi seurata kunkin rankin häviötä, syötteen URI-osoitteita, gradienttinormia ennen leikkausta ja GradScaler-skaalauskertoimia. Toiseksi tarkasta automaattinen sekoitettu tarkkuus (AMP) ja dynaaminen häviön skaalaus: FP16:ssa suuret gradientit ylivuotoavat helposti (`> 65504`), mikä saa häviön skaalaajan ohittamaan vaiheita ja puolittamaan toistuvasti skaalauskertoimensa, kunnes skaalaus saavuttaa nollan; epävakaiden operaatioiden (esim. softmax, LayerNorm, fokaalisen häviön eksponentit tai rajauslaatikon IoU-nimittäjät) vaihtaminen FP32:een tai BF16:n käyttöönotto (joka vastaa FP32:n dynaamista aluetta) yleensä vakauttaa harjoittelun. Lopuksi tarkasta DDP-kohtaiset sudenkuopat, kuten all-reduce-operaatiot, jotka levittävät NaN-arvoja yhdestä työntekijästä kaikkiin rankkeihin, oppimisnopeuden lämmittelyskaalaus (esim. lineaarinen skaalaussääntö suurilla globaaleilla batch-kokoilla) ja gradientin leikkaus.
import torch
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
for step, (images, targets, uris) in enumerate(dataloader):
# 1. Input sanitization
if not torch.isfinite(images).all():
print(f"Corrupt input detected from URIs: {uris}")
continue
optimizer.zero_grad(set_to_none=True)
with autocast(dtype=torch.float16):
outputs = model(images)
loss = criterion(outputs, targets)
if not torch.isfinite(loss):
print(f"NaN/Inf loss at step {step} on rank {torch.distributed.get_rank()}; skipping step.")
continue
scaler.scale(loss).backward()
# Unscale before clipping to inspect true gradient norms
scaler.unscale_(optimizer)
grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
if torch.isnan(grad_norm) or torch.isinf(grad_norm):
print(f"Warning: Grad norm is {grad_norm}. Scaler will adjust.")
scaler.step(optimizer)
scaler.update()
14Miten suunnittelisit reaaliaikaisen digitaalisen videonvakautuskomponentin kameralle, jossa esiintyy kuvan tärinää?
Reaaliaikaisen digitaalisen videonvakautusputken suunnittelu kameran kuvan tärinän (jitter) poistamiseksi sisältää neljä päävaihetta: liikkeen estimointi, liikkeen tasoitus, liikkeen kompensointi (vääntäminen) ja reunojen käsittely.
1. **Kehysten välinen liikkeen estimointi:** Poimi 2D-harvoja avainpisteitä peräkkäisistä kuvista käyttämällä nopeita piirteentunnistimia (esim. ORB, FAST tai Shi-Tomasi-kulmat) ja laske vastaavuudet Lucas-Kanaden optisen virtauksen tai piirrekuvaajien vertailun avulla. Estimaa kehysten välinen geometrinen muunnos (kuten Affine- tai Homography-malli) RANSAC-algoritmia käyttäen hylätäksesi erillään liikkuvien etualan kohteiden aiheuttamat poikkeavat vastaavuudet.
2. **Liikeradan kerryttäminen ja reaaliaikainen tasoitus:** Integroi kehys-kehys-muunnoksia ajan mittaan kumulatiivisen kameraradan $P_t = P_{t-1} \cdot H_t$ ylläpitämiseksi. Käytä reaaliaikaista tasoitussuodatinta – kuten 1D/2D Kalman-suodatinta tai lyhyen ikkunan kausaalista liukuvaa keskiarvoa – erottaaksesi korkeataajuisen tahattoman tärinän matalataajuisesta tahallisesta kameran panoroinnista.
3. **Kompensointi ja kuvan vääntäminen:** Laske korjausmuunnos $C_t = S_t \cdot P_t^{-1}$ (missä $S_t$ on tasoitettu polku) ja väännä nykyinen kuva bilineaarisen/bikubisen interpoloinnin avulla.
4. **Reunojen käsittely ja viiverajoitukset:** Vääntäminen aiheuttaa puuttuvia reunapikseleitä / mustia reunoja; ratkaise tämä soveltamalla kiinteää dynaamista rajaustekijää (esim. 5-10 % zoom) reunan ekstrapolaatiolla tai adaptiivisella skaalauksella. Reaaliaikaisessa ympäristössä ylläpidä minimaalista puskurointia (1–3 ennakoivaa kehystä) käsittelyviiveen rajoittamiseksi.
15Miten optimoisit reaaliaikaisen näköjärjestelmän putken, kun detektori on hitaampi kuin tavoitekuvanopeus?
Kun kohteentunnistin ei pysty ylläpitämään tavoitekuvanopeutta (esim. käynnissä 15-20 kuvaa sekunnissa 60 kuvaa sekunnissa videovirralla), vankka tuotantoarkkitehtuuri irrottaa tunnistuksen reaaliaikaisesta esityssilmukasta käyttämällä asynkronista monisäikeistä putkea, joka yhdistää raskaan tunnistuksen kevyeen seurantaan. Tässä hybridiarkkitehtuurissa syöttösäie tallentaa videokehyksiä jatkuvasti. Raskas tunnistin toimii asynkronisesti 'avainkehystunnistimena' taustatyösäikeessä. Samaan aikaan kevyt seurantaohjelmisto (kuten optinen virtaus Lucas-Kanade, ByteTrack/BoT-SORT tai nopea korrelaatiosuodatin/Kalman-suodatin) toimii synkronisesti jokaisessa kehyksessä täydellä 60 kuvaa sekunnissa ylläpitäen kohteen tilaa, identiteettiä ja tasaisia rajaavan laatikon (bounding box) liikeratoja. Viiveen ja vastapaineen käsittelemiseksi ilman rajatonta viivettä tai vanhentuneita kehyksiä käytetään rajattuja rengaspuskureita ja uusimman kehyksen pudotuskäytäntöjä. Kun tunnistin viimeistelee kehyksen T_0 ajankohtana T_curr, sen tulos on vanhentunut. Putki suorittaa koordinaattien uudelleenlinjauksen/takaisinprojisoinnin: se yhdistää viivästyneet tunnistustulokset historialliseen seurannan tilatietoon ajankohdassa T_0, päivittää identiteetit ja puuttuvat seurannat sekä levittää korjaukset eteenpäin ajankohtaan T_curr seurannan liikevektoreiden tai Kalman-suodattimen ennustusvaiheiden kautta.
import queue
import threading
frame_queue = queue.Queue(maxsize=1) # Drop stale frames, keep latest
det_result_queue = queue.Queue()
def detector_worker():
while True:
frame, frame_id, timestamp = frame_queue.get()
boxes, scores, classes = heavy_detector.infer(frame)
det_result_queue.put({'frame_id': frame_id, 'boxes': boxes, 'timestamp': timestamp})
def realtime_pipeline(video_stream):
tracker = FastTracker() # e.g. Optical flow or Kalman tracker
for frame, frame_id, timestamp in video_stream:
if frame_queue.empty():
frame_queue.put((frame, frame_id, timestamp))
if not det_result_queue.empty():
det_result = det_result_queue.get()
tracker.reconcile_and_correct(det_result, current_frame_id=frame_id)
active_tracks = tracker.update(frame)
display_or_downstream(frame, active_tracks)