Newsgroup: it.hobby.robotica
Titolo: Riconoscimento di immagini

Ciao a tutti!
Ecco il mio problema: per il robot che sto costruendo volevo implementare
un sistema di riconoscimento di immagini.
Questo sistema, idealmente, dovrebbe avere due scopi:
1) Dire al robot se davanti a lui ci sono degli ostacoli (scopo secondario
visto che posso anche usare un sensore di prossimita')
2) Fargli capire in che stanza della casa si trova e, magari, anche in che
direzione e' orientato (scopo principale, altrimenti non so come fare a
fargli capire dove si trova)
Per fare cio' pensavo di usare una rete neurale BackPropagation.
Ho quindi creato il Software (non che ci voglia molto...) e ora sono a
bestemmiare con il dimensionamento della rete e l'apprendimento...
Ho scattato un totale di 64 foto 80x60, con la WebCam che sara' integrata
nel robot, 16 per ogni stanza, 4 per ogni stanza-direzione (4 per cucina
Nord, 4 per corridoio Nord, etc.).
Pensavo di avere 4800 neuroni in Input, 1200 Hidden e 5 in Output (Stanza,
tendenza Nord, tendenza Sud, tendenza Est e tendenza Ovest).
OK! Addestro la rete e l'apprendimento va a buon fine con una tolleranza
bassissima.
Scatto un'ennesima immagine e la rete va in palla: confonde stanze e
direzioni.
Altre persone, in un altro gruppo, mi hanno detto che devo ridurre il
numero di informazioni inviate alla rete, ma non sono assolutamente
riuscito a capire "come" (mi parlavano di PCA e mi hanno anche inviato un
programma OpenSource, ma non riesco a capire che razza di dati mi da in
uscita e quali mandare alla rete...).
Ora la domanda e': qualcuno sa darmi delle spiegazioni terra-terra su come
dovrei trattare queste immagini per darle in pasto alla rete e ottenere i
risultati sperati?
Domande aggiuntive: come posso calcolare la dimensione massima e minima
della rete in funzione delle mie aspettative di funzionamento? Come scelgo
il numero di esempi?
Scusate l'ovvieta' delle domande, ma finora i miei esperimenti di reti
neurali (fatti anni fa!) usavano insiemi di dati talmente piccoli e "fatti
alla bisogna" che non mi sono mai scontrato con il problema...
Grazie 2^10!
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Secondo me il problema è proprio a monte
Hai le immagini e e dai in pasto alla rete neurale ma quale features hai 
scelto?
Luminosità, contrasto, linee verticali...
Questo è fondamentale perché se volessi distinguere il salotto dal bagno 
allora forse solo il colore come feature va bene ma se poi devi distinguere 
il bagno dalla cucina allora probabilmente non basta
La scelta delle features è la parte più delicata
Quello ceh ti hanno detto in merito alla PCA è proprio per capire quali 
features usare
Ad esempio se voglio capire se uno è uomo o è donna posso misurare altezza, 
peso, corporatura, timbro vocale e potrei anche misurare "qualcosa intorno 
al pube"
Bene, è chiaro in questo caso che il "qualcosa" da solo basta ma lo so 
perché ne ho esperienza, se invece ho delle cose che ho misurato ma non so 
cosa rappresentino o non so dire se sono importanti o no la do a un qualcosa 
tipo PCA e quella mi dice più o meno quali e quante features scegliere (in 
realtà me ne da pure una combinazione lineare)
Il fatto di scegliere poi una rete neurale con 3fantastiliardi di neuroni è 
inutile
Una volta scelte le features si deve dividere i campioni in due insiemi, uno 
di addestramento e uno di test
L'errore sull'addestramento si ridurrà sempre (nel tuo caso avendo neuroni a 
sbafo si può proprio annullare) ma quello sul test in genere no ed è proprio 
quello ceh a te accade
La tua rete impara a riconoscere il trainingset ma sul mondo reale non serve 
a una mazza 

 a una mazza
Mmm... temevo di aver fatto una grande ca$$ata...
A questo punto, la domanda: hai qualche consiglio terra-terra per
implementare cio' che vorrei fare?
Oppure, se la cosa diventa complessa da spiegare (non sono proprio un
genio in matematica...), se conosci programmi che facciano alla bisogna,
mi potrebbe essere utile! =:)
Ciao e grazie


Si parte sempre dalle features
Tu da queste immagini riesci a ricavarti dei parametri? Che so, colore, 
liminosità, contrasto o qualunque altra cosa? 

 liminosità, contrasto o qualunque altra cosa?
Guarda, se vuoi posso anche mettermi ad argomentare per mezz'ora
sull'argomento, ma se vogliamo essere proprio sinceri, l'unica risposta
che mi sento di dare e': non lo so!
Sinceramente non capisco neanche la domanda... Ogni stanza e' diversa.
L'unica cosa in comunque sono i muri bianchi, per il resto sono tutte
decisamente diverse, come mobili e oggetti vari.
Puo' bastare?
Devo forse provare a addestrare la rete con i vari oggetti delle stanze e
poi, una volta individuato l'oggetto sapere che quello si trova in una
determinata stanza?
Oppure ho sparato un'altra ca$$ata enorme?
Ciao


 
Hai provato a considerare un'altra strada completamente diversa?
Potresti caricare nella base di conoscenza la planimetria 
dell'appartamento e lasciare ai sensori di prossimità il riconoscimento 
degli ostacoli.
Analizzando i giri delle ruote e moltiplicandoli per la loro 
circonferenza non dovrebbe essere troppo complicato sapere dove si trova 
il robot.
Questo ammettendo che non sia possibile uno "slittamento" delle ruote 
come accade sul ghiaccio, altrimenti perdi la posizione e ciao.
Potresti ovviare al problema con un sensore che "guarda" quante 
piastrelle passano (susseguirsi delle fughe) e le mette in relazione ai 
giri delle ruote ma la cosa si complica un po' di più (in effetti non 
molto).
Comunque, tutto questo è per dire che a volte la soluzione ad un 
problema non è sempre da cercare nello svolgimento del problema stesso 
ma nell'analisi della praticità nell'ottenere lo stesso risultato.
byEz
-- 
Claudio(BS)
L'unico problema per l'uomo non sta nella difficoltà delle sue imprese
ne' nella quantità di denaro necessario per compierle, ma nella durata
della sua esistenza. (Claudio 14.02.2004)
NB. Protezione antispam
Per rispondere aggiungere claudio

Sinceramente adotterei un altro sistema per il riconoscimento.
prova ad immaginare se riesci a far funzionare la rete con l'apprendimento 
delle immagini, e improvvisamente per qualsiasi motivo viene cambiato 
arredamento in una stanza o ancor peggio in tutto l'appartamento.
In questo modo la rete non sarą piu' in grado di riconoscere gli ambienti.
Il problema personalmente lo affronterei in questi termini, in ogni stanza 
adotterei un piccolo trasponder in modo che il sistema sappia a prescindere 
dall'arredamento dove si trovi, utilizzerei la planimetria della casa in 
modo da fargli capire i vari accessi utilizzando come punto noto i vari 
trasponder in modo da dare un orientamento.
In questo modo il sistema saprą sempre dove si trova.
P.S.
Che software usi per le reti neurali? 

 Che software usi per le reti neurali?
Un programmello che ho scritto io in C. Non che ci vada molto per una
BackPropagation...
Ciao



Non so se è proprio quello che fa per te, però per un esame che ho dato 
tempo fa all'università ho utilizzato l'architettura Subsumption di 
Brooks per la navigazione sicura di un robot in un ambiente di lavoro. 
Il robot è in grado di muoversi all'interno di un ambiente e di 
riconoscere i corridoi e i muri. Il passo successivo sarebbe stato 
quello di aggiungere altre features (leggi livelli) come il 
riconoscimento di oggetti e la creazione di una mappa, ma non era 
richiesto. Una volta aggiunta la feature di creazione della mappa il 
robot potrebbe sapere in che stanza si trova in base al confronto con 
una mappa di partenza.
Ah, il tutto è stato fatto senza reti neurali.
Se ti può interessare trovi tutto a questo indirizzo:
http://curriculum.cicchi.info/piero.html
Ciao
       Federico

 
http://curriculum.cicchi.info/piero.html
Un paio di cose solo:
1) Il link a Saphira punta ad una pagina inesistente
2) Che razza di filmati sono quelli che hai messo? Non li riesco ad aprire
con nessun programma, ne con Linux ne con Windows...
3) Hai solo la teoria o hai anche qualche riga di codice, tanto per darmi
una base?
Grazie


 Grazie
Ciao !

 pň, appena posso metto tutto sul sito.
OK! Nessun problema!
ciao
Luca


 Puo' bastare?
Mi sa che non ci stiamo capendo
Tu hai da una parte una foto e dall'altra la rete neurale che vuole dei 
numeri
Come fai a dare la foto alla rete? Che numeri dai alla rete? Cosa 
rappresentano? 

 rappresentano?
I singoli pixel! Sono valori a 8 bit (256 colori). Io mi limito a
trasformarli in un float da 0 a 1.
So di sbagliare, ma non so:
a) perche' sbaglio
b) come fare a fare giusto...


 trasformarli in un float da 0 a 1.
Se io ti faccio vedere i singoli pixel di una immagine tu capisci che stanza 
é?
Immagina l'immagine un po' sfocata ma ancora riconoscibile
Riconosceresti il salotto perché hai in alto a destra la riproduzione dei 
girasoli di VanGogh che però vedi come macchia gialla in alto a dx. Poi 
vedresti alla sinistra riconosceresti la lampada perché vedi una linea 
verticale scura e magari nella zona centrale hai più luiminosità perché c'è 
la finestra.
Se però la foto è del bagno hai una luminosità molto più accentuata e un 
colore tendente al bianco (a meno che tu non abbia il bagno rosa)
In definitiva io per iniziare prenderei la foto e mi calcolerei su tutta la 
foto liminosità e media dei tre colori, poi la dividerei a metà e per 
ciascuna metà ancora gli stessi paramerti, poi ancora a metà e così via in 
modo da avere una 30ina di features su cui lavorare
In questo modo se il salotto ha la finestra al centro e il bagno a dx li 
discriminerai dalla luminosità di quella zona e cose simili per le altre 
stanze
estrarre poi le linnee tipo la lampada di prima è più difficile ma potrebbe 
essere molto importante. In una stanza ci sono anceh le linee descritte dai 
mobili, dalle porte e sono sempre più o meno nella stessa posizione
Secondo me analizzare pixel per pixel non serve a niente. Se solo fai la 
foto con un angolo leggermente diverso allora ogni pixel avrà un valore 
tutto sballato pur essendo la foto molto simile mentre se dividi a zone 
riduci le features (e quindi i neuroni da addestrare dello strato IN) e sei 
abbastanza immune da differenze per te impercettibili nelle foto ma 
disastrose se analizzi pixel per pixel 

 disastrose se analizzi pixel per pixel
Capisco...
Eventualmente, sei a conoscenza di programmi che mi trattino l'immagine
come serve a me e mi diano i dati sui quali lavorare?
Grazie


Prendi l'immagine e la dividi in 9 parti
In ogni parte fai: somma(r+g+b)/numpixel
Fai la stessa cosa per ogni singola componente ( somma(r)/numpixel) e hai 
altri 3 valori per ogni parte
Alla fine avrai per ogni immagine 4*9 numerelli e quelli sono gli ingressi 
della rete
In questo modo la rete è più semplice e le features sono più significative
Per le linee potresti fare una trasformata di houg ma in tutta sincerità non 
l'ho mai fatto
In compenso potresti calcolarti il gradiente orizzontale e verticale e usare 
in qualceh modo questa informazione
In realtà potresti inventarti qualunque cosa e passaer i tuoi dati in una 
PCA ceh ti dirà quali features sono più discriminanti per il tuo problema
Io per un esame ho usato un programma (tooldiag) che faceva l'estrazione o 
la selezione delle features migliori ma mi sa che tu sei un po' a digiuno 
della cosa 

 della cosa
Decisamente a digiuno...
Provero' a fare la griglia!
Intanto, mille grazie!!


 In questo modo la rete è più semplice e le features sono più significative
Ciao!
Ho provato a suddividere le immagini e a passare i 36 dati (64 esempi in
tutto, con foto 160x120 prese da diverse angolazioni rielaborate come mi
hai suggerito) alla rete.
L'addestramento e' estremamente veloce, ma poi non mi riconosce neanche
gli esempi che gli ho dato...
La cosa e' molto strana... Stasera provero' a ricontrollare il codice.
Almeno gli esempi ME LI DEVE riconoscere, giusto?
Oppure puo' essere che il sistema e' ancora sbagliato?
Ciao


 In questo modo la rete è più semplice e le features sono più significative
Ho fatto la prova...
64 esempi, trattati come suggerito.
La rete impara, ma purtroppo continua a sbagliare nel mondo reale... =:(((
Forse che ho le stanze troppo uguali?
Ciao


 Forse che ho le stanze troppo uguali?
Non ho detto che avrebbe funzionato
Probabilmente le features non sono ancora abbastanza discriminanti o forse i 
campioni non sono sufficienti o forse non addestri bene la rete
L'errore dovrebbe essere comunque minore rispetto a quanto faceva prima 

 L'errore dovrebbe essere comunque minore rispetto a quanto faceva prima
Si, e' un po' minore, pero' se mi sbaglia la stanza, siamo sempre al punto
di prima...
E se io dividessi l'immagine in 25 parti? 100 neuroni in ingresso sono
troppi?
E quanti ne dovrei mettere come Hidden?
