Files
boc/iom/visual_geolocation/__pycache__/similarity_search.cpython-39.pyc
T

95 lines
6.7 KiB
Plaintext
Raw Normal View History

a
!˜>j$ã@sjdZddlmZmZmZmZddlmZddlZ eGdddƒƒZ
GdddƒZ d d
Z e
d krfe ƒdS) zQ
Similarity Search
Find similar images using embeddings for temporal geolocation
é)ÚDictÚListÚOptionalÚTuple)Ú dataclassNc@sJeZdZUdZeed<eed<eeeefed<eeed<e ed<dS)ÚSimilarityMatchzSimilarity match resultÚimage_idÚ
similarityÚlocationÚ timestampÚmetadataN)
Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚstrÚ__annotations__Úfloatrrr©rrúK/home/bernt/.openclaw/workspace/iom/visual_geolocation/similarity_search.pyr s
 rc@eZdZdZdedœddZdeeje e
e e fe ee dœdd „Z
dejee eed œd
dZejee eed œddZdeje
e e fe eeedœddZd eje
e e fe e dœddZe dœddZdS)!ÚSimilaritySearchzª
Find similar images using embeddings
Uses:
- Visual embeddings (from CLIP)
- Scene embeddings
- Object embeddings
- Combined embeddings
é©Ú
embedding_dimcCsN||_i|_i|_d|_zddl}| |¡|_d|_WntyHYn0dS)NFrT)rÚ
embeddingsr Ú use_faissÚfaissZ IndexFlatIPÚ faiss_indexÚ ImportError)ÚselfrrrrrÚ__init__ s 
 zSimilaritySearch.__init__N©rÚ embeddingr
r r cCsN|tj |¡}||j|<|||p$idœ|j|<|jrJ|j | dd¡¡dS)zAdd image to similarity index)r
r r ééÿÿÿÿN) ÚnpÚlinalgÚnormrr rrÚaddÚreshape)rrr"r
r r rrrÚ add_image.s

ý zSimilaritySearch.add_imageéçffffffæ?)Úquery_embeddingÚmin_similarityÚreturnc
C|tj |¡}|jrÆt|jƒdkrÆ|j | dd¡|¡\}}g}t |j 
¡ƒ}t t |d|dƒƒD]Z\}\} }
| |krf|
t|ƒkrf||
} |j
| } | t| t| ƒ| d| d| dd¡qf|S| |||¡SdS) a
Search for similar images
Args:
query_embedding: Embedding of query image
k: Number of results to return
min_similarity: Minimum similarity threshold
Returns:
List of similarity matches
rr#r$r
r r ©rr r
r r N)r%r&r'rÚlenrrÚsearchr)ÚlistÚkeysÚ enumerateÚzipr ÚappendrrÚ_brute_force_search)
rr-r.r/Z similaritiesÚindicesÚresultsZ image_idsÚiZsimÚidxrÚmetarrrr3Es( ÿ"
û
zSimilaritySearch.searchc
Cs|g}|j ¡D]N\}}t ||¡}||kr|j|}| t|t|ƒ|d|d|dd¡q|jdddd|d |S)
zBrute force similarity searchr
r r r1cSs|jS©r ©ÚxrrrÚ<lambda>Žóz6SimilaritySearch._brute_force_search.<locals>.<lambda>T)ÚkeyÚreverseN) rÚitemsr%Údotr r8rrÚsort) rr-r.r/r;rr"r r>rrrr9us 
û
z$SimilaritySearch._brute_force_searchçY@)r-r
Úradiusr.r0c Csh|j||dd}g}|D]@}|jr| |d|d|jd|jd¡}||kr| |¡q|d|S)zp
Find temporal matches at same location
Useful for detecting changes over time
é©r.rr#N)r3r
Ú_haversine_distancer8) rr-r
rKr.Z all_matchesZtemporal_matchesÚmatchÚdistancerrrÚfind_temporal_matchess
 þ z&SimilaritySearch.find_temporal_matchesçI@)Úcurrent_embeddingr
rKr0cCst|j|||dd}|s dddœSt|ddd}d |j}d
||j|j|jd œt|ƒ|d kr`d
n|dkrldnddœS)z
Detect changes between current image and historical matches
Returns:
Dict with change analysis
é
rMZ
no_historyz+No historical observations at this location)ÚstatusÚmessagecSs|jSr?r@rArrrrCÈrDz1SimilaritySearch.detect_changes.<locals>.<lambda>)rEr#Zchange_detected)rr r gà?Úhighg333333Ó?ÚmediumÚlow)rUÚ change_scoreÚ
best_matchZhistorical_countÚseverity)rQÚmaxr rr r2)rrSr
rKÚ
historicalr[rZrrrÚdetect_changes°s$
ÿþ
ý÷zSimilaritySearch.detect_changes)r0c
Cddl}d}| |¡}| |¡}| ||¡} | ||¡}
| | d¡d| |¡| |¡| |
d¡d} d| | | ¡| d| ¡¡} || S)z4Calculate distance between two coordinates in metersrNi¸6arLr#)ÚmathÚradiansÚsinÚcosÚatan2Úsqrt)
rÚlat1Úlng1Úlat2Úlng2r`Úphi1Úphi2Ú delta_phiÚ delta_lambdaÚcrrrrNÚs

$ÿ z$SimilaritySearch._haversine_distance)r)NNN)r+r,)rJr+)rR)r
rrrÚintr rr%Úndarrayrrrrr*rrr3r9rQr_rNrrrrrsT
úú üû 2û !û
ú "ü
û *rcCtdƒtdd}tj d¡tdƒD]^}tj d¡}|jd|d|dtj ¡d d
tj ¡d fd |d d
dddidq&|jdtj d¡d}|j |dd}tdt