사물 인식¶
얼굴 인식¶
준비¶
opencv설치
conda install -c conda-forge opencv # opencv 3.3, 아나콘다
명령어창에서 다음과 같이 conda install -c conda-forge opencv
입력한다.
- dlib 설치
pip install dlib
conda install -c menpo dlib # 아나콘다
- xml 파일들 다운로드
In [ ]:
import urllib.request
import os
directory = 'xmls'
if not os.path.exists(directory):
os.makedirs(directory)
files = ['haarcascade_frontalface_default.xml',
'haarcascade_eye.xml']
for file in files:
url = 'https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/' + file
fpath = directory + '/' + file
if not os.path.exists(fpath):
urllib.request.urlretrieve(url, fpath)
- dlib model 파일 다운로드
http://dlib.net/files/로부터 필요한 파일들
shape_predictor_68_face_landmarks.dat.bz2
을 다운로드 받는다.
In [ ]:
import urllib.request
import os
directory = 'models'
if not os.path.exists(directory):
os.makedirs(directory)
files = ['shape_predictor_68_face_landmarks.dat.bz2']
for file in files:
url = 'http://dlib.net/files/' + file
fpath = directory + '/' + file
if not os.path.exists(fpath):
urllib.request.urlretrieve(url, fpath)
사진¶
- opencv 이용
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('xmls/haarcascade_frontalface_default.xml')
eye_casecade = cv2.CascadeClassifier('xmls/haarcascade_eye.xml')
img = cv2.imread('images/jisung.png')
컬러를 회색 영상으로 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
scaleFactor = 1.1은 0.1 * 100 % = 10 %로 그림을 줄여 나가면서 얼굴을 찾는다.
숫자가 작으면 더 정확하게 얼굴들을 찾아내지만 시간이 많이 걸리고 또한 얼굴이 아닌 것을 찾을 가능성이 커진다.
scaleFactor는 1보다 커야 한다.
minNeighbors = 5는 후보가 되는 사각형을 적어도 5개의 사각형들이 포함하고 있어야 한다는 것이다.
갯수가 많아지면 더 정확한 얼굴을 찾지만 그만큼 원하는 얼굴들을 찾지 못할 수 있다.
탐색된 얼굴에 대한 직사각형 리스트 반환
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
for (x, y, w, h) in faces:
# 이미지에 탐색된 얼굴 직사각형 표시
# 두번째 인자 (x, y)는 직사각형의 왼쪽 위, 3번째 인자 (x+w, y+h)는 직사각형의 오른쪽 아래,
# 4번째 인자 (255, 0, 0)는 직사각형 색,
# 다섯번째 인자 2는 직사각형 둘레의 두께
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 탐색된 얼굴부분만 변수로 저장
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# 얼굴 부분에서 눈 탐색
eyes = eye_casecade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
# 탐색된 얼굴 부분에 탐색된 눈 부분 직사각형 표시
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- dlib 이용
비디오¶
- 얼굴 인식
import cv2
import sys
import datetime as dt
from time import sleep
cascPath = "xmls/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)
video_capture = cv2.VideoCapture(0)
anterior = 0
while True:
if not video_capture.isOpened():
print('Unable to load camera.')
sleep(5)
pass
# Capture frame-by-frame
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30)
)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if anterior != len(faces):
anterior = len(faces)
# Display the resulting frame
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()
사물인식(object detection)¶
opencv이용¶
imutils
모듈 설치 필요
pip install imutils
python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel
q
를 눌러서 종료할 수 있는데 종료가 안될 경우도 생긴다. 그럴때는
ctrl + alt + del을 눌러서 연결된 python 실행을 강제로 종료해야 한다.
USAGE
python real_time_object_detection.py --prototxt MobileNetSSD_deploy.prototxt.txt --model MobileNetSSD_deploy.caffemodel
import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import argparse
import imutils
import time
import cv2
construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True,
help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
help="minimum probability to filter weak detections")
args = vars(ap.parse_args())
initialize the list of class labels MobileNet SSD was trained to
detect, then generate a set of bounding box colors for each class
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant", "sheep",
"sofa", "train", "tvmonitor"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))
load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
initialize the video stream, allow the cammera sensor to warmup,
and initialize the FPS counter
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
fps = FPS().start()
loop over the frames from the video stream
while True:
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()
frame = imutils.resize(frame, width=400)
# grab the frame dimensions and convert it to a blob
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)),
0.007843, (300, 300), 127.5)
# pass the blob through the network and obtain the detections and
# predictions
net.setInput(blob)
detections = net.forward()
# loop over the detections
for i in np.arange(0, detections.shape[2]):
# extract the confidence (i.e., probability) associated with
# the prediction
confidence = detections[0, 0, i, 2]
# filter out weak detections by ensuring the `confidence` is
# greater than the minimum confidence
if confidence > args["confidence"]:
# extract the index of the class label from the
# `detections`, then compute the (x, y)-coordinates of
# the bounding box for the object
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# draw the prediction on the frame
label = "{}: {:.2f}%".format(CLASSES[idx],
confidence * 100)
cv2.rectangle(frame, (startX, startY), (endX, endY),
COLORS[idx], 2)
y = startY - 15 if startY - 15 > 15 else startY + 15
cv2.putText(frame, label, (startX, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)
# show the output frame
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
# update the FPS counter
fps.update()
stop the timer and display FPS information
fps.stop()
print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()