DAY70. Tensorflow Face detection (1)face landmark
๋ฅ ๋ฌ๋ ์ ์ฉ ์ด๋ฏธ์ง ๋ถ์ ์ ์ฐจ
STEP 01
Data Crawling (Selenium) ์ด๋ฏธ์ง ์๋ฃ ์์ง
STEP 02
1) Face Detection (dlib) ์ผ๊ตด ์ธ์
HOG (Histogram of Gradient Face Detection) : ์ด๋ฏธ์ง์์ face ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ
* HOG : ๋์ ์์ญ์ ์ผ์ ํฌ๊ธฐ์ ์ ๋ก ๋ถํ ํ๊ณ , ๊ฐ ์ ๋ง๋ค edge ํฝ์ (gradient magnitude๊ฐ ์ผ์ ๊ฐ ์ด์์ธ ํฝ์ )๋ค์ ๋ฐฉํฅ์ ๋ํ ํ์คํ ๊ทธ๋จ์ ๊ตฌํ ํ ์ด๋ค ํ์คํ ๊ทธ๋จ bin ๊ฐ๋ค์ ์ผ๋ ฌ๋ก ์ฐ๊ฒฐํ ๋ฒกํฐ
2) ์ผ๊ตด ์ ๋ ฌ(Face Alignment)
3) API Install
python3.8์ ๊ฐ์ํ๊ฒฝ์์ cmake ์ค์น
(base) > conda activate tensorfow
(tensorflow) >pip install cmake
dlib ์ค์น : 68 ๋๋๋งํฌ ์ธ์(์ผ๊ตด์ธ์)
(tensorflow)> pip install C:\ITWILL\5_Tensorflow\tools\dlib-19.19.0-cp38-cp38-win_amd64.whl
scikit-image ์ค์น : image read/save
* openCV library ๋์ฒด ๊ฐ๋ฅ
(tensorflow) > pip install scikit-image
4) 68 landmark ๋ฐ์ดํฐ์ ๋ค์ด๋ก๋/์์ถํ๊ธฐ
http://dlib.net/files์์ shape_predictor_68_face_landmarks.dat.bz2 ๋ค์ด๋ก๋
ํ์ฌ ์์ ์์น์ ์์ถ ํ๊ธฐ
STEP 03 Deep Learning (Tensorflow)
ํ๋ จ ๋ฐ์ดํฐ ์ (Training Dataset) : ๋ชจ๋ธ์ ํ๋ จํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ (์ ๊ฒฝ๋ง : ๊ฐ์ค์น, ๋ฐ์ด์ด์ค)
์ ํจ์ฑ ๋ฐ์ดํฐ ์ (Validation Dataset) : ๋ชจ๋ธ์ Hyper Parameter๋ฅผ ํ๋ ํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ (๋ชจ๋ธ ์ต์ ํ)
๊ฒ์ ๋ฐ์ดํฐ ์ (Test Dataset) : ๋ชจ๋ธ์ด ์์ ํ ํ๋ จ ๋ ํ์ ๋ง ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์ (์ค์ ์ ๋ฌด ๋ฐ์ดํฐ)
image ์ผ๊ตด์ธ์๊ณผ 68 point landmark ์ธ์
1. dlib + scikit-image ์ค์น : ๊ฐ์ํ๊ฒฝ(tensorflow)
๋จ๊ณ1 : ํจํค์ง ์ค์น
(base) > conda activate tensorfow
(1) cmake ์ค์น : dlib ์์กด์ฑ ํจํค์ง ์ค์น
(tensorflow) >pip install cmake
(2) dlib ์ค์น : 68 ๋๋๋งํฌ ์ธ์(์ผ๊ตด์ธ์)
(tensorflow) >conda install ํ์ผ๊ฒฝ๋ก/dlib
(3) scikit-image ์ค์น : image read/save
(tensorflow) >pip install scikit-image
๋จ๊ณ2 : 68 ํฌ์ธํธ ๋๋๋งํฌ data ๋ค์ด๋ก๋
(1) ๋ค์ด๋ก๋ :http://dlib.net/files
shape_predictor_68_face_landmarks.dat.bz2
(2) lecture01 ์์ถํ๊ธฐ
(3) images ํด๋ ์ ๊ณต
import dlib #face detection/face landmark
from skimage import io #image read/save
from glob import glob #dir ํจํด๊ฒ์(*jpg)
import os #๊ฒฝ๋ก์ค์ , ํด๋์ด๋
ํด๋ ์ด๋
os.chdir(r'C:\ITWILL\5_Tensorflow\workspace\chap07_Face_detection\lecture01_face_landmark')
path = os.getcwd() #ํ์ฌ ๊ฒฝ๋ก
fpath = path + "/images" #celeb image ์์น
fpath2 = path + "/croped_images" #croped image ์ ์ฅ ์์น
hog ์ผ๊ตด ์ธ์๊ธฐ(์๊ณ ๋ฆฌ์ฆ)
face_detector = dlib.get_frontal_face_detector()
hog ์ผ๊ตด ์ธ์๊ธฐ ์ด์ฉ - 68 point landmark ๊ฐ์ฒด ์์ฑ
face_68_landmark = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
i = 100 #[์ถ๊ฐ] image file
for file in glob(fpath+"/*.jpg") : #ํด๋์์ ์์๋๋ก jpg ํ์ผ ์ฝ๊ธฐ
image = io.imread(file) #image file ์ฝ๊ธฐ
print(image.shape) #image ๋ชจ์
#์๋์ image ํ์
win = dlib.image_window()
win.set_image(image) #1์ฐจ : ์๋ณธ ์ด๋ฏธ์ง ํ์
#image์์ ์ผ๊ตด์ธ์
faces = face_detector(image, 1) #๋๋ฒ์งธ ์ธ์=1 : ์
์ํ๋ง ํ์
print('์ธ์ํ face size =', len(faces))
'''
์
์ํ๋ง ํ์ : ๋ ๋ง์ ์ด๋ฏธ์ง๋ฅผ ์ธ์ํ๊ฒํ๋ค. ๋ณดํต 1 ์ง์
'''
#image ํฌ๋กญ(crop) & file save : 68 point ๊ธฐ์ค ์๋ฅด๊ธฐ
for face in faces : # 1๋ช
-> 1ํ ๋ฐ๋ณต
i += 1 #[์ถ๊ฐ]
print(face) #๊ฐ์ง๋ image ์ฌ๊ฐ์ ์ขํ
print(f'์ผ์ชฝ : {face.left()}, ์ : {face.top()}, ์ค๋ฅธ์ชฝ : {face.right()}, ์๋ : {face.bottom()}')
#์๋์ ์ผ๊ตด ํ์ : face ์ฌ๊ฐ์ ์ขํ ๊ฒน์น๊ธฐ
win.add_overlay(face) # 2์ฐจ : ์ด๋ฏธ์ง ์์ ์ผ๊ตด ๊ฒน์น๊ธฐ
#face ์ฌ๊ฐ์ ์์ 68 point ๊ฒน์น๊ธฐ
face_landmark = face_68_landmark(image, face)
win.add_overlay(face_landmark) #3์ฐจ : 68 ํฌ์ธํธ ๊ฒน์น๊ธฐ
#[์ถ๊ฐ] ํฌ๋กญ(crop) : ์ผ๊ตด ๋ถ๋ถ๋ง ์๋ฅด๊ธฐ : image file save
crop = image[face.top():face.bottom(), face.left():face.right()] #image[h,w]
#croped images svae
io.imsave(fpath2 + "/croped" + str(i) + ".jpg", crop)
#croped101.jpg, croped102.jpg
croped image resize(100x100)
from glob import glob #file ํจํด(*, ?)์ผ๋ก ์กฐํ : (*.jpg)
from PIL import Image #image file read : image resize
from skimage import io #image save
import numpy as np #array ์์ฑ
import os #ํด๋ ๊ฒฝ๋ก/์ด๋
ํด๋ ์ด๋
os.chdir(r'C:\ITWILL\5_Tensorflow\workspace\chap07_Face_detection\lecture01_face_landmark')
path = os.getcwd() #ํ์ฌ ๊ฒฝ๋ก
fpath = path + "/croped_images" #image path
croped image -> 100x100
def imgReshape() :
img_reshape = [] #image save
for file in glob(fpath + "/*.jpg") : #jpg file ์ ํ
img = Image.open(file) #image read
#image ๊ท๊ฒฉํ
img = img.resize( (100, 100) ) #image resize
#PIL -> numpy
img_data = np.array(img)
print(img_data.shape)
img_reshape.append(img_data)
return np.array(img_reshape) #list -> numpy
ํจ์ ํธ์ถ
img_reshape = imgReshape()
print(img_reshape.shape) #(26, 100, 100, 3) - (size, h, w, c)
[์ถ๊ฐ] images show & save
import matplotlib.pyplot as plt
size = img_reshape.shape[0]
for i in range(size) : #0 ~ 25
img = img_reshape[i]
plt.imshow(img)
plt.show()
#image save
io.imsave(fpath + '/croped'+str(i+101)+"_resize"+".jpg", img)
#croped101_resize.jpg, croped102_resize.jpg