Vai al contenuto

Progetto di sistema di allarme di sicurezza con l'utilizzo di Ultralytics YOLOv8

Sistema di allarme di sicurezza

Il progetto del sistema di allarme di sicurezza che utilizza Ultralytics YOLOv8 integra funzionalitĂ  avanzate di visione artificiale per migliorare le misure di sicurezza. YOLOv8 Il sistema di visione artificiale, sviluppato da Ultralytics, consente di rilevare gli oggetti in tempo reale, permettendo al sistema di identificare e rispondere tempestivamente alle potenziali minacce alla sicurezza. Questo progetto offre diversi vantaggi:

  • Rilevamento in tempo reale: l'efficienza di YOLOv8 permette al sistema di allarme di rilevare e rispondere agli incidenti di sicurezza in tempo reale, riducendo al minimo i tempi di risposta.
  • Precisione: YOLOv8 è noto per la sua precisione nel rilevamento degli oggetti, riducendo i falsi positivi e migliorando l'affidabilitĂ  del sistema di allarme di sicurezza.
  • CapacitĂ  di integrazione: Il progetto può essere perfettamente integrato con l'infrastruttura di sicurezza esistente, fornendo un livello superiore di sorveglianza intelligente.



Guarda: Progetto di sistema di allarme di sicurezza con Ultralytics YOLOv8 rilevamento di oggetti

Codice

Imposta i parametri del messaggio

Nota

La generazione di password per le app è necessaria

  • Vai su App Password Generator, indica il nome di un'applicazione, ad esempio "progetto di sicurezza", e ottieni una password di 16 cifre. Copia questa password e incollala nel campo della password designata come indicato.
password = ""
from_email = ""  # must match the email used to generate the password
to_email = ""  # receiver email

Creazione e autenticazione del server

import smtplib

server = smtplib.SMTP("smtp.gmail.com: 587")
server.starttls()
server.login(from_email, password)

Funzione di invio e-mail

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


def send_email(to_email, from_email, object_detected=1):
    """Sends an email notification indicating the number of objects detected; defaults to 1 object."""
    message = MIMEMultipart()
    message["From"] = from_email
    message["To"] = to_email
    message["Subject"] = "Security Alert"
    # Add in the message body
    message_body = f"ALERT - {object_detected} objects has been detected!!"

    message.attach(MIMEText(message_body, "plain"))
    server.sendmail(from_email, to_email, message.as_string())

Rilevamento degli oggetti e invio di avvisi

from time import time

import cv2
import torch

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors


class ObjectDetection:
    def __init__(self, capture_index):
        """Initializes an ObjectDetection instance with a given camera index."""
        self.capture_index = capture_index
        self.email_sent = False

        # model information
        self.model = YOLO("yolov8n.pt")

        # visual information
        self.annotator = None
        self.start_time = 0
        self.end_time = 0

        # device information
        self.device = "cuda" if torch.cuda.is_available() else "cpu"

    def predict(self, im0):
        """Run prediction using a YOLO model for the input image `im0`."""
        results = self.model(im0)
        return results

    def display_fps(self, im0):
        """Displays the FPS on an image `im0` by calculating and overlaying as white text on a black rectangle."""
        self.end_time = time()
        fps = 1 / round(self.end_time - self.start_time, 2)
        text = f"FPS: {int(fps)}"
        text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 1.0, 2)[0]
        gap = 10
        cv2.rectangle(
            im0,
            (20 - gap, 70 - text_size[1] - gap),
            (20 + text_size[0] + gap, 70 + gap),
            (255, 255, 255),
            -1,
        )
        cv2.putText(im0, text, (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2)

    def plot_bboxes(self, results, im0):
        """Plots bounding boxes on an image given detection results; returns annotated image and class IDs."""
        class_ids = []
        self.annotator = Annotator(im0, 3, results[0].names)
        boxes = results[0].boxes.xyxy.cpu()
        clss = results[0].boxes.cls.cpu().tolist()
        names = results[0].names
        for box, cls in zip(boxes, clss):
            class_ids.append(cls)
            self.annotator.box_label(box, label=names[int(cls)], color=colors(int(cls), True))
        return im0, class_ids

    def __call__(self):
        """Executes object detection on video frames from a specified camera index, plotting bounding boxes and returning modified frames."""
        cap = cv2.VideoCapture(self.capture_index)
        assert cap.isOpened()
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
        frame_count = 0
        while True:
            self.start_time = time()
            ret, im0 = cap.read()
            assert ret
            results = self.predict(im0)
            im0, class_ids = self.plot_bboxes(results, im0)

            if len(class_ids) > 0:  # Only send email If not sent before
                if not self.email_sent:
                    send_email(to_email, from_email, len(class_ids))
                    self.email_sent = True
            else:
                self.email_sent = False

            self.display_fps(im0)
            cv2.imshow("YOLOv8 Detection", im0)
            frame_count += 1
            if cv2.waitKey(5) & 0xFF == 27:
                break
        cap.release()
        cv2.destroyAllWindows()
        server.quit()

Richiamare la classe Object Detection ed eseguire l'inferenza

detector = ObjectDetection(capture_index=0)
detector()

Tutto qui! Quando eseguirai il codice, riceverai una singola notifica sulla tua email se viene rilevato un oggetto. La notifica viene inviata immediatamente, non ripetutamente. Tuttavia, sentiti libero di personalizzare il codice in base alle esigenze del tuo progetto.

Campione di e-mail ricevute

Campione di e-mail ricevute



Created 2023-12-02, Updated 2024-06-18
Authors: glenn-jocher (6), IvorZhu331 (1), RizwanMunawar (1)

Commenti