728x90

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_image_display/py_image_display.html#display-image

 

Getting Started with Images — OpenCV-Python Tutorials 1 documentation

Getting Started with Images Goals Here, you will learn how to read an image, how to display it and how to save it back You will learn these functions : cv2.imread(), cv2.imshow() , cv2.imwrite() Optionally, you will learn how to display images with Matplot

opencv-python-tutroals.readthedocs.io

 

이미지를 가지고 시작해보자

 

목표

 

- 이 과정을 통해서 이미지를 읽는 방법과 화면에 띄우고 어떻게 저장을하는지 배워봅시다.

- 여기서는 다음과 같은 함수들을 사용하겠습니다. => cv2.imread(), cv2.imshwo(), cv2.imwrite()

- 옵션으로, matplotlib으로 이미지들을 표시할수도 있겠습니다.

 

 

 

1, opencv를 사용하여 이미지를 읽어보자

 

kimheungkook.jpg

 

 cv2.imread() 함수로 이미지를 읽을수 있습니다. 여기서 첫번째 매개변수는 이 이미지들은 작업 공간에 존재하거나 아니면 전체 경로를 전달해주어야 합니다.

 

 두번째 매개변수는 플래그로 이 이미지를 어떻게 읽을지 명시하게 됩니다.

 

- cv2.IMREAD_COLOR : 색상 정보를 가진 이미지로 읽습니다. 대신 투명 성분은 무시(디폴트 플래그)

- cv2.IMREAD_GRAYSCALE : 이미지를 그레이 스케일 모드(명암 영상)으로 읽어들입니다.

- cv2.IMREAD_UNCHANGED : 알파 채널(투명도)를 포함해서 이미지를 로드합니다.

 

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

print(img)

파일명 : 01_imread.py

- 상대경로시 작업 공간 경로를 기준으로 파일을 찾기때문에 그냥 절대 경로를 주었습니다.

 

- 읽은 img를 print로 출력했더니, 흑백 이미지 정보(2차원 배열- 명암)을 출력 합니다.

 

 

* Visual Studio Code(VS Code) pylint Module cv2 has no member - import cv2 에러 해결방법. 

 다음 링크를 참조하자

http://blog.naver.com/x21999/221254889848

 

 

 

2. 이미지를 출력해 보자

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

파일명 : 02_imshow.py

- imshow 함수로 image 라는 이름의 윈도우를 띄웁니다.

- waitKey(0)을 눌러 직접 키누를때까지 종료를 멈춥니다. 

- 이미지가 닫히면 존재하는 모든 윈도우 자원들을 해제합니다.

 

 

결과

 

 

 

3. 이미지 쓰기

 

 

import numpy as np
import cv2

# 이미지를 흑백 영상( gray scale)로 읽어봅시다.
img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)

cv2.imwrite('kimheungkook.png',img)

파일명 : 03_imwrite.py

- 위 코드를 실행하면 김흥국.jpg를 읽어들인 후 png 파일로 저장합니다.

 

=> 작업 공간 루트에 저장됨..

 

 

 

4. 정리하기

 

import numpy as np
import cv2

img = cv2.imread('/Users/jdo/git/python_vision/01day/kimheungkook.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0) # 키 입력을 받을떄 까지 기다립니다.
if k == 27:         # ESC 키가 눌리면 모든 이미지 자원들을 해제 합니다.
    cv2.destroyAllWindows()
elif k == ord('s'): # s를 누르면 저장 후 저원들을 해제 합니다.
    cv2.imwrite('kimheungkook.png',img)
    cv2.destroyAllWindows()

파일명 : 04_sumup.py

- 키 입력을 받을떄까지 이미지 띄우고 대기

- esc 를 누르는 겨우 자원 해제 후 종료

- s를 누르는 경우 png로 저장후 자원 해제 후 종료

 

* 다른 키를 눌러도 화면은 꺼지지만 정상적으로 자원이 해제되지 않습니다.

 

 

 

* 다음 부터는 아래로 작업 공간이 변경됩니다.

/Users/jdo/Documents/GitHub/opencv_python

300x250
728x90

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html#intro

 

OpenCV란?

 

 opencv는 1999년 gray bradsky가 개발하기 시작하여 2000년에 처음 배포된 라이브러리입니다. vadim pisarevsky가 opencv 팀에 합류하여, 2005년에서는 달파 그랜드 챌린지에서 차량 부분에 우승하게 되는데 여기서 사용되었습니다. 이들과 willow garage의 지원으로 개발이 계속 진행되고 있으며 컴퓨터 비전과 머신러닝 관련 수 많은 알고리즘들을 지원하고 있습니다.

 

 현재 opencv는 파이썬, 안드리오드 등 다양한 언어와 플랫폼에서 사용할수 잇도록 지원 중이며, cuda와 opencl을 이용하여 더 고속의 gpu 연산이 수행가능하게 되엇습니다.

 

 opencv-python은 opencv의 파이썬 API로 최고의 opencv C++ API와 파이썬이라는 언어가 결합된것이라 할수 있겠습니다.

 

 

 

 

 

OpennCV-python

 

 파이썬언 귀도 반 로섬이 처음 개발한 언어로 현재 간결함과 코드 가독성에 있어서의 강점으로 짧은 시간에 가장 대중적인언어가 되었습니다. 파이썬을 이용하면 개발다는 가독성이 저해되지 않은채로 짧은 줄로 아이디어들을 구현할수 있게 됩니다.

 

 C와 C++같은 다른 언어들과 비교하면 파이썬은 느리지만, 파이썬의 가장 큰 특징은 C/C++을 추가할수 있다는 점인데, 이는 C/C++에서 좋은 계산성능 을 가진 코드들을 파이썬 래퍼를 이용해서 파이썬 모듈로서 사용할수 있습니다. 이 기능은 두가지 장점이 있는데, 첫째는 C/C++ 코드 만큼 빠르게 구현가능하다는 점이고, 두번째는 파이썬은 코딩하기 쉬운 장점이 있습니다. 그래서 실제로는 c++로 구현하고, 파이썬 래퍼를 이용해 그 코드를 사용하는것이 opencv-python의 동작 방법이라 할 수 있겠습니다.

 

대부분의 작업에서 넘파이가 사용됩니다. 넘파이는 수치 연산을 위한 고수준 최적화 라이브러리인데, 이들은 매트랩 문법들을 따르며, 모든 오픈시브이의 배열 구조들은 넘파이 배열로부터 변환된것이라 할수 있겠습니다. 여러분들이 넘파이로 할수있는 모든 연산들은 opencv에 추가할수도 있습니다. 이 외에도 Scipy, matplotlib같은 다른 라이브러리도 넘파이를 지원하고 있습니다.

 

 그래서 Opencv-python은 컴퓨터 비전 문제를 빠르게 프로토타이빙하기 위한 적절한 도구라고 할수 있겠습니다. 

 

 

 

 

 

 

OpenCV는 여러분이 ㅍㅣ료해요

 

 opencv는 진취적인 오픈소스이다보니, 이 튜토리얼에서도 물론 기여할수 있는 모든 사람들을 환영합니다. 

 

 이 튜토리얼에서 잘못된 부분을 찾는다면 편하게 고쳐주세요.

 

오픈 소스를 처음 시작하는 사람에게는 좋은 훈련이 될겁니다. 그냥 openv를 깃헙에서 포크하고, 필요한 부분들을 고치고, opencv에 풀 리퀘스트를 요청해 주세요. opencv 개발자들이 여러분들이 작성한 요청들을 확인보고 피드백을 줄겁니다. 이후 리뷰어들에게 허가를 받아 통과하면 opencv에 머지될겁니다. 그러면 여ㄹㅓ 분들은 opencv의 컨트리뷰터가 되었습니다.

 

 

 

 

300x250
728x90

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

 

항상 공부를 하다보면

 

이론적인 내용과 예제 실습을 얼마나 오프셋을 조절하는게 좋을까 고민이된다.

 

그런 문제로 아까 베이 교수님 자료를 했다면 이번에는 opencv-python 튜토리얼을 정리해보았다.

 

하고싶을때 vscode터럼 조금씩 해나가고자 한다.

 

 

 

opencv-python 튜토리얼 목차

 

1. opecv 소개

 1.1 opencv-python 튜토리얼 소개

 1.2 윈도우에서 설치하기

 

2. opencv에서 gui 기능들

 2.1 영상과 함께 시작하기

 2.2 비디오로 시작하기

 2.3 opencv로 그리기 함수 사용하기

 2.4 마우스를 페인트 브러쉬로 사용해보자

 2.5 트랙바를 색상 팔레트로 사용하기

 

 

3. 핵심 연산

 3.1 이미지에 대한 기본적인 연산들

 3.2 이미지에 대한 산술 연산

 3.3 성능 측정 및 개선 기술들

 3.4 opencv의 산술 도구

 

 

4.영상 프로세싱

 4.1 색상 공간 변환

 4.2 이미지의 기하 번환

 4.3 이미지 임계화

 4.4 이미지를 부드럽게 만들기... 이미지 스무딩

 4.5 모폴로지 변환

 4.6 이미지 그라디언트

 4.7 캐니 에지 검출

 4.8 이미지 피라미드

 4.9 opencv로 윤곽선들을 만들기

 4.10 히스토그램

 4.11 이미지 변환기술들

 4.12 탬플릿 매칭

 4.13 허프 직선 변환

 4.14 허프 원 변환

 4.14 워터셰드 알고리즘을 이용한 이미지 분할

 4.15 그랩컷 알고리즘을 사용한 인터렉티브 포어그라운드 추출

 => 굳이 정리하자면 그랩컷알고리즘을 이용해서 즉시 전반부 물체를 추출

  => 물체를 따라 그리면 해당 물체가 추출되는 방법을 말하는것 같다.

 

 

5. 특징 검출과 기술

 5.1 특징 이해하기

 5.2 해리스 코너 검출

 5.3 시-토마시 코너 검출기와 좋은 특징을 추적하기 shi-tomasi corner detector

 5.4 SIFT 소개. 크기 불변의 특징으로 변환

 5.5 SURF 소개. 고속 강인 특징

 5.6 코너 검출을 위한 Fast 알고리즘. 

 5.7 BRIEF이진 강인 독립 요소 특징 .. (Binary Robust Independent Elementary Features)

 5.8 ORB Oriented Fast and Rotated BRIEF 방향을 가진 Fast와 회전을 가진 BRIEF ?

  => 아무튼 두 알고리즘을 조합한 특징검출 기술

 5.9 특징 매칭

 5.10 물체 검출을 위한 특징 매칭과 호모그래프 찾기

 

 

6. 영상 분석

 6.1 민시프트와 캠시프트

 6.2 옵티컬 플로우

 6.3 배경 제거

 

 

7. 카메라 캘리브레이션과 3차원 복원

 7.1 카메라 켈리브레이션

 7.2 자세 추정

 7.3 에피폴라 기하학

 7.4 스테레오 이미지로부터 깊이맵 구하기

 

 

8. 머신러닝

 8.1 K-최근접 이웃

 8.2 서포트 벡터 머신 SVM

 8.3 K-평균 클러스터링

 

 

 

9.  컴퓨터 포토그래피

 * 컴퓨터 포토그래피 : 광학 프로세스 대신 디지털 계싼을 통해 얻은 이미지 캡처 및 처리 기술

 => 필름을 이용했을때 못했던 기능들을 말함

 9.1 이미지 노이즈 제거

 9.2 이미지 인패이팅

 

 

10. 물체 인식

 10.1 하르 케스케이드를 이용한 얼굴 검출

 

 

 

11. opencv-python 바인딩

 11.1 어떻게 Opencv-Python 바인딩이 동작할까?

 

 

 

으악 목차만 해도 왜이렇게 많나..

 

 

 

 

 

 

300x250
728x90

광류 지도의 한계

- 물체의 궤적 정보 가지나 명시적이지 않음

 

물체 추적을 위해서 할일

- 광류 맵 -> 궤적 특징 추출 -> 궤적 정보 변환

=> 물체 추적

 

 

KLT 추적 알고리즘

- 카나드 루카스 광류 추정 알고리즘 기반 물체 추적 알고리즘

1. 모션 벡터로부터 특징 추출

2.특징이 가려지거나 영사압ㄲ에 나간 경우 실종 처리

 

 

 

물체 추적의 예시

 OpenCV 3.4.1 에서 제공하는 물체 추적 알고리즘 : BOOSTING, MIL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE and CSRT

- python + cpp 예제 링크 : https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/

 

 

300x250
728x90

광류

- 시간 t축에 인접한 두 영상 사이의 명암 변화를 다룸

-> 움직임 정보 추정

 

 

광류 추정 알고리즘

- 현재 화소가 t+1시간의 어느화소와 매칭이되는지 찾기

- 아래의 그림은 광류 지도와 광류 벡터 예시

 

https://www.researchgate.net/figure/Optical-flow-map-and-motion-vector-graph-of-the-spatial-sequences_fig11_261342598

 

 

 

광류 추정 원리

- 일반적인 영상은 매우 크며, 잡음 존재 -> 적절한 모델로 변환 필요

- 밝기 향상성 가정 활용 : 두 영상간 같은 지점은 명암이 비슷

1. 시간 간격이 짧다면 테일러 전개로 근사

2. 광류 조건식 optical flow constraint equation 취득

  광류/그라디엍트 조건식(미방) <- 영상의 y축 변화(모션벡터) * v + 영상의 x축 변화(모션벡터) * u + 영상의 t축 변화 = 0

3. 광류 추정 알고리즘(ex. Lucas-Kanade or Horn-Schunck알고리즘)으로 모션 벡터 계산

  * but. 모션 벡터들을계산해도 v, u는 결정 불가

- 아래의 그림은 광류 추정 알고리즘

https://www.researchgate.net/figure/Optical-flow-map-computed-by-different-methods-a-Lucas-Kanade-b-Horn-Schunck-c_fig3_328750324

 

 

 

 

루카스 카나드 알고리즘

- 특정 화소 주위의 윈도우의 광류는 동일함을 가정

- 루카스 카나드 알고리즘에서 광류 예시 : 윈도우 내부의 픽셀들은 동일한 모션 벡터를 가짐

 

 

 

 

루카스 카나드 알고리즘 파이썬 실습

- 아래의 링크에서 광류 추정 알고리즘 예제 제공

https://www.datasciencecentral.com/profiles/blogs/implementing-lucas-kanade-optical-flow-algorithm-in-python

 

함부르크 택시 예제

1. 입력 영상

 

2. 중간 과정 

 

3. 출력 영상 = 원본 + 옵티컬 플로우

 

 

300x250
728x90

영상 = 동적 비전

- 움직이는 이미지를 영상 image seuqence나 동영상 video

-> 동적 비전

 

프레임

- 동영상의 각 영상

 

동적 비전이 하는일

- 영상 안의 물체 정보 추출

 

컴퓨터 비전과 3차원

- 활용가능성이 크게 늘어남

-> ex. 축구장 3차원 비전

- 아래의 그림은 2차원 사진으로부터 3차원 복원 과정을 보여줌

https://www.researchgate.net/figure/Voxel-carving-approach-for-3D-reconstruction-Process-with-4-cameras-around-the-subject_fig1_262362824

 

동적 비전의 난이도

1. 움직이는 물체 인식 -> 자동 소등 장치

2. 물체 갯수 파악 -> 교통량 측정, 동전 세기

3. 물체 추적 -> 감시

4. 물체 동작 인식 -> 감시

5. 비디오 검색 -> 이미지로 영상 찾기

6. 장면 이해 ->자율주행

 

7. 3차원 공간 재구성 ->스포츠 중계

https://www.researchgate.net/figure/Voxel-carving-approach-for-3D-reconstruction-Process-with-4-cameras-around-the-subject_fig1_262362824

 

 

 

 

영상의 특성

- 공간 일관성 spatial coherence : 특정 화소와 주위 화소가 유사

- 시간 일관성 temporal coherence : 시간의 변화에 대한 연속 영상에서의 픽셀끼리 비슷

 

 

 

동적 비전의 종류

1. 차영상

2. 모션 필드

 

 

차영상 difference image

- 시간 t와 t+1에서의 영상간의 차이 영상

 

 

 

3차원 공간의 3차원 투영

- 현실의 3차원 공간은 투영 중심을 통해 2차원 영상으로 투영됨

- 아래는 이를 간략화 한 핀홀 카메라 모델

 

 

 

 

 

모션 필드  motion field = 동작장

- 연속된 두 영상 사이의 모션 벡터 v

- 모든 점에서의 모션 벡터 v의 지도 => 모션 필드

- 아래의 예시는 이동한 사각형 사이의 모션 장을 보여줌

http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT12/node3.html

 

 

모션 필드의 문제

- 물체가 가만히 있더라도 회전이나 광원 이동에 따라 모션 필드가 변할 수 있음

 

 

 

 

300x250
728x90

사례 인식

- 어떤 종류에 속하는 특정한 사례가 인식의 대상

- 아래의 그림은 개구리와 기차에 대한 모델이 존재할때, 아래의 사진이 입력된 경우 사진 요소들의 사례 인식 

 

 

 

 

이전의 사례 인식 연구

- 다른 물체에 의해 가려지거나 뒤틀려진 경우를 고려하지 않은 단순한 경우들을 연구

=> 실제 환경에서는 다른 물체로 가려지거나 찌그러질수도 있음.

 

사례 인식을 위한 방법

1. 전통적인 방법

- 기하학적 인식

2. bag of words 단어 가방

 

 

 

 

 

 

 

 

 

기하 정렬

- 한 물체에 대해 일관적인 매칭 쌍 모음

 -> 물체가 여러 종류인 경우에는 어떻게 다룰까?

 

기하 정렬 알고리즘 구성

- 2 단계로 구성

1. 모델 구축 단계 

 검출 관심점 전처리 -> 특징 벡터 추출 -> 관련 정보와 저장 = 특징 집합 P

  -> P의 워소들을 인덱싱(해싱이나 kd트리)

2. 인식 단계

  기능 : 영상이 입력 됨 -> 존재 물체 물체 판단 -> 기하변환 행렬 계산 및 출력

   입력 영상서 관심점과 특징 벡터 추출 -> 각 물체 분류의 매칭쌍 리스트 추출 -> 매칭쌍 리스트로 기하 정렬 수행 

  -> 기하 변환 행렬 취득 -> 기하변환 행렬이 임계치를 넘으면 해당 분류의 물체가 인식된것으로 판단

* 기하 정렬 수행 알고리즘 : RANSAC 활용 => 입력 매칭쌍 리스트, 출력 기하 변환 행렬

기하 정렬의 예시

 

 

 

 

 

 

 

 

 

기하 정렬의 한계와 정보 이론

- 기하 정보의 한계 : 계산 시간이 오래 걸림

- 개선 방안 : 기존의 정보 검색 이론을 활용

- ex. 정보 검색 엔진은 빠르게 질의어로 문서를 찾아줌

 

 

정보 검색의 원리

- 문서를 빈도 벡터로 변환하여 간략화

=> 단어 집합에 있는 단어가 문서에서 나오는 횟수를 벡터로 표현

 

 

텍스트 문서를 빈도 벡터로 바꾸기

- 텍스트 문서

 doc1 길동은 농구와 탁구를 좋아한다.

 doc2 농구 선수나 탁구 선수가 되길 원하는 학생이 많다.

 

- 사전 : [길동, 농구, 탁구, 좋아하다, 선수, 되길 원하다, 학생, 많다]

 

- 벡터

  1. v1 = {1, 1, 1, 1, 0, 0, 0, 0}

  2. v2 = {0, 1, 1, 0, 2, 1, 1, 1}

 

 

 

 

 

 

 

 

 

 

단어가방 Bag of Words 이란

- 정보 검색에서의 경우 문서를 단어 벡터로 만들어 표현하는 방식

 

정보 검색 알고리즘

- 정보 검색의 핵심 연산 -> 문서간 유사도 측정

- doc1과 doc2의 유사도를 구할수 있으면 됨

 => doc1과 doc2는 비교하기 어려우므로 , v1과 v2를 비교

 

단어 빈도 벡터 term frequency vector

- v1, v2처럼 단어의 횟수를 나타내는 벡터.

- tf 벡터라고도 함

 

 

 

 

 

 

 

 

 

tf-idf 벡터

- tf term frequency: 단어 빈도

 -> 아래의 경우 정규화된 단어의 빈도수

- idf inverse document frequency : 역문서 빈도

 -> log (전체 문서 갯수 / i번째 단어가 나온 문서의 갯수)

- tf-idf 벡터는 정규화된 단어 빈도와 역문서 빈도로 아래와 같이 정의

  => 많이 나온 단어에 더 큰 가중치를 줌(정규화 단어빈도) + i번째 단어 문서가 적다면 높은 가중치(역문서 빈도) 

 

두 tf-idf 벡터간 유사도 측정

- 두 벡터의 유사도 = 두 벡터 사잇 각 코사인 => 코사인 유사도

- 질의 된 문서의 벡터와 k번째 문서의 벡터 사이 유사도는 아래의 식으로 계산 가능

 

 

 

 

 

영상에서의 단어 가방

- 영상에서의 단어 후보 : 에지, 영역, 관심점

 => 최적의 단어 : 관심점 + 기술자 <-> 문제점 : 특징은 크기도 크고 많으므로 계산량이 매우 커짐

- 개선 방안 : 가까운 특징 벡터들을 중 하나를 대표 단어로 사용.

 

벡터 양자화

- 특징 공간을 임의의 d 개로 나누는 작업

=> 군집화 알고리즘이 사용(ex. k-means)

 

시각 단어 visual word

- 특징 공간 상의 각 구간에 대한 대표 특징 벡터

-> 시각 단어의 갯수 = 사전의 크기는 d개

 

시각 단어 사전 구축하기

1. 영상에서 특징과 기술자 검출

2. 벡터 양자화를 수행

3. 클러스터링 하여 대표 특징 벡터 획득 -> 시각 단어로 사용

4. 각 분류에 대해 tf-idf 벡터 계산

 

 

영상 인식

- 입력 영상에서 특징 벡터 추출

- 사전에 존재하는 분류중 하나인 경우 유사도가 비슷함

- 사전에 없는 부류라면 모든 시각 단어와 유사성이 낮음 -> 인식 못하는 특징 벡터(시각 단어)

 

 

 

 

 

300x250
728x90

얼굴인식

- 얼굴 인식에서는 두 단계로 이루어짐

- 1. 얼굴 검출, 2. 얼굴 인식

 

 

특징 벡터 수집 방법

- 이전에 봤던 특징 벡터를 수집하는 방법을 다시 되돌아 보면 다음의 3가지가 존재

1. 일정 영역

2. 슬라이딩 윈도우

3. 지역 특징

 

 

 

얼굴 검출 알고리즘들

- 신경망을 이용하여 추출하는 방법

- SVM을 사용하는 방법

- 비올라 존스 알고리즘

 

신경망으로 얼굴 검출

- Retinal Connected Neural Network, 1996

- 입력 영상을 피라미드 영상으로 변환 -> 다양한 크기 얼굴에 대처

- 20 x 20 크기의 슬라이딩 윈도우를 이동하며 얼굴 판단.

 * 윈도우로 전처리 -> 신경망 입력 -> 얼굴 여부 판단 

 

https://arxiv.org/pdf/1404.1292.pdf

 

 

SVM으로 얼굴 검출하는 경우

https://www.researchgate.net/figure/Block-diagram-of-the-face-detection-system_fig1_228351802

 

 

 

 

비올라 존스 알고리즘 개요

- SVM, 신경망 같은 복잡한 분류기 사용

- 비올라 존스 알고리즘은 유사 하르 특징 Haar-like feature  사용

- 분류기는 단순 결정 트리를 직렬 연결 -> 직렬 분류기 cascade of classifier

- 빠른 특징 추출을 위해 적분영상 사용

 

 

유사 하르 특징

- 에지, 선 등 추출하기 위해 다음의 유사하르 특징 연산자들을 사용

 

비올라 존스 알고리즘을 이용한 특징 검출 예시

- 4개의 유사 하르 연산자 사용 -> 4개의 하르 연산자들을 조합 조합하여 많은 특징 추출 가능

- 4가지 유사 하르 연산자와 유사 하르 연산자들의 조합을 통한 특징 추출 예시 1

https://eehoeskrap.tistory.com/95

- 유사 하르 연산자들의 조합을 통한 특징 추출 예시 2

https://www.semanticscholar.org/paper/A-comparative-study-between-LBP-and-Haar-like-for-Kadir-Kamaruddin/3ec98dabbcf440db746d4baf6550e44e12c5ee76/figure/1

 

 

비올라 존스 알고리즘으로 구한 결과 경우의 수

- 24 x 24 얼굴 영상의 경우 4 유사 하르 연산자를 조합한 경우

 => 160,000개의 서로 다른 특징 추출 가능

 

 

 

적분 영상

- 명암 영상을 합한 결과 영상 -> 빠르게 특징 추출 가능

- 특정 픽셀까지 모든 화소들의 합 => 적분 영상에서의 값

- 가로 2 x 세로 4 크기의 블록의 합을 구하려면 8개의 픽셀 값이 필요 

 => 적분 영상 사용시 4개의 픽셀 값들을 이용하면 구할 수 있음.

 

 

비올라 존스 알고리즘과 적분 영상

- 모든 유사 하르 연산자들은 적분 영상으로 추출

https://www.sciencedirect.com/science/article/pii/S2468067216300116

 

비올라 존스 알고리즘으로 얼굴 검출

- 위는 얼굴 상에 존재하는 유사 하르 특징을 찾는 과정

- 하지만 얼굴 크기가 작거나 위치가 다른 경우를 대처하기 위한 방법이 필요

-> 슬라이딩 윈도우 사용 : 24 x 24 윈도우를 몇 픽셀씩 이동시킴. 아다부스트로 얼굴 여부 판단

-> 윈도우 확대 : 영상 마다 얼굴 크기가 다르므로 1.25배씩 확대

300x250
728x90

분류 앙상블 classifier ensemble

- 하나의 분류기만으로는 성능이 부족.

- 여러 분류기들을 활용하여 더 나은 성능으로 문제 해결하는 개념

https://www.geeksforgeeks.org/ensemble-classifier-data-mining/

 

 

기본 분류기 base classifier

- SVM, 신경망 등 분류기 -> 강한 분류기

 

앙상블과 약한 분류기

- 분류 앙상블에서는 여러개의 약한 분류기들을 사용

 ex. 기초 분류기 : 신경망 -> 약한 분류기 : 성공률이 50%인 퍼셉트론

 

앙상블에서 분류기들의 결합 방법

- 분류기들 간 투표 -> 가장 많은 표를 받은 분류기 결과 반영

 

 

 

 

샘플링 방법

- 리샘플링 : 동일한 샘플들을 어러번 사용

- k겹 교차 검증 : 전체 샘플들을 k 등분 하고, k-1개 부분집합을 학습, 나머지 1개 부분집합으로 성능 평가

- 부트스트래핑 : k겹 교차 검증과 동일하나 샘플들 사이 중복을 허용

https://specialscene.tistory.com/26

 

 

 

 

 

 

부트스트랩

- 샘플들을 k개로 나눌 시 샘플들의 중복을 허용하여 훈련

https://yashuseth.blog/2017/12/02/bootstrapping-a-resampling-method-in-statistics/

 

 

분류 앙상블 기법

1. 배깅

2. 부스팅

3. 아다부스팅

4. 랜덤 포래스트

 

 

배깅 bagging

- 확장한 부트스트랩 bootstrap aggregating => 부트스트랩을 다중 분류기에 적용한 기술

- 사용한 샘플들을 다시 넣어(재샘플링) 학습에 사용

- 부트스트랩핑으로 재샘플한 데이터셋으로 약한 분류기들을 학습 -> 투표하여 결과를 선정

https://gaussian37.github.io/ml-concept-bagging/

 

 

 

 

부스팅 boosting

- 배깅보다 정교하게 재샘플링을 수행한 앙상블 기법

 * i번쨰 분류기와 i + 1번쨰 분류기간 연관성을 가진 샘플들로 학습 수행

- 처음에는 맞는 샘플들, 틀린 샘플들로만 분류하다가 이후에 이들이 혼합된  복잡한 데이터셋으로 학습

 

 

 

아다부스트 Adaboost

- 각 분류기 마다 가중치가 큰 샘플들을 잘 맞출수 있도록 학습

1. 아래의 그림과 같이 +와 -가 가능한 가장 잘 구분되도록 분류기들을 학습

2. 맞춘 샘플들은 가중치를 낮추고, 틀린 샘플들의 가중치를 높임

3. 약한 분류기들의 틀린 샘플 오류 합을 구하여 강한 분류기 취득

=> 틀린 샘플들은 높은 가중치를 가지면서 격리됨

 

 

 

 

 

 

 

랜덤 포레스트 random forest

- 부스팅 기법에서 분류기들은 상호 보완

- 랜덤 포레스트에서 분류기들은 서로 독립됨

- 기본 분류기는 트리 분류기 사용. 트리의 각 노드들은 특징 하나를 비교하여 분기 시킴.

- 아래의 그림은 특징 벡터가 주어질떄 분류하는 과정

https://www.geeksforgeeks.org/decision-tree-introduction-example/

 

300x250
728x90

분류기 일반화 성능

- 다음의 샘플이 주어질 떄, 다양한 분류 모델이 제공될 수 있음.

- 학습 과정을 통해 분류기는 학습 데이터들을 가장 분류하는 H2로 수렴함 => 일반화 성능이 가장 좋음 

https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0

 

SVM

- 기존의 분류기들은 오류 최소화(최소 제곱법 least square method)하는 방향

- 서포트 벡터 머신은 오류 최소화 + 마진 최대화 하여 일반화 능력을 극대화 시킨 알고리즘

- 선형 회귀 모델을 다루는 선형 SVM과 비선형 모델을 다루는 비선형 SVM이 존재

 

 

선형 SVM

- 이진 분류 binary classification 수행하는 결정 초평면 decision hyperplane에 대한 식은 아래와 같이 정리할 수 있음.

- 결청 초평면을 이용한 선형 분리

 

 

선형 SVM과 결정 초평면 hyperplane

- 여백 margin을 최대화 화는 결정 초평면의 기울기 w를 구해야 함

 => 최적화 문제로 다루게 됨

- 서포트 벡터 support vector : 여백의 크기를 결정하는 샘플들

 => 서포트 벡터까지의 거리가 최대로 되도록 조절하는 결정 초평면 찾기

 

 

SVM과 최적화 문제

- 결정 경계 decision boundary와 서포트 벡터까지의 거리가 1이 되도록 한다면 다음과 같이 정리 가능

-아래와 같이 학습 집합을 정의

- 모든 샘플들을 올바르게 분류하는 결정 초평면 hyperplane 찾기

 => 조건부 최적화 문제 constrained optimization problem이 됨

- 아래의 조건이 주어질때 등호가 성립하는 경우가 서포트 벡터

- 최적화 문제를 다음과 같이 정리


라그랑주 승수와 조건부 최저화

- 위 조건식에 라그랑주 승수 alpha_i를 부여

- 함수 L을 w와 b로 미분후 0으로 정리. 

 

- KKT Karush-Kuhn-Tuckker 조건식을 유도하여 정리하면, 아래의 식을 최대화 하는 라그랑주 승수를 구하는 문제가 됨.

 

 

선형 SVM과 비선형 SVM

- 결정 초평면으로 선형 분리가 불가능 한 경우도 존재

https://stackoverflow.com/questions/44606126/linear-svm-vs-nonlinear-svm-high-dimensional-data

 

 

비선형 SVM

- 2차원 공간(input space)에서 선형 분리가 불가능 한경우, 3차원의 공간(feature space)에선 결정 평면 decision surface로 선형 분리가 가능

- 아래의 그림과 같이 매핑 함수 Phi를 사용하여 3차원 공간으로 확장 가능

- 매핑 함수를 이용해 조건부 최적화를 다루는 목적  함수로 정리 가능

- 매핑 함수는 고차원이라 실제로는 사용 불가 -> 매핑 함수의 내적인 커널 함수로 사용 가능

300x250

+ Recent posts