์ด๋ฒ ๊ธ์ ๋๊ณ ๊ณ์ ํ๊ธฐ ๋ ์งํํ๋ ์ผ๊ตด ์ธ์ ์ถ์๊ธฐ๋ก ํ๋ก์ ํธ์ ๋ํ ์ ๋ฆฌ ๊ธ์ ๋๋ค.
๊ณ์ ํ๊ธฐ๋ค ๋ณด๋ ์งง์ ๊ธฐ๊ฐ ์์ ์ํํ์ด์ผ ํ์ต๋๋ค. ๊ณผ๋ชฉ์ ๋ํด ๊ฐ๋ตํ ์๊ฐํ์๋ฉด ์ํ๋ ์ฃผ์ ์ ๋ํ ์คํ์์ค๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํ์ ์์ํ๊ณ , ์ฐธ๊ณ ํ ์คํ์์ค๋ฅผ ๋ถ์ํ์ฌ ๋ฌธ์ ์ ์ ๋ํ ๊ฐ์ ์ ์ ์ถ๊ฐ๋ก ๊ตฌํํด์ฃผ์ด์ผ ํ๋ ๊ณผ๋ชฉ์ด์์ต๋๋ค.
์๋ ๊ตฌํ ์์๊ณผ ์์ค์ฝ๋ ๋งํฌ๋ฅผ ์ฒจ๋ถํ์์ต๋๋ค. ์ฐธ๊ณ ํด์ฃผ์ธ์!
https://www.youtube.com/watch?v=aBTPyji1nHA
https://github.com/KimGyoungTae/OpenCV-Face-recognition-Project
GitHub - KimGyoungTae/OpenCV-Face-recognition-Project
Contribute to KimGyoungTae/OpenCV-Face-recognition-Project development by creating an account on GitHub.
github.com
์ผ๊ตด ์ธ์์ ๊ตฌํํ๊ธฐ ์ํด Object ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ Haar cascades๋ฅผ ํ๋์ฉ ๊ณต๋ถํ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ์งํํด ๋๊ฐ๋ค๋ฉด ์๊ฐ์ ์ซ๊ธฐ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ์ง ๋ชปํ์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง OpenCV๋ฅผ ํ์ฉํ๋ฉด ๋ฏธ๋ฆฌ ํ์ต๋ Hear cascade๋ฅผ XML ํ์ผ๋ก ์ ๊ณตํ์ฌ ์์ฝ๊ฒ ์ฝ๋๋ก ๊ตฌํํ ์ ์๊ฒ ๋ฉ๋๋ค.
OpenCV๋ Open Source Computer Vison์ ์ฝ์๋ก ์์ ์ฒ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค. C๋ C++ ์ธ์ด์์ ๊ตฌํํ ์ ์์ง๋ง Python์์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ฒ ์ง์ํ๊ณ ์์ด Python์ผ๋ก OpenCV๋ฅผ ํ์ฉํด์ ํ๋ก์ ํธ๋ฅผ ๋ง์ด ์งํํ๊ณค ํฉ๋๋ค.
์ปดํจํฐ ๋น์ ? / Computer Vison?
OpenCV๋ฅผ ์ธ๊ธํจ์ผ๋ก์จ ๊ฐ์ฅ ์ค์ํ ๋จ์ด๋ ๋ฌด์์ผ๊น? ๋ฐ๋ก Computer Vison, ์ปดํจํฐ ๋น์ ์ด๋ค.
์ปดํจํฐ ๋น์ ์ ์ด๋ฏธ์ง์ ๋น๋์ค๋ฅผ ์ฒ๋ฆฌํด ์ ์๋ฏธํ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ์ธ๊ณต์ง๋ฅ ๊ธฐ์ ์ด๋ค. ์ฆ, ๊ธฐ๊ณ์๊ฒ ์ธ๊ฐ์ ์๊ฐ์ ์ง๋ฅ์ ๋ถ์ฌํ์ฌ ์ธ๊ฐ์ ์๊ฐ์ด ํ ์ ์๋ ๋ช ๊ฐ์ง ์ผ์ ์ํํ๋ ์์จ์ ์ธ ์์คํ ์ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
๋ค์ ๋งํด, ์ฐ๋ฆฌ๊ฐ ๋์ผ๋ก ๋ณด๊ณ ์ํฉ์ ์ดํดํ๋ ๊ฒ ๊ฐ์ ์๊ฐ ๊ธฐ๋ฅ์ ์ปดํจํฐ์๊ฒ๋ ๊ทธ ์๊ฐ๊ธฐ๋ฅ์ ๋ถ์ฌํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ด๋ค.
์์์ฒ๋ฆฌ : ์ปดํจํฐ ๋น์ ์์์ ์ ์ฒ๋ฆฌ ๊ณผ์ , ์ฌ์ง ๋๋ ์์์ ๋์งํธํ์ฌ ์ ์ ๋ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ปดํจํฐ ๋น์ : ์์์ฒ๋ฆฌ๋ฅผ ๋ฐํ์ผ๋ก ํ ์์์ ํตํด ๋ค์ํ ํน์ง ๋ฐ ์ฅ๋ฉด์ ๋ถ์ํด์ ์ปดํจํฐ๊ฐ ์ดํดํ๋๋ก ๋ง๋ค์ด ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ ๋๋ค.
์ผ๊ตด ์ธ์์ ์ํ ํ๊ฒฝ ์ธํ ๋ฐ Test ์งํ
์ง๊ธ๊น์ง OpenCV ์ ์ปดํจํฐ ๋น์ ์ ๊ดํด ๊ฐ๋ตํ๊ฒ ์์๋ณด์์ต๋๋ค. ์ด์ ์์๋ณธ OpenCV๋ฅผ ํ์ฉํ์ฌ ์ผ๊ตด ์ธ์์ ์งํํด๋ณด๊ฒ ์ต๋๋ค. ์ ๋ OpenCV ํ์ฉ์ ์ํด Python์ผ๋ก ๊ตฌํํ ๊ฒ์ด๊ณ , ํ์ด์ฌ ์ธ์ด์ ํนํ๋ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ธ PyCharm์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
Interpreter ์ฆ, ์คํ ํ๊ฒฝ์ ์ ์์ ์ผ๋ก ์ ํํ๋ค๋ฉด ์ ์ฌ์ง๊ณผ ๊ฐ์ ์์ด์ฝ ๋ชจ์์ผ๋ก ๋ฐ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ + ๋ฒํผ์ ๋๋ฌ ์ฐ๋ฆฌ๊ฐ ํ์ํ ํจํค์ง๋ค์ Install ํด์ค์๋ค.
ํ์ํ ํจํค์ง๋ค์ ํ์ํด๋์์ต๋๋ค. requests๋ ํ์ฌ๋ ํ์ ์์ง๋ง, ๋์ค์ ์นด์นด์คํก์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ ๋ ํ์ํ ํจํค์ง์ ๋๋ค.
์ ์ด๋ฏธ์ง๋ ์ปดํจํฐ๊ฐ ์ฐ๋ฆฌ์ ์ผ๊ตด์ ์ธ์ํ๋ ๋จ๊ณ์ ๋๋ค. ์ปดํจํฐ ๋น์ ์์ ์ผ๊ตด ์ธ์์ ์ด์ ๊ฐ์ ๋ฐฉ์์ ๊ธฐ๋ฐ์ผ๋ก ์ปดํจํฐ๊ฐ ์ด๋ฏธ์ง์์ ๊ฐ์ฒด๋ฅผ ๊ฒ์ถํ๊ณ ๊ณ ์ ํจํด์ ์ถ์ถํ๊ฒ ๋ฉ๋๋ค.
์์ธํ๊ฒ ๊ณผ์ ์ ์ดํดํ๊ณ ์ถ์ผ์๋ฉด ์๋ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด๋ณด์๋ฉด ๋์์ด ๋์ค ๊ฒ ๊ฐ์ต๋๋ค.
https://www.cubox.ai/board/blog/board_view.php?&page=1&num=121
CUBOX
์ธ๊ณ ์ต๊ณ ์์ค์ AI ์ผ๊ตด์ธ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ Liveness๊ธฐ์ ์ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ๊ณตํญ ์๋ํ ํ๋ซํผ 'One-ID', ์๊ฒฉ๊ทผ๋ฌด ์๋ฃจ์ 'K-Face i Tracker', ๋์ค๊ตํต ํ๋ซํผ 'Tag-less Gate', ๋น๋๋ฉด ์ฃผ๋ฌธ ๊ฒฐ์ ์์คํ 'F&B P
www.cubox.ai
1
2
3
4
5
6
7
8
|
import cv2
import numpy as np
import face_recognition
imgElon = face_recognition.load_image_file('faces/Elon Musk.jpg') #์ธ์ฝ๋ฉ์ ์ฌ์ฉํ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
imgElon = cv2.cvtColor(imgElon,cv2.COLOR_BGR2RGB) #RGB๋ก ๋ณํ
imgTest = face_recognition.load_image_file('faces/Face_image.jpg') #Test ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
imgTest = cv2.cvtColor(imgTest,cv2.COLOR_BGR2RGB) #Tset ์ด๋ฏธ์ง RGB๋ก ๋ณํ
|
cs |
ํ์ํ ํจํค์ง๋ค์ ์ค์นํ์ จ์ผ๋ฉด, ์ด์ ๊ตฌํ์ ์์ํด๋ณผ ์ฐจ๋ก์ ๋๋ค. ์ค์นํ๋ ํจํค์ง๋ค์ import ์์ผ์ค๋๋ค.
๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋น๊ตํด๋ณผ ๊ฒ์ ๋๋ค. ๊ธฐ์กด์ ๊ฐ์ง๊ณ ์๋ ์ด๋ฏธ์ง(imgElon)์ ๋น๊ตํด๋ณผ ์ด๋ฏธ์ง(imgTest) ์ด๋ ๊ฒ ๋ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํฉ๋๋ค. ์ง๊ธ์ ์น์บ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ผ ์์ ๋ ๊ฐ ์ด๋ฏธ์ง ๋ชจ๋ ๋ถ๋ฌ์ค๊ณ , RGB๋ก ๋ณํ์์ผ์ฃผ์์ต๋๋ค.
1
2
3
4
5
6
7
8
|
#์ผ๊ตด์ ์์น ๊ฐ๊ฒ ๋ง๋ค๊ธฐ
faceLoc = face_recognition.face_locations(imgElon)[0]
encodeElon = face_recognition.face_encodings(imgElon)[0] #๊ฐ์งํ ์ผ๊ตด ์ธ์ฝ๋ฉ, ์ฒซ๋ฒ์งธ ์์๋ง ๊ฐ์ ธ์ค๊ธฐ
cv2.rectangle(imgElon,(faceLoc[3],faceLoc[0]), (faceLoc[1],faceLoc[2]),(255,0,255),2) #์ฐ๋ฆฌ๊ฐ ์ผ๊ตด์ ๊ฐ์งํ ์์น๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฌ๊ฐํ์ ์ด๋ฏธ์ง์ ๊ทธ๋ฆผ
faceLocTest = face_recognition.face_locations(imgTest)[0]
encodeTest = face_recognition.face_encodings(imgTest)[0] #Test์ด๋ฏธ์ง์ ๋ํ ์ฒซ๋ฒ์งธ ์์๋ง ๊ฐ์ ธ์ค๊ธฐ
cv2.rectangle(imgTest,(faceLocTest[3],faceLocTest[0]), (faceLocTest[1],faceLocTest[2]),(255,0,255),2) #Test ์ด๋ฏธ์ง์ ์ฌ๊ฐํ ์ด๋ฏธ์ง
|
cs |
๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์ํํ ๋น๊ต๋ฅผ ์ํด ์ผ๊ตด์ ์์น๋ฅผ ๊ต์ ํด์ฃผ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ธ์ฝ๋ฉ์ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด๋ฏธ์ง ํ๋ํ๋ ํฝ์ ๊ฐ์ ๋ชจ๋ ์ฝ๋๋ก ๋ฐ๊ฟ์ ๊ฐ์ ์ป๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
|
results = face_recognition.compare_faces([encodeElon],encodeTest) #์ธ์ฝ๋ฉ ์ด๋ฏธ์ง์ Test ์ด๋ฏธ์ง ๊ฐ์ ๋น๊ตํ๊ธฐ
faceDis = face_recognition.face_distance([encodeElon],encodeTest) #์ด๋ฏธ์ง ์ ์ฌ์ฑ ์๊ธฐ, (==> ์ผ๊ตด ๊ฐ์ ์ค์ฐจ ๋๋์ธ๊ฑฐ ๊ฐ์)
print(results, faceDis) #๋ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์๋ก ๊ฐ์ผ๋ฉด True, ๋ค๋ฅธ ์ด๋ฏธ์ง์ผ ๊ฒฝ์ฐ False๋ฅผ ์ถ๋ ฅํ๋ค
#์ด๋ฏธ์ง์ ๋ํ ๊ฒฐ๊ณผ๋ ์ ์ฌ์ฑ์ Test ์ด๋ฏธ์ง์ ๋ช
์ํด์ฃผ๊ธฐ, round()๋ ์ ์ฌ์ฑ์ ์์์ ๋์งธ์ง๋ฆฌ๋ก ๋ฐ์ฌ๋ฆผ ํ๋ค๋ ๋ป
cv2.putText(imgTest, f'{results} {round(faceDis[0], 2)}', (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Elon Musk',imgElon) #์ธ์ฝ๋ฉ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
cv2.imshow('Face_image',imgTest) #Test ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
cv2.waitKey(0)
|
cs |
์ด์ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์๋ก ๋น๊ตํ์ฌ ์ผ๊ตด ๊ฐ์ ์ค์ฐจ๋ฅผ ํ์ ํฉ๋๋ค. ์ค์ฐจ๊ฐ ์ ์์๋ก ์ปดํจํฐ๋ ๋ ์ผ๊ตด์ ๋์ผ์ธ์ผ๋ก ํ๋จํ๊ฒ ๋ฉ๋๋ค.
๋น๋ ์ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋น๊ตํด ๋์ผ์ธ์ผ๋ก ํ๋จํ์ฌ True ๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
์ฌ ์ผ๊ตด์ Test ์ด๋ฏธ์ง๋ก ๋ฃ์ด๋ดค์ต๋๋ค. ๋น์ฐํ Elon musk๋ ์ ๋ ๋์ผ์ธ์ด ์๋๊ธฐ ๋๋ฌธ์ False๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค. ๊ตฌํ์ด ์ ๋๋ค๋ ์ฆ๊ฑฐ๊ฒ ์ฃ ?
์ง๊ธ๊น์ง OpenCV๋ฅผ ํ์ฉํด์ Pycharm ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ผ๊ตด ์ธ์ Test๋ฅผ ์งํํด๋ณด์์ต๋๋ค.
๋๊น์ง ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
์ด์์ ๋๋ค ~~ ^*^
'Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity] MediaPipe ์ฐ๋ํด์ ์ ์ํธ์์ฉ ๊ตฌํํ๊ธฐ (1) | 2023.06.12 |
---|---|
MediaPipe๋ฅผ ์ด์ฉํ์ฌ Hand Tracking & ์ ๋์ ์ธ์ ์ฝ๊ฒ ํ ์คํธ ํ๊ธฐ (0) | 2023.06.08 |