object detection(객체 검출)에 대해 알아보기 전 computer vision(컴퓨터 비전)에 대해 알아보자.
computer vision(컴퓨터 비전)이란 컴퓨터를 활용하여, 정지 영상 또는 동영상으로부터 의미 있는 정보를 추추하는 방법을 연구하는 학문을 말한다. 쉽게 말해, 사람이 눈으로 사물을 보고 인지하는 과정을 컴퓨터가 하게끔 만들어 주는 학문이다.
computer vision의 하위 항목은 아래와 같다.
- 영상의 화질 개선
- 객체 검출 및 영상 분할
- 얼굴 인식, 문자 인식 등 각종 인식
이 3가지 중 객체 검출 분야에 대해 자세히 알아보자.
object detection(객체 검출)이란 이미지나 동영상에서 사람, 동물, 차량 등 의미 있는 객체의 종류와 그 위치(bounding box)를 정확하게 찾기 위한 computer vision(컴퓨터 비전) 기술로 localization 과 classification 개념이 포함되어 있다. 예를 들어, 어떤 이미지를 입력했을 때 검출 객체를 localization(bounding box)해주고 box 안에 있는 객체를 classification까지 해주는 것을 object detection 이라고 한다.
object detector에서 localization과 classification이 진행되는 순서에 따라 1-Stage detector와 2-Stage detector로 나뉜다.
2-stage detector의 경우, regional proposal과 classification이 순차적으로 이루어지는 모델이다. Regional Proposal 과정이 먼저 이루어지며, 이 과정에서 image 내에 object가 있을 법한 영역인 RoI(Region of Interest)를 찾아낸다. 이러한 영역들을 발견하고 나면 그 이후에 RoI들에 대하여 object classification을 진행하게 된다.
1-Stage detector는 regional proposal과 classification이 동시에 이루어지는 모델로 RoI를 추출하지 않고, image 전체에 대해 clssification을 수행한다. 예를 들어, 1-stage detector에 해당하는 YOLO의 경우, 전체 이미지를 특정 크기의 grid로 분할하여 object의 중심이 cell에 존재할 경우 해당 cell이 object detection을 진행하는 방식으로 classification을 진행하여 바로 Bounding Box(BBox, object가 존재하는 image 내 사각형)를 예측하게 된다.
이런 1-stage detector 에 해당하는 간단한 yolo 예제를 실행해보자.
먼저 yolo를 실행할 딥러닝 프레임워크가 필요한데 yolo와 가장 많이 호환되는 프레임워크 중 OpenCV를 사용하여 실행시켜보자.
여기서 OpenCV란 컴퓨터 비전 또는 머신러닝 오픈소스 라이브러리로 컴퓨터 비전 기술을 구현하기 위해 필요한 알고리즘을 모아둔 프레임워크다.
1.python에서 opencv를 사용하기 위해 pip를 통해 설치한다.
먼저 알고리즘을 실행하기 위해서 4개의 파일이 필요하다.
- weight file : 훈련된 model
- cfg file : 구성파일. 알고리즘에 관한 모든 설정이 있다.
- name files : 알고리즘이 감지할 수 있는 객체의 이름을 포함한다.
- image files : 사진 속 객체들을 yolo를 통해 분류한다.
4개의 파일을 하나의 폴더에 넣어준다.
2.openCV와 numpy 라이브러리를 import 해준다.
import cv2
import numpy as np
3.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))
4.물체 감지를 할 이미지를 로드하고 너비, 높이도 가져온다.
img = cv2.imread("apple and banana.jpg")
img = cv2.resize(img, None, fx=0.4, fy=0.4)
height, width, channels = img.shape
네트워크에서 이미지를 바로 사용할 수 없기때문에 먼저 이미지를 Blob으로 변환해야 한다.
Blob은 이미지에서 특징을 잡아내고 크기를 조정하는데 사용된다.
5.Object Detect(객체 검출)한다.
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
6.결과 화면에 표시 / 신뢰도, 신뢰 임계값 계산한다.
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)
# 좌표
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)
7.노이즈를 제거한다.
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
같은 물체에 대한 박스가 많은 것을 제거하는 걸 Non maximum suppresion이라고 한다.
8.화면에 표시한다.
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[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()
9.검사결과
'Project > 캡스톤디자인프로젝트' 카테고리의 다른 글
라즈베리파이B3+ 사용법 및 하드웨어 제작 과정 (0) | 2022.05.17 |
---|---|
[RaspberryPi3]라즈베리파이 한글 설정하기 (0) | 2022.02.26 |
[RaspberryPi3]카메라 사용하기(모듈, 로지텍) (0) | 2022.02.22 |
[RaspberryPi3]vnc viewer이용해 원격 접속하기 (0) | 2022.02.22 |