Interpolera position från inexakt positionsdata

Permalänk
Medlem

Interpolera position från inexakt positionsdata

Bakgrund:
Vill geotagga mina foton tagna med kamera som saknar GPS från nerladdad positionsdata från Google Timeline. Finns olika verktyg för detta, men inget som verkar ta hänsyn till inexakthet i datan, så jag tänkte programmera det själv. Det är bara en bit som saknas.

Problem:
Positionsdatan innehåller en massa positioner vid olika tidpunkter, men datan är inte alltid exakt. GPS-data är ofta väldigt exakt, men data från CELL eller WIFI kan ha stora felmarginaler på hundratals meter eller ett par km. Jag vill fortfarande kunna använda dessa, speciellt om ingen GPS-data finns i närheten av den tidpunkt jag behöver, men jag vill inte heller förlita mig för mycket på dessa.

Fråga:
Hur bör jag interpolera min position vid en viss given tidpunkt (när ett foto är taget)? Jag antar att jag behöver hitta den mest sannolika kurvan som jag följt genom ett visst antal positionsmätningar, och väga mätningarnas kontribution med hur exakta de är. Några ideer, eller finns det redan någon känd algoritm för detta?

Möjligt att jag gör detta onödigt svårt för mig, men jag är också nyfiken och vad gör man inte för att ens egna projekt ska bli så bra som möjligt =).

Permalänk
Medlem
Skrivet av ajp_anton:

Bakgrund:
Vill geotagga mina foton tagna med kamera som saknar GPS från nerladdad positionsdata från Google Timeline. Finns olika verktyg för detta, men inget som verkar ta hänsyn till inexakthet i datan, så jag tänkte programmera det själv. Det är bara en bit som saknas.

Problem:
Positionsdatan innehåller en massa positioner vid olika tidpunkter, men datan är inte alltid exakt. GPS-data är ofta väldigt exakt, men data från CELL eller WIFI kan ha stora felmarginaler på hundratals meter eller ett par km. Jag vill fortfarande kunna använda dessa, speciellt om ingen GPS-data finns i närheten av den tidpunkt jag behöver, men jag vill inte heller förlita mig för mycket på dessa.

Fråga:
Hur bör jag interpolera min position vid en viss given tidpunkt (när ett foto är taget)? Jag antar att jag behöver hitta den mest sannolika kurvan som jag följt genom ett visst antal positionsmätningar, och väga mätningarnas kontribution med hur exakta de är. Några ideer, eller finns det redan någon känd algoritm för detta?

Möjligt att jag gör detta onödigt svårt för mig, men jag är också nyfiken och vad gör man inte för att ens egna projekt ska bli så bra som möjligt =).

Lite spekulationer:
Google Maps har en funktion där man med hjälp av kamera (kanske även fungerar med bilder?) kan få position, antar att den jämför med streetview och ev satellit.. ej läst på..
Ev finns API mot detta som kan hjälp dig positionera bilder som är tagna utomhus.

Visa signatur

Dator: 10900KF, RTX 3080, Torrent Compact
Skärm: LG 42C2 + Dell S2721DGF
Tillbehör: iQunix F97 med vita pudding, Taurus GM1-W, PS5 gamepad
Ljud: EPOS H3Pro, GSP 670, Corsair Virtuoso, Fidelio X2HR, DT770 pro, Eris E5, Airpods Pro 2022, GoXLR, Fiio E10
Övrigt: iQunix ZX75, Varmilo va109m, Keychron K8(Glorious Panda)

Permalänk
Medlem

Kör du Lightroom Classic för att hantera dina bilder kan du prova pluginet Geoencoding Support som går att hämta här. Pluginet har ett par olika funktioner för att hantera positionsdata som inte är helt exakt.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem
Skrivet av Leestander:

Lite spekulationer:
Google Maps har en funktion där man med hjälp av kamera (kanske även fungerar med bilder?) kan få position, antar att den jämför med streetview och ev satellit.. ej läst på..
Ev finns API mot detta som kan hjälp dig positionera bilder som är tagna utomhus.

Vet inte riktigt vad du menar... Alltså att Google skulle identifiera position från vad som syns på bilden? Ser inte hur de skulle kunna göra detta ens i teorin, även om de har bilddata på allt i hela världen, då saker inte är statiska. Vissa byggnader eller vida landskap kanske.

Skrivet av ToJa92:

Kör du Lightroom Classic för att hantera dina bilder kan du prova pluginet Geoencoding Support som går att hämta här. Pluginet har ett par olika funktioner för att hantera positionsdata som inte är helt exakt.

Såg ingenting om en sådan funktion på hemsidan, men installerade LrC för att testa den. Den kör bara linjär interpolation mellan tidpunkterna på varsin sida om bildens tidpunkt, och ignorerar totalt hur inexakta de mätningarna är. Hittar ingen inställning för att ändra på detta.

Permalänk
Medlem

Om du har en tydlig ide om hur positionsdatat som inte existerar ska hallucineras fram så kanske du ska berätta det? Linjär interpolation är ju det givna annars?

Jag blir nyfiken på hur du har tänkt att använda resultatet. Att du kommer hitta faktisk punkt där fotot är taget tycks (i det generella fallet i alla fall) vara helt uteslutet, eftersom du helt enkelt saknar den informationen?

Ett första steg till en något mindre naiv algoritm är antagligen att väga in kartdata och beräkna sannolik färdväg mellan några olika punkter i de områden där start- och slutpunkt kan ha befunnit sig, givet inexaktheten i mätningarna. Det kommer naturligtvis ändå bli nästan lika fel som linjär interpolation.

Rätt sätt annars är ju att gå ut i fält och hitta platsen, samt mäta in den med den noggrannhet man tycker sig behöva.

Permalänk
Medlem

Spännande problem. Hur ser datan ut, antar du har longitud och latitud vid olika tidpunkter från olika källor?

Jag är verkligen ingen expert på sådant men kul problem. Om mina antaganden kring hur din data ser ut skulle jag dela upp tiden i ett antal bins. beroende på hur frekvent data du har får man välja storleken. Sedan är väl det enklaste att medelvärdera positonsdatan till en "medelpositon" i det tidsintervallet. Om det går att särskilja på källan till data-punkten och därmed nogrannheten kan man vikta dem olika beroende på källa.

Har man sedan ett antal medelvärderade punkter med förhoppningsvis bättre noggrannhet kan man linjärinterpolera mellan positionerna givet vilken tidpunkt fotot är taget.

Misstänker dock att din positonsdata inte är särskilt frekvent. För att det överhuvudtaget ska vara någon poäng med att betrakta olika nogrannheter beroende på mätmetod måste du har många mätpunkter i varje faktisk position vilket känns osannolikt. En rimligare ambition kanske är att försöka bestämma vilken ort du befann dig vid vid olika tidpunkter. Dela upp dagen i timmar och försöka bestämma en ort varje timme med ovan metod.

Visa signatur

Workstation | A64 3500+ "venice" @2,6 (260x10) | 1024MiB Speed premium bh5 @260mhz 1,5225-1t | DFI Sli-DR | 7800GTX @525/1410 | pc6070b
Server | P4 2,0 @ 2,6 | 1024 mb ram | Gfx4 mx | 1,6TiB hdd | Debian Etch |
Laptop | Zepto 6224W | C2D 7300 2Ghz | 8600GT 512MB | 2gb 666mhz ram | 100gb 7200rpm hdd |

Permalänk
Medlem
Skrivet av KAD:

Om du har en tydlig ide om hur positionsdatat som inte existerar ska hallucineras fram så kanske du ska berätta det? Linjär interpolation är ju det givna annars?

Ett första steg till en något mindre naiv algoritm är antagligen att väga in kartdata och beräkna sannolik färdväg mellan några olika punkter i de områden där start- och slutpunkt kan ha befunnit sig, givet inexaktheten i mätningarna. Det kommer naturligtvis ändå bli nästan lika fel som linjär interpolation.

Skulle inte alls säga att linjär interpolation är givet. Dock så är det såklart ett alternativt, men "linjär interpolation från de två närmsta punkterna" är iallafall uteslutet, och det är vad alla verkar använda. Just de två närmsta punkterna kan ju vara hemskt inexakta med kilometerstora felradier. Kan ju finnas exakt GPS-data bara en halv minut längre bort.

Något jag funderat på är att använda nån sorts viktning av datan, där t.ex varje minut bort kostar 100m i osäkerhet (gånghastighet). Man letar tills det inte går att hitta en mätpunkt som har bättre vikt än allt man hittat tidigare. Sen kör man linjär regression på alla de mätpunkter man hittat, med viktning av datan baserat på avstånd i tid samt noggrannhet. Dock så måste man se till så man inte delar på noll, där en (teoretisk) noggrannhet på 0m 10minuter bort, eller en superinexakt mätning precis vid rätt tidpunkt skulle viktas till oändligheten.

Sen finns ju ickelinjär regression, för man rör sig ju inte alltid med konstant hastighet och riktning. Men hur välja grad av polynomen isåfall?

Notera att det inte är pga dumhet som jag inte kan nöja mig med simpel linjär interpolering av de två närmsta mätpunkterna. Jag är genuint intresserad av problemet, vad den kan ha för olika lösningar, och hur jag ska implementera det.

Skrivet av KAD:

Jag blir nyfiken på hur du har tänkt att använda resultatet. Att du kommer hitta faktisk punkt där fotot är taget tycks (i det generella fallet i alla fall) vara helt uteslutet, eftersom du helt enkelt saknar den informationen?

Rätt sätt annars är ju att gå ut i fält och hitta platsen, samt mäta in den med den noggrannhet man tycker sig behöva.

För de allra flesta bilderna så kan jag hitta den exakta positionen på en karta, men det är inget man vill göra med 200k bilder och eventuellt allt i framtiden, så länge min kamera saknar GPS. Den här processen ska automatiseras så långt det går.

Permalänk
Medlem
Skrivet av ajp_anton:

För de allra flesta bilderna så kan jag hitta den exakta positionen på en karta, men det är inget man vill göra med 200k bilder och eventuellt allt i framtiden, så länge min kamera saknar GPS. Den här processen ska automatiseras så långt det går.

Det funkar inte med redan tagna bilder men...
Ta med en GPS i framtiden, så kan du korrelera datan därifrån med bilderna

Permalänk
Medlem
Skrivet av Pingo88:

Spännande problem. Hur ser datan ut, antar du har longitud och latitud vid olika tidpunkter från olika källor?

Jag är verkligen ingen expert på sådant men kul problem. Om mina antaganden kring hur din data ser ut skulle jag dela upp tiden i ett antal bins. beroende på hur frekvent data du har får man välja storleken. Sedan är väl det enklaste att medelvärdera positonsdatan till en "medelpositon" i det tidsintervallet. Om det går att särskilja på källan till data-punkten och därmed nogrannheten kan man vikta dem olika beroende på källa.

Har man sedan ett antal medelvärderade punkter med förhoppningsvis bättre noggrannhet kan man linjärinterpolera mellan positionerna givet vilken tidpunkt fotot är taget.

Misstänker dock att din positonsdata inte är särskilt frekvent. För att det överhuvudtaget ska vara någon poäng med att betrakta olika nogrannheter beroende på mätmetod måste du har många mätpunkter i varje faktisk position vilket känns osannolikt. En rimligare ambition kanske är att försöka bestämma vilken ort du befann dig vid vid olika tidpunkter. Dela upp dagen i timmar och försöka bestämma en ort varje timme med ovan metod.

Det är en blandning av GPS (felradie på normalt 10m, ibland 50m), mobilmaster och wifi (felradier på allt från 100m till 2km, kanske mer). Tidsintervall varierar, ibland varje halvminut, ibland blir det hopp på 10 minuter. Totalt har jag 1,4 miljoner mätpunkter under 7,5 år, vilket blir i genomsnitt 3 minuter per mätpunkt. Vet inte om det är nån dag-natt-variation.

Sen har jag också de platser som Google gissat att jag besökt, t.ex "under den här tiden så var du sannolikt i den här restaurangen eller parken". Kan säkert använda dessa också i de fall där den faktiska positionsdatan är dålig.

Att dela upp all data i bins är väl ungefär samma som att skapa en bin runt varje enskilda bild, och då är vi tillbaka till hur man interpolerar datan runt när bilden är tagen. Så t.ex att utöka binnen tills den inkluderar tillräckligt många mätpunkter och sen ta ett viktat genomsnitt? Känns som att om man även viktar tidsavstånd, så kan det bli ganska samma som linjär interpolation.

Permalänk
Medlem

Man använder normalt någon variant av Kalmanfilter för detta.

Visa signatur

AMD Ryzen 5800X | MSI RTX 3060 Ti Gaming X Trio | Cooler Master HAF 912 Plus

Permalänk
Medlem

Jag skulle nog leka med vanliga algoritmer som dessa:
https://www.bbc.co.uk/bitesize/guides/zh8ywty/revision/4

Man kan ju ta flera olika tvärsnitt/urval av punkter och räkna medelvärden av föreslagna punkter, och viktas så GPS får mer värde till exempel

Linjen man får ut kan ju sedan segmenteras till tidssteg utan större bekymmer och antagligen få ganska vettiga resultat

Gör en linje för punkter [n-k, n-k+1, … , n+k] för olika k och där n är närmaste punkten, räkna ut tidssteg från dessa linjer, ta ett viktat medelvärde av resultaten beroende på datats ursprung (kanske GPS får vikten 10 och 1 för andra?)

Permalänk
Medlem
Skrivet av ajp_anton:

Det är en blandning av GPS (felradie på normalt 10m, ibland 50m), mobilmaster och wifi (felradier på allt från 100m till 2km, kanske mer). Tidsintervall varierar, ibland varje halvminut, ibland blir det hopp på 10 minuter. Totalt har jag 1,4 miljoner mätpunkter under 7,5 år, vilket blir i genomsnitt 3 minuter per mätpunkt. Vet inte om det är nån dag-natt-variation.

Sen har jag också de platser som Google gissat att jag besökt, t.ex "under den här tiden så var du sannolikt i den här restaurangen eller parken". Kan säkert använda dessa också i de fall där den faktiska positionsdatan är dålig.

Att dela upp all data i bins är väl ungefär samma som att skapa en bin runt varje enskilda bild, och då är vi tillbaka till hur man interpolerar datan runt när bilden är tagen. Så t.ex att utöka binnen tills den inkluderar tillräckligt många mätpunkter och sen ta ett viktat genomsnitt? Känns som att om man även viktar tidsavstånd, så kan det bli ganska samma som linjär interpolation.

Låter smartare. Med lite statistik skulle du t.ex. kunna välja en bin-storlek kring tiden bilden är taget och succesivt inkludera fler datapunkter längre bort i tiden så länge det varje tillagd datapunkt minskar standardavvikelsen på data-settet (eller på något smartare sätt avgöra om fler tillagda punkter gör resultatet bättre). Så kankse man kan avgöra vilka punkter som faktikst är där bilden togs och vilka som kommer senare när du börjar röra på dig igen.

Jag tror inte riktigt på det där med linjär-regression (eller med ett polynom för den delen). Med regression försöker du ju skapa ett samband mellan punkterna i ett data-set som kan beskrivas med ett polynom. Men det bygger ju på att det ska finnas ett samband som kan beskrivas med ett polynom, linjärt eller ej. En fysisk förflyttning mellan olika platser sker högst troligt in i en rät linje eller annan förutbestämd form.

Tror mer man får tänka kring enskilda positioner. Där kan man ju applicera grunden till regressionen dvs att passa en enskild punkt så "felet" med hänsyn till alla punkter blir så liten som möjligt. Dvs. ett smartare sätt än att bara medelvärdera.

Visa signatur

Workstation | A64 3500+ "venice" @2,6 (260x10) | 1024MiB Speed premium bh5 @260mhz 1,5225-1t | DFI Sli-DR | 7800GTX @525/1410 | pc6070b
Server | P4 2,0 @ 2,6 | 1024 mb ram | Gfx4 mx | 1,6TiB hdd | Debian Etch |
Laptop | Zepto 6224W | C2D 7300 2Ghz | 8600GT 512MB | 2gb 666mhz ram | 100gb 7200rpm hdd |