다잘하고싶어

딥러닝모델적용을 위한 YoloV8 학습 본문

프로젝트회고/팩세이프(FacSafe)

딥러닝모델적용을 위한 YoloV8 학습

챙영잉 2023. 12. 10. 21:55

이번 공장안전자동화시스템 개발 프로젝트 FacSafe (Factory + Safety) 를 진행하면서

화재, 낙상 감지를 인식하는 딥러닝 모델 학습 및 적용 부분을 담당하게 되었다.

딥러닝 모델학습은 처음 경험해보는 것이라 조금 막막하기도 했는데,

생각보다 관련 자료들이 많아서 쉽게 따라할 수 있었다.

아래 내용은 자료들을 참고해 실제 프로젝트에 적용할 YoloV8을 실습해본 내용이다.


YOLO

Object Detection, 객체 인식

  • 이미지 또는 비디오에서 개체를 식별하고 찾는 것과 관련된 컴퓨터 비전 작업
  • Object Detection 기술은 두 가지 질문을 위해 존재
    • 이것은 무엇인가? 특정 이미지에서 대상을 식별하기 위함
    • 어디에 위치해있는가? 이미지 내에서 개체의 정확한 위치를 설정하기 위함

YOLO 의 정의와 개념

= You Only Look Once

  • 최첨단 실시간 Object Detection 시스템
  • 물체 감지와 객체 인식에 대한 딥러닝 기반 접근 방식
  • YOLO는 입력된 이미지를 일정 분할로 그리드한 다음, 신경망을 통과하여 바운딩 박스와 클래스 예측을 생성하여 최종 감지 출력을 결정
    • Bbox를 계산하기 위해 YOLO는 IoU(Intersect over Union) 및 NMS(Non-maximum suppression)의 주요 후처리 단계를 구현
    • NMS는 이미지에 얼굴이 여러 개 있다고 판단하는 것이 아니라, 동일한 객체에 대한 상자 중 가장 높은 확률을 가진 상자를 선택
    • 즉, 아래 사진과 같이 모든 bounding box 에 object 가 존재하지만, 가장 높은 objectiveness score 을 가지는 녹색 box 만을 선택한다.

 

NMS 관련 참고사이트:

 

[Object Detection] NMS(Non Maximum Suppression), Soft NMS

본 글에서는 Object detection의 Overlap problem의 해결방안인 NMS(Non Maximum Suppression), 그리고 NMS의 같은 객체를 가리키는 IoU 문제를 해결하기 위한 Soft NMS에 대해서 다루어보겠습니다. Overlap pr

velog.io

YOLO 에 주목해야 하는 이유 ⇒ 활용도

  • YOLO는 빠른 속도와 상대적으로 높은 정확도를 자랑 ⇒ 실시간성
    • 속도: 물체를 실시간으로 예측하여 감지 속도 향상
    • 높은 정확도: 최소한의 배경 오류로 정확한 결과를 제공
    • 학습 기능: YOLO는 객체의 표현을 학습하고 이를 객체 감지에 적용할 수 있는 뛰어난 학습 기능

YOLO 버전

  • 사용할 모델을 결정하는 것은 애플리케이션의 요구 사항에 따라 달라지지만, 실시간 Object Detection 작업이 필요할 경우 YOLOv8을 선택하는 경향

YOLO 개념 관련 참고 사이트

https://www.thedatahunt.com/trend-insight/guide-for-yolo-object-detection

실습

0) OpenCV와 numpy 모듈을 import

import cv2
import numpy as np

1) YOLO 로드

# Load Yolo
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(0, 255, size=(len(classes), 3))

YOLO 알고리즘을 실행하기 위해서 필요한 세 개의 파일

  • Weight file : 훈련된 model
  • Cfg file : 구성파일. 알고리즘에 관한 모든 설정.
  • Name files : 알고리즘이 감지할 수 있는 객체의 이름을 포함

2) 물체를 감지할 이미지 로드

# Loading image
img = cv2.imread("a101.jpg")
img = cv2.resize(img, None, fx=0.4, fy=0.4)
height, width, channels = img.shape

3) 이미지를 Blob 으로 변환

YOLO가 허용하는 세가지 크기

  • 320 × 320 : 작고 정확도는 떨어지지 만 속도 빠름
  • 609 × 609 : 정확도는 더 높지만 속도 느림
  • 416 × 416 : 중간

4) 물체 감지

# Detecting objects
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)

net.setInput(blob)
outs = net.forward(output_layers)

outs 는 감지결과. 탐지된 개체에 대한 모든 정보와 위치 제공

5) 결과 정보를 화면에 표시

# Showing informations on the screen
class_ids = []
confidences = []
boxes = []
for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:
            # Object detected
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)

            # Rectangle coordinates
            x = int(center_x - w / 2)
            y = int(center_y - h / 2)

            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
print(indexes)
  • 신뢰도가 0.5 이상이라면 물체가 정확히 감지되었다고 간주
  • 임계값은 0에서 1사이의 값을 가지며, 1에 가까울수록 탐지 정확도가 높고 , 0에 가까울수록 정확도는 낮아지지만 탐지되는 물체의 수는 많아짐

6) 사용자 화면에 보여주기

font = cv2.FONT_HERSHEY_PLAIN
for i in range(len(boxes)):
    if i in indexes:
        x, y, w, h = boxes[i]
        label = str(classes[class_ids[i]])
        color = colors[class_ids[i]]
        cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
        cv2.putText(img, label, (x, y + 30), font, 3, color, 3)

cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

실습결과

참고 ) 실습은 YOLOv3 로 진행함

test1 → laptop, cup, keyboard

당시의 책상을 사진찍어 테스트 해봤다.

노트북, 키보드, 컵까지 잘 인식한다. 친구 책상에 있는 텀블러까지 인식해서 더 신기했다.

test2 → person

프로젝트 기획과정에서 의지를 다지며 함께 찍었던 우리팀 사진으로도 테스트 해본 결과 사람을 잘 인식했다!

콘솔창에도 해당하는 결과가 잘 찍혔다.

 


참고사이트

https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/

YOLO object detection using Opencv with Python - Pysource

 

YOLO object detection using Opencv with Python - Pysource

We’re going to learn in this tutorial YOLO object detection. Yolo is a deep learning algorythm which came out on may 2016 and it became quickly so popular because it’s so fast compared with the previous deep learning algorythm. With yolo we can detect

pysource.com

https://bong-sik.tistory.com/16

 

Python으로 OpenCV를 사용하여 YOLO Object detection

이번엔 뜬금없이 영상처리다... 살면서 한번도 안해봤고 해볼거라고 생각도 못했음. 하지만 시키니까 합니다... https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/ YOLO object detection using

bong-sik.tistory.com