๋ฐ์ดํ„ฐ๋ถ„์„๊ฐ€ ๊ณผ์ •/Tensorflow

DAY70. Tensorflow Face detection (1)face landmark

LEE_BOMB 2021. 12. 29. 17:10
๋”ฅ ๋Ÿฌ๋‹ ์ ์šฉ ์ด๋ฏธ์ง€ ๋ถ„์„ ์ ˆ์ฐจ

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)

 

68 LandMark Centralization

 

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)

CNN ๋ชจ๋ธ ๊ตฌ์กฐ

ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ์…‹(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