Doctorat progress

Am tot zis că o să vorbesc un pic aici despre proiectul meu de doctorat și în ce stadiu suntem acum cu el. Here goes.

Tema generală a proiectului este conversia imaginii în sunet, cu aplicații în ghidarea nevăzătorilor. Adică vrem să transmitem unui nevăzător un sunet care să descrie scena pe care o are în față, în sunet. De aici, pornind de la conceptul de brain plasticity, sperăm ca nevăzătorii să poată să își re-antreneze zona din creier responsabilă cu captarea imaginii pentru a prelucra informația sonoră pe care o suprapunem noi sunetelor existente. Există ceva cercetare în domeniul ăsta, și eu sunt în procesul de a descoperi exact câtă și ce rezultate are.

Între timp, ne-am propus să facem niște teste, să ne facem o imagine asupra diferitelor abordări posibile. Continuând munca începută de Alex Iordan la proiectul lui de diplomă, am scris o aplicație care folosește gstreamer (pentru captură), PIL (pentru procesare imagine), glade și pygtk (pentru interfață) și pyaudiere (pentru generare sunet), pe care să o putem folosi în teste. Mi-a luat ceva vreme până am citit toate cele, dar acuma merge destul de ok.

În principiu, preiau imaginea de la un webcam, o trec în grayscale și apoi în imagine binară (alb / negru). Pe imagine definesc macropixeli (pentru a mă ajuta cu viteza de procesare :P) în funcție de care decid dacă imaginea pe care o văd este în interiorul unei ținte, dacă am prins și din țintă și din fundal sau daca văd doar fundal. Evident, testele sunt extrem de simple, cu doar două culori, ținta și fundalul, și doar două dimensiuni.

Obiectivul testelor de acum este de a vedea dacă prin mișcarea capului și limitarea puternică a dimensiunii imaginii poți să îți dai seama care sunt formele pe care le ai în față (curbe, unghiuri drepte, colțuri, dimensiuni …). Săptămâna trecută, înainte să plec la Alba, am făcut un prim rând de teste, și a mers destul de bine. Evident, sunt și lucruri care nu au mers atât de bine (spre exemplu, sunetul pentru cele trei cazuri posibile este continuu și înnebunitor), dar pentru asta avem versiunea 0.02 :P

Astăzi am făcut partea de binarizare și m-am mai jucat un pic cu pyaudiere pentru generarea de sunet intermitent.

Deși proiectul ăsta este mai puțin despre software decât despre alte chestii, ta-daaa, un screenshot din varianta curentă a aplicației:

Eyecam în acțiune

New toy :D

Am tot zis că o să scriu despre ce fac pentru doctorat, dar tot n-am apucat. Dar o să scriu. Ideea e că astăzi a venit în sfărșit noul webcam (că webcamul vechi eram cam pușcat), un Canyon CNR-WCAM813 cu 50 de lei de la eMag, Acuma, ideea a fost să construim un dispozitiv experimental (adică cu care să putem face experimente) în care webcam-ul să vadă ce văd eu, inclusiv când îmi mișc capul. Ne-am gândit la un sistem stil frontală (pentru ne-munțomani, frontala îi lanterna aia ce ți-o pui pe cap :P), care probabil va fi și soluția finală, dar pentru prima tură de experimente am folosit o șapcă, primită sponsorizare de la cei cinci care au rămas patru (mulțumeeesc).

Un pic de bormașina, niște prinzătoare de plastic, și, taaa-daaaa:

Camera e prinsă cu șurubul original pe sub cozoroc

La primele teste, inclusiv unghiul camerei este bun, as in centrul imaginii este drept în fața mea :) One more picture:

Eh, e chiar stylish, nu? :P

Grafice rapide pe Linux

Deși nu ne-am calificat la FRC2010, am învățat mai multe lucruri utile și pentru multe alte feluri de proiecte. Spre exemplu, primeam date de la accelerometrul ala, și le salvam pe un card în microSD. Pentru mine, pe Linux, a fost destul de nasol să fac graficul acceleratie(x) în OOo Calc, pentru că erau foarte multe puncte, și efectiv nu se descurca, și graficul rezultat era greu de aranjat.

Așa că am început să folosim Octave, care este un soft de genul Matlab (evident, opensource și mai puțin dezvoltat ca Matlab), și interfața grafică QtOctave. Am luat datele de la accelerometru, dar și punctele unde am înregistrat noi curbele, și valorile de prag pe care le calculam la fiecare tură. Ce mi-a s-a părut foarte tare a fost că în 20 de minute am făcut un script python cu niște expresii regulate, care spărgea fișierul provenit de la mașină în mai multe seturi de date, și o funcție Octave care să tragă niște grafice după care să ne estimăm noi algoritmul. Practic, din trei clickuri, era gata tot, și și foarte repede.

Octave-ul e doar este o soluție la îndemână pentru învârtit datele, pentru aranjat în matrici. De acolo, de fapt octave-ul folosește gnuplot, care se poate folosi și standalone, și care și el este o super sculă :D

Anyway, toate sculele astea sunt gratis, și, even better, opensource.

Tadaaaaa

Idei de licențe

Înainte să plec la Vienna, am avut o discuție cu profu’ despre cum ar trebui să abordez tema de doctorat și una din chestiile ce le-am decis e că am putea să propunem niște teme de licență, să mai împart ce am eu de descoperit / inventat la mai mulți.

So, până acum am stabilit în linii mari trei idei de teme de licență:

  • Recunoaștere de texte din imagini aleatoare, în principal din outdoor (nume de străzi, firme, reclame, anunțuri, numere de mașină). Tema are două elemente, unul este stabilirea existenței unei forme de text într-o imagine (într-un mod eficient) și al doilea este recunoașterea textului efectiv (care poate fi deformat în mai multe feluri, din cauza poziției, sau a suportului – i.e. un stâlp rotund, sau să fie de sus în jos …)
  • Transformarea de forme geometrice în sunet. Stabilirea unei metode (experimentale) prin care un set de forme geometrice în sunet. Formele geometrice pot fi de la simple (gen un dreptunghi, un disc) la lucruri mai complicate, dar toate vor fi bicolore.
  • Determinarea distanței față de un obiect dat și a poziției obiectului într-un cadru prin analiza dimensiunii obiectului, într-un flux video live, și transmiterea acestei informații pe un canal audio către un utilizator.

O regulă importantă este că ne dorim să dezvoltăm / folosim algoritmi independenți de limbaj și platformă, folosind tehnologii opensource. N-aș vrea să avem programe în Matlab folosind biblioteci proprietare (ca să nu mai spunem hackuite).

Dacă sunteți interesați de așa ceva, sau poate știți pe cineva care ar putea fi, dați un semn. Revin cu detalii după ce mai stabilesc chestii.

ZigBee – Serială

Am zis că o să revin, foarte scurt, cu ultimul dizpozitiv pe care l-am inventat pentru cursul de RIE. E vorba de un adaptor, de la modulul ZigBee de la Atmel de care vorbeam înainte, la o serială (RS232). Pe ăsta l-am și nimerit la fix și încap toate mufele cum trebuie :D

Back
Front
Front

Pentru că deja am lipit chestii SMD (mă rog, pe astea ce le-am avut până acum), placa asta nu a mai fost o provocare din punctul ăsta de vedere. Totuși, am învățat multe chestii de PCB / gSchem cu ocazia plăcii ăsteia. O dată, am făcut update la gSchem cu ce este în repo-ul lor, versiune care se mișcă mult mai bine (și arată mai bine). Am făcut update și la PCB, dar nu am prins schimbări majore.

Apoi, am descoperit trei feature-uri de la PCB care mi-au fost de real ajutor. Prima, cea mai neimportantă, este că poți mări un text dacă stai cu mouse-ul deasupra lui și apeși pe S. Apoi, am reușit să potrivesc dimensiunea discului de cubru care rămâne în jurul găurii (pentru ca ale mele erau prea mici și se corodau sau le luam din greșeală cu bormașina). Și cea mai folositoare chestie ce am găsit-o, utilă îndeosebi când ai și componente SMD și și de-alea normale, dar și când lucrezi la o placă cu două fețe, este posibilitatea de a vedea cealaltă parte a plăcii și de a muta elemente pe cealaltă parte a plăcii (adică le oglindește direct programul).