본문 바로가기
프로젝트 기록/딥러닝 모델 개발_공학설계캡스톤디자인(스마트카ICT)

[YOLOv5] 객체인식 후 음성 안내문구 재생

by 소요이 2023. 5. 20.
728x90

이번에는 아래 두 코드를 합쳐보았다.

 

이전에 학습 모델로 객체인식 하는 코드 + 구글 TTS 음성출력 코드 

https://skook.tistory.com/163

 

[YOLOv5] 학습된 모델파일(best.pt) 파이참에서 불러와서 관심영역 객체 detect

이번에 돌려볼 파일은 이 위치에... 이전 게시글에서 다운받은 best.pt파일을 프로젝트 코드가 있는 위치에 붙여넣기 했음 파일 경로: 초록 형광펜 친 부분 참고 best.pt : 전체를 라벨링하고 학습시

skook.tistory.com

https://skook.tistory.com/170

 

[gTTS] google TTS로 음성 출력 예제코드

간단하게 TTS만 이용해서 음성 출력하는 코드 """text_Saying.py""" from gtts import gTTS import os # 변환하려는 문장들을 리스트에 저장합니다. sentences = ["창 밖으로 손을 내밀지 마세요", "창 밖으로 머리를

skook.tistory.com

 


1. 사진에서 객체인식 + 음성출력

 

 

코드 실행 시

객체 인식된 사진이 나오며, 경고 문구를 재생한다.

객체인식 결과, 음성 출력

 

 

코드

"""230520_jpg_detect_and_say.py"""

import torch
import cv2
import numpy as np
from gtts import gTTS
from pathlib import Path
import os

# YOLOv5 모델 로드
model_path = 'C:/Users/songs/PycharmProjects/mediapipe/yolov5/data/dataset_230515/230518_/best_SY_230518.pt'
model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path)

# 객체 클래스와 경고 문장을 매핑하는 딕셔너리
warnings = {
    'head': "창 밖으로 머리를 내밀면 위험합니다",
    'hand': "창 밖으로 손을 내밀지 마세요",
    'etc': "낙하 위험이 있습니다. 비상등을 켜겠습니다."
}

# 이미지 읽기
image = cv2.imread('frame_99.jpg')

points = np.array([[187, 33],
                   [247, 49],
                   [320, 78],
                   [394, 114], [452, 148],
                   [497, 182],
                   [540, 246],
                   [571, 317],
                   [588, 398],
                   [527, 478],
                   [425, 542],
                   [337, 605],
                   [287, 644],
                   [263, 485],
                   [237, 308],
                   [210, 162]], dtype=np.int32)

# 관심 영역 설정 (창문 안쪽을 까맣게 처리)
mask = np.ones_like(image, dtype=np.uint8) * 255
cv2.fillPoly(mask, [points], (0, 0, 0))
roi = cv2.bitwise_and(image, mask)

# 객체 탐지 실행
results = model(roi[:, :, ::-1])  # YOLOv5는 RGB 이미지를 기대하므로 BGR에서 RGB로 변환

# 결과 출력
results.print()

# 탐지된 객체에 대한 경계 상자와 클래스를 그림
rendered_image = results.render()[0]

# 객체 탐지 결과를 가져옵니다.
for *box, confidence, class_id in results.xyxy[0]:
    # 객체 클래스 이름을 얻습니다.
    class_name = results.names[int(class_id)]

    # 객체 클래스에 해당하는 경고 문장을 찾습니다.
    warning = warnings.get(class_name)

    # 경고 문장이 있으면 TTS로 변환하고 재생합니다.
    if warning is not None:
        tts = gTTS(text=warning, lang='ko')
        filename = f"voice_{class_name}.mp3"
        tts.save(filename)
        os.system(f"start {filename}")

cv2.imshow("Detections", rendered_image[:, :, ::-1])  # RGB에서 BGR로 변환하여 OpenCV로 표시
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

 


2. 동영상에서 객체인식 + 음성출력

 

음성출력 조건


- 한 번 객체가 인식되면, 그 때 인식된 객체와 알맞은 음성을 출력
- 인식된 객체와 다른 객체가 인식되면, 바로 새로 인식된 객체에 해당하는 음성을 출력
- 음성 출력이 완료되었는데도 계속 해당 객체가 감지되고 있다면, 1초 기다린 뒤 해당 문구를 출력
- 음성 출력이 되고 있는 와중에, 인식되던 객체가 사라진다면 음성 출력은 0.5초 뒤에 종료

터미널에서 ffmpeg 설치

복잡해서 ffmpeg 안쓰기로함

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg