Untitled

 avatar
unknown
plain_text
5 months ago
2.6 kB
4
Indexable
class TrashClassifier:
    _instance = None
    _camera = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(TrashClassifier, cls).__new__(cls)
            cls._instance._initialized = False
        return cls._instance
    
    def __init__(self):
        if self._initialized:
            return
            
        self.client = OpenAI()
        if not TrashClassifier._camera:
            try:
                TrashClassifier._camera = Picamera2()
                TrashClassifier._camera.start()
                time.sleep(2)  # Give camera time to warm up
            except Exception as e:
                print(f"Error initializing camera: {e}")
                TrashClassifier._camera = None
        
        if not os.path.exists('img'):
            os.makedirs('img')
            
        self._initialized = True
    
    def take_picture(self):
        if not TrashClassifier._camera:
            raise Exception("Camera not initialized")
            
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        image_path = f"img/capture_{timestamp}.jpg"
        TrashClassifier._camera.capture_file(image_path)
        return image_path
    
    def encode_image(self, image_path):
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    
    def classify_image(self, image_path):
        base64_image = self.encode_image(image_path)
        
        response = self.client.chat.completions.create(
            model="gpt-4-vision-preview",
            messages=[
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "In which german recycling bin does the object in the image belong: Gelber Sack, Biomüll, Papier, Restmüll. output just the bin without . or anything else"
                        },
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{base64_image}"
                            }
                        }
                    ]
                }
            ]
        )
        
        return response.choices[0].message.content.strip()
    
    @classmethod
    def cleanup(cls):
        if cls._camera:
            cls._camera.stop()
            cls._camera = None
Editor is loading...
Leave a Comment