[AIFFEL] 22.Jan.17 - OpenCV, Pillow, Loss functions, Optimizers

Deok Jong Moon·2022년 1월 17일
0
post-thumbnail

오늘의 학습 리스트

LMS

  • 이미지가 RGB인 3가지로 구분 되는 이유
    : 우리의 시세포가 대부분 그렇게 3가지로 이루어져 있단다.

  • 라스터(raster), 비트맵(bitmap) 형식

    • 8비트로서 2^8인 0~255 숫자로 이루어진다.
    • 픽셀 하나하나 마다의 값을 저장한다.
    • 확대하면 깨진다
  • 벡터(vector) 형식

    • 상대적인 점과 선의 위치를 방정식으로 기록해둔다.
    • 확대 혹은 축소하면 그것에 맞게 재계산해서 보여준다.
    • 그래서 확대하면 안 깨진다.(예 : 폰트)
  • 이와 또 다른 이미지 파일 기록 형식들이 있다.

    • YUV
    • HSV(Hue 색상, Saturation 채도, Value 명도)
  • 이러한 RGB, HSV 등은 각각의 컬러 스페이스(colour space)에서 채널로서 나타난다.

  • JPEG, PNG

    • jpeg는 이미지 내 근처 화소들을 묶어 비슷한 색으로 뭉뚱그려서 압축 및 저장함
    • 그래서 jpeg는 축소, 확대 여러번 거치면 지저분해짐
    • png는 색상 손실 없이 이미지 압축
    • 이미지에 사용된 색상을 정의하고 이것을 참조하는 팔레트 방식 사용 가능
    • 그래서 크기가 작은 이미지는 png가 jpeg보다 더 용량이 작을 수 있으나, 크기가 커지면 png가 더 용량 큼
  • png를 jpg로 .save()하려면 먼저 RGBA에서 A를 discard 하거나 img파일변수명.convert('RGB')로 바꿔줘야 한다.

  • np.ndarray.reshape(order=) order 파라미터에 'F'를 주면 fortran-like 순서로 인덱싱해서 reshape한단다.
    : 직관적으로는 어레이가 있을 때 어떤 모양이 되어야 하는지 잘 생각해보고 order 모양에 맞게 주라는 뜻

  • OpenCV는 BGR 순서이다.

  • "Pillow의 실습에서 보았든, 이미지는 결국 [너비, 높이, 채널] 형태를 가지는 배열이고"

    • 이게 헷갈린다...
    • 정리를 하자면
      1) 이미지 세계에서는 (너비, 높이, 채널)로 나타내는 것 같다.
      2) 근데 Numpy 기준에서는 두 가지로 볼 수 있는데,
      • 첫째는 Numpy를 이용하는 사람의 입장
        • 이거는 (높이, 너비, 채널) 이렇게 이해한다.
      • 둘째는 Numpy 자체의 입장
        • 이거는(차원, 높이, 너비) 이렇게 이해한다.
      • 그래서 사람 기준의 이미지 배열을 Numpy 어레이로 만들고 해석한다면
        :(여러장 쪼개진(차원화된) 높이, 옆으로 뉘어진 너비, 앞에서 보면 평면으로 붙어있는 채널)로 이해하면 될 것 같다.
  • cv.inRange(이미지변수명, lower_boundary, upper_boundary) 넣으면 해당 부분에 들어가는 건 1, 아닌 건 0으로 처리한 배열을 반환한다.

  • cv2.bitwise_and() 등은 0,1로 이진숫자를 기준으로 이미지 영역에서 합집합, 교집합 등을 반환해준다.(https://copycoding.tistory.com/156) 이 분이 직관적으로 잘 정리해주셨다.

    • bitwise_and : 둘 다 흰색(1) 부분만 흰색(1)으로 나타냄
    • bitwise_or : 둘 다 검정(0) 부분만 검정(0)으로 나타냄
    • bitwise_not : 한 그림을 정반대로 바꿈(1 -> 0, 0 -> 1)
    • bitwise_xor : 둘 다 같으면 검정(0), 다르면 흰색(1)으로 나타냄
      • 예) 둘 다 0이면 0, 둘 다 1이어도 0
  • list().append(리스트)하면 리스트 통째로 들어간다. 근데 이걸 np.concatenate()하면 그걸 다 풀어서 numpy array로 만들어준다.

lis = []
t = np.arange(4).reshape(4,-1)
t2 = t.copy()
lis.append(t)
lis.append(t2)
lis

>>>
[array([[0],
        [1],
        [2],
        [3]]),
 array([[0],
        [1],
        [2],
        [3]])]

np.concatenate(lis)
>>>
array([[0],
       [1],
       [2],
       [3],
       [0],
       [1],
       [2],
       [3]])

Deep ML

  • SGD

  • Momentum

  • Adam
    -> 이런 optimizer의 종류를 처음으로 알았다.
    -> 이들의 작동 원리도 알아야겠다.

  • Softmax 함수

    • 수식의 원리
    • 주의할 점
      • Softmax에 들어가기 전 실제 값은 서로 간의 차이가 별로 크지 않을 수 있는데, 이것이 exponential 함수에 들어가서 작은 차이도 궁극적 output간 차이는 굉장히 커진다.(예 : 값들이 0과 1에 더 가까워 지면서 양극화된다)
      • 이 점을 주의해서 해석할 것
profile
'어떻게든 자야겠어'라는 저 아이를 닮고 싶습니다

0개의 댓글