일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 페이로드
- 포트포워딩 안될때
- 배열복사
- filezilla
- 리눅스계열
- 센토스
- docker
- 도커권한설정
- Decapsulation
- 다차원배열
- 모래시계출력
- 네트워크모델
- 유니캐스트
- 오름차순
- 배열최소값최대값
- wan
- 객체배열
- 도커
- 백준1946
- 배열빈도수
- 브로드캐스트
- 포트포워딩
- 디비버
- EC2
- ubuntu
- 우분투
- 백준
- 1946
- 리눅스환경
- dbeaver
- Today
- Total
다잘하고싶어
딥러닝모델적용을 위한 YoloV8 학습 본문
이번 공장안전자동화시스템 개발 프로젝트 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 관련 참고사이트:
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
https://bong-sik.tistory.com/16
'프로젝트회고 > 팩세이프(FacSafe)' 카테고리의 다른 글
딥러닝모델 정확도를 높이기 위한 반복 학습시키기 (0) | 2023.12.10 |
---|---|
Smoke & Fire 모델 학습 시키기 (0) | 2023.12.10 |