카메라 스티커 앱 만들기
링크텍스트# 카메라 스티커 앱
목표
< 일단 그냥 만들어 보자 >
{얼굴인식 카메라의 흐름 이해}
{dlib라이브러리 사용}
{이미지 배열의 인덱싱 예외 처리}
{x,y좌표 수정을 통해서 벌어지는 상태를 보기}
배울 것
- 필수 기술
- 프로젝트 수행 과정
- OpenCV활용 과 Image Pyramids
- SVM
필수 기술
- 동영상 처리, 검출, 키포인트 추청,추적, 카메라 원근 기술을 다룹니다.
- landmark or alignment: 얼굴 각각 위치를 찾아내는 기술
- 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->크기 키움
-
detector -> bounding box추출
dlib detector- dlib.rectangles타입 객체 반환
dlib.rectangless- left(), top(),
right(),bottom(),height(),width()함수를 포함 -
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좌표는 원본 이미지의 경계값으로 수정
+) 그리고 적용
-
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
:다목적 머신러닝 모델로 선형, 비선형 분류, 회귀 이상치 탐색에도 사용이됩니다. 고로 복잡한 분류 문제에 잘 맞거나 작거나 중간 크기의 데이터 셋에 적합하다.
-
선형 SVM
: 두 클래스가 확실하게 구분이됨
- 라진 마진 분류: 선형 SVM 중에서 가장 클래스 사이의 폭이 넓다.
-서포트 벡터: 도로 경계에 위치한 샘플에 의해 전적 결정되고 특성의 스케일에 민감하여 스케일을 조정하면 결정 경계가 좋아짐
- 하드 마진 분류
:도로 바깥쪽에 올바르게 분류가 된 상태: 선형적 구분이 된 상태이어야함 :이상치에 민감하다
- 소프트 마진 분류 :하드마진 분류 단점을 극복하여 도로의 폭을 넓게 유지하고 마진 오류 사이에 적절한 균형을 잡아주는 분류.
코드로 보기
- 비선형 SVM분류: 비선형 SVM을 특성추가하여 선형으로 보통 바꿔서 한다: PolynomialFeatures 변환기와 StandardScaler, LinearSVC연결하여 pipeline만들기: moons데이터 셋에 적용한다(make_moons)
- 코드 구현
-
다항식 커널
: 커널 트릭을 이용하여 적용.(특성을 추가하는 기법은 아니다 하지만 효과는 몇 배)
: 코드로 구현
: coef0 - 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절
: C- 결정 경계 폭을 결정(과대적합인 경우를 규제함)
![](https://media.vlpt.us/images/qsdcfd/post/dd237383-681f-45a9-84df-595c9c1f977d/image.png)
-
유사도 특성
- 랜드마크(landmark) : 비선형 특성을 다루는 또다른 기법
0 : 랜드마크와 아주 멀리 떨어짐 1 : 랜드마크와 같은 위치
- 유사도 함수(similarity function): 얼마나 닮았는지 측정
- 가우시안 방사기저 함수(가우시안 RBF) : 유사도 함수로 정의함. 단점은 훈련 셋이 클 경우 동일크기의 아주 많은 특성이 생김공식:
코드 :
Author And Source
이 문제에 관하여(카메라 스티커 앱 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qsdcfd/카메라-스티커-앱-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)