← back to Dw Photo Capture

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

151 lines

�

~J�j�M����ddlZddlZddlZddlZddlZddlZddlmZmZddl	Z
ddlZddlm
Z
ejdZeejj#dd��Zejj#dd�Zejj#d	�d
k(Zejj#d�d
k(Zddd�Zej.�Zd
�Zej.�Zdgddiggd�Zd�Zhd�hd�hd�ddhhd�ddhddhddhddhddhdhhd�ddhdhd�Zd �Zd,d!�Zd"�Z Gd#�d$e�Z!e"d%k(r5e�e#d&e�d'ed(�d)�d*�+�eeefe!�jI�yy)-�N)�BaseHTTPRequestHandler�ThreadingHTTPServer)�Image�
DW_UNIFIED_DB�VS_PORT�9914�VS_HOSTz	127.0.0.1�PG_FINGERPRINTS�1�PATTERN_SIBLINGS)�model�
preprocessc���td��Gt5td��.ddl}ddl}t	dd��|jdd�	�\}}}tjjtjjtjjt��d
�}tjj|�r2|j|j|d��d
��t	d|d��|j�|j!t#dt
j$�dz
��||ctd<td<ddd�tdtdfS#1swY�xYw)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�_MODEL_LOCK�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���
��g��&�'��'�t�4�'0�'L�'L�Z�dw�'L�'x�$��q�*��g�g�l�l�2�7�7�?�?�2�7�7�?�?�8�3L�#M��_���7�7�>�>�#�&��)�)�%�*�*�S�u�*�*M�V[�)�\��>��4�P��
�
��e�3�3�C��2�<�<�>�A�;M�4N�O�8=�z�5��w����!5���'�?�F�<�0�0�0��[�s�D9E$�$E-)�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>?s����/�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_hexrp<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>rSrJrLrE>rSrIrP>rIrLrPrTrSrP>rNrSrLr]rNr\r[rYrW>rIrFrErIrJ)rIrLrSrTrPrNr]r\r[rYrWrJrErFc���tjt�}|j�}trdnd}|jd|�d��ggggif\}}}}}|D�]\
}}	}
}}}
}}}}t
|�}|jtjt|�d���|j||	|
|||
|d��|jt|��t�}|r_	t|t�r|ntj |�}|D�chc],}|s�t#|�j%�j'���.}}|j|�|	s��|	|vs��|||	<��|j+�|j+�|r$tj,|�j/d�ntj0dd�}t25|t4d	<|t4d
<t7j6�t4d<t
|�t4d<|t4d
<|t4d<|t4d<ddd�t9dt
|��dt
|��d�d��ycc}w#t($rY��wxYw#1swY�ExYw)Nz�(select source_vc_id as vc_id, dw_sku, mfr_sku, vendor_code, pattern_name, image_url, embedding from product_image_fingerprints)�image_embeddingsz�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 a 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)rir0r1r2r3r4r5r6zloaded u embeddings · z
 skus indexedTr)�psycopg2�connect�DB�cursorr
�executer`�append�np�
frombuffer�bytesrp�set�
isinstance�list�json�loads�strr^�lower�	Exception�close�vstack�astype�zeros�LOCK�STATE�timer)�conn�cur�src�vecsr1r5r6r4rvrw�mfr�vc�pat�url�emb�hexc�	ai_stylesr|�i�sset�arr�xr0s                       r.r'r'js/�����B��D�t�{�{�}��3B�.�GY���K�K����1�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�I
�)I
�=I�AI"�
I�	I�I�"I+c�D�dgg}}|r"|jd�|j|�|r|jd�|r5|jd�|j|jdd�dz�tjt�}|j�}|j
ddj|�z|�|j�}	|j�|j�|	sgStj|	D�
cgc]%}
tjt|
d	�d
����'c}
�}||z}t|t|	��}|t|	�krtj ||dz
�d
|ntj"t|	��}
|
tj$||
�}
|
D�cgc]T}|	|d|	|d|	|d|	|d|	|d|	|d|	|d|	|dt't)||�d�d�	��Vc}Scc}
wcc}w)a#SQL-filtered match (PG_FINGERPRINTS path): pre-filter product_image_fingerprints in SQL on
    indexed columns, then brute-force cosine in-process over only the surviving rows. Returns the
    same result shape as /search. Vectors are the SAME bytes as image_embeddings (loader copies them).�truezvendor_code = %szproduct_status = 'ACTIVE'zdw_sku like %s�%r:z�select source_vc_id, dw_sku, mfr_sku, vendor_code, pattern_name, image_url, embedding, shopify_product_id, product_status from product_image_fingerprints where z and r@rsrtrNrrr9rB���)	rvrwrxryrzr{�shopify_product_id�status�score)r��replacer}r~rr�r�r!�fetchallr�r�r�r�r�rcr`�argpartition�arange�argsort�round�float)�q�kry�active_only�
dw_sku_prefix�where�argsr�r��rowsrgr0�sims�idxr�s               r.�	pg_searchr��s���(�B�4�E�
�u�|�|�.�/����V�1D��E�L�L�!<�=��e�l�l�#3�4�d�k�k�-�BW�BW�X[�]_�B`�cf�Bf�6g����B��D�t�{�{�}���K�K�\�^e�^j�^j�kp�^q�r�sw�y��<�<�>�D�3�9�9�;��
�
�����
�	�	��M��1�2�=�=��q��t��I�>��M�N�A��q�5�D��A�s�4�y��A�/0�3�t�9�}�"�/�/�4�%��Q��
'���
+�"�)�)�C�PT�I�BV�C�

�b�j�j�$�s�)��$�
%�C�PS�T�OR�!��1�g�a�j�D��G�A�J�4��7�1�:�Y]�^_�Y`�ab�Yc��Q���
�T�!�W�Q�Z�t�TU�w�WX�z��A�w�q�z�E�%��Q��.�!�,D�
F�OR�T�T��N��
Ts
�*H�<AHc���ddl}t�\}}tjt	j
t
j|���jd�}|j�5|j||�jd��}||jdd��zj�j�jd�d}ddd�|S#1swYSxYw)Nr�RGB�����T)�dim�keepdimrs)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)Nr<)�self�as  r.�log_messagez
H.log_message�s��t�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�objris    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�r3|jddtdtdtrdd��Sdd��S|jjd	�r&t�|jddtdd
��S|jdddi�y#t$r(}|jddt|�d
��cYd}~Sd}~wwxYw)Nz/healthrXTr3r2�product_image_fingerprintsrr)�okr3r2�sourcez/reload)r�r3��F�r��err�r��	not found)r �
startswithr�r�r
r'r�r�)r��es  r.�do_GETzH.do_GET�s����9�9���	�*�4�:�:�c�$�UZ�[^�U_�ns�t�oA�n}�Nj�DW�4X�-X�DV�DW�4X�-X��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|�}|jd�}tr�t|t �r�t#|||jd�t%|jd��|jd���}dd||d�}t&rG|jd�r6|r4ddl}	t*5t,d}
ddd�|	j/|d
�|d<|j	d|�St*5t,dt,d}}ddd��t1|�s|j	ddgdd��S||z}
t3j4|
t7|t1|
�d z
��d|}|t3j8|
|�}|D�cgc]#}i|�d!t;t=|
|�d"�i���%}}dt,d#|d$�}t&r/|jd�r|rddl}	|	j/|d�|d<|j	d|�y#1swY��LxYw#1swY��xYwcc}w#t>$r(}|j	d%d&tA|�d'��Yd}~yd}~wwxYw)(Nz/similarz	/pairwisez/searchr�r�r�r�r�{}r{r:�,r�r�r��zimage required�filterryr�r�)ryr�r�T�pg)r�r�r��results�siblingsr1�pattern_siblingsrXr0)r�r�r3rr�rBr3�r�r3r�r�Fr�)!r r��_similar�	_pairwiser�ra�headers�getr�r��rfile�read�splitr�r
r��dictr��boolrr�r�r�r�r`r�r�rcr�r�r�r�r�)r�r3�pr�r�r��flt�res�outr��meta_nowr0r1r�r�r�r�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��%�%��/�C��:�c�4�#8���1�S�W�W�X�->�D�QT�QX�QX�Yf�Qg�Lh�.1�g�g�o�.F�H��!�T�S�S�Q��#����j�(9�c�+��%��-�x��.>�.G�.G��A��PX�.Y�C�*�+��z�z�#�s�+�+���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��E�#�J�3�?�C��A�E�E�*�$5�#�'�*:�*C�*C�C��F�D�*Q��&�'��J�J�s�C� �������
P���	:��J�J�s�5��Q��8�9�9��	:�sj�B.M�6B"M�
L,�"1M�M�L9�-*M�AM�-(M�AM�,L6�1M�9M�>
M�	M<�M7�7M<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�rwr:�
candidatesr�Fzdw_sku + candidates[] requiredr�i�r0r4rXT)r��cosinesr��no stored embedding for dw_sku rB)r�r3rr�)rar�r�r�r�r�rr^r�r�r�r�r�r�r`r�r��array�zipr�r�r�)r�r3rrw�candsr>r0r4�qir��ixs�skus�cir�rnr�rr�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�rwr:�hex�stylerr�r�rRr�Fzdw_sku requiredr�r0r1r4r5r6rXTr�r�r
rKr�� rCg���Q��?r<g���Q��?g{�G�z�?c��|dS)Nrr<)�ts r.�<lambda>zH._similar.<locals>.<lambda>9s��a��dr�)�key�reverser|r{zcdn.shopify.comzdesignerwallcoverings.comrzryrB)rwr{rzryr|r�r3)rw�familyr6)r�r3�queryr�r�)rar�r�r�r�r�rr^r*rcr�r�r�r`r�r�rpr�r�r�r�r�r�rr��_FAM_ADJr��sortr��sortedr�) r�r3rrw�hexq�style_qr�r0r1r4r5r6rr�r��pool�cand�qfam�qstylesr�rn�scoredr��base�boost�cfamr�_rank�mrfr�r�s                                 r.r�z
H._similars7��@	:��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�r<r�r.r�r��s!��#�0�.� :�D :�DG:r�r��__main__zvisual-search on :u · r3z embeddingsTr)r�NFN)%rr�r�r��	threadingr��http.serverrrr�r�r}�PILr�environrrar��PORT�HOSTr
rr�Lockrr/r�r�rpr r'r�r�r�r/r�
serve_foreverr<r�r.�<module>r;s���-�,�,�C���
�Z�Z�� ��
�2�:�:�>�>�)�V�,�-��
�z�z�~�~�i��-���*�*�.�.�!2�3�s�:��
�:�:�>�>�"4�5��<���t�	,���i�n�n���1�"�y�~�~����B�Q�Q�"�R�[]�^��
"�L0�:U�2�v�x�>P�&��&�/A�
�H��&�&�)9�H�f�CU�
�W����:U��v�
�&��
��'V�RT�,
�X:��X:�t�z���F�	��t�f�D��s���K�
@��M���t��a�(�6�6�8�r�