tiistai 18. joulukuuta 2012

Tentin ja välikokeiden tulokset

Tentti ja välikokeet on nyt tarkastettu. Tulokset olivat varsin hyviä, ja eritoten välikokeilla on saatu hyviä arvosanoja. Osin tämä johtuu siitä että toinen välikoe oli helpohko, minkä lisäksi sinne oli lipsahtanut sama 5a-tehtävä kuin ensimmäisessä välikokeessakin. Tästä huolimatta esimerkiksi välikokeen tehtävä 5b oli yhteinen tentin kanssa, ja se oli osattu paljon paremmin välikokeen puolella, joten välikokeen paremmat arvosanat ovat perusteltuja.

Kysymyspaperin kuutostehtävässä pyydettiin kommentteja kurssista kehittämistä varten. Palaute oli pääosin positiivista, ja siinä kiiteltiin luentoja, prujua sekä sovellushenkisyyttä. Kurssia kommentoitiin helpohkoksi ja kaivattiin siihen korkeampaa pakollisten harjoitusten määrää sekä esimerkiksi harjoitustyötä tukemaan itsenäistä osaamista. Myös kurssiblogia sekä viikkoharjoituksia kiiteltiin. Yksi palaute totesi luennoitsijan kehittyneen opettajana vuosia sitten suoritettuun kurssiin SGN-1201 verrattuna. Ilmeisesti siis TTY:n järjestämät pedagogiset opinnot (tai joku muu syy) ovat tehneet tehtävänsä.

Kurssi luennoitiin tässä muodossa toiseksi viimeistä kertaa. Laitoksen kurssit nimittäin organisoidaan uusiksi, ja kurssit SGN-1201 ja SGN-1251 sulautetaan uuteen laajempaan Signaalinkäsittelyn perusteet -kurssiin (5 op). Tästä huolimatta kommentit sekä tenttipapereiden kautta saatu palaute (mitkä asiat ovat vaikeita) on tärkeässä osassa kehitettäessä kurssin uutta versiota keväälle 2014. Kommentteja voi siis jättää Kaiku-järjestelmään tai vaikka tämän blogin kommenttikenttään.

keskiviikko 5. joulukuuta 2012

Vierailuluennot

Tänään kurssilla oli vierailuluentoja signaalinkäsittelyn teollisista sovelluksista:
Ensimmäisen vierailuluennon aiheena oli hänen kehittämänsä ja Ovelinin tuotteistama musiikin nuotinnusjärjestelmä. Menetelmä perustuu ns. Constant-Q-muunnokseenMenetelmän perustalle on toteutettu peli "WildChords", jossa akustisen kitaran avulla voidaan ohjata pelihahmoa. Innovatiivista pelissä on se, että pelatessaan oppii samalla soittamaan kitaraakin. Esityksessä tuli hienosti vastaan kurssilla aiemmin vastaan tulleita elementtejä: (ainakin) spektrin estimointi, audion koodaus sekä koneoppiminen.

Toisella tunnilla tutustuttiin Sandvikin poralaitteisiin, ja tehtiin mielenkiintoinen ekskursio teollisuustalouden periaatteisiin: miksi ja milloin tuotekehitystä tarvitaan. Lopuksi tarkasteltiin joitakin signaalinkäsittelyn sovelluksia liittyen porausprosessin hallintaan ja ymmärtämiseen, joissa kaikissa lähtötietona on joltain anturilta kerättävä häiriöinen mittaustieto.

keskiviikko 28. marraskuuta 2012

Epälineaarinen signaalinkäsittely

Päivän aihe oli epälineaarinen signaalinkäsittely, jonka lisäksi tutkailtiin varovasti signaalin ilmaisun sekä hypoteesin testauksen aihepiirejä. 

Epälineaariset suotimet saattavat tarjota vaihtoehdon lineaarisille suotimille (FIR ja IIR) silloin kun häiriö ja signaali sijaitsevat samalla taajuusalueella. Klassisin epälineaarinen suodin on mediaanisuodin, jonka ulostulo on suuruusjärjestyksessä keskimmäinen ikkunan sisällä olevista arvoista. Tätä vertailtiin prujun esimerkissä lineaarisen suotimen kanssa. Lopuksi tarkasteltiin vielä suotimen robustisuusmittoja, ja erityisesti murtumapistettä.

Toisen tunnin loppupuolella vilkaistiin ensi viikon harjoitustehtäviä 9.4 ja 9.5, joissa toteutetaan outlier-tunnistin:
  • x(n) on outlier, jos |x(n) - m| / s > 2,
missä m on signaalin keskiarvo ja s keskihajonta. Vastaavia algoritmeja on helppo keksiä, ja niiden vertailu onkin tärkeää. Tätä varten määriteltiin ns. true-positive-rate (TPR), joka kertoo kuinka suuri osa outliereistä löydettiin, ja ns. false-positive-rate (FPR), joka kertoo paljonko tuli vääriä hälytyksiä. Yhdessä nämä piirtävät ns. ROC-käyrän, jonka alle jäävä alue on yleisesti käytetty ilmaisimen hyvyysmitta.
Ilmaisun teoria (engl. detection theory) tarjoaa myös työkalut optimaalisen aaltomuodon tunnistimen suunnitteluun. Tästä nähtiin esimerkki, joka tunnistaa sinipulssit korrelaation kautta.

Aivan lopuksi tutustutiin yleisempään hypoteesin testaukseen. Tästä esimerkkinä oli tämän vuoden Ig-Nobel-palkinnon voittaja otsikolla Dead salmon brain scan. Jutussa oli havaittu satunnaisvaihtelusta johtuvaa aktiivisuutta kuolleen lohen aivoissa, ja vitsiä jatkettiin tieteelliseksi artikkeliksi asti (jossa lohi reagoi erilaisiin psykologisiin testeihin). Virheellisesti havaitun aktiivisuuden syynä on ns. multiple comparison testing-ongelma: kun tarpeeksi monta pikseliä verrataan kynnysarvoon, joku niistä sattuu ylittämään kynnyksen.

Signaaliprosessorit

21.11 olleella luennolla käsiteltiin kappale signaaliprosessoreista. Tärkeimmät syyt niiden käyttöön ovat yksinkertaisuus, halvempi hinta sekä pienempi virrankulutus. Kuitenkin niistä saa riittävästi tehoa signaalinkäsittelyn tarpeisiin, koska alan tarvitsemat operaatiot ovat nopeita (kertolasku, yhteenlasku). Esimerkiksi FIR-suodatuksen tarvitsemat kertolaskut ja yhteenlaskut voidaan suurelta osin laskea rinnakkain ns. MAC-operaation avulla. Vastaavia operaatioita on nykyisin myös tavallisissa prosessoreissa, ja ensimmäinen tällainen laajennus oli IntelinMMX-käskykanta vuodelta 1997.

Ensi viikon viikkoharjoituksissa koodataan FIR-suodin luokan TC303 signaaliprosessoreille. Olennaisimmat vaiheet olivat:
  1. Suodin suunniteltiin Matlabin fir1-rutiinilla.
  2. Kertoimet kopioitiin C-koodiin.
  3. C-kieliseen pohjaan kirjoitettiin for-silmukka, jossa kertoimet käydään läpi.
  4. Ulostulonäyte kirjoitetaan D/A-muuntimelle.
Vaiheessa 3 on kiinnitettävä huomiota circular buffering-tekniikkaan, jotta viitataan oikeisiin aiemmin sisään tulleisiin alkioihin.

keskiviikko 14. marraskuuta 2012

Audiokompressio

Tänään käsiteltiin kappale 7: audiokompressio. Audiokompression ideana on tallentaa äänisignaali häviöllisesti poistaen bittejä sieltä missä kuulo ei niitä havaitse. Tässä auttaa kuulon ominaisuuksien tuntemus, joista olennaisin osa on kuulokäyrä. Kuulo havaitsee matalia ja korkeitä ääniä heikommin kuin keskiääniä. Tämän vuoksi epätarkemmin havaittavat taajuudet voidaan esittää pienemmällä bittimäärällä. Tässä yhteydessä on hyvä muistaa että jokainen poistettu bitti lisää kvantisointikohinaa kuudella desibelillä. Kysymys voidaan siis asettaa muotoon: "montako kuuden desibelin palikkaa kuulokäyrän alle mahtuu kullakin taajuudella". Lisätilaa kuuden desibelin palikoille saadaan havaitsemalla, että äänet peittävät heikompia ääniä alleen. Tässä tapauksessa siis itse kompressoitava signaali peittää näitä heikompia kuuden desibelin palikoita. Luennolla nähtiin myös esimerkki siitä miltä tulosmaski saattaisi näyttää yksittäisen piippauksen ympäristössä.

Jotta kuulomallia voitaisiin käyttää, täytyy signaali jakaa taajuuskaistoihin. Tämä tehdään kaistanpäästösuotimilla, ja kaistoja mp3-standardissa on 32. Kukin kaista voidaan alinäytteistää kertoimella 32, jolloin dataa on saman verran kuin alun perin. Nämä kaistat voidaan sitten kvantisoida kuulomallin mukaisesti. Palautettaessa alkuperäistä näytteenottotaajuutta riittää tehdä ylinäytteistys (nollien lisääminen) kertoimella 32, jolloin havaitaan, että aiemmin laskostunut signaali pomppaakin oikealle paikalleen ja vieläpä oikein päin --- siinäkin tapauksessa, että se olisi sattunut laskostumaan peilikuvakseen.

keskiviikko 7. marraskuuta 2012

Tilastollinen signaalinkäsittely

Tänään luotiin katsaus tilastolliseen signaalinkäsittelyyn ja erityisesti parametrien estimointiin. Ideana on luoda malli signaalista, joka riippuu tietyistä parametreista. Ongelmana on tämän jälkeen kehittää menetelmä näiden parametrien valintaan mitatun datan perusteella. Esimerkkinä voisi olla signaali, jonka tiedetään olevan sinimuotoinen, mutta amplitudi, vaihe sekä taajuus eivät ole tiedossa. Tähän ongelmaan esitetään prujussa kaavat, joilla voidaan arvioida optimaalisesti (suurimman uskottavuuden mielessä) kohinaisesta datasta näitä kolmea parametria.

Seuraavaksi tutustuttiin tarkemmin pienimmän neliösumman menetelmään, joka valitsee parametrit minimoimalla neliövirheen datan ja mallin ennusteen välillä. Kaavana ilmaistuna, pyritään löytämään se vektori c joka minimoi lausekkeen sum((y-Hc)^2). Voidaan osoittaa, että tämä saadaan kätevästi kaavasta

c = (HT*H)-1 * HT * y.


Seuraavaksi vilkaistiin muutamaa esimerkkisovellusta:
  • Soft sensor, jossa ennustetaan jotain hankalasti mitattavaa suuretta useiden helppojen mutta epätarkkojen mittausten avulla
  • Mikroskooppikuvan valaistuksen epätasaisuuden poisto
  • Asuntojen hinnanmuodostus ja siihen vaikuttavat tekijät Tampereen keskustassa (tällä aineistolla)
Aivan luennon lopuksi tutustuttiin lyhyesti tapaukseen, jossa muuttujia on enemmän kuin näytteitä. Tällöin vektori c ei ole yksikäsitteinen, vaan useampi kerroinvektori tuottaa yhtä hyvän tuloksen. Tällaisissa tilanteissa valitaan tavallisesti lähimpänä origoa oleva c (siis se, jonka normi ||c|| on pienin). Vaihtoehtoisesti voidaan piirteenvalinnalla valita vain osa matriisin H sarakkeista, jolloin c tulee ennen pitkää taas yksikäsitteiseksi.

torstai 1. marraskuuta 2012

Oppivat järjestelmät

Tänään jatkettiin oppivien järjestelmien opiskelua. Ensimmäisen tunnin aluksi kuitenkin käytiin läpi ensimmäisen välikokeen kysymykset ja hahmoteltiin vastauksia niihin.

Tämän jälkeen muisteltiin edellisen viikon asioita lyhyesti, ja vilkaistiin mm. Matlab-demoa, jolla voidaan piirtää hiirellä projektiosuora kaksiulotteisen datan koordinaatistoon. Kun kaksi pistettä suoralta on merkitty, Matlab-skripti projisoi datan tälle suoralle ja piirtää tuloksena saatavien yksiulotteisten näytteiden jakauman sekä luokitteluprosentin. Hyvillä projektiosuorilla data oli täydellisesti luokiteltavissa, mutta huonoilla joukot menivät päällekkäin projisoinnin jälkeen. Fisherin lineaarinen erottelija laskee tämän suoran automaattisesti niin että erottelu on optimaalinen.

Seuraavaksi palautettiin mieleen tukivektorikone, ja tarkasteltiin lähemmin kernelitemppua. Kernelitemppu kuvaa näytteet korkeampiulotteiseen avaruuteen, jossa ne toivottavasti ovat paremmin eroteltavissa. Itse kuvausta ei kuitenkaan tarvitse käytännössä tehdä, vaan riittää korvata menetelmässä jokainen vektorien välinen sisätulo <x,y> jollain muulla funktiolla k(x,y). Tiettyjen reunaehtojen vallitessa voidaan osoittaa tämän olevan sama asia kuin kuvaus tíettyyn korkeampiulotteiseen avaruuteen ennen luokittelua. Periaatteessa tämä kyseinen kuvaus voidaan laskeakin, mutta yleensä se ei sinänsä ole kovin kiinnostavaa. Sen sijaan voidaan kokeilla erilaisia kerneleitä, ja katsoa millä niistä luokittelutulos on paras. Yleisesti käytettyjä kerneleitä ovat mm. polynomikernelit k(x,y) = (<x,y>)^n ja k(x,y) = (1 + <x,y>)^n sekä ns. RBF-kerneli k(x,y) = exp(-||x-y||).

Tukivektorikoneita vertailtiin lineaariseen luokittelijaan vaihteeksi Python-kielellä ja seuraavalla skriptillä. Jos haluat tutustua Pythoniin, kätevä Windows-asennuspaketti löytyy täältä.

 # Diagnosis of ovarian cancer with several classifiers  
   
 import numpy as np  
 from sklearn import svm  
 from sklearn import cross_validation  
   
 # Read the data  
   
 filename = "ovariancancer.csv"  
   
 X = np.genfromtxt(filename, delimiter=',', skip_header = 0, dtype = np.float)  
 y = X[:,0]  
 X = X[:,1:]  
   
 # Set a range for the parameters of the classifier  
   
 pars = 10.0**(np.arange(-1,7))  
 res = np.empty(np.shape(pars))  
 kernel = 'rbf'  
   
 # Select regularization parameter  
 for i, C in enumerate(pars):  
     
   print "C = " + str(C)  
     
   classifier = svm.SVC(degree=2,C=C,kernel=kernel)  
   scores = cross_validation.cross_val_score(classifier, X, y, cv=5)     
       
   print "Accuracy: %0.2f %% (+/- %0.5f)" % (100*scores.mean(), scores.std() / 2)  
   print ""  
   
   res[i] = scores.mean()  
     
 minidx = res.argmax()  
 C = pars[minidx]  
   
 classifier = svm.SVC(C=C, kernel=kernel)  
       
 model = classifier.fit(X,y)  
   
 print "Score with param %f for all data: %f." % (C, model.score(X,y))  
   

Tämän jälkeen paneuduttiin hermoverkkojen opetukseen, ja mainittiin lyhyesti opetusalgoritmin perustuvan derivaattaan ja ketjusääntöön. Näiden avulla voidaan päätellä suunta, jossa luokitteluvirhe pienenee jyrkimmin, ja kyseiset kaavat löytyvät esim. täältä. Perus- backpropagationin lisäksi on olemassa kehittyneempiä ja nopeampia opetusalgoritmeja, ja esim. Matlabissa niitä on lähes parikymmentä. Olennaisin ero algoritmien välillä on niiden nopeudessa ja muistin tarpeessa.

Luennolla ei otettu kantaa siihen miten järjestelmä löytää verkolle syötettävät merkit, mutta joitain yleisimpiä ratkaisuja kuvaillaan wikipedian feature detection -artikkelissa. Luennon lopuksi demottiin tamperelaisen Visy Oy:n kehittämää rekisterikilven tunnistusohjelmistoa, joka on käytössä mm. raja-asemilla, satamissa ja tehtaissa ympäri maailmaa.