๋ณธ ๋ฌธ์๋ _์ค๊ตญ์ด ็ฎไฝไธญๆ็ ๋ก๋ถํฐ ๋ฒ์ญ๋์ด ํ๊ตญ ์ฌ์ฉ์๋ค์ ๊ธฐ์ฌ๋ฅผ ํตํด ๋ง๋ค์ด์ง ๋ฌธ์์ ๋๋ค.
๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ๊ณ์์ ๊ฐ์ฅ ๊ฐ๋จํ ์ผ๊ตด ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, Python ๋๋ ๋ช ๋ น ์ค(CLI)์์ ์ผ๊ตด์ ์ธ์ํ๊ณ ์กฐ์ํด ๋ณผ ์ ์์ต๋๋ค.
๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฅ๋ฌ๋ ๊ธฐ๋ฐ์ผ๋ก ์ ์๋ dlib์ ์ต์ฒจ๋จ ์ผ๊ตด ์ธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์์ต๋๋ค. ์ด ๋ชจ๋ธ์ Labeled Faces in the Wild ๊ธฐ์ค์ผ๋ก 99.38%์ ์ ํ๋๋ฅผ ๊ฐ์ง๋๋ค.
๋ํ, ๋ช
๋ น ์ค(CLI)์์ ์ด๋ฏธ์ง ํด๋ ์์ ์๋ ์ผ๊ตด ์ธ์ ๊ธฐ๋ฅ์ ์ํ ๊ฐ๋จํ face_recognition
๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค!
์ฌ์ง์ ๋ฑ์ฅํ๋ ๋ชจ๋ ์ผ๊ตด๋ค์ ์ฐพ์ต๋๋ค:
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
๊ฐ๊ฐ์ ์ฌ๋์ ๋, ์ฝ, ์ , ํฑ์ ์์น์ ์ค๊ณฝ์ ์ก์๋ ๋๋ค.
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
์ผ๊ตด์ ํน์ง์ ์ฐพ๋ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ์ค์ํ ์ผ๋ค์ ์ ์ฉํ๊ฒ ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋์งํธ ๋ฉ์ดํฌ์ (Meitu ๊ฐ์ ๊ฒ)์ ์ ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ๋ง ๋ฉ์ฒญํ ๊ฒ๋ค์๋ ์ฐ์ผ ์ ์์ต๋๋ค:
๊ฐ๊ฐ์ ์ฌ์ง์์ ๋๊ฐ ๋ฑ์ฅํ์๋์ง ์ธ์ํฉ๋๋ค.
import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")
biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฅธ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด ์ค์๊ฐ ์ผ๊ตด ์ธ์๋ ๊ฐ๋ฅํฉ๋๋ค:
์ฝ๋์ ๋ํด์๋ ์ด ์์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ค์ ์ฌ์ฉ์๊ฐ ๊ณต์ ํ Jupyter notebook demo (๊ณต์์ ์๋๋๋ค):
- Python 3.3+ ๋๋ Python 2.7
- macOS ๋๋ Linux (Windows๋ ๊ณต์์ ์ผ๋ก ์ง์ํ์ง ์์ผ๋, ์๋ํ ์๋ ์์)
์ฐ์ , Python ๋ฐ์ธ๋ฉ์ ํตํด dlib์ด ์ด๋ฏธ ์ค์น๊ฐ ๋์ด์๋์ง๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค:
๋ค์์ผ๋ก, pip3
(๋๋ Python2์ ๊ฒฝ์ฐ pip2
)์ ์ฌ์ฉํ์ฌ pypi์์์ ๋ชจ๋์ ์ค์นํ์ญ์์ค:
pip3 install face_recognition
๋๋, ์ด ๋ถ๋ถ์ ์ฐธ์กฐํ์ฌ, Docker๋ก ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ํด๋ณด์ญ์์ค.
์ค์น์ ๋ํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ผ๋ฉด, ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋ VM์ ์ฌ์ฉํด ๋ณผ ์๋ ์์ต๋๋ค.
Windows๋ ๊ณต์์ ์ผ๋ก ์ง์ํ์ง๋ ์์ง๋ง, ์น์ ํ ์ ์ ๋ค์ด ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ค์นํ๋์ง ์ค๋ช ์๋ฅผ ์์ฑํ์ต๋๋ค:
- ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋ VM ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ธฐ (VMware Player ๋๋ VirtualBox์ฉ).
face_recognition
์ ์ค์นํ๋ฉด, ๋ ๊ฐ์ง ๊ฐ๋จํ ๋ช
๋ น ์ค(CLI) ํ๋ก๊ทธ๋จ์ ์ป์ต๋๋ค:
face_recognition
- ์ฌ์ง ํน์ ์ฌ์ง์ด ๋ค์ด์๋ ํด๋์์, ์ผ๊ตด์ ์ธ์ํฉ๋๋ค.face_detection
- ์ฌ์ง ํน์ ์ฌ์ง์ด ๋ค์ด์๋ ํด๋์์, ์ผ๊ตด์ ์ฐพ์ต๋๋ค.
face_recognition
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ์ฌ์ง ํน์ ์ฌ์ง์ด ๋ค์ด์๋ ํด๋์์, ์ผ๊ตด์ ์ธ์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๋จผ์ , ์ด๋ฏธ ์๊ณ ์๋(์ธ์ํ๊ณ ์ ํ๋) ๊ฐ ์ฌ๋์ ์ฌ์ง ํ ์ฅ์ด ํด๋์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ง ์ ๊ทธ ์ฌ๋์ ์ด๋ฆ์ ๋ด ์ด๋ฏธ์ง ํ์ผ์ด ๊ฐ๊ฐ ํ๋์ฉ ์์ด์ผ ํฉ๋๋ค:
๋ค์์ผ๋ก, ์๋ณํ๊ณ ์ถ์ ํ์ผ๋ค์ด ์๋ ๋ ๋ฒ์งธ ํด๋๊ฐ ํ์ํฉ๋๋ค:
๊ทธ๋ฐ ๋ค์, ์๊ณ ์๋ ์ฌ๋์ ํด๋์ ๋ชจ๋ฅด๋ ์ฌ๋์ ํด๋(๋๋ ๋จ์ผ ์ด๋ฏธ์ง)๋ฅผ ์ ๋ฌํ๋ face_recognition
๋ช
๋ น์ ์คํํ๋ฉด, ๊ฐ ์ด๋ฏธ์ง์ ์๋ ์ฌ๋์ด ๋๊ตฐ์ง ์ ์ ์์ต๋๋ค:
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
๊ฐ๊ฐ์ ์ผ๊ตด์ ๊ฒฐ๊ณผ๋ ํ ์ค๋ก ๋ํ๋ฉ๋๋ค. ๊ฐ ์ค์ ํ์ผ ์ด๋ฆ๊ณผ ์๋ณ๋ ๊ฒฐ๊ณผ์ธ ์ฌ๋ ์ด๋ฆ์ด ์ผํ๋ก ๊ตฌ๋ถ๋์ด ๋ํ๋ฉ๋๋ค.
unknown_person
์ ์ด๋ฏธ์ง ์์ ์๊ณ ์๋ ์ฌ๋์ ํด๋์ ์๋ ๊ทธ ๋๊ตฌ์๋ ์ผ์นํ์ง ์๋ ์ผ๊ตด์์ ์๋ฏธํฉ๋๋ค.
face_detection
๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง์์ ์ผ๊ตด์ ์์น (ํฝ์
์ขํ)๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
face_detection
๋ช
๋ น์ ์คํํ์ฌ ๊ฒ์ฌ ํ ์ด๋ฏธ์ง ํด๋ (๋๋ ๋จ์ผ ์ด๋ฏธ์ง)๋ฅผ ์ ๋ฌํ์ญ์์ค:
$ face_detection ./folder_with_pictures/
examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792
๊ฐ์ง๋ ๊ฐ ์ผ๊ตด์ ๋ํด ํ ์ค์ฉ ์ธ์ํฉ๋๋ค. ๊ฒฐ๊ณผ๊ฐ์ ์ขํ๋ ๊ฐ๊ฐ ์ผ๊ตด์ ์์ชฝ, ์ค๋ฅธ์ชฝ, ์๋์ชฝ ๋ฐ ์ผ์ชฝ ์ขํ (ํฝ์ ๋จ์)์ ๋๋ค.
๊ฐ์ ์ฌ๋์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ํญ๋ชฉ์ ์ป์๋ค๋ฉด, ์ฌ์ง์ ์๋ ์ฌ๋๋ค์ด ๋งค์ฐ ์ ์ฌํ๊ฒ ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ฉฐ ๋์ฑ ์๊ฒฉํ ์ผ๊ตด ๋น๊ต๋ฅผ ์ํด ๋ฎ์ ํ์ฉ์น(tolerance value)๊ฐ ํ์ํฉ๋๋ค.
--tolerance
๋ณ์๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ํ์ฉ์น ๊ฐ์ 0.6์ด๋ฉฐ ์ซ์๊ฐ ๋ฎ์ผ๋ฉด ๋์ฑ ์๊ฒฉํ ์ผ๊ตด ๋น๊ต๊ฐ ๊ฐ๋ฅํฉ๋๋ค:
$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
ํ์ฉ์น ์ค์ ์ ์กฐ์ ํ๊ธฐ ์ํด, ๊ฐ ์๋ณ์์์ ์ผ๊ตด ๊ฑฐ๋ฆฌ๋ฅผ ์๊ณ ์ถ๋ค๋ฉด --show-distance true
๋ฅผ ํตํด ๋ณผ ์ ์์ต๋๋ค:
$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/
/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
ํ์ผ ์ด๋ฆ์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๊ฐ ์ฌ์ง์ ์๋ ์ฌ๋๋ค์ ์ด๋ฆ๋ง์ ์๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค:
$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2
Barack Obama
unknown_person
์ฌ๋ฌ ๊ฐ์ CPU ์ฝ์ด๊ฐ ์๋ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ผ๊ตด ์ธ์์ ๋์์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, 4๊ฐ์ CPU ์ฝ์ด๊ฐ ์๋ ํ๊ฒฝ์์๋, ๋ชจ๋ CPU ์ฝ์ด๋ฅผ ๋ณ๋ ฌ๋ก ์ฌ์ฉํ์ฌ ๊ฐ์ ์๊ฐ ๋์ ์ฝ 4๋ฐฐ์ ์ด๋ฏธ์ง๋ค์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Python 3.4 ์ด์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ --cpus <number_of_cpu_cores_to_use>
์ ๋งค๊ฐ ๋ณ์(parameter)๋ฅผ ์ ๋ฌํ์ญ์์ค:
$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/
๋ํ --cpus -1
์ ์ ๋ฌํ์ฌ ์์คํ
์ ๋ชจ๋ CPU ์ฝ์ด๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
face_recognition
๋ชจ๋์ ๋ถ๋ฌ์(import) ๋จ ๋ช ์ค์ ์ฝ๋๋ง์ผ๋ก ์ผ๊ตด ์กฐ์์ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค!
API ๋ฌธ์: https://face-recognition.readthedocs.io.
import face_recognition
image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)
# face_locations is now an array listing the co-ordinates of each face!
์ด ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํด ๋ณด์ญ์์ค.
์ข ๋ ์ ํํ ๋ฅ ๋ฌ๋ ๊ธฐ๋ฐ์ ์ผ๊ตด ํ์ง ๋ชจ๋ธ์ ์ฑํํ ์๋ ์์ต๋๋ค.
์ฐธ๊ณ : ์ด ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋์ด๋ ค๋ฉด (NVidia์ CUDA ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํ) GPU ๊ฐ์์ด ํ์ํฉ๋๋ค. ๋ํ dlib
์ ์ปดํ์ผ๋งํ ๋ CUDA ์ง์(support)์ ํ์ฑํ ํ ์ ์์ต๋๋ค.
import face_recognition
image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")
# face_locations is now an array listing the co-ordinates of each face!
์ด ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํด ๋ณด์ญ์์ค.
์ด๋ฏธ์ง์ GPU๊ฐ ๋ ๋ค ๋ง์ ๊ฒฝ์ฐ, ์ผ๊ตด์ ์ผ๊ด์ ์ผ๋ก ์ฐพ์ ์๋ ์์ต๋๋ค.
import face_recognition
image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.
์ด ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํด ๋ณด์ญ์์ค.
import face_recognition
picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]
# my_face_encoding์ ์ด์ ์ด๋ ์ผ๊ตด๊ณผ๋ ๋น๊ตํ ์ ์๋ ๋ด๊ฐ ๊ฐ์ง ์ผ๊ตด ํน์ง์ ๋ณดํธ์ ์ธ ์ธ์ฝ๋ฉ์ ํฌํจํ๊ฒ ๋์์ต๋๋ค.
unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]
# ์ด์ `compare_faces`๋ฅผ ํตํด ๋ ์ผ๊ตด์ด ๊ฐ์ ์ผ๊ตด์ธ์ง ๋น๊ตํ ์ ์์ต๋๋ค!
results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)
if results[0] == True:
print("It's a picture of me!")
else:
print("It's not a picture of me!")
์ด ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํด ๋ณด์ญ์์ค.
๋ชจ๋ ์์ ๋ ์ฌ๊ธฐ ์ ์์ต๋๋ค.
- ์ฌ์ง์์ ์ผ๊ตด ์ฐพ๊ธฐ
- ์ฌ์ง์์ ์ผ๊ตด ์ฐพ๊ธฐ(๋ฅ ๋ฌ๋ ์ฌ์ฉ)
- ์ด๋ฏธ์ง ๋ชจ์์์ ์ผ๊ตด ์ฐพ๊ธฐ w/ GPU (๋ฅ ๋ฌ๋ ์ฌ์ฉ)
- ์น์บ ์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ ๋น๋์ค์ ๋ชจ๋ ์ผ๊ตด์ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ๊ธฐ (OpenCV๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ)
- ์๊ณ ์๋ ์ฌ๋๋ค์ ์ฌ์ง์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ง์์ ์ ์ ์๋ ์ผ๊ตด์ ์ฐพ๊ณ ์ธ์ํ๊ธฐ
- ์ฌ์ง ์์ ๊ฐ ์ฌ๋๋ค์ ์๋ณํ๊ณ ์ฃผ์์ ์์๋ฅผ ๊ทธ๋ฆฌ๊ธฐ
- ์ผ๊ตด ๊ตฌ๋ถ์ ์ฐธ/๊ฑฐ์ง ๊ตฌ๋ถ ๋์ ์ซ์๋ก ๋น๊ตํ๊ธฐ
- ์น์บ ์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ ๋น๋์ค์ ์ผ๊ตด ์ธ์ํ๊ธฐ - ๊ฐ๋จํจ / ๋๋ฆฐ ๋ฒ์ (OpenCV๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ)
- ์น์บ ์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ ๋น๋์ค์ ์ผ๊ตด ์ธ์ํ๊ธฐ - ๋น ๋ฅธ ๋ฒ์ (OpenCV๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ)
- ๋น๋์ค ํ์ผ์์ ์ผ๊ตด์ ์ธ์ํ๊ณ ์ ๋น๋์ค ํ์ผ์ ์์ฑํ๊ธฐ (OpenCV๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ)
- Raspberry Pi w/ camera์์์ ์ผ๊ตด ์ธ์ํ๊ธฐ
- HTTP๋ฅผ ํตํด ์ผ๊ตด์ ์ธ์ํ๋ ์น ์๋น์ค ์คํํ๊ธฐ (Flask๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ)
- K-nearest neighbors classifier๋ฅผ ํตํ ์ผ๊ตด ์ธ์ํ๊ธฐ
Python
์ด๋ face_recognition
์ ์ค์นํ ํ์ ์์ด ์คํํ ์ ์๋ ๋
๋ฆฝ์ ์ธ ์คํํ ์คํ ํ์ผ์ ๋ง๋ค๋ ค๋ฉด PyInstaller ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์
ํ๋ ค๋ฉด ์ด๋ ์ ๋์ ์ค์ ์ปค์คํ
์ด ํ์ํฉ๋๋ค. ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ด ์ด์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ์ผ๊ตด ์ธ์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๊ดํ ๊ธ: ๋ฅ ๋ฌ๋์ ํตํ ํ๋์ ์ผ๊ตด ์ธ์
- ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๊ณ ๋ฆฌ์ฆ์ด ์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง
- Adrian Rosebrock์ OpenCV, Python ๋ฐ ๋ฅ ๋ฌ๋์ ํตํ ์ผ๊ตด ์ธ์
- ์ค์ ๋ก ์ผ๊ตด ์ธ์์ ์ฌ์ฉํ๋ ๋ฒ
- Adrian Rosebrock์ Raspberry Pi ์ผ๊ตด ์ธ์
- Raspberry Pi์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง
- Adrian Rosebrock์ Python ์ผ๊ตด ํด๋ฌ์คํฐ๋ง by Adrian Rosebrock
- ๋น์ง๋ ํ์ต์ ์ฌ์ฉํ์ฌ ๊ฐ ์ฌ์ง์ ๋ํ๋๋ ์ฌ๋์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ง์ ์๋ ํด๋ฌ์คํฐํ๋ ๋ฐฉ๋ฒ
black box ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๋์ ์ผ๊ตด ์์น์ ์ธ์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์ถ์ผ์๋ค๋ฉด ์ด ๊ธ ์ ์ฝ์ผ์ญ์์ค.
- ์ผ๊ตด ์ธ์์ ๋ชจ๋ธ์ ์ฑ์ธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ํตํด ํ๋ จ์ด ๋์์ผ๋ฉฐ ๋ฐ๋ผ์ ์ด๋ฆฐ์ด์ ๊ฒฝ์ฐ์๋ ์ ์ ์ฉ์ด ๋์ง ์์ต๋๋ค. 0.6์ ๊ธฐ๋ณธ ์๊ณ ๊ฐ์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฆฐ์ด๋ค์ ์ผ๊ตด์ ๊ตฌ๋ถํ์ง ๋ชปํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
- ์์ ๋ฏผ์กฑ๋ง๋ค ์ ํ์ฑ์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ์ํค ํ์ด์ง ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
face_recognition
์ C++๋ก ์์ฑ๋ dlib
์ ์์กดํ๊ธฐ ๋๋ฌธ์, Heroku ๋๋ AWS์ ๊ฐ์ ํด๋ผ์ฐ๋ ํธ์คํ
์ ๊ณต ์
์ฒด์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ ๋ฐฐํฌํ๋ ๊ฒ์ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
๋ ์ฌ์ด ์์
์ ์ํด, Docker container์์ face_recognition
์ผ๋ก ๋น๋ ๋ ์ฑ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์ด repo์ Dockerfile ์์ ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Docker ์ด๋ฏธ์ง๋ฅผ ์ง์ํ๋ ๋ชจ๋ ์๋น์ค์ ๋ฐฐํฌํ ์ ์์ด์ผํฉ๋๋ค.
๋ค์์ ์คํํ์ฌ Docker ์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ๋ก ์๋ ํ ์ ์์ต๋๋ค: docker-compose up --build
GPU (๋๋ผ์ด๋ฒ >= 384.81) ๋ฐ Nvidia-Docker ๊ฐ ์ค์น๋ Linux ์ฌ์ฉ์๋ GPU์์ ์์ ๋ฅผ ์คํํ ์ ์์ต๋๋ค: docker-compose.yml ํ์ผ์ ์ด๊ณ dockerfile : Dockerfile.gpu
๋ฐ runtime : nvidia
ํ์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด github ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ธฐ ์ ์ ์ํค์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์น์ ์ ์ฝ์ด๋ณด์ญ์์ค.
dlib
๋ฅผ ๋ง๋ค๊ณ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ๋ ์ผ๊ตด ์ธ์ ๊ธฐ๋ฅ๊ณผ ์ผ๊ตด ์ธ์ฝ๋ฉ ๋ชจ๋ธ์ ์ ๊ณตํ Davis King (@nulhom) ์๊ฒ ๋ง์ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค. ์ผ๊ตด ์ธ์ฝ๋ฉ์ ์ง์ํ๋ ResNet์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ ํ์ธํ์ญ์์ค.- numpy, scipy, scikit-image, pillow ๋ฑ์ ๋ชจ๋ ๋ฉ์ง ํ์ด์ฌ ๋ฐ์ดํฐ ๊ณผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ผํ๋ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ฐ ์ข ๋ฅ์ ๊ฒ๋ค์ ํ์ด์ฌ์์ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ๋ง๋ญ๋๋ค.
- Cookiecutter ์ audreyr/cookiecutter-pypackage ํ๋ก์ ํธ ํ ํ๋ฆฟ ๋๋ถ์ ํ์ด์ฌ ํ๋ก์ ํธ ํจํค์ง ๋ฐฉ์์ด ๋ ๊ด์ฐฎ์ ์ก์ต๋๋ค.