일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 얼굴 비식별화
- opencv
- caffemodel
- 스파크
- 내채공만기
- iOS부트캠프
- YOLO
- 아파치 스파크
- yolov5
- face blur
- SPARK
- Yolo5 custom dataset
- 아파치 카프카
- roboflow
- python
- IOS
- 준지도학습
- Apache Kafka
- Yolo5
- Apache Spark
- Kafka
- 내일채움공제만기
- 앱생명주기
- 비식별화
- 카프카
- 파이썬
- Swift
- train data
- SeSAC
- scenedelegate
- Today
- Total
봉식이와 캔따개
Python으로 OpenCV를 사용하여 YOLO Object detection 본문
이번엔 뜬금없이 영상처리다...
살면서 한번도 안해봤고 해볼거라고 생각도 못했음.
하지만 시키니까 합니다...
https://pysource.com/2019/06/27/yolo-object-detection-using-opencv-with-python/
이 분 글을 보고 따라해봤습니다.
YOLO란?
설마 그 욜로인가 했다. 알고보니 비슷했다.
You Only Look Once
간단히 object detection을 위한 CNN 기반의 물체인식 알고리즘이다.
YOLO 사용법
YOLO를 실행 할 딥러닝 프레임워크가 필요하다.
YOLO와 호환되는 가장 많이 사용되는 3가지 프레임워크
- Darknet : YOLO 개발자가 만든 프레임워크. YOLO를 위해 특별히 제작되었다.
장점 : 빠르다. GPU또는 CPU와 함께 사용가능
단점 : 리눅스에서만 호환...
- Darkflow : Darknet을 텐서플로우에 적용한것
장점 : 빠르고 GPU 또는 CPU와 함께 사용 가능하고 리눅스, 윈도우, 맥에서 호환
단점 : 설치 복잡
- OpenCV : 최소 3.4.2버전 필요
장점 : openCV외에 설치할 것이 없다
단점 : CPU에서만 작동하기 때문에 비디오를 실시간으로 처리하는 데 속도가 빠르진 않다
OpenCV 설치
Python에서 OpenCV를 사용하기 위해 OpenCV 모듈을 설치했습니다.
pip를 통해 설치 가능
python -m pip install opencv-python
설치가 잘 되었는지 확인해봅시다.
굳.
YOLO 사용법
OpenCV와 numpy 모듈을 import 해줍니다 :
import cv2
import numpy as np
알고리즘을 로드합니다. 알고리즘을 실행하기 위해서 세개의 파일이 필요합니다.
-
Weight file : 훈련된 model
-
Cfg file : 구성파일. 알고리즘에 관한 모든 설정이 있다.
-
Name files : 알고리즘이 감지할 수 있는 객체의 이름을 포함한다.
weight파일은 용량때문에 안올라간다ㅓ ㅠㅠㅠㅁㄴㅇ
이런식으로 한 폴더에 넣어주었다.
YOLO 로드 :
# 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))
그 다음 물체 감지를 할 이미지를 로드하고 너비, 높이도 가져옵니다 :
# 이미지 가져오기
img = cv2.imread("sample.jpg")
img = cv2.resize(img, None, fx=0.4, fy=0.4)
height, width, channels = img.shape
네트워크에서 이미지를 바로 사용할 수 없기때문에 먼저 이미지를 Blob으로 변환해야 한다.
Blob은 이미지에서 특징을 잡아내고 크기를 조정하는데 사용된다.
YOLO가 허용하는 세가지 크기
-
320 × 320 : 작고 정확도는 떨어지지 만 속도 빠름
-
609 × 609 : 정확도는 더 높지만 속도 느림
-
416 × 416 : 중간
Object Detect :
# 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는 감지 결과이다. 탐지된 개체에 대한 모든 정보와 위치를 제공한다.
결과 화면에 표시 / 신뢰도, 신뢰 임계값 계산 (이 부분이 완전 이해가 안된다 ) :
# 정보를 화면에 표시
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)
신뢰도가 0.5 이상이라면 물체가 정확히 감지되었다고 간주한다. 아니라면 넘어감..
임계값은 0에서 1사이의 값을 가지는데
1에 가까울수록 탐지 정확도가 높고 , 0에 가까울수록 정확도는 낮아지지만 탐지되는 물체의 수는 많아진다.
노이즈 제거 :
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
같은 물체에 대한 박스가 많은것을 제거
Non maximum suppresion이라고 한답니다.
마지막으로 모든 정보를 추출하여 화면에 표시합니다.
-
Box : 감지된 개체를 둘러싼 사각형의 좌표
-
Label : 감지된 물체의 이름
-
Confidence : 0에서 1까지의 탐지에 대한 신뢰도
화면에 표시하기 :
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()
결과는...??
ㅋㅋㅋㅋㅋㅋ 우리 봉식이랑 티비를 감지해냈다!
재밌어서 더 많은 물건이 찍힌 사진을 넣어봤다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 생각보다 많은걸 감지해냈다.
과자 포장지 그림을 케이크라고 잘못 인식하긴했지만...
역시 보는것보단 직접 해보는게 재밌다.
'머신러닝, 딥러닝 > 이미지처리' 카테고리의 다른 글
[Yolo5] Yolo5의 detect.py 사용해서 Yolo 학습용 데이터셋 만들기 (6) | 2022.02.23 |
---|---|
[YOLO] 커스텀 데이터셋 학습시키기 - colab에서 Yolo5 모델 (5) | 2022.02.10 |
[YOLO] 커스텀 데이터셋 학습시키기 - roboflow에서 데이터셋 만들기 (4) | 2022.02.07 |
CNN에 대해 쉽게 정리 (3) | 2021.01.22 |
Python과 OpenCV를 이용하여 웹캠 실시간 face detection + 비식별화 (1) | 2020.04.13 |