33from  appslab .core  import  load_module_compose_file , parse_docker_compose_variable 
44import  logging 
55import  io 
6+ from  PIL  import  Image 
7+ from  io  import  BytesIO 
68
79logger  =  logging .getLogger (__name__ )
810
@@ -28,6 +30,14 @@ def detect_from_file(self, image_path :str) -> dict:
2830                logger .error (f"Error: { e }  )
2931                return  None 
3032
33+     def  _get_image_type (self , image_bytes ):
34+         try :
35+             image  =  Image .open (BytesIO (image_bytes ))
36+             return  image .format .lower ()  # Returns 'jpeg', 'png', etc. 
37+         except  Exception  as  e :
38+             print (f"Error detecting image type: { e }  )
39+             return  None 
40+ 
3141    def  detect (self , image_bytes , image_type :str  =  "jpg" ) ->  dict :
3242        if  not  image_bytes  or  not  image_type :
3343            return  None 
@@ -55,12 +65,33 @@ def detect(self, image_bytes, image_type:str = "jpg") -> dict:
5565            return  None 
5666
5767    def  process (self , item ):
58-         if  isinstance (item , str ):
59-             return  self .parse (item )
60-         elif  isinstance (item , dict ) and  'image'  in  item  and  item ['image' ] !=  "" :
61-             image  =  item ['image' ]
62-             image_type  =  image .split ('.' )[- 1 ]
63-             return  self .detect (image , image_type .lower ())
68+         """Process an item to detect objects in an image. 
6469
65-         return  item  # No processing needed 
70+         Args: 
71+             item: A file path (str) or a dictionary with the 'image' and 'image_type' keys (dict). 'image_type' is optional while 'image' contains image as bytes. 
72+         """ 
73+         try :
74+             if  isinstance (item , str ):
75+                 # Use this like a file path 
76+                 with  open (item , 'rb' ) as  f :
77+                     return  self .detect (f .read (), item .split ('.' )[- 1 ])
78+             elif  isinstance (item , dict ) and  'image'  in  item  and  item ['image' ] !=  "" :
79+                 image  =  item ['image' ]
80+                 if  'image_type'  in  item  and  item ['image_type' ] !=  "" :
81+                     image_type  =  item ['image_type' ]
82+                 else :
83+                     image_type  =  self ._get_image_type (image )
84+                     
85+                 if  image_type  is  None :
86+                     logger .debug (f"[{ self .__class__ }  )
87+                     return  None 
88+                 
89+                 return  self .detect (image , image_type .lower ())
90+ 
91+             return  item  # No processing needed 
92+         except  FileNotFoundError :
93+             logger .error (f"[{ self .__class__ } { item }  )
94+         except  Exception  as  e :
95+             logger .error (f"[{ self .__class__ } { item } { e }  )
96+         return  None 
6697
0 commit comments