o
    {i                     @   sH  d dl Z d dlZd dlmZ d dlZd dlmZ d dlZd dlZd dl	m
Z
 d dlmZmZ dddd	d
Zd dlZd dl Z d dlmZ d dlZd dlZd dlmZ dd dd dd dd dZdd Zdd Zdd Zi Ze D ]\ZZzcejesede eevrede dee  ZeeZee\ZZedurej edd e!  eee< e"de  nedure#edeZ$e$!  e$ee< e"de  ne%d W qr e&y Z' ze"d!e d"e d#e'   dZ'['ww e
(e
)d$e
* e
+g d%g d&gZ,d'd( Z-d/d*d+Z.e/d,kr"d-Z0d.Z1e.e0e1Z2dS dS )0    N)OrderedDict)Image)
transforms)ThreadPoolExecutoras_completedz0/var/www/html/ai-image-ml/obstacle_classifier.ptz0/var/www/html/ai-image-ml/moisture_classifier.ptz//var/www/html/ai-image-ml/clarity_classifier.ptz,/var/www/html/ai-image-ml/pipe_classifier.pt)obstaclemoistureclaritypipe)resnetc                   C      t jddddS Nefficientnet_b0F   )
pretrainednum_classestimmcreate_model r   r   */var/www/html/ai-image-ml/filter_images.py<lambda>#       r   c                   C   r   r   r   r   r   r   r   r   $   r   c                   C   r   r   r   r   r   r   r   r   %   r   c                   C   r   r   r   r   r   r   r   r   &   r   )r   r	   r
   r   c                 C   sB   t  }|  D ]\}}|dr|tdd  n|}|||< q|S )Nzmodule.)r   items
startswithlen)
state_dict	new_statekvnew_keyr   r   r   strip_module_prefix)   s
   
r!   c                 C   s   t | ts
t | trtdd |  D rt| d fS t | trGdD ]$}|| v rF| | }t |ttfr;t|d f  S t|drFd |f  S q"t| drWt | jtj	rWd | fS dS )Nc                 s   s    | ]}t |tV  qd S )N)
isinstancestr).0r   r   r   r   	<genexpr>4   s    z)try_extract_state_dict.<locals>.<genexpr>)r   model_state_dictmodeleval)NN)
r"   r   dictallkeysr!   hasattrr(   types
MethodType)
checkpointkey	candidater   r   r   try_extract_state_dict0   s   

r2   c                 C   s   zt j| t dddW S  tyj } zRt|}d|v s$d|v s$d|v rez,t jtjg t j| t dddW  d   W W  Y d}~S 1 sJw   Y  W   tyd } zt	d	| |d}~ww  d}~ww )
z
    Attempt to load checkpoint safely:
      1) try weights_only=True (safe)
      2) on specific failure, retry inside safe_globals for known classes with weights_only=False
    Returns whatever torch.load returns (OrderedDict, dict, or nn.Module)
    cpuT)map_locationweights_onlyzWeights only load failedzUnsupported globalUnsupportedGlobalFNz4Failed loading checkpoint even inside safe_globals: )
torchloaddevice	Exceptionr#   serializationsafe_globalsr   ResNetRuntimeError)pathemsge2r   r   r   robust_torch_loadF   s"   0rC   zpath not found: z!No architecture defined for key ''F)strictu*   ✅ Loaded weights into architecture for: moduleu!   ✅ Loaded full saved model for: zEUnrecognized checkpoint format (neither state_dict nor model object).u   ❌ Failed to load model 'z' from : )   rH   )g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?c              
   C   s<  t d| z{t| d}|jd dk s|jd dk r#ddgdW S t|d}i }t " t	
 D ]\}}||}t| }|d	k||< q5W d    n1 sUw   Y  g }	|d
 re|	d |d sn|	d |d sw|	d t|	dk|	dW S  ty }
 zddt|
 gdW  Y d }
~
S d }
~
ww )Nz
activity ,RGBr   2   r   FzImage too small.)acceptedreasonsg      ?r   zPipe is obstructed.r	   zImage is unclear.r
   zNo pipe in the Image.Error: )printr   openconvertsize	transform	unsqueezer7   no_gradmodels_dictr   sigmoiditemappendr   r:   r#   )
image_pathactivityimageinput_tensorresultsr0   r'   outputprobfailedr@   r   r   r   predict_all   s8   





"ra      c                    sB  t j dd g } fdddd t D }t|dxfdd	|D }t|D ]_}z,| }|| |d
 r@dnd}t| d|d  d|d rVd|d nd  W q. t	y }	 z%|| }
td|
 dt
|	  ||
ddt
|	 gd W Y d }	~	q.d }	~	ww |W  d    S 1 sw   Y  d S )NT)exist_okc                    s@   t j| }t|}| |d< |d rt |t j |  |S )NfilenamerK   )osr?   joinra   rename)rd   r?   result)accepted_dir
source_dirr   r   process_image   s   z3batch_filter_images_parallel.<locals>.process_imagec                 S   s   g | ]}|  d r|qS ))z.jpgz.jpegz.png)lowerendswithr$   fr   r   r   
<listcomp>   s    z0batch_filter_images_parallel.<locals>.<listcomp>)max_workersc                    s   i | ]	}  ||qS r   )submitrn   )executorrk   r   r   
<dictcomp>   s    z0batch_filter_images_parallel.<locals>.<dictcomp>rK   u   ✅ Acceptedu   ❌ RejectedrG   rd   u    → rL   z, z	No issuesu   ❌ Error processing FrM   )rd   rK   rL   )re   makedirslistdirr   r   rh   rX   rN   rf   r:   r#   )rj   ri   rq   r]   image_filesfuture_to_filefuturerh   statusr@   rd   r   )ri   rs   rk   rj   r   batch_filter_images_parallel   s4   
6	$r{   __main__
raw_imagesaccepted_images)rb   )3r7   r   collectionsr   r-   PILr   re   retorchvisionr   concurrent.futuresr   r   MODEL_PATHStorchvision.modelsr   
MODEL_ARCHr!   r2   rC   rU   r   r0   r?   existsFileNotFoundErrorKeyError
arch_modelr/   r   loaded_modelload_state_dictr(   rN   getattr
real_modelr>   r:   r@   ComposeResizeToTensor	NormalizerR   ra   r{   __name__
SOURCE_DIRACCEPTED_DIRr]   r   r   r   r   <module>   s    
 
)
%