← back to Dw Photo Capture

visual-search/__pycache__/search_service.cpython-312.pyc

138 lines

�

;�TjX>��2�ddlZddlZddlZddlZddlZddlZddlmZmZddl	Z
ddlZddlm
Z
ejdZeejj#dd��Zejj#dd�Zddd	�Zd
�Zej,�Zdgddiggd�Zd�Zhd
�hd�hd�ddhhd�ddhddhddhddhddhdhhd�ddhdhd�Zd�Zd�ZGd�d e�Zed!k(r5e�ed"e�d#ed$�d%�d&�'�eeefe�jA�yy)(�N)�BaseHTTPRequestHandler�ThreadingHTTPServer)�Image�
DW_UNIFIED_DB�VS_PORT�9914�VS_HOSTz	127.0.0.1)�model�
preprocessc��td��.ddl}ddl}tdd��|j	dd�	�\}}}t
jjt
jjt
jjt��d
�}t
jj|�r2|j|j|d��d
��td|d��|j�|jt!dtj"�dz
��||ctd<td<tdtdfS)z�Load CLIP on first /search only. Uses the SAME weights (ViT-B-32/laion2b + optional
    dw_clip_ft.pt) the catalog was embedded with, so re-embedded photos share the catalog's space.r
Nruloading CLIP…T��flushzViT-B-32�laion2b_s34b_b79k)�
pretrainedz
dw_clip_ft.pt�cpu)�map_locationF)�strictz"loaded fine-tuned DW CLIP weights:��r)�_MODEL�torch�	open_clip�print�create_model_and_transforms�os�path�join�dirname�abspath�__file__�exists�load_state_dict�load�eval�set_num_threads�max�	cpu_count)rrr
�_r�_fts      �K/Users/macstudio3/Projects/dw-photo-capture/visual-search/search_service.py�
_get_modelr+s����g����
��t�,�(�D�D�Z�\o�D�p���q�*��g�g�l�l�2�7�7�?�?�2�7�7�?�?�8�+D�E��W��
�7�7�>�>�#���!�!�%�*�*�S�u�*�"E�e�!�T��6��4�H�
�
�
��e�+�+�C��2�<�<�>�A�3E�,F�G�05�z�-��w����-��'�?�F�<�0�0�0�)�M�meta�	loaded_at�n�sku_ix�fam�stylesc���|sy|j�jd�}t|�dk(rdjd�|D��}t|�dkry	t	|ddd�d	zt	|dd
d�d	zt	|d
dd�d	z}}}t
|||�t|||�}}||z
}||zdz}|dk(rdn,d
td|zd
z
�z
r|d
td|zd
z
�z
znd}	d}
|dk7r6||k(rd||z
|zdzz}
n"||k(rd||z
|zdzz}
nd||z
|zd
zz}
|
dkr|
dz
}
|	dkr!|dkDry|dkryd|
cxkrdkr	ny|dkDryy|dkDr
d|
cxkrdkry|dkr|	dkrd|
cxkrdksn|
dk\ry|dkry|
d ks|
dk\ry!|
d"kr|	d#kr|d$kDrdSd%S|
d&kr|	d#krdS|
d'krd(Sd)S|
d*kr	|d#krd(Sd)S|
d+kry,|
d-kry.|
d/kry0|
d1kry2y3#t
$rYywxYw)4N�#��c3�&K�|]	}|dz���y�w)rN�)�.0�cs  r*�	<genexpr>z#_family_from_hex.<locals>.<genexpr>1s����/�Q���!��Q�s��rr�g�o@�g@�r�<ihg
ףp=
�?g��Q���?�white�black��Fg333333�?�beige�grayg�������?g�������?g�?�
iY�browng{�G�z�?��red�(g�������?g�������?�orange�7�2�gold�yellow�A��green���teal���bluei"�purple�pink)	�strip�lstrip�lenr�int�
ValueErrorr&�min�abs)�hex_str�h�r�g�b�mx�mn�d�l�s�hds           r*�_family_from_hexrm.sn���4��
�
����s�#�A�
�1�v��{����/�Q�/�/�A�
�1�v��z�$���a��!�f�R�.��&��A�a��F�2��u�(<�c�!�A�a�&��n�U�>R�a�1����1�Q�Z��Q�q����B��B��Q�	�B����A��A�v���#�a��c�!�e�*��1�a��A�a�C��E�
�l�+�3�A�	�B��A�v�
��7�2��1��a��1�}�-�b�
�1�W�2��1��a��1�}�-�b���1��a��1�}�-�b�	�A�v�r�S�y�r��4�x��t�8�G��t�8�G�
��>�r�>�� �$�h�w���4�x�B�"�M�r�M�'�M��4�x�A��H�2��=�b�=�R�3�Y���4�x��	�B�w�"��)�E�	�B�w�A��H��T���H��H�	�B�w�1�t�8��R�B��G�&�R��R�	�B�w�1�t�8��9��9�	�C�x��	�C�x��	�C�x��	�C�x����7����s�6G&�&	G2�1G2>rPrGrIrB>rPrFrM>rFrIrMrQrPrM>rKrPrIrZrKrYrXrVrT>rFrCrBrFrG)rFrIrPrQrMrKrZrYrXrVrTrGrBrCc���tjt�}|j�}|j	d�ggggif\}}}}}|D�]\
}}}	}
}}}
}}}t|�}|j
tjt|
�d���|j
|||	|
|||d��|j
t|��t�}|r_	t|t�r|ntj|�}|D�chc],}|s�t!|�j#�j%���.}}|j
|�|s��||vs��|||<��|j)�|j)�|r$tj*|�j-d�ntj.dd�}t05|t2d<|t2d<t5j4�t2d<t|�t2d	<|t2d
<|t2d<|t2d<ddd�t7d
t|��dt|��d�d��ycc}w#t&$rY��wxYw#1swY�ExYw)Na�select e.vc_id, e.dw_sku, e.mfr_sku, e.vendor_code, e.pattern_name, e.image_url,
                          e.embedding, v.dominant_color_hex, v.ai_styles, sp.handle
                   from image_embeddings e
                   left join vendor_catalog v on v.dw_sku = e.dw_sku
                   left join shopify_products sp on sp.dw_sku = e.dw_sku
                        and sp.status = 'ACTIVE' and sp.online_store_published is true
                   where e.embedding is not null�float32)�dtype)�vc_id�dw_sku�mfr_sku�vendor�pattern�image�handle)rir-r.r/r0r1r2r3zloaded u embeddings · z
 skus indexedTr
)�psycopg2�connect�DB�cursor�executer]�append�np�
frombuffer�bytesrm�set�
isinstance�list�json�loads�strr[�lower�	Exception�close�vstack�astype�zeros�LOCK�STATE�timer)�conn�cur�vecsr.r2r3r1rqrr�mfr�vc�pat�url�emb�hexc�	ai_stylesrw�i�sset�arr�xr-s                      r*r#r#\s�����B��D�t�{�{�}���K�K�4�5�')�"�b�"�b�&8�#�D�$��V�V�JM�F��v�s�B��S�#�t�Y����I�����B�M�M�%��*�I�>�?����e�v�#�QS�`c�nq�~D�E�	F��
�
�#�D�)�*��u���
�#-�i��#>�i�D�J�J�y�DY��8;�A��1�q��A�����,�,�.���A�	�
�
�d���f�F�*��F�6�N�KN� �I�I�K�����-1��	�	�$����y�)�r�x�x��)�7T�A�	
���c�
���f�
�4�9�9�;�e�K�.@�]`�ae�]f�PU�VY�PZ� ��h���%��,��e�H�o�
�
�G�C��I�;�o�c�&�k�]�-�
H�PT�U��B���
��
��
��s7�+I�>H?�)H?�/I�5AI�?I�	I�I�Ic���ddl}t�\}}tjt	j
t
j|���jd�}|j�5|j||�jd��}||jdd��zj�j�jd�d}ddd�|S#1swYSxYw)Nr�RGB�����T)�dim�keepdimro)rr+r�open�io�BytesIO�base64�	b64decode�convert�no_grad�encode_image�	unsqueeze�normr�numpyr�)�b64rr
r�img�vs      r*�embed_photor��s����"���E�:�
�*�*�R�Z�Z�� 0� 0�� 5�6�
7�
?�
?��
F�C�	�������z�#��8�8��;�<��
����B���-�
-�2�2�4�:�:�<�C�C�I�N�q�Q��
�
�H�
�
�H�s
�,A+C!�!C+c�0�eZdZd�Zd�Zd�Zd�Zd�Zd�Zy)�Hc��y)Nr9)�self�as  r*�log_messagez
H.log_message�s��tr,c�.�tj|�j�}|j|�|j	dd�|j	dtt
|���|j�|jj|�y)NzContent-Typezapplication/json�Content-Length)
r��dumps�encode�
send_response�send_headerr�r]�end_headers�wfile�write)r��code�objrfs    r*�_sendzH._send�sp���J�J�s�O�"�"�$��d�&8�&8��&>�����);�<�d�>N�>N�O_�ad�eh�ij�ek�al�>m�����D�J�J�,�,�Q�/r,c��|jjd�r$|jddtdtdd��S|jjd�r&t	�|jddtdd��S|jdd
di�y#t
$r(}|jd	d
t
|�d��cYd}~Sd}~wwxYw)Nz/healthrUTr0r/)�okr0r/z/reload)r�r0��F�r��err�r��	not found)r�
startswithr�r�r#r�r�)r��es  r*�do_GETzH.do_GET�s����9�9���	�*�4�:�:�c�$�UZ�[^�U_�ns�t�oA�DB�4C�-C��9�9���	�*����
�
�3�t�%��*�0M� N�N��
�
�3���,�-���W�$�*�*�S��s�ST�v�:V�*W�#W��W�s�%B�	C�C�<C�Cc���|jjd�r|j�S|jjd�r|j�S|jjd�s|j	dddi�S	t|jjdd��}tj|jj|�xsd	�}|jd
�xsdjd�d
}t|jdd��}|s|j	dddi�St|�}t5tdtd}}ddd��t!|�s|j	ddgdd��S||z}t#j$|t'|t!|�dz
��d|}	|	t#j(||	�}	|	D�
cgc]#}
i|
�dt+t-||
�d�i���%}}
|j	ddtd|d��y#1swY��xYwcc}
w#t.$r(}|j	ddt1|�d��Yd}~yd}~wwxYw)Nz/similarz	/pairwisez/searchr�r�r�r�r�{}rvr7�,r��k��zimage requiredr-r.rUT)r��resultsr0r�scorer?r0�r�r0r�r�Fr�)rr��_similar�	_pairwiser�r^�headers�getr�r��rfile�read�splitr�r�r�r]r~�argpartitionr`�argsort�round�floatr�r�)
r�r0�pr�r��qr-r.�sims�idxr��resr�s
             r*�do_POSTz	H.do_POST�s���9�9���
�+�D�M�M�O�-C��9�9����,�T�^�^�5E�.E��y�y�#�#�I�.�t�z�z�#��{�G[�7\�0\�	:��D�L�L�$�$�%5�q�9�:�A��
�
�4�:�:�?�?�[\�K]�Kf�af�@g�A��5�5��>�'�R�.�.�s�3�B�7�C��A�E�E�#�q�M�"�A��t�z�z�#��7G�/H�I�I��C� �A���s��U�6�]�$�q���y��A��t�z�z�#�d�WY�`a�?b�/c�(c��q�5�D��/�/�4�%��Q��D�	�!��)<�=�b�q�A�C��b�j�j�$�s�)��,�-�C�KN�O�3�a�A�d�1�g�A�w��e�D��G�n�a�(@�A�3�C�O��J�J�s�4�e�C�j�S�I�J�
���
P���	:��J�J�s�5��Q��8�9�9��	:�sJ�B.H3�6H3�H"�*H3�AH3�(H.�H3�"H+�'H3�3	I$�<I�I$c
���	t|jjdd��}tj|j
j
|�xsd�}|jd�xsdj�}|jd�xsg}|rt|t�s|jddd	d
��S|ddD�cgc]}|s�t|�j��� }}t5tdtd
}}ddd��t|�s|jddid��Sj|�}|�|jddd|��d
��S||}	gg}}
|D]>}|j|�}|��||k7s�|
j|�|j|��@|
s|jddid��S|t!j"|
�|	z}
t%||
�D��cic]\}}|t't)|�d���}}}|jddt|�|d��ycc}w#1swY��,xYwcc}}w#t*$r(}|jddt|�d
��Yd}~yd}~wwxYw)Nr�rr�rrr7�
candidatesr�Fzdw_sku + candidates[] requiredr�i�r-r1rUT)r��cosinesr��no stored embedding for dw_sku r?)r�r0r�r�)r^r�r�r�r�r�r�r[r�r�r�r�r�r�r]r}r~�array�zipr�r�r�)r�r0r�rr�candsr;r-r1�qir��ixs�skus�cir�rkr��outr�s                  r*r�zH._pairwise�s%��	:��D�L�L�$�$�%5�q�9�:�A��
�
�4�:�:�?�?�[\�K]�Kf�af�@g�A��e�e�H�o�+��2�2�4�F��E�E�,�'�-�2�E���E�4�!8��z�z�#�e�<\�']�^�^�-2�5�D�\�?�\��Q�S��V�\�\�^�\�E�?��!�#�J��h��6����y��A���z�z�#�d�r�'B�C�C����F�#�B��z��z�z�#�e�>]�^d�]e�<f�'g�h�h��"��A��B��C����Z�Z��]���>�b�B�h��J�J�r�N�D�K�K��N����z�z�#�d�r�'B�C�C��R�X�X�c�]�#�a�'�D�58��t�_�E�_�T�Q��1�e�E�!�H�a�(�(�_�C�E��J�J�s�4�c�#�h�3�G�H��%@���� F���	:��J�J�s�5��Q��8�9�9��	:�sx�B5H:�8H:�?H"�H"�"H:�*H'�=)H:�'*H:�!H:�4H:�::H:�5*H:� H4�?"H:�"H:�'H1�,H:�:	I+�I&�&I+c���	t|jjdd��}tj|j
j
|�xsd�}|jd�xsdj�}|jd�xsdj�}|jd�xsd}tdtt|jd	d
��d��}|s|jdd
dd��St5tdtd}}tdtdtd}}
}	ddd��t|�s|jdddgd��S	j|�}|�|jdd
d|��d��S||}
||
z}t|dzd�}tj|t|t|�dz
��d|}|rt!|�n|t
�kr|
|nd}t#�}t%|t&�r8|D�chc],}|s�t)|�j�j+���.}}nzt%|t(�rj|j�rZ|j-dd�j/�D�chc]1}|j�s�|j�j+���3}}|s|t�kr||}g}|D]�}||k(r�	t1||�}d}|t
�kr|
|nd}|r0|r.||k(r|dz
}n#|t2j|d�vr|d z
}n|d z}|r |t�kr||r
|||zr|d!z
}|j5||z||f���|j7d"�d�#�g}|D]x\}}}t|�|k\rnd|}|jd$�}|jd%�xsd}|s�Ed&|vrd'|vr�N|j5|d||d(|d)|t9|d*�d+���z|jddtd,||t;|�d-�|d.��y#1swY��xYwcc}wcc}w#t<$r(}|jd/d
t)|�d��Yd}~yd}~wwxYw)0Nr�rr�rrr7�hex�stylerr�r�rOr�Fzdw_sku requiredr�r-r.r1r2r3rUTr�r�r�rHr�� r@g���Q��?r9g���Q��?g{�G�z�?c��|dS)Nrr9)�ts r*�<lambda>zH._similar.<locals>.<lambda>s��a��dr,)�key�reverserwrvzcdn.shopify.comzdesignerwallcoverings.comrurtr?)rrrvrurtrwr�r0)rr�familyr3)r�r0�queryr�r�)r^r�r�r�r�r�r�r[r&r`r�r�r�r]r~r�rmr�r�r�r�r��replacer�r��_FAM_ADJr}�sortr��sortedr�) r�r0r�rr�hexq�style_qr�r-r.r1r2r3r�r�r��pool�cand�qfam�qstylesr�rk�scoredr��base�boost�cfamr��_rank�mrcr�r�s                                 r*r�z
H._similar�s7��@	:��D�L�L�$�$�%5�q�9�:�A��
�
�4�:�:�?�?�[\�K]�Kf�af�@g�A��e�e�H�o�+��2�2�4�F��E�E�%�L�&�B�-�-�/�D��e�e�G�n�*��G��A�s�3�q�u�u�S�!�}�-�r�2�3�A���z�z�#�e�<M�'N�O�O����*�e�F�m�4��&+�H�o�u�U�|�U�8�_�V�����y��A���z�z�#�d��r�'J�K�K����F�#�B��z��z�z�#�e�>]�^d�]e�<f�'g�h�h��"��A��q�5�D��q�2�v�s�#�D��?�?�D�5�#�d�C��I�a�K�*@�A�%�4�H�D�.2�#�D�)�2��C��=��B��VZ�D��e�G��'�4�(�;B�H�7�a�a�3�q�6�<�<�>�/�/�1�7��H��G�S�)�g�m�m�o�6=�o�o�c�3�6O�6U�6U�6W�e�6W��[\�[b�[b�[d�1�7�7�9�?�?�,�6W��e��r�C��K�/� ��*���F�����7�H��T�!�W�~����!"�S��X��s�1�v�4���D��t�|�5�D�=�5�����d�B�!7�7��$���38�D�=�5��q�3�v�;��6�!�9�����*�5�D�=�5��
�
�t�e�|�T�1�5�6��
�K�K�N�D�K�9��C�"(���t�Q��s�8�q�=�%���G���E�E�(�O��1�5�5��>�+?�R�S�
�(�$�C�/�4O�WZ�4Z�\d��
�
�a��k�C�A�i�L�&'��k�Q��t�UV��Y�Z�#)�
�J�J�s�4�e�C�j� �D�F�7�O�DM�Y\�^�
_�k���(I��e��B�	:��J�J�s�5��Q��8�9�9��	:�si�C7Q�:Q�.P.�.*Q�*Q�B	Q�
P;�)P;�>AQ�Q� Q�9E4Q�.P8�3Q�	Q6�Q1�1Q6N)	�__name__�
__module__�__qualname__r�r�r�r�r�r�r9r,r*r�r��s ��#�0�.�:�( :�DG:r,r��__main__zvisual-search on :u · r0z embeddingsTr
)!rr�r�r��	threadingr��http.serverrrr�r~rx�PILr�environrzr^r��PORT�HOSTrr+�Lockr�r�rmrr#r�r�rr�
serve_foreverr9r,r*�<module>rsM��-�,�,�C���
�Z�Z�� ��
�2�:�:�>�>�)�V�,�-��
�z�z�~�~�i��-���t�	,��
1��y�~�~����B�Q�Q�"�R�[]�^��
"�L0�:U�2�v�x�>P�&��&�/A�
�H��&�&�)9�H�f�CU�
�W����:U��v�
�&��
��%V�N
�I:��I:�V�z���F�	��t�f�D��s���K�
@��M���t��a�(�6�6�8�r,