카메라 스티커 앱 만들기

매일 공부(ML)·2021년 9월 30일
0

Simple toy project

목록 보기
2/19

링크텍스트# 카메라 스티커 앱

목표

< 일단 그냥 만들어 보자 >
{얼굴인식 카메라의 흐름 이해}
{dlib라이브러리 사용}
{이미지 배열의 인덱싱 예외 처리}
{x,y좌표 수정을 통해서 벌어지는 상태를 보기}

배울 것

  1. 필수 기술
  2. 프로젝트 수행 과정
  3. OpenCV활용 과 Image Pyramids
  4. SVM

필수 기술

  1. 동영상 처리, 검출, 키포인트 추청,추적, 카메라 원근 기술을 다룹니다.
  2. landmark or alignment: 얼굴 각각 위치를 찾아내는 기술
  3. Object detection기술: 얼굴의 위치 찾기
    3.라이브러리 dlib
    +)face detector
    HOG feature
    +)SVM
    sliding window
    위의 두 가지를 통해서 얼굴을 찾는다

프로젝트 수행 과정

-Very simple process

1.얼굴 사진 준비
2. bounding box -> face landmark 찾기
3.찾아진 영역-> 왕관 스티커 붙이기

<단계별 얼굴인식>
1. 모든 얼굴 찾기(face detection)(by Python + dlib)
2. 얼굴의 위치교정(Posing) 과 투영(Projection) [by face landmark estimation]
3.얼굴 인코딩 [얼굴 구별하는 단계,embeddings이용]
4. 인코딩에서 사람의 이름찾기[이번 프로젝트랑 관련X,SVM이용]

-Deep process-
1. 디렉토리 구조 세팅
2. 사용할 이미지 + 스티커 이미지 저장
3. matplotlib -> opencv와 노트북 출력 for 이미지 처리
3-1)opencv-BGR / matplotlib,dlib - RGB
4.색깔보정 처리{By cvtColor()}이용하기
5. dlib -> hog detector
Perameters
+)hitThreshold:옵션이고 평면과 물체 사이의 거리 설정값
+)이미지 피라미드의 수 :이미지->unsampling->크기 키움

  1. detector -> bounding box추출

    dlib detector- dlib.rectangles타입 객체 반환
    dlib.rectangless- left(), top(),
    right(),bottom(),height(),width()함수를 포함

  2. bounding box로 잘라낸(crop)얼굴 이미지 이용
    -->이목구비 위치 알아냄 by face landmark localization기술
    -->face landmark localization
    +)top-down: bounding box찾고 box내부의 keypoint 예측
    +)bottom-up: keypoint 먼저 찾고 군집화해서 box생성
    --> 얼굴 이미지 이목구비 위치 찾기 (by 68개)
    8.Dlib의 제공되는 모델 이용
    +)weight file 다운
    +) 압푹 풀어서 이용
    +)저장 landmark모델 부르기
    +)RGB이미지, dlib.rectangle 입력->dlib.full_object_detection반환
    +)parts()함수이용
    +)tuple(x,y) 68개로 이루어진 리스트 만들기
    +)68개의 랜드만크가 얼굴 개수만큼 저장
    9.스티커 적용하기
    -위치 지정 방식
    i)코 중심을 기준으로 높이 X 이상 그리기(비율로 거리 계산)

    ii)눈썹 위 n픽셀 위에서 스티커 구현

    -스티커 이미지 resize

    -원본 이미지에 스티커 이미지 추가를 위해 x,y좌표 수정

    -음수 생길 시 예외처리
    +) -y크기만큼 스티커 자르기(crop)
    +) top의 y좌표는 원본 이미지의 경계값으로 수정
    +) 그리고 적용

  3. bounding box와 landmark제거 하면 최종 결과 나온다.

OpenCV활용 과 Image Pyramids

1.opencv - 영상 관련 업계 표준 라이브러리
-> import cv2

2.cv.imread(fileName, flag): 함수를 이용하여 이미지 파일 읽기,파일 경로:절대/상대.

 +) filName(str):이미지 파일의 경로
  +)flag(int)-이미지 파일을 읽을 때의 Option
           -cv.IMREAD_COLOR:Color러 읽음,투명부분무시,default
           -cv.IMREAD_GRAYSCALE:Grayscale로읽기,중간처리단계
           -cv.IMREAD_UNCHANGED:alpha channel포함하여 읽음

3.cv2.imshow(title,image):이미지 파일 보여줌

  +) title(str)-윈도우 창의 Title
   +) image(numpy.ndarray)-cv2.imread()의 return값
      -cv2.waitKey():Keyboard입력 대기 함수
      -cv2.destroyAllwindows():화면에 나타난 윈도우 종료

4.cv2.imwrite(fileName,image):변환된 이미지나 동영상 저장

      +)fileName(str)-저장된 파일명
      +)image-저장할 이미지
      

5.Image Pyramids
: 동일 이미지의 서로 다른 사이즈를 설정하는 것
:종류는 Gaussian Pyramids 와 Laplacian Pyramids
:Laplacian Pyramids는 축소,확장시 동일 원본 추출 불가
:특징
+)2개의 이미지를 각각 Load함.
+)각 이미지에 대해서 적당한 Gaussian Pyramid를 생성함.
+)Gaussian Pyramid를 이용하여 Laplacian Pyramid를 생성함.
+)Laplicain Pyramid를 이용하여 각 이미지의 좌측과 우측을 결함
+) 결함한 결과중 가장 작은 이미지를 확대하면서 동일 사이즈의 결합결과와 Add하여 외곽선을 선명하게 처리함.

6.cv2.pyrDown():행과 열이 2배씩 감소

7.cv2.pryUp(): 행과 열이 2배씩 증가

SVM

:다목적 머신러닝 모델로 선형, 비선형 분류, 회귀 이상치 탐색에도 사용이됩니다. 고로 복잡한 분류 문제에 잘 맞거나 작거나 중간 크기의 데이터 셋에 적합하다.

  1. 선형 SVM

    : 두 클래스가 확실하게 구분이됨

  • 라진 마진 분류: 선형 SVM 중에서 가장 클래스 사이의 폭이 넓다.

-서포트 벡터: 도로 경계에 위치한 샘플에 의해 전적 결정되고 특성의 스케일에 민감하여 스케일을 조정하면 결정 경계가 좋아짐

  • 하드 마진 분류
    :도로 바깥쪽에 올바르게 분류가 된 상태
        : 선형적 구분이 된 상태이어야함
        
        :이상치에 민감하다
    
        
  • 소프트 마진 분류 :하드마진 분류 단점을 극복하여 도로의 폭을 넓게 유지하고 마진 오류 사이에 적절한 균형을 잡아주는 분류.
코드로 보기

  1. 비선형 SVM분류: 비선형 SVM을 특성추가하여 선형으로 보통 바꿔서 한다: PolynomialFeatures 변환기와 StandardScaler, LinearSVC연결하여 pipeline만들기: moons데이터 셋에 적용한다(make_moons)
  • 코드 구현
  1. 다항식 커널

    : 커널 트릭을 이용하여 적용.(특성을 추가하는 기법은 아니다 하지만 효과는 몇 배)

    : 코드로 구현

    : coef0 - 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절

    : C- 결정 경계 폭을 결정(과대적합인 경우를 규제함)

        ![](https://velog.velcdn.com/images%2Fqsdcfd%2Fpost%2Fdd237383-681f-45a9-84df-595c9c1f977d%2Fimage.png)
        
  2. 유사도 특성

  • 랜드마크(landmark) : 비선형 특성을 다루는 또다른 기법
       0 : 랜드마크와 아주 멀리 떨어짐
       
       1 : 랜드마크와 같은 위치
       
  • 유사도 함수(similarity function): 얼마나 닮았는지 측정
  1. 가우시안 방사기저 함수(가우시안 RBF) : 유사도 함수로 정의함. 단점은 훈련 셋이 클 경우 동일크기의 아주 많은 특성이 생김공식:
         

코드 :

      
profile
성장을 도울 아카이빙 블로그

0개의 댓글