ó
    +bðiø+  ã                   óè  • S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJr  S SKJrJrJrJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJrJrJr  S S
K J!r!  \RD                  RG                  \RD                  RI                  \%5      5      r&\RD                  RO                  \&S5      r(Sr)Sr*Sr+Sr,Sr-\" \*S9r.Sq/Sq0S r1S r2S%S jr3\!S\4S j5       r4\" \4S9r5\5Rm                  \S/S/S/S9  \5Ro                  S5      \	" S5      4S\4S jj5       r8\5Rs                  S5      S 5       r:\5Ro                  S 5      \	" S5      4S\4S! jj5       r;\5Ry                  S"5      S#\=4S$ j5       r>g)&é    N)Úglob)ÚFastAPIÚ
UploadFileÚFileÚHTTPException)ÚCORSMiddleware)ÚImageÚ	ImageStatÚImageEnhanceÚImageOpsÚImageFilter)ÚSentenceTransformer)ÚYOLO)ÚQdrantClient)ÚDistanceÚVectorParamsÚPointStructÚFilterÚFieldConditionÚ
MatchValue)ÚasynccontextmanagerÚmodelsz../data/imagesz../vector_db_dataÚsticker_visual_searchzclip-ViT-B-32z
yolov8s.pt)Úpathc                  óÂ  • [         R                  " [        SS9  [         R                  " [        SS9  [        R                  [        5      (       d9  [        R                  [        [        S[        R                  S9S9  [        S5        [        [        5      q[         R                  R!                  [        ["        5      n [         R                  R%                  U 5      (       de  [        S["         S35        ['        ["        5        [         R                  R%                  ["        5      (       a  [(        R*                  " ["        U 5        ['        U 5      q[        S	5        g )
NT)Úexist_oki   )ÚsizeÚdistance)Úcollection_nameÚvectors_configu+   => Ä�Ã£ táº¡o Database Qdrant thÃ nh cÃ´ng.u   => Ä�ang tá»± Ä‘á»™ng táº£i z...u)   => ToÃ n bá»™ AI Models Ä‘Ã£ sáºµn sÃ ng!)ÚosÚmakedirsÚ
MODELS_DIRÚ	IMAGE_DIRÚclientÚcollection_existsÚCOLLECTION_NAMEÚcreate_collectionr   r   ÚCOSINEÚprintr   ÚCLIP_MODEL_NAMEÚmodelr   ÚjoinÚYOLO_MODEL_NAMEÚexistsr   ÚshutilÚmoveÚdetector)Ú	yolo_paths    ô   D:\Dá»± Ã¡n 1\backend\main.pyÚsetup_systemr5   +   sÝ   € ä‡K‚K”
 TÒ*Ü‡K‚K”	 DÒ)ä×#Ñ#¤O×4Ñ4Ü× Ñ Ü+Ü'¨S¼8¿?¹?ÑKð 	!ñ 	
ô 	Ð;Ô<ä¤Ó0€Eä—‘—‘œZ¬Ó9€IÜ�7‰7�>‰>˜)×$Ñ$ÜÐ,¬_Ð,=¸SÐAÔBÜŒ_ÔÜ�7‰7�>‰>œ/×*Ñ*Ü�KŠKœ¨Ô3Ü�I‹€HÜ	Ð
5Õ6ó    c                 ó  • [         R                  " U 5      nUR                  S;   d   UR                  S:X  aÇ  SUR                  ;   a·  UR	                  S5      nUR                  5       S   n[        R                  " UR	                  S5      US9nUR                  (       a  UR                  S   OS	nUS
:”  a  SnOSn[         R                  " SUR                  U5      nUR                  XS9  UR	                  S5      $ UR	                  S5      $ )uÞ   
Xá»­ lÃ½ áº£nh PNG thÃ´ng minh:
Tá»± Ä‘á»™ng lÃ³t ná»�n Ä�en Tuyá»‡t Ä�á»‘i cho chá»¯ Tráº¯ng, vÃ  Tráº¯ng Tuyá»‡t Ä�á»‘i cho chá»¯ Ä�en
nháº±m giá»¯ láº¡i tá»‘i Ä‘a Ä‘áº·c trÆ°ng hÃ¬nh há»�c (Geometry) cá»§a nÃ©t chá»¯.
)ÚRGBAÚLAÚPÚtransparencyr8   é   ÚL)Úmaskr   é€   é   )r   r   r   éÿ   )rA   rA   rA   rA   ÚRGB)r	   ÚopenÚmodeÚinfoÚconvertÚsplitr
   ÚStatÚmeanÚnewr   Úpaste)Úimage_sourceÚimgÚ
alpha_maskÚstatÚavg_brightnessÚbg_colorÚ
backgrounds          r4   Úload_and_preprocess_imagerS   C   sÙ   € ô �*Š*�\Ó
"€Cà
‡x�x�>Ó! c§h¡h°#£o¸.ÈCÏHÉHÓ:TØ�k‰k˜&Ó!ˆØ—Y‘Y“[ ‘^ˆ
ä�~Š~˜cŸk™k¨#Ó.°ZÑ@ˆØ)-¯¯˜Ÿ™ 1š¸ˆð ˜CÓØ%‰Hà+ˆHä—Y’Y˜v s§x¡x°Ó:ˆ
Ø×Ñ˜ÐÑ.Ø×!Ñ! %Ó(Ð(à�;‰;�uÓÐr6   c           	      ól  • / nU R                   u  pVU" XSS9nUS   R                  R                   H  n[        [        U5      u  pšp¼X¹:”  d  M  XÊ:”  d  M$  [        SX“-
  5      n[        SX£-
  5      n[        X[U-   5      n[        XlU-   5      nUR                  U R                  XÞUU45      5        M�     U$ )uc   Sá»­ dá»¥ng YOLO Ä‘á»ƒ gáº¯p váº­t thá»ƒ vÃ  ná»›i lá»�ng viá»�n (Padding) Ä‘á»ƒ khÃ´ng láº¹m chá»¯F)ÚconfÚverboser   )	r   ÚboxesÚxyxyÚmapÚintÚmaxÚminÚappendÚcrop)rM   r2   rU   ÚpaddingÚcropsÚwÚhÚresultsÚboxÚx1Úy1Úx2Úy2Úpx1Úpy1Úpx2Úpy2s                    r4   Ú	get_cropsrm   _   s«   € à€EØ�8‰8�D€AÙ�s¨uÑ5€GØ�q‰z×Ñ×$Ô$ˆÜœS #›‰ˆ�Ø�7�r•wä�a˜™Ó&ˆCÜ�a˜™Ó&ˆCÜ�a˜g™Ó&ˆCÜ�a˜g™Ó&ˆCØ�L‰L˜Ÿ™ 3¨S°#Ð"6Ó7Ö8ñ %ð €Lr6   Úappc                ó*   #   • [        5         S 7v •  g 7f)N)r5   )rn   s    r4   Úlifespanrp   p   s   é € ä„NÝ	ùs   ‚)rp   Ú*)Úallow_originsÚallow_methodsÚallow_headersz/search-image.Úfilec           
   ƒ   óÊ  #   • Sn U R                  5       I S h  v•N n[        [        R                  " U5      5      nUR                  u  pEXE-  n[        U[        SSS9n/ nU H?  n	U	R                  u  p«X«-  nSU-  Us=:  a  SU-  :  d  M*  O  M.  UR                  U	5        MA     / n[        U5      S:”  a  UnO»UR                  U5        [        US-  5      [        US-  5      pþXNS-  :”  a/  X_S-  :”  a'  UR                  UR                  XïXN-
  X_-
  45      5        [        US	-  5      [        US	-  5      nnUUS-  :”  a3  UUS-  :”  a*  UR                  UR                  UUUU-
  UU-
  45      5        / nU HÝ  n	[        R                  " U	5      nUR                  S
5      n[        R                  " U5      nUR                  S5      n[        R                   " U	SS9n/ SQnU Hm  nUS:X  a$  UR                  U5        UR                  U5        M-  UR                  UR#                  USSS95        UR                  UR#                  USSS95        Mo     Mß     0 nU H™  n	[$        R'                  U	SS9R)                  5       n[*        R-                  [.        USUS9nUR0                   HJ  nUR2                  R5                  S5      n[7        UR8                  S5      nUU;  d  UUU   :”  d  ME  UUU'   ML     M›     UR;                  5        V V!s/ sH  u  n n!U!U S.PM     n"n n![=        U"S SS9n#SU#S S 0$  GNs  sn!n f ! [>         a  n$[A        S[C        U$5      S9eS n$A$ff = f7f)Ng      à?ç333333Ã?é   )rU   r_   gš™™™™™©?g®Gáz®ï?r   é   g      Ð?g       @g333333ó?)Úcutoff)r   éZ   é´   i  rx   iñÿÿÿT)rA   rA   rA   )ÚexpandÚ	fillcolorF©Úshow_progress_baré2   )r   ÚqueryÚlimitÚscore_thresholdÚ	file_nameé   )Úscorer…   c                 ó   • U S   $ )Nr‡   © )Úxs    r4   Ú<lambda>Ú#search_by_sticker.<locals>.<lambda>å   s   € ¸!¸Gº*r6   )ÚkeyÚreverserc   é   éô  ©Ústatus_codeÚdetail)"ÚreadrS   ÚioÚBytesIOr   rm   r2   r]   ÚlenrZ   r^   r   Ú	SharpnessÚenhanceÚContrastr   ÚautocontrastÚrotater,   ÚencodeÚtolistr%   Úquery_pointsr'   ÚpointsÚpayloadÚgetÚroundr‡   ÚitemsÚsortedÚ	Exceptionr   Ústr)%ru   ÚFIXED_THRESHOLDÚcontentÚ	query_imgra   rb   Ú
total_areaÚ	raw_cropsÚvalid_cropsr^   ÚcwÚchÚ	crop_areaÚsearch_targetsÚpad_15xÚpad_15yÚpad_25xÚpad_25yÚaugmented_targetsÚsharp_enhancerÚ
crop_sharpÚcontrast_enhancerÚcrop_stdÚcrop_rescueÚanglesÚangleÚunique_resultsÚquery_vectorÚresponseÚpÚfnamer‡   ÚfÚsÚ
final_listÚsorted_resultsÚes%                                        r4   Úsearch_by_stickerrÈ      sq  é € à€Oðh<ØŸ	™	›×#ˆÜ-¬b¯jªj¸Ó.AÓBˆ	Ø�~‰~‰ˆØ‘Uˆ
ô ˜i¬¸ÀbÑIˆ	àˆÛˆDØ—Y‘Y‰FˆBØ™ˆIà�jÑ  9Õ@¨t°jÑ/@×@Ñ@Ø×"Ñ" 4Ö(ñ ð ˆÜˆ{Ó˜aÓà(‰Nð ×!Ñ! )Ô,ô  # 1 t¡8›}¬c°!°d±(«m�WØ˜Q‘;‹ 1°¡{£?Ø×%Ñ%Ø—N‘N G°a±kÀ1Á;Ð#OÓPôô
  # 1 t¡8›}¬c°!°d±(«m�WˆGØ�7˜Q‘;‹ 1 w°¡{£?Ø×%Ñ%Ø—N‘N G¨W°a¸'±kÀ1ÀwÁ;Ð#OÓPôð ÐÛ"ˆDä)×3Ò3°DÓ9ˆNØ'×/Ñ/°Ó4ˆJÜ ,× 5Ò 5°jÓ AÐØ(×0Ñ0°Ó5ˆHô #×/Ò/°¸QÑ?ˆKò 0ˆFÛ�Ø˜A“:Ø%×,Ñ,¨XÔ6Ø%×,Ñ,¨[Ö9ð &×,Ñ,Ø Ÿ™¨°dÀo˜ÐVôð &×,Ñ,Ø#×*Ñ*Ø!¨$¸/ð +ð öó  ñ #ð> ˆÛ%ˆDÜ Ÿ<™<¨À˜<ÐF×MÑMÓOˆLÜ×*Ñ*Ü /Ø"ØØ /ð	 +ð ˆHð —_”_�ØŸ	™	Ÿ™ kÓ2�Ü˜aŸg™g qÓ)�à Ó.°%¸.ÈÑ:OÕ2OØ,1�N 5Ó)ó %ñ &ð" @N×?SÑ?SÔ?UÔVÑ?U±t°q¸! °Ô2Ñ?Uˆ
ÑVÜ 
Ñ0DÈdÑSˆà˜>¨#¨2Ð.Ð/Ð/òI $ùóB Wøô
 ó <Ü¨´C¸³FÑ;Ð;ûð<üsX   ‚M#†L> ™L5šA/L> ÂIL> Ë. L> ÌL8ÌL> Ì4M#Ì5L> Ì8L> Ì>
M ÍMÍM Í M#z/list-productsc               ƒ   ó,  #   • [        [        R                  R                  [        S5      5      [        [        R                  R                  [        S5      5      -   n SU  Vs/ sH"  n[        R                  R                  U5      PM$     sn0$ s  snf 7f)Nz*.[jJ][pP][gG]z*.[pP][nN][gG]Úproducts)r   r!   r   r-   r$   Úbasename)Úimage_pathsrÁ   s     r4   Úlist_productsrÍ   í   sm   é € ä”r—w‘w—|‘|¤IÐ/?Ó@ÓAÄDÜ
�‰�‰”YÐ 0Ó1óEñ €Kð ±kÓB±k°œŸ™×)Ñ)¨!Ö,±kÑBÐCÐCùÒBùs   ‚A!BÁ#(BÂ	Bz/add-productc           	   ƒ   óØ  #   •  [         R                   " 5       nU R                  n[        R                  R	                  [
        U5      n[        US5       nUR                  U R                  5       I S h  v•N 5        S S S 5        [        U5      n[        [        [        R                  " [        R                  US-   5      5      [        R!                  USS9R#                  5       USS.S9/n[$        R'                  [(        US9  [         R                   " 5       n[+        Xq-
  S5      nS	U S
3US.$  N½! , (       d  f       N½= f! [,         a  n	[/        S[        U	5      S9eS n	A	ff = f7f)NÚwbÚ_fullFr   )r…   Úis_crop)ÚidÚvectorr¡   )r   r    ry   u$   Ä�Ã£ lÆ°u file thiáº¿t káº¿ Sticker u    thÃ nh cÃ´ng!)ÚmessageÚ
time_takenr�   r‘   )ÚtimeÚfilenamer!   r   r-   r$   rC   Úwriter”   rS   r   r§   ÚuuidÚuuid5ÚNAMESPACE_DNSr,   r�   rž   r%   Úupsertr'   r£   r¦   r   )
ru   Ú
start_timer…   Ú	file_pathÚbufferÚfull_imgr    Úend_timeÚprocess_timerÇ   s
             r4   Úadd_productrã   õ   s*  é € ð<Ü—Y’Y“[ˆ
à—M‘Mˆ	Ü—G‘G—L‘L¤¨IÓ6ˆ	Ü�)˜TÔ" fØ�L‰L˜tŸy™y›{×*Ô+÷ #ô -¨YÓ7ˆô Ü”t—z’z¤$×"4Ñ"4°iÀ'Ñ6IÓJÓKÜ—|‘| HÀ�|ÐF×MÑMÓOØ&/¸EÑBñð
ˆô 	�‰¤o¸fˆÑEä—9’9“;ˆÜ˜XÑ2°AÓ6ˆð >¸i¸[ÈÐWØ&ñ
ð 	
ñ% +÷ #Õ"ûô. ó <Ü¨´C¸³FÑ;Ð;ûð<üsT   ‚E*„AE ÁD4Á4D2
Á5D4Á=B4E Ä1E*Ä2D4Ä4
EÄ>E Å
E'ÅE"Å"E'Å'E*z/delete-product/{file_name}r…   c              ƒ   ó€  #   •  [         R                  R                  [        U 5      n[         R                  R	                  U5      (       a  [         R
                  " U5        [        R                  [        [        [        S[        U S9S9/S9S9  SSU  S30$ ! [         a  n[        S	[        U5      S
9eS nAff = f7f)Nr…   )Úvalue)r�   Úmatch)Úmust)r   Úpoints_selectorrÔ   u   Ä�Ã£ xÃ³a sticker u    khá»�i há»‡ thá»‘ng!r�   r‘   )r!   r   r-   r$   r/   Úremover%   Údeleter'   r   r   r   r¦   r   r§   )r…   rÞ   rÇ   s      r4   Údelete_productrë     s¥   é € ð<Ü—G‘G—L‘L¤¨IÓ6ˆ	Ü�7‰7�>‰>˜)×$Ñ$Ü�IŠI�iÔ ä�‰Ü+Ü"ä" {¼*È9Ñ:UÑVðñð 	ñ 	
ð Ð/°	¨{Ð:OÐPÐQÐQøÜó <Ü¨´C¸³FÑ;Ð;ûð<üs)   ‚B>„BB ÂB>Â
B;Â#B6Â6B;Â;B>)rw   rx   )?r•   r!   rÙ   r0   rÖ   r   Úfastapir   r   r   r   Úfastapi.middleware.corsr   ÚPILr	   r
   r   r   r   Úsentence_transformersr   Úultralyticsr   Úqdrant_clientr   Úqdrant_client.modelsr   r   r   r   r   r   Ú
contextlibr   r   ÚdirnameÚabspathÚ__file__ÚBASE_DIRr-   r#   r$   ÚDB_PATHr'   r+   r.   r%   r,   r2   r5   rS   rm   rp   rn   Úadd_middlewareÚpostrÈ   r¢   rÍ   rã   rê   r§   rë   r‰   r6   r4   Ú<module>rû      s˜  ðÛ 	Û 	Û Û Û Ý ß <Ó <Ý 2ß EÕ EÝ 5Ý Ý &÷÷ õ +ð
 �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜( HÓ-€
Ø€	Ø
€Ø)€à!€Ø€á	˜7Ñ	#€Ø€Ø€ò7ò0ô8ð" ð
˜ó 
ó ð
ñ
 �xÑ €Ø × Ñ Ø 3 %¸°uÈSÈEð ñ ð ‡�ˆ/ÓÙ/3°C«yñ j< *ô j<ó ðj<ðZ ‡�Ð	ÓñDó ðDð ‡�ˆ.ÓÙ)-¨c«ñ <˜Jô <ó ð<ðB ‡�Ð)Ó*ð< Có <ó +ñ<r6   