2012-11-28 10 views
10

Quindi ho un algoritmo iterative closest point (ICP) che è stato scritto e che si adatta a un modello a una nuvola di punti. Come un rapido tutorial per coloro che non sono al corrente, l'ICP è un semplice algoritmo che si adatta ai punti di un modello che alla fine fornisce una matrice di trasformazione omogenea tra il modello ei punti.Assurance of ICP, Internal Metrics

Ecco un breve tutorial di immagini.

Fase 1. Trovare il punto più vicino al modello di cui al set di dati:

Fase 2: Usando un po 'di matematica di divertimento (a volte sulla base di discesa gradiant o SVD) tirare le nuvole più vicini e ripetere fino a una posa è formato:

[Figura 2] [2]

Ora che bit è semplice e di lavoro, quello che vorrei aiuto con è:! Come faccio a sapere se la posa che ho è una buona?

Così Attualmente ho due idee, ma sono un po 'hacky:

  1. quanti punti sono nell'algoritmo ICP. Cioè, se mi sta adattando a quasi nessun punto, presumo che la posa sarà cattiva:

    Ma cosa succede se la posa è in realtà buona? Potrebbe essere, anche con pochi punti. Non voglio respingere buone pose:

Figure 5

Così quello che vediamo qui è che i punti bassi può effettivamente fare una posizione molto buona se sono nel posto giusto.

Quindi l'altra metrica esaminata era il rapporto tra i punti forniti e i punti utilizzati. Ecco un esempio

Figure 6

Ora exlude punti che sono troppo lontani perché saranno valori anomali, ora questo significa che abbiamo bisogno di una buona posizione di partenza per l'ICP al lavoro, ma io sono ok con quello. Ora, nell'esempio di cui sopra la garanzia sarà dire di no, questa è una cattiva posa, e sarebbe giusto, perché il rapporto tra punti vs punti inclusi è:

2/11 < SOME_THRESHOLD 

thats così buono, ma fallirà nel caso mostrato sopra dove il triangolo è capovolto. Dirà che il triangolo capovolto è buono perché tutti i punti sono usati da ICP.

È non necessario essere un esperto di ICP per rispondere a questa domanda, sto cercando buone idee. Usando la conoscenza dei punti come possiamo classificare se è una buona soluzione di posa o no?

L'uso di entrambe queste soluzioni insieme in tandem è un buon suggerimento, ma è una soluzione piuttosto zoppa se mi chiedi, molto stupido di limitarlo.

Quali sono alcune buone idee su come farlo?

PS. Se vuoi aggiungere del codice, per favore fallo. Sto lavorando in C++.

PPS. Qualcuno mi aiuti a taggare questa domanda, non sono sicuro di dove dovrebbe cadere.

+0

Come viene definita una posa? Segmenti di linea? – FoolishSeth

+0

Come matrice di trasformazione omogenea. –

+0

Per curiosità, hai trovato una soluzione? Hai usato qualcosa offerto in risposta o hai trovato qualcosa di tuo? – Andrei

risposta

3

Un possibile approccio potrebbe essere quello di confrontare le pose con le loro forme e il loro orientamento.

confronto

forme può essere fatto con Hausdorff distance up to isometry, cioè pose sono della stessa forma se

d(I(actual_pose), calculated_pose) < d_threshold 

dove d_threshold deve trovare da esperimenti. Poiché le modifiche isometriche di X prenderei in considerazione le rotazioni da diversi angoli - sembra essere sufficiente in questo caso.

Le pose hanno la stessa forma, dovremmo confrontare il loro orientamento. Per confrontare l'orientamento potremmo usare un po 'semplificato Freksa model. Per ogni posa dovremmo calcolare i valori

{x_y min, x_y max, x_z min, x_z max, y_z min, y_z max} 

e quindi assicurarsi che ogni differenza tra i valori corrispondenti per pose non si rompe another_threshold, derivato da esperimenti pure.

Speriamo che questo abbia un senso, o almeno puoi disegnare qualcosa di utile per il tuo scopo.

+0

Non l'avevo letto veramente correttamente fino ad ora . Per il secondo suggerimento, hai bisogno della posa reale per fare il confronto. Non abbiamo la posa reale, quindi non funzionerà. –

1

ICP tenta di ridurre la distanza tra la nuvola di punti e un modello, sì? Non sarebbe più sensato valutarlo in base a quale sia effettivamente la distanza dopo l'esecuzione?

Suppongo che cerchi di ridurre al minimo la somma delle distanze quadrate tra ciascun punto che si tenta di adattare e il punto modello più vicino. Quindi, se vuoi una metrica per la qualità, perché non limitarti a normalizzare quella somma, dividendola per il numero di punti che è adatto. Sì, i valori anomali lo disturberanno un po ', ma potrebbero anche disturbare un po' il tuo adattamento.

Sembra che qualsiasi calcolo che si può ottenere che offra più informazioni di quanto l'ICP riduca al minimo sarebbe più utile incorporarlo nell'algoritmo stesso, in modo da minimizzare anche questo. =)

Aggiornamento

penso non ho ben capito l'algoritmo. Sembra che selezioni iterativamente un sottoinsieme di punti, li trasformi per minimizzare l'errore e quindi ripeta questi due passaggi? In tal caso, la soluzione ideale seleziona il maggior numero di punti possibile mantenendo l'errore il più piccolo possibile.

Hai detto che la combinazione dei due termini sembrava una soluzione debole, ma mi sembra una descrizione esatta di ciò che desideri e cattura le due principali caratteristiche dell'algoritmo (sì?). Valutare usando qualcosa come error + B * (selected/total) sembra spiritualmente simile a come viene usata la regolarizzazione per affrontare il problema del sovradattamento con algoritmi ML di discesa del gradiente (e simili). Scegliere un buon valore per B richiederebbe qualche sperimentazione.

+0

Sfortunatamente basare la tua assicurazione che la posa è corretta in base al valore che stai cercando di minimizzare non è un'idea molto buona. Ogni volta che la posa cade in un minimo locale mostrerà una buona posa. In effetti mostrerà sempre una buona posa se l'ICP ha funzionato correttamente, il che non è molto buono. Buona risposta però. –

+0

Questo non ha molto senso. Ovviamente l'algoritmo può raggiungere i minimi locali ma il valore che sta cercando di minimizzare non sarà così piccolo come sarebbe se trovasse l'optimum globale. – FoolishSeth

+0

In un caso normale ICP sì ma con la soglia di rimozione dei punti si scoprirà che è spesso simile o inferiore ai minimi globali. Devi anche ricordare che i punti modello non corrispondono esattamente ai punti dati. Abbiamo provato questo metodo e scoperto che non era molto buono per il nostro scopo. –

1

Guardando i tuoi esempi, sembra che una delle cose che determina se la partita è buona o meno, è la qualità dei punti. Potresti usare/calcolare un fattore di ponderazione nel calcolo della tua metrica?

Ad esempio, è possibile appesantire i punti che sono co-lineari/complanari o spazialmente vicini poiché probabilmente definiscono la stessa funzione.Questo forse permetterebbe di respingere il tuo triangolo capovolto (dato che i punti sono in linea, e che non è un grande indicatore della posa generale), ma il caso d'angolo sarebbe ok, poiché definiscono approssimativamente lo scafo.

In alternativa, è possibile che la ponderazione dipenda dalla distribuzione dei punti attorno alla posa, cercando ancora di assicurare una buona copertura piuttosto che corrispondere a piccole caratteristiche indistinte.

+0

Buon suggerimento, hai documenti o riferimenti in cui viene fatto. Inoltre sono preoccupato per l'intensità computazionale, pensi che sarà molto intenso? Come si controlla la copertura della forma quando il modello è più complesso di un triangolo, ad esempio un camion o un aereo? –

+0

Praticamente mentre sto andando avanti, anche se potrebbe esserci qualcosa nel processo del Siggraph, sembra un problema familiare. Ad ogni modo, sto pensando che forse la costruzione di un albero ottuso sarebbe abbastanza economica, e si potrebbe usare il numero di nodi foglia contenenti punti corrispondenti come indicazione di copertura. – JasonD