Búsqueda de imágenes

Al intentar implementar la búsqueda de imágenes inversa para mi sitio, me encontré con el enorme mundo de la búsqueda de imágenes. A continuación se muestran breves descripciones y casos de uso para algunos de los enfoques de búsqueda de imágenes inversos / similares.





Agua, piedras, cielo
Agua, piedras, cielo

Conjunto de datos utilizado





Hash perceptual

[ Colab ]





Descripción detallada de cómo funciona phash





. , .





- . N ( - threshold').





? ! Vantage-point tree, O(n log n) O(log n).





, , , vantage-point tree , for.   , 100 .   , ... , vptree . ? , vantage point tree PyPI, 1 - vptree. , - . vp-tree javascript . for-loop ,  vptree 10 . - , top N , . , vp-tree , . gist





- vp-tree, . , . / vp-tree c / , /.





Nuestro conjunto de datos tiene 2 duplicados de la primera imagen.
2

































  • {transformation_name}





- . - , "" .





https://habr.com/ru/post/205398/

https://habr.com/ru/post/211773/





: phash , preview/thumbnail. .





RGB Histogram

[Colab]





Histograma RGB
RGB

RGB , , , .





: . , .





Búsqueda lineal.  Compare histogramas usando el método cv2. HISTCMP_INTERSECT (53ms)
. cv2.HISTCMP_INTERSECT (53ms)

flatten, , 4096 .





k-nearest neighbor search, .





Bruteforce knn (73ms) y hnsw (0.4ms) producen las mismas imágenes
Bruteforce knn (73ms) hnsw(0.4ms)

. approximate nearest neighbor search. hnswlib, Hierarchical Navigable Small World. 50-70ms, 0.4ms.





.

approximate nearest neighbor search - https://habr.com/ru/company/mailru/blog/338360/









  • ,





  • , phash









  • ( 16 RGB 4096)





  • ,





SIFT/SURF/ORB

[SIFT Colab]





SIFT.





, SURF ORB. SIFT - Root SIFT.





:





descs /= (descs.sum(axis=1, keepdims=True) + eps)
descs = np.sqrt(descs)
      
      



SIFT ~5 .

: SIFT features, Brute-Force Matcher(cv2.BFMatcher), matches.





Búsqueda de cultivos (30 s)
(30s)

:





  • SIFT , ,





:













  • ( , python)





NN features

[Colab ResNet50] [Colab CLIP]





. . ResNet50 - 2048. "" ResNet50, knn . .





model = ResNet50(weights='imagenet', include_top=False,input_shape=(2242243),pooling='max')
      
      



La imagen por la que estamos mirando
Cascadas (ResNet50)
(ResNet50)
Encontrar una imagen altamente pixelada (ResNet50)
(ResNet50)
Búsqueda de cultivos (ResNet50)
(ResNet50)

- CLIP. , encode_image 512.





Cascadas (CLIP)
(CLIP)
Búsqueda de imágenes altamente pixeladas (CLIP)
(CLIP)
Búsqueda de cultivos (CLIP)
(CLIP)

CLIP c , - , 224 aspect ratio, Center Crop, . .





. t-SNE.





t-SNE ResNet50 (10100x10100 7.91MB)
t-SNE CLIP (10100x10100 7.04MB)

Features CLIP . , CLIP , , .





:









  • approximate nearest neighbor search





:





  • features GPU





CLIP text search

[Colab CLIP]





CLIP:





  • https://habr.com/ru/post/539312/





  • https://habr.com/ru/post/540312/





CLIP , , . knn search features , features . .





text_tokenized = clip.tokenize(["a picture of a windows xp wallpaper"]).to(device)
with torch.no_grad():
        text_features = model.encode_text(text_tokenized)
        text_features /= text_features.norm(dim=-1, keepdim=True)
      
      



"una imagen de una puesta de sol cerca del mar"
"a picture of a sunset near the sea"
"una imagen de una niebla cerca de las montañas"
"una imagen de una niebla cerca de las montañas"
"una imagen de un fondo de pantalla de windows xp"
"una imagen de un fondo de pantalla de windows xp"

Github con todas las laptops








All Articles