※ image blending (이미지 합성)

• 지난 시간, image를 "number"와 "array"로 보는 관점을 알아보았다.

• 이번 시간에는 number와 array를 포함하여 이미지 = 여러 정보의 집합이라는 관점을 알아볼 것이다.

 지난 시간들에서의 관점에서는 이미지를 컨트롤하였기에 이를 상정하면?

우리는 이미지를 조작할 수 있다는 것이고 이미지 = 정보라는 관점(image = information)에서 보면?

즉, 이런 관점이면 우리는 이미지 정보를 조작할 수 있다는 것이다!

 

 

 

[실습] - blending 

<import 부분>

 

<찍은 2개의 사진 출력>

 

 

<frame1에 frame2를 blending>

이때,

crop = frame2[130:400, 150:400]

frame1[100:370, 200:450] = crop

plt.imshow(frame1)

에서 100:370에서 사이즈인 270이 동일해야 한다.

 

 

 

 

§ Alpha Blend (이미지가 있을 때, 이미지를 투명하게 만들어서 덮어씌움)

• 2개의 이미지가 있을 때, 한 이미지를 투명하게 만들어 덮어씌우는 것

• 위에서는 구역이 나뉘어져 있었지만 alpha blend의 경우, 같은 구역을 동시에 차지할 수 있다.

(정보를 일부 손실시키지만 공간을 효율적으로 쓸 수 있어 딥러닝에서 학습을 빠르게 하기위한 최적화시 사용)

구현방식 : alpha blending : frame1 x a  + frame2 x (1-a) 

 

 

 

 

 

 

[실습] - alpha blending 

 

 

 

 

 

 

 

 

 

 

 

 

 

※ image Masking (이미지 마스킹, 거름망)

Masking: 어떤 것을 막아주는, 걸러준다는 의미. , filter는 다른 의미. 우리가 익히아는 filter의 뜻 = masking

• image의 특정 부분을 까맣게 가리는 것.

• 원본source 이미지와 마스크 이미지가 존재

 

[실습] - Masking 

사각형 마스킹 구현방식 : 마스크 이미지[밝은 부분을 1, masking 부분을 0으로 만들어] 원본이미지와 곱한다.


 

[실습] - 원형 Masking

원형 마스킹 구현방식 : 사각형 마스킹 구현방식 + numpy 안의 meshgrid mgrid 이용

- np.mgrid[:H, :W] 을 이용

이진의 경우, plt는 1을 노란색, 0을 보라색으로 표현

- 따라서 H와 W는 다음과 같다.

이에 대한 코드는 아래와 같이 표현하여 출력할 수 있다.

 

 

 

 

 

 

 

 
-과제: gaussian 사용해보기 à 등고선처럼 화면의 밝기가 나옴
-과제: sigmoid 사용해보기 à 왼쪽을 밝고 오른쪽을 어둡게 와 같이 나옴

 

 

 

 

 

 

※ Finale _ 틀린그림 찾기

[실습] 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

• 지난 시간에는 image가 일종의 number로 생각하는 과정이었다.

https://chan4im.tistory.com/74

 

[Computer Vision].prev_ pixel과 RGB, HSV

※ Computer Vision • Computer Vision -> 자연어 처리 -> 오디오 부분 순으로 발전하였기에 가장 발전된 분야 • 시각적 세계를 해석하고 이해하도록 컴퓨터에 학습시키는 인공지능 분야로 컴퓨터를 이

chan4im.tistory.com

이번에는 image가 하나의 array라고 생각한다면 할 수 있는 방법들에 대해 배워볼 것이다.

 

 

※ image crop

• image는 일종의 "array"이므로 이런 image를 배열단위를 자르는 방식을 통해 자를 수 있다.

• 그렇다면 배열을 자르기 위해 어떤 방식을 사용할 수 있을까?

바로 slicing을 이용해 image 배열을 자를 수 있다.

구현방식: a = [1,2,3,4]  -->  a = [1, 4]로 만들려면?   =>   a[1:3]   (by. slicing) 

 

[실습] - crop

<import 부분>

 

 

 

 

 

 

 

 

※ image padding

원본 image의 바깥부분에 덧대는 방식으로 4가지 padding 기법을 소개한다.

zero-padding : 원본 image의 주위 값을 0으로 배치

mean-padding : 원본 image의 주위 값을 평균값으로 배치 (단, RGB는 R따로, G따로, B따로 평균)

reflect-padding : 데칼코마니 하듯이 뒤집어서 가져옴

symmetric-padding : 대칭되듯이 가져옴

1. zero-padding&nbsp; &nbsp;2. reflect-padding&nbsp; &nbsp; 3. symmetric-padding

 

구현방식 1: frame을 그대로 두고 이어 붙일 것을 concat 시킨다.

장점: memory 절약가능 (학습 시 많이 사용)

단점: 느리다.

 

구현방식 2: 새로 비어있는 큰 배열을 만들어 가운데 부분에 frame을 대입시킨다.

장점: 빠르다. (inference(추론), 즉 학습이 끝난 후 결과를 낼 때 많이 사용)

단점: memory가 비교적 많이 필요하다.

 

 

 

※ 배열의 축, axis이해하기.

배열에는 축이라는 개념이 있는데, 이 축이 헷갈리는 이유는 행렬개념과는 조금 다르게 받아들여야 하기 때문이다.

1차원 배열
먼저 1차원 배열의 경우, 축은 axis 0 하나뿐이다. (행열의 개념이 없음)
array([0, 1, 2, 3, 4 ,5])


2차원 배열
다음으로 2차원 배열의 경우, 축은 axis 0, axis 1 두 가지가 있다.
array([[0, 1, 2],
          [3, 4 ,5]])
위의 경우, 우리는 2행 3열로 배열을 해석하는데 행과 열에 대한 축의 매칭은 아래와 같다.
행: axis 0        열: axis 1
이때, 무작정 axis0을 행이라 외우는 것은 주의해야 한다. 고차원으로 갈수록 규칙이 깨지기 때문이다.


3차원 배열
다음으로 3차원 배열의 경우, 축은 axis 0, axis 1, axis 2  세 가지가 있다.
array([[[ 0, 1, 2, 3],
           [ 4 ,5, 6, 7],
           [ 8, 9, 10, 11]],

          [[12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]]]
)

위의 경우,  3행 4열의 행렬이 2층으로 배열을 해석하는데 행과 열, 높이에 대한 축의 매칭은 아래와 같다.
높이: axis 0        행: axis 1       열: axis 2
import numpy as np

arr1 = np.array([ [1, 2, 3], [10, 20, 30] ])
arr2 = np.array([ [4, 5, 6], [40, 50, 60] ])

np.concatenate((arr1, arr2), axis = 0)
array([[ 1,  2,  3],
       [10, 20, 30],
       [ 4,  5,  6],
       [40, 50, 60]])

np.concatenate((arr1, arr2), axis = 1)
array([[ 1,  2,  3,  4,  5,  6],
       [10, 20, 30, 40, 50, 60]])

 

 

 

 

 

[실습] - padding

 

 

 

 

 

 

※ translation

crop과 padding을 이용하여 사진을 옮길 수 있음 (정석적 방법은 아님)

• image를 100 pixel만큼 왼쪽으로 옮기고 싶다면?

-  frame을 slicing을 이용한 crop으로 자름 => [:, 100:]

- 그 후 padding

 

[실습] - translation

※ Computer Vision

• Computer Vision  -> 자연어 처리 -> 오디오 부분 순으로 발전하였기에 가장 발전된 분야

• 시각적 세계를 해석하고 이해하도록 컴퓨터에 학습시키는 인공지능 분야로 컴퓨터를 이용한 정보처리를 진행한다.

• 따라서 컴퓨터 비전은 정보를 데이터로 표현하기 매우 적절한 구조를 갖고 있다.

 

cf. 만약  It's late를 데이터로 표현하려면...?  (feat. 자연어 처리)
자연어의 경우, 자연어는 데이터로 표현하기 어려운데, (데이터를 많이 갖고 있기 때문)

예시에서 It's의 t와 late의 t가 똑같은 용도로 사용될까? 이런 저런 이유로 컴퓨터비전은 데이터를 표현하기 매우 좋다.

 

 

 

 

※ PASCAL VOC challenge 문제

초창기 이미지 dataset에 대해 인식성능을 겨루는 대회가 열렸고,

가장 대표적인 PASCAL VOC(Visual Object Classes) Challenge 로 이 대회를 기점으로 이미지 인식에서 다루는 문제들이 아래와 같이 정형화 되었다,

• Classification

• Detection

• Segmentation

 

 

Classification 

※ Classification 
특정 class에 해당하는 사물이 포함되어 있는지 여부를 분류하는 모델
classification은 Detection, Segmentation문제를 향한 출발점이기에 더더욱 중요하며 다음 2가지로 나눌 수 있다.

§ 단일 사물 분류 문제
- 모든 이미지가 반드시 하나의 사물만 존재
- 전체 class에 대한 confidence score  S를 비교, 가장 큰 confidence score를 지니는 class로 선정하는 방법

§ 복수 사물 분류 문제
- 이미지 상에 여러개의 사물들이 포함되어 있음
- 단순히 가장 큰 confidence score를 갖는 class 하나만을 선정하는 방법은 합리적이지 않게 된다.
- 방식이 조금씩은 다르나 class별 threshold를 정해놓고  S > threshold 일 때
==> "주어진 이미지 안에 해당 class가 포함되어 있을 것이다" 라고 결론지음

▶ 평가척도 
• accuracy  = 올바르게 분류한 이미지 수  /  전체 이미지 수
- accuracy는 classification문제에서 일반적으로 test를 위해 측정한다.
- 이 방법은 단일 사물 분류문제에서는 즉각사용해도 별 문제가 없다. 
- 하지만 복수 사물 분류문제에서는 곤란해질 수 있어서 아래와 같은 평가척도를 사용한다.

precision과 recall 은 class A에 대해 다음과 같이 측정한다.
precision = 올바르게 분류한 A 이미지 수  /  A로 예측한 이미지 수
recall = 올바르게 분류한 A 이미지 수  /  전체 A 이미지 수 

 

 

Detection

※ Detection 
image localization이라고도 불리며 classification에서 어느 위치에 포함되어 있는지 "박스형태"로 검출하는 모델을 만드는 것이 목표이다. 이 박스를 bounding box라 한다.



▶ 평가척도 IOU (Intersection Over Union)
• 사물의 Class와 위치의 예측결과를 동시에 평가해야해서 사물의 실제 위치를 나타내는 실제 bounding box (GT bounding box)정보와 예측 bounding box가 얼마나 "겹쳐지는지"를 평가한다.
Bp: 예측 bounding box
Bgt: GT bounding box
Bp와 Bgt의 IOU = Bp∩Bgt 영역넓이  /  Bp∪Bgt 영역넓이
보통 이에 대한 threshold를 0.5로 정해놓고 있으며 여러개의 bounding box가 모두 IOU를 50%를 넘겨 매칭되면
결과적으로 매칭에 실패한것으로 간주한다. (즉, 복수 개의 매칭이 되면 안된다.)

 

 

Segmentation

※ Segmentation 
어느 위치에 있는지를 "Pixel 단위로 분할"하는 것으로 Detection보다 더 자세하게 위치를 표시한다.
이미지 내 각 위치상의 Pixel들을 하나씩 조사, 조사대상 Pixel이 어느 Class에도 해당하지 않으면?
=> background Class로 규정하여 해당 위치에 0을 표기하고 이 결과물을 mask라 부른다.

§ Semantic Segmentation
- 분할의 기본단위: Class
- 동일한 Class에 해당하는 사물은 동일한 색상으로 예측하여 표시

§ Instance Segmentation
- 분할의 기본단위: 사물
- 동일한 Class에 해당하더라도 서로 다른 사물이면 다른 색상으로 예측하여 표시

▶ 평가척도 IOU (Intersection Over Union)
Ap: 예측 mask의 특정 Class 영역
Agt: GT(실제)  mask의 해당 Class 영역
Ap와 Agt의 IOU = Ap∩Agt 영역넓이  /  Ap∪Agt 영역넓이

 

 

 

 

 

※ Pixel (픽셀)이란?

• 픽셀을 이용해 정보를 표현하기에, 픽셀은 한 단위(unit)로 "인간이 정의한 것"이다. 

• 또한 pixel = brightness (밝기)를 이용해 표현하는데 이를 통해 알 수 있는 중요한 사실이 있다.

즉, 픽셀은 이미지의 최소단위이다! (픽셀이 나타내는 값 = 밝기.)

픽셀 함수에서 표현되는 데이터의 느낌과 정 반대가 있다.

vector(수학적 의미가 아닌, vision information 측면의 벡터), 벡터는 함수같은 형식


픽셀: noncontinuous (어떤 unit을 정해 vector의 특정 부분을 묶은 것)
벡터: continuous한 것


실제 존재하는 사물들은 vector자체로 저장하기는 너무 방대하고 연속적이기에

이를 grid로 모두 잘라 pixel로 하여 특정범위별밝기를 0.1, 0.9처럼 하여 그 값들을 data로 3, 23처럼 저장하는 것

이렇듯 pixel은 숫자여서 우리가 보고 있는 모든 것들을 숫자로 표현가능하기에 컴퓨터 비전이 발전할 수 있었다.

 

 

 

 

※ Pixel과 RGB

pixel은 숫자로 이루어져 있는데 그 크기가 1 Byte이다. (0~255의 숫자)
R(1 Byte)     G(1 Byte)     B(1 Byte) 이렇게 (1Byte)^3으로  총 1600만가지 색을 표현할 수 있다.


A(1 Byte): Alpha, 즉 투명도까지 이용한다면?

 

결과적으로 image는 4 Byte로 표현이 가능하며 이것이 바로 1 Pixel 이다.


 

[실습]

<import 부분>

import numpy as np
import cv2  # camera, image 등 conputer vision을 쓰기 위한 openCV
import numpy as np  # 빠른 계산을 위한 라이브러리
import matplotlib.pyplot as plt  # visualization을 위한 matplotlib
cap = cv2.VideoCapture(1)  # cap이라면 변수에 카메라 기능을 가져옴 0번이 전면 카메라
ret,frame = cap.read()  #ret은 성공, 실패, frame은 image frame
print(frame)

1번 카메라로 촬영한 사진을 데이터화한 것.

 

 

 

 

 

아래 사진처럼 frame[0][0][0]에 해당하는 숫자인 121이 uint8 즉, unsigned int 8bit값인 것을 알 수 있다.

따라서 정리하자면 frame이라는 변수는 uint 8bit의 집합 data로 이루어져있음을 알 수 있다.

( image type의  default 값은 uint8이다)

 

 

 

 

 

찍은 사진에 대해 출력을 해보자.

 

 

여기서 잠깐! 

실습을 하던 중 앞에서 배운 내용을 상기시켜보자.

image = 숫자라는 것이 중요하다 하였다.

 

Q. 그렇다면, 픽셀은 밝기를 대변하니까 frame x 2를 하면?

A. 밝기가 밝아진다!

다만, 기존의 255크기를 넘어설 수 있으며 (ex 150 * 2 = 300) 이때 overflow가 발생하기에

아래와 같은 방식을 사용한다.

 

 

 

 

 

 

 

※ Contrast와 Gamma

contrast: 대비, 밝은것을 더 밝게, 어두운것을 더 밝게! 2(frame-127)+127  (x절편 이하값은 손실 발생)

따라서 손실발생을 거의 없애주기 위해서 sigmoid 함수사용!

 

[과제]. sigmoid함수를 사용한 contrast해보기!

위 사진에서 보면 빨간색 부분이 손실되는 것을 알 수 있다.



Gamma (사진변수 / 255)^(감마)  x 255
감마가 높으면 변화량이 커지고 감마가 낮아지면 변화량이 낮아지는데, 선형 contrast보다 손실발생율이 거의 없어서 훨씬 사용에 유리하다.


cf. astype을 통해 형변환이 가능하다!

plt.imshow(frame에 대한 연산.astype(np.int32))

 

 

 

 

 

 

 

 

 

 

 

 

 

※ RGB와 HSV

RGB말고도 사용할 수 있는 색 공간이 있을까?


RGB의 color space: 정육면체형
HSV의 color space: 원뿔형이고, uint를 사용한다.

 - Hue: 0~179사이로 표현 ( pi값으로 value값 1당 2도를 의미 )

           모든 pixel이 색이 조금씩 바뀜 (각도의 이동)  /  hsv[..., 0]  , 0번 채널 즉, hue에 접근하는 것.

 - Saturation: 채도, 색의 농도, 클수록 진하다  /   plt.hsv[... , 1]  ,1이라는 것은 1번 채널만 본다는 뜻이다.

 - Value: 명도, 색의 밝기를 의미





[실습]







 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[과제 해보기]

 

+ Recent posts