Ë
    Ü÷Åj`  ã                   ó0  — d Z ddlZddlZddlZddlZddlZddlZddlmZ  ee	«      j                  «       j                  j                  Zedz  dz  dz  Zedz  dz  dz  Zdd	d
dddddœZdZdZdZd„ Zdd„Zdd„Zd„ Zdd„Zdd„Zd„ Zedk(  r e«        yy)aG  
WD14 tagger: imagenes -> prompts Danbooru, en lote y por consola.

Descarga el modelo de HuggingFace la primera vez (unos 250 MB, cacheado despues).

    python Engine/wd14_tagger.py
    python Engine/wd14_tagger.py --threshold 0.45 --limit 20
    python Engine/wd14_tagger.py --model eva02 --batch 16
    python Engine/wd14_tagger.py --rethreshold 0.3 --from-json

Escribe un .txt por imagen en Archivos/wd14/tags/ y, con --json, un .json con
la confianza de cada tag para poder reprocesar sin volver a correr la inferencia.

Los defaults usan SmilingWolf/wd-swinv2-tagger-v3, el unico de la gama que
identifica personajes (67% de acierto medido). Usa --model vittagger para
reproducir el Space deepghs/wd14_tagging_online, que va mas enfocado pero no
sabe de personajes. --model eva02 da mas tags (43/img) a cambio del doble de tiempo.
é    N)ÚPathÚArchivosÚwd14ÚinboxÚtagszSmilingWolf/wd-swinv2-tagger-v3z$SmilingWolf/wd-eva02-large-tagger-v3z!SmilingWolf/wd-convnext-tagger-v3z&SmilingWolf/wd-v1-4-convnext-tagger-v2z$SmilingWolf/wd-v1-4-swinv2-tagger-v2zSmilingWolf/wd-v1-4-vit-taggerz#SmilingWolf/wd-v1-4-convnext-tagger)Úswinv2v3Úeva02Ú
convnextv3Ú
convnextv2Úswinv2v2Ú	vittaggerÚconvnextv14)z.pngz.jpgz.jpegz.webpz.bmpiÀ  Ú9c                 óp  — dd l }ddlm} t        d| › �«        || d¬«      } || d¬«      }g g }}t	        |dd¬	«      5 }t        j                  |«      D ]1  }|j                  |d
   «       |j                  |d   t        k(  «       Œ3 	 d d d «       t        dt        |«      › d�«       |j                  «       }	d|	v rddgndg}
t        d|
d   › �«       |j                  ||
¬«      }|j                  «       d   j                  }t        |d   t        «      }|rt        d«       ||||fS # 1 sw Y   Œ£xY w)Nr   )Úhf_hub_downloadz[-] Modelo: z
model.onnx)Úrepo_idÚfilenamezselected_tags.csvÚ úutf-8)ÚnewlineÚencodingÚnameÚcategoryú[-] z tags en el modeloÚCUDAExecutionProviderÚCPUExecutionProviderz[-] Ejecucion: )Ú	providersz;[-] El modelo fija el batch a 1: se procesa imagen a imagen)ÚonnxruntimeÚhuggingface_hubr   ÚprintÚopenÚcsvÚ
DictReaderÚappendÚRATING_CATEGORYÚlenÚget_available_providersÚInferenceSessionÚ
get_inputsÚshapeÚ
isinstanceÚint)ÚrepoÚortr   Ú
model_pathÚcsv_pathÚnamesÚratingsÚfÚrowr   ÚuseÚsessionr*   Úfixed_batchs                 ú4C:\Users\Usuario\Downloads\NEW\Engine\wd14_tagger.pyÚ
load_modelr9   .   s=  € ÛÝ/ä	ˆL˜˜Ð
Ô Ù ¨¸ÔE€JÙ tÐ6IÔJ€Hà˜ˆ7€EÜ	ˆh ¨WÕ	5¸Ü—>‘> !Ö$ˆCØ�L‰L˜˜V™Ô%Ø�N‰N˜3˜z™?¬oÑ=Õ>ñ %÷ 
6ô 
ˆD”�U“�Ð.Ð
/Ô0à×+Ñ+Ó-€Ià" iÑ/ð #Ð$:Ñ
;Ø6LÐ5Mð ä	ˆO˜C ™F˜8Ð
$Ô%Ø×"Ñ" :¸Ð"Ó=€GØ×ÑÓ  Ñ#×)Ñ)€EÜ˜U 1™X¤sÓ+€KÙÜÐKÔLØ�E˜7 KÐ/Ð/÷ 
6Ð	5ús   ¿A
D,Ä,D5c                 ó&  — ddl m} ddl}|j                  | «      j	                  d«      }|rnt        t        |j                  «      t        «      }|j                  d||fd«      }|j                  |||j                  z
  dz  ||j                  z
  dz  f«       |}|j                  t        t        f|j                  j                  «      }|j                  |«      dd…dd…ddd…f   j!                  |j"                  «      }||j$                  df   S )	a$  Cuadra con fondo blanco y luego escala. Mantiene la proporcion, cosa que
    el resize directo NO hace: aplasta una vertical 832x1216 a 448x448 y el
    modelo deja de entender el cuerpo (inventa 'pauldrons', 'headphones'...).
    Con pad=False se comporta como el preprocesado de referencia.r   )ÚImageNÚRGB)éÿ   r=   r=   é   éÿÿÿÿ.)ÚPILr;   Únumpyr!   ÚconvertÚmaxÚsizeÚSIZEÚnewÚpasteÚwidthÚheightÚresizeÚ
ResamplingÚLANCZOSÚasarrayÚastypeÚfloat32Únewaxis)ÚpathÚpadr;   ÚnpÚimgÚsideÚcanvasÚarrs           r8   Ú
preprocessrX   I   sâ   € õ
 Ûà
�*‰*�TÓ
×
"Ñ
" 5Ó
)€CÙ
Ü”3�s—x‘x“=¤$Ó'ˆØ—‘˜5 4¨ ,°Ó@ˆØ�‰�S˜D 3§9¡9Ñ,°Ñ2°T¸C¿J¹JÑ5FÈ1Ñ4LÐMÔNØˆØ
�*‰*”dœD�\ 5×#3Ñ#3×#;Ñ#;Ó
<€Cà
�*‰*�S‹/š!šQ¡ " ˜*Ñ
%×
,Ñ
,¨R¯Z©ZÓ
8€CØˆr�z‰z˜3ˆÑÐó    c           	      óÒ   — dd l }|j                  |D �cg c]  }t        ||«      ‘Œ c}d¬«      }| j                  «       d   j                  }| j                  d ||i«      d   S c c}w )Nr   )Úaxis)rA   ÚconcatenaterX   r)   r   Úrun)r6   ÚpathsrR   rS   ÚpÚbatchr   s          r8   Ú	tag_batchra   ]   se   € Ûà�N‰N¹Ó>¹°1œJ q¨#Õ.¸Ñ>ÀQˆNÓG€EØ×ÑÓ Ñ"×'Ñ'€DØ�;‰;�t˜d E˜]Ó+¨AÑ.Ð.ùò ?s   ”A$c                 óF   — d„ t        || |«      D «       }t        |d„ ¬«      S )Nc              3   ó2   K  — | ]  \  }}}|rŒ
||f–— Œ y ­w©N© )Ú.0ÚnÚsÚrs       r8   Ú	<genexpr>zrank.<locals>.<genexpr>f   s   è ø€ ÐGÑ#=™˜˜1˜aÂQˆa�ŒVÑ#=ùs   ‚Ž	c                 ó    — t        | d   «       S )Né   )Úfloat)Úts    r8   Ú<lambda>zrank.<locals>.<lambda>g   s   € ¬¨a°©d«¡|rY   )Úkey)ÚzipÚsorted)Úprobsr1   r2   Úpairss       r8   Úrankru   e   s#   € ÙG¤3 u¨e°WÔ#=ÓG€EÜ�%Ñ3Ô4Ð4rY   c                 ó’   — g }| D ]0  \  }}||k  rŒ|j                  |r|j                  dd«      n|«       Œ2 dj                  |«      S )NÚ_Ú ú, )r$   ÚreplaceÚjoin)ÚrankedÚ	thresholdÚspacesÚoutÚtagÚscores         r8   Úrenderr‚   j   sK   € Ø
€CÛ‰
ˆˆUØ�9ÒØØ�
‰
©F�3—;‘;˜s CÔ(¸Õ<ð ð �9‰9�S‹>ÐrY   c                 óF  — t        | «      } | j                  «       st        j                  d| › �«       |r| j	                  d«      n| j                  «       }t        d„ |D «       «      }|r|d | }|s/t        j                  d| › ddj                  t        «      › d�«       |S )Nz[!] No existe la carpeta: Ú*c              3   ó€   K  — | ]6  }|j                  «       r$|j                  j                  «       t        v r|–— Œ8 y ­wrd   )Úis_fileÚsuffixÚlowerÚ
IMAGE_EXTS)rf   r_   s     r8   rj   zcollect.<locals>.<genexpr>x   s2   è ø€ ð F™b˜Ø—i‘i”k a§h¡h§n¡nÓ&6¼*Ñ&Dô ™bùs   ‚<>z[!] No hay imagenes en z (ry   Ú))	r   ÚexistsÚsysÚexitÚrglobÚiterdirrr   r{   r‰   )ÚfolderÚlimitÚ	recursiveÚitÚfiless        r8   Úcollectr•   s   s–   € Ü�&‹\€FØ�=‰=Œ?Ü�‰Ð-¨f¨XÐ6Ô7Ù'ˆ�‰�cÔ	¨V¯^©^Ó-=€BÜñ F™bó Fó F€EáØ�f�u�ˆÙÜ�‰Ð*¨6¨(°"°T·Y±Y¼zÓ5JÐ4KÈ1ÐMÔNØ€LrY   c                  óª	  ‡— t        j                  d¬«      } | j                  dt        t        «      d¬«       | j                  dt        t
        «      d¬«       | j                  dd	t        t        «      d
¬«       | j                  dt        dd¬«       | j                  dt        dd¬«       | j                  dt        d¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  d dd!¬«       | j                  «       }t        |j                  |j                  |j                   «      }t        |j                  «      Šˆfd"„}|D �cg c]K  }|j                   s;t        |j"                  «       ||«      j%                  d#«      z  j'                  «       s|‘ŒM }}t)        |«      t)        |«      z
  }|rt+        d$|› d%�«       t        |j"                  «      }|j-                  d&d&¬'«       t/        t        |j0                     «      \  }}	}
}|rd(nt3        d(|j4                  «      }i }t7        j6                  «       }d)}t9        d)t)        |«      |«      D �]e  }||||z    }	 t;        |||j<                   «      }tC        ||«      D ]Î  \  }}tE        ||	|
«      }|D ��cg c]  \  }}|tG        t        |«      d.«      g‘Œ c}}|t         ||«      «      jI                  d/d0«      <   tK        ||jL                  |jN                  «      }| ||«      j%                  d#«      z  }|jP                  j-                  d&d&¬'«       |jS                  |d1¬2«       |d(z  }ŒÐ tU        |t)        |«      z   t)        |«      «      }|t3        t7        j6                  «       |z
  d3«      z  }t+        d$|› d0t)        |«      › d4|d5›d6�«       �Œh |jV                  r?|r=|d7z  jS                  tW        jX                  |d8d(¬9«      d1¬2«       t+        d:|d7z  › �«       t7        j6                  «       |z
  }t+        d;|› d<|d5›d=|› �«       y c c}w # t>        $ rN}t)        |«      d(k(  r$t+        d*|d)   j@                  › d+|› �«       Y d }~�Œ!d(}t+        d,|› d-�«       Y d }~ ŒÏd }~ww xY wc c}}w )>Nz"WD14: imagenes -> prompts Danbooru)Údescriptionz--folderzcarpeta de imagenes)ÚdefaultÚhelpz--outzcarpeta de salida .txtz--modelr   zBmodelo WD14 (default swinv2v3; el unico que identifica personajes))r˜   Úchoicesr™   z--thresholdg      à?z7confianza minima (default 0.50; 0.35 recupera mas tags))Útyper˜   r™   z--batché   zimagenes por inferenciaz--limitzprocesa solo las N primeras)r›   r™   z--spacesÚ
store_truez;convierte guiones bajos en espacios (default: los conserva))Úactionr™   z	--stretchz3resize directo sin cuadrar (degrada las verticales)z--jsonz)guarda tambien las confianzas en un .jsonz--forcezreescribe .txt existentesz--no-recursivez&no baja a subcarpetas (SFW/, NSFW/...)c                 óD   •— | j                  ‰«      j                  d«      S )Nr   )Úrelative_toÚwith_suffix)r_   Úsrc_roots    €r8   Úrelzmain.<locals>.rel™   s   ø€ Ø�}‰}˜XÓ&×2Ñ2°2Ó6Ð6rY   z.txtr   z- ya etiquetadas (usa --force para rehacerlas)T)ÚparentsÚexist_okrl   r   z[!] z fallo: z[-] Batch no soportado (z); bajo a imagen a imagené   Ú\Ú/r   )r   g�íµ ÷Æ°>z  (z.1fz img/s)zscores.jsonF)Úensure_asciiÚindentz[-] confianzas -> z[OK] z etiquetadas en zs -> )-ÚargparseÚArgumentParserÚadd_argumentÚstrÚDEFAULT_INBOXÚDEFAULT_TAGSrr   ÚMODELSrm   r,   Ú
parse_argsr•   r�   r‘   Úno_recursiver   Úforcer   r¡   r‹   r&   r    Úmkdirr9   ÚmodelrC   r`   ÚtimeÚrangera   ÚstretchÚ	Exceptionr   rq   ru   Úroundrz   r‚   r}   r~   ÚparentÚ
write_textÚminÚjsonÚdumps)r_   Úargsr”   r£   r3   ÚtodoÚskippedÚout_dirr6   r1   r2   r7   Ú
batch_sizeÚscores_dumpÚt0Ún_okÚiÚchunkrs   ÚerQ   r4   r|   rn   rh   ÚtextÚdestÚdoneÚrateÚdtr¢   s                                 @r8   ÚmainrÑ   �   sq  ø€ Ü×ÑÐ,PÔQ€AØ‡N�N�:¤s¬=Ó'9Ð@U€NÔVØ‡N�N�7¤C¬Ó$5Ð<T€NÔUØ‡N�N�9 j¼&Ä».Ø\ð ô ^à‡N�N�=¤u°dØQð ô Sà‡N�N�9¤3°Ð8Q€NÔRØ‡N�N�9¤3Ð-J€NÔKØ‡N�N�: lØUð ô Wà‡N�N�; |ØMð ô Oà‡N�N�8 LØCð ô Eà‡N�N�9 \Ð8S€NÔTØ‡N�NÐ#¨LØ@ð ô Bà�<‰<‹>€Dä�D—K‘K §¡°×1BÑ1BÐ-BÓC€EÜ�D—K‘KÓ €Hô7ñ ó Y‘u�!Ø�zŠz¤$ t§x¡x£.±3°q³6×3EÑ3EÀfÓ3MÑ"M×!UÑ!UÔ!Wò �u€Dð Yä�%‹jœ3˜t›9Ñ$€GÙÜ��W�IÐJÐKÔLä�4—8‘8‹n€GØ‡M�M˜$¨€MÔ.ä+5´f¸T¿Z¹ZÑ6HÓ+IÑ(€GˆU�G˜[Ù!‘¤s¨1¨d¯j©jÓ'9€Jà€KÜ	�‰‹€BØ€DÜ�1”c˜$“i ×,ˆØ�Q�q˜:‘~Ð&ˆð	Ü˜g u°$·,±,Ð.>Ó?ˆEô ˜U EÖ*‰IˆD�#Ü˜#˜u gÓ.ˆFá5;Ô<±V©T¨Q°�!”Uœ5 ›8 QÓ'Ò(°VÒ<ð œ™C ›I›×.Ñ.¨t°SÓ9Ñ:ä˜& $§.¡.°$·+±+Ó>ˆDØ™S ›Y×2Ñ2°6Ó:Ñ:ˆDØ�K‰K×Ñ d°TÐÔ:Ø�O‰O˜D¨7ˆOÔ3Ø�A‰I‰Dð +ô �1”s˜5“z‘>¤3 t£9Ó-ˆØ”cœ$Ÿ)™)›+¨Ñ*¨DÓ1Ñ1ˆÜ��T�F˜!œC ›I˜; c¨$¨s¨°7Ð;Ö<ð1 -ð4 ‡y‚y‘[Ø	�=Ñ	 ×,Ñ,Ü�J‰J�{°¸qÔAÈGð 	-ô 	UäÐ" 7¨]Ñ#:Ð";Ð<Ô=ä	�‰‹�rÑ	€BÜ	ˆE�$�Ð'¨¨3 x¨u°W°IÐ
>Õ?ùò_Yøô& ò 	Ü�5‹z˜QŠÜ˜˜U 1™XŸ]™]˜O¨8°A°3Ð7Ô8ÝØˆJÜÐ,¨Q¨CÐ/HÐIÔJÝûð	üó =s+   ÆAQ0ÊQ5Ë!S
Ñ5	SÑ>,SÒ0SÓSÚ__main__)T)F)NT)Ú__doc__r«   r"   r¿   ÚosrŒ   r·   Úpathlibr   Ú__file__Úresolver¼   ÚBASE_DIRr¯   r°   r±   r‰   rE   r%   r9   rX   ra   ru   r‚   r•   rÑ   Ú__name__re   rY   r8   Ú<module>rÚ      sÐ   ðñó$ Û 
Û Û 	Û 
Û Ý á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø˜:Ñ%¨Ñ.°Ñ8€Ø˜*Ñ$ vÑ-°Ñ6€ð 2Ø3Ø5Ø:Ø6Ø1Ø8ñ
€ð 8€
Ø
€Ø€ò0ó6 ó(/ò5ó
óòJ@ðZ ˆzÒÙ…Fð rY   