스파르타 코딩클럽의 딥러닝 이미지 처리 수업을 기반으로 공부한 내용을 정리하고 있습니다.
해당 공부는 철저하게 개발자 입장에서 제품을 만들기 위한 시각 중심으로 머신러닝/딥러닝의 이미지 처리및 인식을 익히기 위한 것이다.
따라서 머신러닝과 딥러닝에 대한 심도깊은 설명보단 실제 제품 활용 위주로 정리할 예정!
이 유튜브 영상을 기반으로 나는 머신러닝 자체를 연구하기 위함이 아니라 제품을 만들기 위한 목적으로 접근 하려는 것이당
우선 블로그 내에 머신러닝과 딥러닝에 대해서 간략하게 정리한 글이 있으니 이를 참고하며 공부하려 한다.
-> 데이터가 많아지며, 빅데이터 개념이 등장하고 이에 따라서 기계 학습을 위한 다양한 가설을 추측하고 대처하며 결과값을 예측하고 기계를 학습 시킬 수 있게 된 것이다.
->"문제" 즉 우리가 분석하고자 하는 어떠한 모든 것은 입력(Input)과 출력(Output)으로 정의될 수 있다.
이러한 문제에 대한 출력값을 알기 위한 것이 "딥러닝 모델"이다. 딥러닝 모델은 입력을 넣으면 출력이 나오게 만드는 "알 수 없는 기계"(통칭 블랙박스)이다.. "알 수 없는 기계"안의 부품들은 컴퓨터가 만든 하나의 프로그램인 것이다.
우리는 이 알수없는 기계가 문제를 잘 풀어서 보다 정확한 출력값을 나오게 하기위해 가상의 부품들을 적절히 배치하고 이를 바탕으로 기계 스스로 보다 정확한 결과값을 위해 알아서 조립될 수 있도록 가이드를 주기 위해 "학습"을 하게 된다.
딥러닝에도 다양한 모델이 있다.
1) Deep Feedfoward Network (DFN) : 초기 버전의 대표적인 모델
2) Recurrent Neural Network (RNN) : 시간(순서와 단계가 있는 것)과 관련된 문제를 예측하기 위해
=> 개선형 : Long/Short Term Memory (LSTM)
3) Convolutional Neural Network (CNN)
: 합성곱이라는 연산 활용. 이미지 처리에 주로 활용되는 모델
-> CNN에 관련된 논문
4) Generative Adversarial Network (GAN) : 경찰과 위조지폐범으로 비유를 많이 한다.
-> GAN에 관련된 논문
Open CV 사용하기
-> OpenCV(Open Source Computer Vision) 패키지 안에는 사진과 동영상 파일을 로드하고 편집할 수 있는 기능들이 들어있다.
1. open cv를 import해오고 버전확인하기
아래와 같은 코드로 dlib과 tensorflow도 import해오고 버전 확인하기
2. 이미지 읽고 출력해보기
-> 아래와 같은 코드로 이미지를 읽고 출력할 수 있다.
-> 터미널을 통해 이미지를 숫자로 인식 코드를 출력한다.
3. 이미지 형태 알아보기
-> 높이와 너비는 이미지 가로 세로에서 픽셀의 갯수이다.
-> 채널은 색깔의 정보를 포함하고 있는 것이다. 채널들로 각 픽셀의 컬러를 표현할 수 있다.
각 픽셀의 BGR은 0에서 255까지의 값을 가지며 컴퓨터는 BGR을 적절히 섞어 다양한 색깔을 표현할 수 있는 것이다.
예1) B 255, G 0, R 0 → 파란색 예2) B 255, G 255, R 255 → 하얀색 예3) B 235, G 158, R 52 → 애매한 하늘색
4. 이미지를 창에 띄우기
->'img'는 이미지를 띄우는 창을 의미한다.
-> cv2.waitKey(0) 으로 설정하면 아무 키를 입력할 때까지 이미지를 띄운 창이 사라지지 않는다.
-> 위의 코드를 실행하면 아래와 같은 화면이 뜬다
-> 여기서 아래의 숫자들은 마우스 커서의 위치와 그 픽셀값을 의미하는 것이다.
5. 이미지 위에 도형그리기
-> 아래의 코드는 "img" 라는 이름으로 지정한 이미지 위에 도형을 그리기 위한 코드이다.
-> 아래의 코드는 cv.imread 아래, imshow 위에 기재해야 한다.
(내 추측이지만 우선 이미지를 읽고 도형을 그리고 최종 결과물을 보여줘야 하기 때문이 아닐까 싶다)
cv2.rectangle 함수는 직사각형을 그릴 수 있게 도와주는 함수이며, 각 파라미터들의 의미는
- img: 사각형을 그릴 이미지
- pt1: 사각형의 왼쪽 위 좌표
- pt2: 사각형의 오른쪽 아래 좌표
- color: 사각형의 색깔 (BGR 순서)
- thickness: 도형 선의 두께
-> 여기서 좌표의 개념에 대해서 정리해보자
왼쪽 가장 위를 (0,0)으로 생각하면, x로 갈수록 커지고, y로 갈 수록 세로가 커진다.
어떻게 보면 우리가 흔히 생각하는 좌표가 오른쪽 대각선 위로 갈 수록 수가 커지는데 그거를 뒤짚어서 오른쪽 대각선 아래로 갈수록 커진다고 보면된다.
-> 원을 그리고 싶을 때는?
- img: 원을 그릴 이미지
- center: 원의 중심 좌표
- radius: 원의 반지름
- color: 원의 색깔 (BGR 순서)
- thickness: 도형 선의 두께
-> 여기서 thickness를 활용하면, 도형의 안쪽에 색깔을 점점 칠해 줄 수 있게 된다. 바로 해당 수를 음수로 두면 되는 것이다.
6. 이미지 자체를 수정해보기
1) 이미지 자르기
: 이미지는 직사각형 형태로만 자르기가 가능하다. 따라서 사각형 영역 그릴 때 사용했던 좌표를 사용해서 이미지를 자를 수 있따.
아래의 코드는 y 축으로158에서 453까지 잘라야 하고, x 축으로 148에서 486까지 자른 것이다.
이미지를 자를 때는 y, x 순서로 쓴다.
더 알아보기! 이미지를 자를 때 y, x 순으로 쓰는 이유는 OpenCV가 이미지를 저장할 때 기본적으로 numpy 를 쓰기 때문입니다.
C 스타일의 언어에서는 y → x 순서로 사용하고 Fortran 스타일의 언어에서는 x → y 로 사용합니다.
OpenCV의 기본 함수들은 x → y 순서로 쓰기 때문에 이 부분이 혼란스러울 수 있지만 그냥 외워두시면 편해요!
2) 이미지 크기 변경하기
: 실제로 정해진 이미지 사이즈로 등록하라는 경우가 많아서 중요하다
cv2.resize 명령어를 사용하여 이미지의 크기를 자유자재로 변경할 수 있다. 이 코드는 img 를 가로 512, 세로 256 으로 크기를 변경하여 resized 에 저장하고 img_resized 의 미리보기하는 코드이다.
-> 여기서 imshow의 첫번째 변수 부분은 바로 두번째 변수로 지정한 이미지가 뜨는 윈도우 창의 이름이다.
따라서 이미지를 변경 처리해주고 다른 윈도우 창으로 뜨도록 설정해두면, 기존 이미지 창을 건드리지 않고 새로운 윈도우 창에서 확인할 수 있는 것이다.
3) 이미지 컬러 시스템 변경하기
이미지의 컬러 시스템에 대해서 이야기를 해야하는데 컬러 시스템은 색깔을 표현하는 방법입니다. 예를들면 BGR(파랑색, 초록색, 빨간색) 의 3가지 색깔을 섞어 색깔을 표현할 수도 있고, CMYK(하늘색, 분홍색, 노랑색, 검정색)의 4가지 색깔을 섞어 색깔을 표현할 수 있습니다.
일반적으로는 BGR 방식을 쓰고 있습니다.
이미지는 CMYK 방식에 대한 이미지이다.
위에서 설명했듯이 기본적으로 BGR 시스템을 주로 사용한다. 그러나 경우에 따라 RGB 시스템을 사용해야하는 경우도 있고, Lab 시스템을 사용해야하는 경우도 있다. 왜냐하면 모델을 만든 사람이 모델을 학습 시키면서 여러 컬러 시스템으로 변경하면서 학습을 시키는데 그 중 가장 정확도가 좋았던 컬러 시스템을 사용하기 때문이다.
따라서 일반적으로는 BGR시스템을 쓰다가 다른 시스템으로 변경하고 싶을 때는 아래의 코드를 참고하면 된다.
a. BGR 방식 -> RGB방식 ( 따라서 파랑과 빨강이 바뀌어서 이미지 컬러 시스템이 변경된다.)
b. BGR방식 -> GRAY(흑백사진모드)
7. 이미지 처리 심화 ( 이미지 위에 다른 이미지 합성하기)
우리가 배경 이미지 위에 띄울 오버레이 이미지(주사위)를 overlay_img(오버레이할 이미지 변수 명, 자유롭게 사용)에 저장하고, 똑같이 cv2.imread() 를 사용하여 이미지를 로드해오지만 주사위 이미지에는 cv2.IMREAD_UNCHANGED 를 뒤에 붙여줘야 한다.
오버레이 이미지는 확장자가 .png 인 배경이 투명한 이미지여야 합니다. cv2.imread()를 사용하여 png 이미지를 로드할 때는 꼭 cv2.IMREAD_UNCHANGED를 붙여줘야 배경 투명도를 유지한 상태로 로드가 되니 주의하세요!
- 투명도를 통해 이미지 합성하기
투명도(Alpha)
란? 간단하게 말해 각 픽셀이 얼마나 투명한지 나타내는 값이랍니다! 완전히 투명하면 0, 불투명하다면 255의 값을 가져요. BGR에 A까지 더해, 총 4개 채널을 이용하면 색 뿐만 아니라 반투명한 이미지, 바탕만 투명한 이미지, 픽셀의 색이 진할수록 불투명한 이미지 등 다양한 투명도를 나타낼 수 있어요.
-> BGR은 컬러만 표현해주지 투명도에 대해서는 알려주지 못함. 따라서 투명도를 표현해주는 A채널이 추가된 것이다.
->합성할 이미지 입장에서는 합성할 부분 제외하고는 모두 투명해야하고, 반대로 합성될 이미지는 새로운 이미지가 들어올 자리만 투명해야 한다. 즉 합셩될 이미지와 합성할 이미지의 적당한 위치들의 투명도가 0이 되어야 한다.
**최종코드
-> 합성 부분은 개념적으로 이해하는 것이 더 중요하다. 코드는 잘 기억해두고 필요할때마다 사용하면 개념에 대해 어느정도 잡힐 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import cv2
img = cv2.imread('이라졸정.jpg')
overlay_img = cv2.imread('dices.png', cv2.IMREAD_UNCHANGED)
#합성할 이미지를 지정
overlay_img = cv2.resize(overlay_img, dsize=(150, 150))
#합성할 이미지 리사이즈
overlay_alpha = overlay_img[:, :, 3:] / 255.0 # 합성할 이미지 투명도 조정
background_alpha = 1.0 - overlay_alpha # 합성될 이미지 투명도 조정
x1 = 100
y1 = 100
x2 = x1 + 150 #여기서 150은 합성할 이미지의 사이즈를 의미한다
y2 = y1 + 150
img[y1:y2, x1:x2] = overlay_alpha * overlay_img[:, :, :3]
+ background_alpha * img[y1:y2, x1:x2] cv2.imshow('result', img)
cv2.waitKey(0)
|
cs |
'Data' 카테고리의 다른 글
딥러닝_이미지 처리하기(2) (0) | 2020.12.04 |
---|---|
딥러닝_이미지 처리하기(1) (0) | 2020.12.03 |
[Intro]딥러닝_기본적인 기능(동영상 처리) (0) | 2020.11.26 |
딥러닝 이미지 처리_투명도/ 이미지 합성 (0) | 2020.11.26 |
open cv module 에러 (0) | 2020.11.26 |