컴퓨터공학/인공지능

[인공지능] 6장. 컨볼루션 신경망과 컴퓨터 비전4

NIMHO 2023. 5. 7. 21:00
728x90

복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.

6.8 물체 검출

분류(classification), 검출(detection), 분할(segmentaion) 문제

물체 검출을 위한 딥러닝 모델

  • R-CNN
  • Fast R-CNN
  • Faster R-CNN
  • YOLO (you Only look Once)

 

6.8.1 욜로를 이용한 물체 검출

입력 영상을 S*S 격자(grid)로 나눈 S^2개의 격자 방 각각에 대해 B개의 바운딩 박스를 생성한다.

바운딩 박스는 (x, y, w, h, o)의 5개의 값으로 표현한다. (o는 물체일 가능성)

 

C=80개의 물체 부류

실제 구현에서는 S=7, B=2

→ 49개 격자방 각각은 부류 정보를 표현하는 80-차원 벡터와 바운딩 박스 두 개를 표현하는 10-차원 벡터를 가진다.

 

YOLOv3

14*14, 258*28, 56*56의 3개 스케일을 사용한다.

각각 yolo_82, yolo_94라는 중간층과 yolo_106이라는 마지막 층에서 추출 가능하다.

728x90

6.8.2 욜로 프로그래밍

import numpy as np
import cv2

classes = []
# 80개의 부류 이름을 읽어온다.
f=open('coco.names.txt', 'r')
classes=[line.strip() for line in f.readlines()]
colors=np.random.uniform(0,255,size=(len(classes),3))

# 테스트할 영상을 읽고 전처리 수행
img=cv2.imread('yolo_test.jpg')
height,width,channels=img.shape
blob=cv2.dnn.blobFromImage(img,1.0/256,(448,448),(0,0,0),swapRB=True,crop=False)

# YOLOv3 모델을 불러온다.
yolo_model=cv2.dnn.readNet('./yolov3.weights','./yolov3.cfg')
layer_names=yolo_model.getLayerNames()

# yolo_82, 94, 106층으 ㄹ알아낸다.
out_layers=[layer_names[i[0]-1] for i in yolo_model.getUnconnectedOutLayers()]

# 테스트 영상을 신경망에 입력
yolo_model.setInput(blob)
# 출력을 output3 객체에 저장
output3=yolo_model.forward(out_layers)

class_ids,confidences,boxes=[],[],[]
for output in output3:
    for vec85 in output:
        scores=vec85[5:]
        class_id=np.argmax(scores)
        confidence=scores[class_id]
        if confidence>0.5: # 신뢰도가 50% 이상인 경우만 취함
            centerx,centery=int(vec85[0]*width),int(vec85[1]*height)  # [0,1] 표현을 영상 크기로 변환
            w,h=int(vec85[2]*width),int(vec85[3]*height)
            x,y=int(centerx-w/2),int(centery-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)

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

cv2.imshow("Object detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

728x90