Computer Vision Ricostruzione 3D
Ciao ragazzi, scusate se vi disturbo, volevo chiedervi se qualcuno di voi può indirizzarmi verso un qualche libro di testo, oppure non lo so articoli scientifici o rapporti tecnici che trattano la ricostruzione 3D.
Ho trovato delle dispense su internet, e qualche libro free, però va diciamo che mancano alcuni dettagli implementativi (anche se ho potuto capire che è una tematica piuttosto ostica).
Considerete che ho un buon background (universitario ovviamente) di image processing e computer graphics.
Grazie
Ho trovato delle dispense su internet, e qualche libro free, però va diciamo che mancano alcuni dettagli implementativi (anche se ho potuto capire che è una tematica piuttosto ostica).
Considerete che ho un buon background (universitario ovviamente) di image processing e computer graphics.
Grazie
Risposte
Ciao,
cosa intendi di preciso con "ricostruzione 3D"? intendo l'ambito di utilizzo.
Date delle immagini 2D vuoi ricostruire l'ambiente che rappresentano in 3D?
concordo, ma è piuttosto interessante.
"lukkio":
Ciao ragazzi, scusate se vi disturbo, volevo chiedervi se qualcuno di voi può indirizzarmi verso un qualche libro di testo, oppure non lo so articoli scientifici o rapporti tecnici che trattano la ricostruzione 3D.
cosa intendi di preciso con "ricostruzione 3D"? intendo l'ambito di utilizzo.
Date delle immagini 2D vuoi ricostruire l'ambiente che rappresentano in 3D?
(anche se ho potuto capire che è una tematica piuttosto ostica).
concordo, ma è piuttosto interessante.
"lukkio":
Ho trovato delle dispense su internet, e qualche libro free, però va diciamo che mancano alcuni dettagli implementativi (anche se ho potuto capire che è una tematica piuttosto ostica).
Nella mia esperienza, è molto difficile trovare discussioni dettagliate riguardo all'implementazione dei singoli algoritmi una volta che si esce dall'isola felice rappresentata dagli algoritmi base di un qualche settore (e a volte non è facilissimo neanche in questi casi). Gli autori degli articoli sono spesso sfortunatamente poco precisi riguardo all'implementazione e la maggior parte degli algoritmi non viene probabilmente quasi mai implementata da altri che non siano l'autore originale dell'articolo. Nei casi migliori l'autore distribuisce il suo codice oppure una implementazione open-source viene resa disponibile.
Non conosco molto bene l'argomento particolare che stai cercando, ma se hai dubbi o cerchi consigli puoi sempre chiedere qui. Forse qualcuno ha già provato ad implementare quello che ti serve o qualcosa di simile. In alternativa, puoi sempre provare a chiedere direttamente agli autori oppure a qualche professore/ricercatore/dottorando della tua università che si occupi di argomenti correlati.
Si intendo ricostruire una forma 3D a partire da una o più immagini 2D.
A parte che è un pò ostico perchè alcune cose non le ho trattate all'università.
Per esempio ho dato un occhiata allo shape from shading da un libro, che raccoglieva alcuni risultati di articoli scientifici, quindi leggerli era veramente ostico perchè come sicuramente saprete ognuno quando scrive articoli usa a volta una notazione sua su basi che magari sono diverse da quelle che uno studia tipicamente all'università.
Però va ho visto che alla fin fine che come metodo non è tanto buono, a causa di alcune ambiguità causate dalle immagini che sono da approfondire.
Piu che altro mi interessava imparare a implementarli (onestamente immaginavo erano algoritmi difficili da trovare).
Però va se qualcuno vuol dire la sua, volentieri.
Io cercherò di implementarli alcuni, magari li posto se riesco.
A parte che è un pò ostico perchè alcune cose non le ho trattate all'università.
Per esempio ho dato un occhiata allo shape from shading da un libro, che raccoglieva alcuni risultati di articoli scientifici, quindi leggerli era veramente ostico perchè come sicuramente saprete ognuno quando scrive articoli usa a volta una notazione sua su basi che magari sono diverse da quelle che uno studia tipicamente all'università.
Però va ho visto che alla fin fine che come metodo non è tanto buono, a causa di alcune ambiguità causate dalle immagini che sono da approfondire.
Piu che altro mi interessava imparare a implementarli (onestamente immaginavo erano algoritmi difficili da trovare).
Però va se qualcuno vuol dire la sua, volentieri.
Io cercherò di implementarli alcuni, magari li posto se riesco.
Esistono diversi motivi per cui l'implementazione dei vari algoritmi viene spesso ignorata oppure descritta molto brevemente:
1. L'autore non ha implementato l'algoritmo descritto. Si tratta più che altro di articoli teorici in cui si vuole forse dimostrare un qualche lower-bound o qualcosa del genere e la descrizione di un algoritmo "ottimale" non è in questi casi considerato un contributo importante. L'algoritmo descritto è spesso incredibilmente complicato o con costanti troppo alte per essere utile in pratica. Alternativamente, questo accade più che altro in articoli di matematica, la complessità dell'algoritmo descritto è altissima e si vuole solo dimostrare che il problema è risolvibile attraverso un algoritmo (oppure che è risolvibile in tempo polinomiale ma forse l'esponente è comunque altissimo).
2. L'autore ha implementato l'algoritmo usando un linguaggio di altissimo livello e particolarmente comodo per l'algoritmo. Penso ad esempio all'uso di programmi come Macaulay2, Mathematica, Singular, CoCoA, Maple... oppure anche l'uso di "piattaforme" come Sage o forse Matlab. Molti aspetti implementativi sono semplificati quando si implementa l'algoritmo usando questi linguaggi e non si ritiene quindi forse neccessario discuterne. Ma un programma "reale", scritto in linguaggi di più basso livello o con meno funzionalità utili, deve ovviamente affrontare problematiche spesso diverse.
3. L'autore ritiene che l'implementazione sia ovvia per chiunque abbia abbastanza esperienza nel settore.
4. L'autore non ha voglia di discuterne o lo spazio a sua disposizione non è sufficiente per parlarne.
5. L'autore dell'articolo non è l'autore del codice messo alla prova nell'articolo e non ha idee precise di come sia stato implementato.
6. ... sono certo che ce ne sono altri ...
L'algoritmo che hai preso in considerazione non produce in effetti risultati molto convincenti, però immagino che sia abbastanza centrale anche negli altri. L'idea centrale sembra essere quella di considerare l'immagine come una funzione della normale della superficie che stiamo cercando di modellare (e in effetti è in buona approssimazione così per diverse classi di immagini, ma questa funzione è spesso molto complicata e in molte occasioni ci sono molte altre variabili in gioco). Se supponiamo che questa funzione abbia una qualche forma data, allora abbiamo ottenuto una equazione differenziale che possiamo risolvere. Una volta scritta l'equazione la devi in qualche modo "discretizzare" e poi risolvere usando uno dei tanti metodi disponibili. L'implementazione non viene descritta proprio perché quello che viene descritto è un problema matematico e non un algoritmo risolutivo. Esistono diversi algoritmi per risolvere una equazione come quella che trovi in questo caso.
1. L'autore non ha implementato l'algoritmo descritto. Si tratta più che altro di articoli teorici in cui si vuole forse dimostrare un qualche lower-bound o qualcosa del genere e la descrizione di un algoritmo "ottimale" non è in questi casi considerato un contributo importante. L'algoritmo descritto è spesso incredibilmente complicato o con costanti troppo alte per essere utile in pratica. Alternativamente, questo accade più che altro in articoli di matematica, la complessità dell'algoritmo descritto è altissima e si vuole solo dimostrare che il problema è risolvibile attraverso un algoritmo (oppure che è risolvibile in tempo polinomiale ma forse l'esponente è comunque altissimo).
2. L'autore ha implementato l'algoritmo usando un linguaggio di altissimo livello e particolarmente comodo per l'algoritmo. Penso ad esempio all'uso di programmi come Macaulay2, Mathematica, Singular, CoCoA, Maple... oppure anche l'uso di "piattaforme" come Sage o forse Matlab. Molti aspetti implementativi sono semplificati quando si implementa l'algoritmo usando questi linguaggi e non si ritiene quindi forse neccessario discuterne. Ma un programma "reale", scritto in linguaggi di più basso livello o con meno funzionalità utili, deve ovviamente affrontare problematiche spesso diverse.
3. L'autore ritiene che l'implementazione sia ovvia per chiunque abbia abbastanza esperienza nel settore.
4. L'autore non ha voglia di discuterne o lo spazio a sua disposizione non è sufficiente per parlarne.
5. L'autore dell'articolo non è l'autore del codice messo alla prova nell'articolo e non ha idee precise di come sia stato implementato.
6. ... sono certo che ce ne sono altri ...
L'algoritmo che hai preso in considerazione non produce in effetti risultati molto convincenti, però immagino che sia abbastanza centrale anche negli altri. L'idea centrale sembra essere quella di considerare l'immagine come una funzione della normale della superficie che stiamo cercando di modellare (e in effetti è in buona approssimazione così per diverse classi di immagini, ma questa funzione è spesso molto complicata e in molte occasioni ci sono molte altre variabili in gioco). Se supponiamo che questa funzione abbia una qualche forma data, allora abbiamo ottenuto una equazione differenziale che possiamo risolvere. Una volta scritta l'equazione la devi in qualche modo "discretizzare" e poi risolvere usando uno dei tanti metodi disponibili. L'implementazione non viene descritta proprio perché quello che viene descritto è un problema matematico e non un algoritmo risolutivo. Esistono diversi algoritmi per risolvere una equazione come quella che trovi in questo caso.
In tutta onesta immaginavo questo discorso, perchè anche se approccio da poco la computer vision ho letto comunque diversi articoli di computer grafica, crittoanalisi e altri settori affini all'informatica. Ovviamente però essendo studente (ancora per poco) diciamo che, a parte la tesi, non ho mai cercato implementazioni di molti algoritmi che ho studiato.
Quello che comunque sto cercando al momento di capire e se alcuni algoritmi potrebbero avere una qualche valenza industriale, dove questo "valenza industriale" è ancora per me da identificare. Diciamo che fra i vari ambiti dell'informatica gli aspetti che maggiormente ritengo utili sono gli aspetti legati in qualche modo alla fisica, ad esempio la computer vision oppure il settore automotive a l'acustica.
Però facendo diverse ricerche su internet ho visto veramente che a livello pratico non c'è quasi nulla di implementato, se non algoritmi base. Cioè ho visto molta ricerca, molti articoli scientifici, ma niente di "pratico". Praticamente tutti gli articoli scientifici (quelli in informatica o ingegneria informatica in particolare) si limitano a formalizzare gli algoritmi o un modello che si discretizza.
Per quanto riguarda il discorso della ricostruzione 3D è vero, nella sostanzia si modella una EDP che si deve risolvere numericamente.
Un'altra domanda che mi ponevo e quante persone al mondo siano in grado effettivamente di saper implementare questi algoritmi, e se saperli implementare possa servire a qualche cosa, oltre alla mera ricerca.
Si parla di crisi e cavolate varie (quanto meno in italia) però molte cose non sono esplorate, nonostante a mio avviso le menti per fare certe esplorazioni ci siano.
Per farla breve ad esempio io vedo che moltissimi si focalizzano sul settore gestionale, aziende tipo l'accenture per dire fanno consulenza ma di pratico non producono un bel niente.
Allora un pò per spirito di curiosità e un pò approfondire i miei studi, al di là di una qualche specializzazione che acquisirò con il lavoro, ma anche perchè va nella vita non si sa mai, sto esplorando questo lato dell'informatica, al momento.
Tutto sto discorso non so perchè l'ho fatto, però va mi fa un pò rabbia vedere che in settori così utili come questi qua della computer vision, ma anche altri tipo la sicurezza o la robotica magari (quella alla portata di tutti secondo me, non solo per industrie di produzione) non si pone l'attenzione.
A volte si fa tanta ricerca ma applicazioni pratiche ne ho viste ben poche, nella mia pochissima esperienza.
Quello che comunque sto cercando al momento di capire e se alcuni algoritmi potrebbero avere una qualche valenza industriale, dove questo "valenza industriale" è ancora per me da identificare. Diciamo che fra i vari ambiti dell'informatica gli aspetti che maggiormente ritengo utili sono gli aspetti legati in qualche modo alla fisica, ad esempio la computer vision oppure il settore automotive a l'acustica.
Però facendo diverse ricerche su internet ho visto veramente che a livello pratico non c'è quasi nulla di implementato, se non algoritmi base. Cioè ho visto molta ricerca, molti articoli scientifici, ma niente di "pratico". Praticamente tutti gli articoli scientifici (quelli in informatica o ingegneria informatica in particolare) si limitano a formalizzare gli algoritmi o un modello che si discretizza.
Per quanto riguarda il discorso della ricostruzione 3D è vero, nella sostanzia si modella una EDP che si deve risolvere numericamente.
Un'altra domanda che mi ponevo e quante persone al mondo siano in grado effettivamente di saper implementare questi algoritmi, e se saperli implementare possa servire a qualche cosa, oltre alla mera ricerca.
Si parla di crisi e cavolate varie (quanto meno in italia) però molte cose non sono esplorate, nonostante a mio avviso le menti per fare certe esplorazioni ci siano.
Per farla breve ad esempio io vedo che moltissimi si focalizzano sul settore gestionale, aziende tipo l'accenture per dire fanno consulenza ma di pratico non producono un bel niente.
Allora un pò per spirito di curiosità e un pò approfondire i miei studi, al di là di una qualche specializzazione che acquisirò con il lavoro, ma anche perchè va nella vita non si sa mai, sto esplorando questo lato dell'informatica, al momento.
Tutto sto discorso non so perchè l'ho fatto, però va mi fa un pò rabbia vedere che in settori così utili come questi qua della computer vision, ma anche altri tipo la sicurezza o la robotica magari (quella alla portata di tutti secondo me, non solo per industrie di produzione) non si pone l'attenzione.
A volte si fa tanta ricerca ma applicazioni pratiche ne ho viste ben poche, nella mia pochissima esperienza.
Avevo scritto una risposta un po' di fretta con il cellulare ma ho deciso di riscriverla. Nel mondo del lavoro ti troverai molto raramente (mai?) con richieste del tipo "implementa l'algoritmo X". Sono infatti più comuni richieste come "Risolvi il problema Y" oppure "Implementa la funzionalità Z" oppure richieste ancora più nebulose e poco precise. È possibile che tali richieste non siano poi specifiche come è spesso il caso in molti algoritmi in letteratura, ma operazioni complesse a loro volta scomponibili in diversi sotto-problemi. In generale, più il team di sviluppo è piccolo (e in Italia è spesso piccolo) e maggiore è la tua esperienza, più le operazioni sono di alto livello e generiche. Spesso i problemi saranno semplici e banali e non avrai bisogno di alcun algoritmo particolare descritto in letteratura. Altre volte il problema ci sono invece algoritmi "standard" ben precisi per risolverlo e avrai bisogno di rifarti a questi (normalmente sono molto ben discussi in rete ed esistono in molti casi librerie che già li implementano). In rari casi ti troverai ad affrontare problemi più originali e sarà probabilmente necessario fare un po' di ricerche anche il letteratura per trovare un modo per risolverlo. La prima abilità che sarà però necessario avere è quella di riconoscere algoritmi e tecniche che funzionano e quelli che sono solo uno spreco di tempo. Dovrai imparare a prevedere quanto tempo ci vorrà ad implementare tale algoritmo e capire se fa effettivamente quello che ti interessa. Se arriverai a trovare un algoritmo non implementato che fa esattamente quello che speri, la prima cosa da fare è implementarlo in linguaggi come Matlab o Python (con numpy & co.) o Mathematica o Maple o .. Questa prima versione va implementata velocemente e serve più che altro a valutarne le performance (più che altro a livello di qualità dei risultati e solo in misura minore a livello di velocità - non va molto ottimizzata come versione) e ad imparare qualcosa di nuovo su questo algoritmo (per farti venire idee su come implementarlo meglio ad esempio o per trovarne i difetti). Solo a questo punto dovrai partire ad implementare questo algoritmo. Ma posso già dirti che probabilmente non sarà tra le cose più comuni che farai e che ci vuole tantissimo tempo per implementare un algoritmo trovato in un articolo. In caso decidessi di farlo, da una occhiata a questo link: How to implement an algorithm from a scientific paper
Per venire al tuo problema, e come è stato accennato, dipende molto dal settore a cui fai riferimento. Ogni autore utilizzera un metodo risolutivo ad-hoc per il suo sistema. Io ne ho visti solamente due per la ricostruzione 2D->3D, ma erano legati ad un particolare ambiente di sviluppo e per la risoluzione di un particolare problema, perciò erano stati cercati metodi puntuali.
Ora quale è il tuo scopo, cosa ne faresti di questa riscostruzione?
Se si riesce ti si indica qualcosa, se no segui i consigli di apatriarca, che ha molta esperianza nel mondo Enterprise (e quoto anche tutto ciò che ha descritto).
es. io vidi dei metodi legati a metodi di risoluzione statistici.
Ora quale è il tuo scopo, cosa ne faresti di questa riscostruzione?
Se si riesce ti si indica qualcosa, se no segui i consigli di apatriarca, che ha molta esperianza nel mondo Enterprise (e quoto anche tutto ciò che ha descritto).
"lukkio":
nella sostanzia si modella una EDP che si deve risolvere numericamente.
es. io vidi dei metodi legati a metodi di risoluzione statistici.
Sisi ho capito quello che vuole dire apatriarca. Però diciamo che va, spero nella mia carriera lavorativa, dopo la laurea, di entrare in qualche industria e magari risponderti in modo un pò più maturo. Io intendevo dire un'altra cosa comunque.
Per quel che riguarda hamming burst, cosa me ne farei non lo so mi interessa solo ricavare il modello 3D, l'unica cosa che è "particolare" è che vorrei applicarlo a modelli organici.
In un libro di testo, che parlava però delle feature (almeno nella parte che ho letto io, non l'ho letto tutto), ho adocchiato un'algoritmo di triangolazione basato su delle feature estratte da un volto.
Cioè ripeto al momento mi interessa sperimentare, diciamo però che è mejo che mi faccio le ossa cercando di capire di più magari in tema di computer vision.
Per quel che riguarda hamming burst, cosa me ne farei non lo so mi interessa solo ricavare il modello 3D, l'unica cosa che è "particolare" è che vorrei applicarlo a modelli organici.
In un libro di testo, che parlava però delle feature (almeno nella parte che ho letto io, non l'ho letto tutto), ho adocchiato un'algoritmo di triangolazione basato su delle feature estratte da un volto.
Cioè ripeto al momento mi interessa sperimentare, diciamo però che è mejo che mi faccio le ossa cercando di capire di più magari in tema di computer vision.
"lukkia":
In un libro di testo, che parlava però delle feature (almeno nella parte che ho letto io, non l'ho letto tutto), ho adocchiato un'algoritmo di triangolazione basato su delle feature estratte da un volto.
sembra tracking.
"lukkia":
Per quel che riguarda hamming burst, cosa me ne farei non lo so mi interessa solo ricavare il modello 3D, l'unica cosa che è "particolare" è che vorrei applicarlo a modelli organici.
...
Cioè ripeto al momento mi interessa sperimentare, diciamo però che è mejo che mi faccio le ossa cercando di capire di più magari in tema di computer vision.
ok. allora forse è un po' inutile soffermarsi su un settore specifico, che include una conoscenza pregressa di un determinato argomento.
Perciò direi che un punto di partenza, più "implementativo" (oltre gli standard di vari linguaggi) può essere:
http://opencv.willowgarage.com/wiki/
http://opencv.org/
c'è un'ottima documentazione, li consultai parecchio (e sono utilizzati anche da alcuni centri di ricerca).
Ciao, le tecniche di cui ho letto io, alcuni anni fà, si rifanno a ciò che diceva hamming_burst. Hai per prima cosa un problema di calibrazione della telecamera, che se non ricordo male ha sette (o erano 9?) vincoli. Ti servono dunque almeno altrettanti punti per identificarla. Nella pratica si usano (o usavano, forse, come detto sono passati un po' di anni) più punti di così per ottenere una precisione sub-pixel (con regressione lineare). Per cui programmi esistenti come PFTrack chiedono all'utente di identificare tali punti su tutte le immagini. Hanno anche una modalità automatica in cui il programma si cerca la corrispondenza tra i punti minimizzando gli errori quadratici. Immagino che il programma si cerchi prima punti di rilievo, con ampio gradiente sui punti vicini, cercando di escludere i punti luce (cioè le parti luminose dovute solo a riflettenza della luce, che cambiano al cambiare dell'angolo di visione). Quest'ultimo fatto è particolarmente importante per superfici organiche visto che tendono alla rotondità. Gli articoli che ho letto seppur generalmene non sufficienti a ricostruire tutto l'algoritmo per un profano, rimandano in bibliografia alla maggior parte degli articoli necessari.
A naso, eviterei le equazioni differenziali perché non mi risulta esista alcuno spazio di colore percettualmente lineare, anche se una rapida googlata mostra articoli recenti sul tema. Lo spazio considerato standard negli articoli di Computer Vision è CIE L*a*b*.
Ti interessa solo un metodo interamente automatizzato o va bene anche semiautomatico?
Non ho gli articoli qui con me, sono rimasti a casa dei miei, ma potrei essere interessato a leggermi alcuni articoli recenti.
A naso, eviterei le equazioni differenziali perché non mi risulta esista alcuno spazio di colore percettualmente lineare, anche se una rapida googlata mostra articoli recenti sul tema. Lo spazio considerato standard negli articoli di Computer Vision è CIE L*a*b*.
Ti interessa solo un metodo interamente automatizzato o va bene anche semiautomatico?
Non ho gli articoli qui con me, sono rimasti a casa dei miei, ma potrei essere interessato a leggermi alcuni articoli recenti.
Lo spazio di colore usato non è il principale problema legato allo "shape for shading". Che io sappia i colori non vengono infatti praticamente mai usati in questo caso e si considera solo la luminosità di ogni singolo pixel. In questo tipo di problema si usa una singola immagine e si fanno grosse semplificazioni riguardo al tipo di materiale usato nella scena, si suppone infatti che il colore sia uniforme, che la riflessione della luce dipenda esclusivamente dalla normale sulla superficie e dall'osservatore secondo una legge fissata, si suppone che la scena ritratta sia un'unica superficie tutta collegata e non diversi oggetti uno davanti all'altro.. Di fatto non funziona in nessun caso reale. Ho trovato il seguente pdf che descrive anche di implementazione un po': http://vision.eecs.ucf.edu/papers/shah/99/ZTCS99.pdf
Il metodo basato invece sulla ricerca e confronto delle diverse feature nell'immagine è spesso migliore, ma richiede l'utilizzo di almeno due immagini. In alcuni casi movimento e posizioni della camera nelle varie scene è conosciuta a priori e fornita in input (per esempio nel cinema). In altri si conoscono solo alcune informazioni sulla camera (in applicazioni di realtà aumentata si potrebbe per esempio conoscere l'orientamento nello spazio e solo in parte la posizione) oppure non avere alcuna informazione. La ricerca di features è comunque importante anche in molti altri settori di computer vision.
Il metodo basato invece sulla ricerca e confronto delle diverse feature nell'immagine è spesso migliore, ma richiede l'utilizzo di almeno due immagini. In alcuni casi movimento e posizioni della camera nelle varie scene è conosciuta a priori e fornita in input (per esempio nel cinema). In altri si conoscono solo alcune informazioni sulla camera (in applicazioni di realtà aumentata si potrebbe per esempio conoscere l'orientamento nello spazio e solo in parte la posizione) oppure non avere alcuna informazione. La ricerca di features è comunque importante anche in molti altri settori di computer vision.