μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œ ν”„λ‘œμ νŠΈ μ‚¬μš© Ultralytics YOLOv8

λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œ

Ultralytics YOLOv8 을 ν™œμš©ν•œ λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œ ν”„λ‘œμ νŠΈλŠ” κ³ κΈ‰ 컴퓨터 λΉ„μ „ κΈ°λŠ₯을 ν†΅ν•©ν•˜μ—¬ λ³΄μ•ˆ 쑰치λ₯Ό κ°•ν™”ν•©λ‹ˆλ‹€. YOLOv8 Ultralytics μ—μ„œ κ°œλ°œν•œ 이 μ‹œμŠ€ν…œμ€ μ‹€μ‹œκ°„ 물체 감지 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ 잠재적인 λ³΄μ•ˆ μœ„ν˜‘μ„ μ¦‰μ‹œ μ‹λ³„ν•˜κ³  λŒ€μ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” λͺ‡ 가지 μž₯점을 μ œκ³΅ν•©λ‹ˆλ‹€:

  • μ‹€μ‹œκ°„ 탐지: YOLOv8 의 νš¨μœ¨μ„±μ„ 톡해 λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œμ€ λ³΄μ•ˆ 사고λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ νƒμ§€ν•˜κ³  λŒ€μ‘ν•˜μ—¬ λŒ€μ‘ μ‹œκ°„μ„ μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 정확도: YOLOv8 λŠ” 물체 감지 정확도가 λ›°μ–΄λ‚˜ μ˜€νƒμ„ 쀄이고 λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œμ˜ 신뒰성을 ν–₯μƒμ‹œν‚€λŠ” κ²ƒμœΌλ‘œ 유λͺ…ν•©λ‹ˆλ‹€.
  • 톡합 κΈ°λŠ₯: 이 ν”„λ‘œμ νŠΈλŠ” κΈ°μ‘΄ λ³΄μ•ˆ 인프라와 μ›ν™œν•˜κ²Œ ν†΅ν•©λ˜μ–΄ μ—…κ·Έλ ˆμ΄λ“œλœ 지λŠ₯ν˜• κ°μ‹œ 계측을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



Watch: Ultralytics YOLOv8 물체 감지λ₯Ό ν†΅ν•œ λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œ ν”„λ‘œμ νŠΈ

μ½”λ“œ

λ©”μ‹œμ§€ λ§€κ°œλ³€μˆ˜ μ„€μ •

μ°Έκ³ 

μ•± λΉ„λ°€λ²ˆν˜Έ 생성 ν•„μš”

  • μ•± λΉ„λ°€λ²ˆν˜Έ μƒμ„±κΈ°λ‘œ μ΄λ™ν•˜μ—¬ 'λ³΄μ•ˆ ν”„λ‘œμ νŠΈ'와 같은 μ•± 이름을 μ§€μ •ν•˜κ³  16자리 λΉ„λ°€λ²ˆν˜Έλ₯Ό μ–»μŠ΅λ‹ˆλ‹€. 이 λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³΅μ‚¬ν•˜μ—¬ μ•ˆλ‚΄μ— 따라 μ§€μ •λœ λΉ„λ°€λ²ˆν˜Έ μž…λ ₯λž€μ— λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€.
password = ""
from_email = ""  # must match the email used to generate the password
to_email = ""  # receiver email

μ„œλ²„ 생성 및 인증

import smtplib

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

이메일 보내기 κΈ°λŠ₯

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())

객체 감지 및 μ•Œλ¦Ό λ°œμ‹ μž

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):
        """Run object detection on video frames from a camera stream, plotting and showing the results."""
        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()

객체 감지 클래슀λ₯Ό ν˜ΈμΆœν•˜κ³  좔둠을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

detector = ObjectDetection(capture_index=0)
detector()

λμž…λ‹ˆλ‹€! μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ κ°œμ²΄κ°€ κ°μ§€λ˜λ©΄ μ΄λ©”μΌλ‘œ ν•œ 번의 μ•Œλ¦Όμ„ λ°›κ²Œ λ©λ‹ˆλ‹€. μ•Œλ¦Όμ€ 반볡적으둜 μ „μ†‘λ˜μ§€ μ•Šκ³  μ¦‰μ‹œ μ „μ†‘λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œμ νŠΈ μš”κ΅¬ 사항에 맞게 μ½”λ“œλ₯Ό 자유둭게 μ‚¬μš©μž 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

이메일 μˆ˜μ‹  μƒ˜ν”Œ

이메일 μˆ˜μ‹  μƒ˜ν”Œ

자주 λ¬»λŠ” 질문

Ultralytics YOLOv8 λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œμ˜ 정확도λ₯Ό μ–΄λ–»κ²Œ κ°œμ„ ν•˜λ‚˜μš”?

Ultralytics YOLOv8 λŠ” 높은 μ •ν™•λ„μ˜ μ‹€μ‹œκ°„ 객체 탐지 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œμ„ κ°•ν™”ν•©λ‹ˆλ‹€. κ³ κΈ‰ μ•Œκ³ λ¦¬μ¦˜μ€ μ˜€νƒμ„ 크게 쀄여 μ‹œμŠ€ν…œμ΄ μ§„μ§œ μœ„ν˜‘μ—λ§Œ λŒ€μ‘ν•˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν–₯μƒλœ μ•ˆμ •μ„±μ€ κΈ°μ‘΄ λ³΄μ•ˆ 인프라와 μ›ν™œν•˜κ²Œ ν†΅ν•©λ˜μ–΄ μ „λ°˜μ μΈ λ³΄μ•ˆ κ°μ‹œ ν’ˆμ§ˆμ„ μ—…κ·Έλ ˆμ΄λ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Ultralytics YOLOv8 을 κΈ°μ‘΄ λ³΄μ•ˆ 인프라와 톡합할 수 μžˆλ‚˜μš”?

예, Ultralytics YOLOv8 κΈ°μ‘΄ λ³΄μ•ˆ 인프라와 μ›ν™œν•˜κ²Œ 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ‹œμŠ€ν…œμ€ λ‹€μ–‘ν•œ λͺ¨λ“œλ₯Ό μ§€μ›ν•˜κ³  μ‚¬μš©μž 지정에 λŒ€ν•œ μœ μ—°μ„±μ„ μ œκ³΅ν•˜μ—¬ κ³ κΈ‰ 객체 감지 κΈ°λŠ₯으둜 κΈ°μ‘΄ 섀정을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ— YOLOv8 을 ν†΅ν•©ν•˜λŠ” 방법에 λŒ€ν•œ μžμ„Έν•œ 지침은 톡합 μ„Ήμ…˜μ„ μ°Έμ‘°ν•˜μ„Έμš”.

Ultralytics YOLOv8 을 μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μŠ€ν† λ¦¬μ§€ μš”κ΅¬ 사항은 λ¬΄μ—‡μΈκ°€μš”?

ν‘œμ€€ μ„€μ •μ—μ„œ Ultralytics YOLOv8 을 μ‹€ν–‰ν•˜λ €λ©΄ 일반적으둜 μ•½ 5GB의 λ””μŠ€ν¬ μ—¬μœ  곡간이 ν•„μš”ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” YOLOv8 λͺ¨λΈ 및 μΆ”κ°€ 쒅속성을 μ €μž₯ν•˜κΈ° μœ„ν•œ 곡간이 ν¬ν•¨λ©λ‹ˆλ‹€. ν΄λΌμš°λ“œ 기반 μ†”λ£¨μ…˜μ˜ 경우 Ultralytics HUBλŠ” 효율적인 ν”„λ‘œμ νŠΈ 관리 및 데이터 μ„ΈνŠΈ 처리λ₯Ό μ œκ³΅ν•˜μ—¬ μŠ€ν† λ¦¬μ§€ μš”κ΅¬ 사항을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν™•μž₯ μŠ€ν† λ¦¬μ§€λ₯Ό ν¬ν•¨ν•œ ν–₯μƒλœ κΈ°λŠ₯에 λŒ€ν•œ ν”„λ‘œ μš”κΈˆμ œμ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄μ„Έμš”.

Ultralytics YOLOv8 λ‹€λ₯Έ 객체 감지 λͺ¨λΈ(예: Faster R-CNN λ˜λŠ” SSD)κ³Ό λ‹€λ₯Έ 점은 λ¬΄μ—‡μΈκ°€μš”?

Ultralytics YOLOv8 λŠ” μ‹€μ‹œκ°„ 감지 κΈ°λŠ₯κ³Ό 높은 μ •ν™•λ„λ‘œ Faster R-CNNμ΄λ‚˜ SSD와 같은 λͺ¨λΈλ³΄λ‹€ μš°μœ„λ₯Ό μ ν•©λ‹ˆλ‹€. κ³ μœ ν•œ μ•„ν‚€ν…μ²˜λ₯Ό 톡해 정밀도 μ €ν•˜ 없이 이미지λ₯Ό 훨씬 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆμ–΄ λ³΄μ•ˆ 경보 μ‹œμŠ€ν…œκ³Ό 같이 μ‹œκ°„μ— λ―Όκ°ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ΄μƒμ μž…λ‹ˆλ‹€. 물체 감지 λͺ¨λΈμ— λŒ€ν•œ 쒅합적인 λΉ„κ΅λŠ” κ°€μ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

Ultralytics YOLOv8 을 μ‚¬μš©ν•˜μ—¬ λ³΄μ•ˆ μ‹œμŠ€ν…œμ—μ„œ μ˜€νƒ λΉˆλ„λ₯Ό 쀄이렀면 μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?

μ˜€νƒμ„ 쀄이렀면 Ultralytics YOLOv8 λͺ¨λΈμ΄ λ‹€μ–‘ν•˜κ³  주석이 잘 달린 데이터 μ„ΈνŠΈλ‘œ μ μ ˆν•˜κ²Œ ν›ˆλ ¨λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”. ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ₯Ό λ―Έμ„Έ μ‘°μ •ν•˜κ³  μƒˆλ‘œμš΄ λ°μ΄ν„°λ‘œ λͺ¨λΈμ„ μ •κΈ°μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λ©΄ 탐지 정확도λ₯Ό 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ 기법은 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ κ°€μ΄λ“œμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.



2023-12-02 생성, 2024-07-05 μ—…λ°μ΄νŠΈλ¨
μž‘μ„±μž: glenn-jocher (7), ambitious-octopus (1), IvorZhu331 (1), RizwanMunawar (1)

λŒ“κΈ€