[논문 정리] Oh, "Deep Visual Discomfort Predictor for Stereoscopic 3D Image", TIP(2018)

공부/읽은 논문 정리|2020. 3. 12. 16:28

이 논문에서 제안하는 스테레오스코픽 3D(stereoscopic 3D, S3D) 이미지 시각 불편도 예측(visual discomfort prediction, VDP) 모델은 다음과 같은 알고리즘을 갖고 있다. 

 

1) 훈련셋에 속하는 S3D 이미지들을 로컬 패치로 분할한다.

2) 각 로컬 패치의 의사품질점수를 기존의 S3D-VDP 모델로 얻는다.

3) 로컬 패치들과 그것들의 의사품질점수들을 이용해서 로컬 패치의 품질 점수를 예측할 수 있는 패치 기반 CNN 모델을 훈련시킨다.

4) 훈련된 패치 기반 CNN 모델에 훈련셋의 S3D 이미지의 로컬 패치들을 입력해서 패치당 200개의 특성을 얻는다.

5) 하나의 S3D 이미지 내의 로컬 패치들마다 얻은 200개의 특성을 로컬 특성 종합 레이어에 통과시킴으로 800개의 특성이 되게 해준다. 800개의 특성과 MOS 값을 이용해서 회귀 함수를 훈련시킨다. 이 과정에서 패치 기반 CNN 모델의 가중치들도 재보정된다. 

<양육쇼크>, 좀 더 과학적인 양육법은?

일상/독후감|2020. 3. 11. 07:32

아래 글은 2017년 어느날에 <양육쇼크>를 읽고 적은 독후감입니다. 

-----


우리 가정의 임신 소식을 듣고 결혼식 날 주례해주신 목사님 가정이 며칠 전에 이 책을 선물해주셨다. 총 9권의 책을 선물해주셨는데, 대부분 양육에 관한 책이다. 이제 내 책장에 새로운 분야의 책들이 꽂혀가면서 결혼과 임신을 더욱더 실감하게 되는 것 같다. 여러 권 중에서 이 책을 먼저 읽어봐야겠다는 생각이 든 것은 다름 아닌 제목 때문이다. 영어 제목이 함께 적혀있는데 바로 NurtureShock이다. Culture shock에서 cul을 nur로 바꾸었을 뿐인데, '제목 하나 참 잘 지었네'하며 감탄했다.

이 책은 기존에 우리가 경험적으로 대대로 물려져오고 있는 당연하다고 생각되는 양육 방법들 중에 몇몇은 잘못되었다는 것을 과학적인 연구들을 통해서 증명해낸다. 그 중 인상깊었던 몇가지만 소개한다.

대표적인 것이 바로 아이들에게 칭찬을 많이 해줘야한다는 믿음이다. "칭찬은 고래도 춤추게 한다"는 속담에 너무 깊게 감명을 받았는지 우리는 아이들에게 칭찬을 무분별하게 많이해왔다. 칭찬을 통해 자신에 대해 자긍심을 갖게해야한다는 이유 때문이다. 특히 많은 부모가 자신의 자녀들이 영재였으면 하는 바램때문인지는 몰라도 "아이고 우리 아들 똑똑하네", "누구 닮아서 이렇게 똑똑할까?" 등의 지능에 대한 칭찬을 많이한다. 그러나 지능에 대한 칭찬을 많이 듣고 자라온 아이들은 도전의식과 노력이 부족한 경우가 많았다. 문제를 풀다가 어려운 문제나 나오면 지능에 대한 칭찬을 많이 들어온 아이들의 경우, '이건 내 머리로 풀 수 있는 것이 아니야. 좀 더 똑똑해야지만 이 문제를 풀 수 있어'라고 스스로의 지능에 한계를 둔다. 그러나 노력에 대해 칭찬을 들어온 아이들의 경우, '내가 집중을 하지 않아서 이 문제를 풀지 못했던 것이야. 좀 더 열심히 노력하면 풀 수 있을거야'라고 생각한다. 이런 생각을 가진 아이들이 당연히 성장할 가능성이 훨씬 더 크다. 따라서 우리는 지능이 아닌 노력에 대해서 칭찬을 해줘야한다.

사람의 뇌는 쓰면 쓸수록 좋아진다. 다른 신체 기관들과 달리 나이가 들어도 발전할 가능성이 있는 것은 뇌뿐이다. 성장하는 뇌를 고영성, 신영준의 '완벽한 공부법'이라는 책에서는 '뇌 가소성'이라고 표현한다. 뇌는 쓰면 쓸수록 좋아지기 때문에 자신의 지능에 한계를 두는 것은 더이상 머리를 쓰지 않겠다고 스스로 선언하는 것과 마찬가지다. 과외를 하면서 아이들에게 숙제를 내주면, 그 중에 몇몇은 조금이라도 어려운 문제는 손도 대지 않는다. 왜 이 문제들은 안 풀었냐고 물어보면, 대부분 "선생님, 이 문제들은 너무 어려워서 제 머리로는 절대 풀 수 없어요. 좀 더 똑똑한 친구들만 풀 수 있을거에요."라고 답한다. 스스로의 능력에 계속 제한을 두는 것이다. 이 상황이 반복되면 문제가 심각해질 것 같아, 최근에 뇌 가소성에 대해 설명해주었더니 좀 더 끈기있게 문제를 풀려고하는 모습을 볼 수 있었다. 머리를 쓰게 하는 훈련을 계속해서 시키는 것이 당장 한 문제 두 문제 더 맞는 것보다 훨씬 중요한 일임을 새삼 깨닫고 있다.

두번째로 중요한 발견은 아이들을 충분히 재워야한다는 것이다. 많은 부모들이 아이들이 너무 많이 잔다고 걱정하는 것 같다. 그러나 사실은 필요보다 덜 자고 있다. "아이들의 두뇌는 21세까지 지속적으로 발달을 거듭해가는데 그중 상당부분이 취침 중에 이루어진다." (p. 55) 아마도 부모들의 욕심때문에 아이들의 취침 시간이 줄어든 것은 아닐까? 좀 더 공부잘하게 만들려고 취침시간을 줄였는데, 결과적으로는 두뇌가 성장하는 것을 방해하고 있던 것이다. 또한 하루 동안 공부한 내용이 잘 정리되기 위해서라도 충분한 숙면은 꼭 필요하다. 잠을 자는 동안 두뇌는 그날 학습한 것들을 무의식 중에 잘 정리해서 효율적으로 저장한다. 학부시절에 시험기간이 오면 밤새 공부하고 시험을 보는 친구들이 있었다. 암튼 그렇게 공부한 것은 단기기억으로 당장 시험은 어떻게든 통과할지 몰라도 제대로 남지 않는다. 아마 일주일만 지나도 거진 다 까먹을 것이다. 그래서 아이들의 등교시간을 늦춰야한다는 것이 학자들의 의견이다. 중학교, 고등학교 시절 생각해보면 8시까지 등교해야했는데, 그때까지 학교를 가려면 6시, 늦어도 7시에는 일어나야갈 수 있곤 했다. 그런데 보충수업 끝나고 집에 들어오면 새벽 1시였으니 많이 자야 6시간이었던 것이다. 결과적으로 아침 0교시는 항상 취침 시간과 같았다. 그렇게 무의미하게 시간을 보내느니 차라리 등교시간을 1시간 늦추라는 것이다. 수업에 임하는 학생들의 태도와 성적이 완전히 눈에 띄게 좋아진다는 것이 실험들을 통해 입증된 사실이다.

내년 5월이면 로아가 태어날텐데, 좋은 부모로 잘 준비되도록 노력해야겠다. 과외를 여러 명 해오면서 느낀 바는 부모의 과한 욕심이 아이들을 상당히 힘들게 만든다는 것이다. 내 자식이 태어나면 또 다르겠지만, 이 아이가 나의 자녀일 뿐만 아니라 하나님께서 나에게 잠시 맡기신 생명임을 기억하고 겸손히 양육할 수 있도록 잘 준비해야 겠다. 기존의 양육 방식을 되돌아보며 새로운 통찰력을 얻고 싶은 부모들에게 이 책을 추천한다.

[Anaconda+python] Spyder 편집창 간지나게 변경하기

코딩/python|2020. 3. 10. 13:56

코딩을 하는데 있어서 중요한 것 중 하나는 간지죠. 카페에서 코딩을 하던가, 팀원들과 모여서 작업할 때 시각적인 면도 무시할 수 없습니다. 오늘은 Spyder의 편집창을 간지나게 바꾸는 방법에 대해 소개해드리도록 하겠습니다.  

 

참고로 제가 사용하고 있는 Spyder의 버전은 3.3.6입니다. 아마 다른 버전의 경우도 크게 다르지 않을 것으로 예상됩니다. 

 

편집창의 Syntax의 색상은 다음과 같이 바꿀 수 있습니다. 

 

메뉴바에서 

 

Tools - Preferences - Syntax coloring

 

에 들어가셔서 Scheme을 원하는 것으로 바꿔주면 됩니다. 각 Scheme 마다 어떤 색상으로 구성되는지 아래 예들을 하나하나 확인해보세요. 뭐가 가장 괜찮은지는 각자 판단하시면 되겠습니다. 

 

1. Emacs 

Emacs

2. IDLE

IDLE

3. Monokai

Monokai

4. Pydev

Pydev

5. Scintilla

Scintilla

6. Solarized Dark

Solarized Dark

7. Solarized Light

Solarized Light

8. Spyder

Spyder

9. Spyder Dark

Spyder Dark

10. Zenburn

Zenburn

 

저는 개인적으로 3번 Monokai가 가장 괜찮아 보여서 이것으로 세팅했습니다. 여러분들의 선택은 어떨지 궁금하네요.^^ 여성분들은 10번 Zenburn을 좋아할 것 같기도 하구요. ㅎㅎ

<세 왕 이야기>, 지도자가 마음에 들지 않을때

일상/독후감|2020. 3. 10. 01:08

아래 글은 2020년 3월 10일에 작성한 독후감입니다.

 

-----

 

<세 왕 이야기>는 지금까지 여러번 읽었지만, 읽을 때마다 울림을 준다. 저자인 진 에드워드는 똑같은 이야기라도 자신만의 언어로 잘 각색해서 마음에 와닿게 전해주는 설교자이자 이야기꾼이다. 진 애드워드의 <신의 열매>, <이야기 갈라디아서>도 읽어볼만하다. 

 

이 책을 오랜만에 손에 집어든 이유는 내 안에 커져가는 지도자들에 대한 불만을 그리스도인으로서 어떻게 해결해야하는 것인가에 대한 답이 이 책 속에 담겨져 있었던 것 같은 흐릿한 기억 때문이었다. 다윗이 자신을 일평생 괴롭혔던 사울에 대해 어떤 태도를 가졌는지를 다시 한번 확인하고 싶었다. 

 

사울은 자신보다 인기가 많았던 다윗을 끊임없이 죽이고자 했다. 다윗을 죽이고자 집요하게 찾아다녔다. 그러나 다윗은 그런 사울을 대적하지 않고, 단지 도망다녔다. 반대로 사울을 죽일 기회가 여러 차례 있었음에도 그는 하나님이 세우신 왕을 결코 죽일 수 없다면서 사울을 해치지 않았다. 

 

다윗은 오히려 죽는 것을 선택했고, 도망다니는 것을 선택했고, 비참해지는 것을 선택했다. 악을 악으로 갚지 않고, 도리어 악을 선으로 갚았다. 누군가를 깨뜨리려하기 보다는 자신을 깨뜨렸다. 

 

내가 원하는 답을 이 책이 주진 않지만, 이것이 바로 성경의 가르침이다. 그리스도인은 내 뜻보다는 하나님의 뜻을 앞세우는 존재다. 성경의 메시지는 세상의 가르침과 많이 다르다. 세상은 눈에는 눈, 이에는 이로 살라고 말한다. 멍청하게 맞고만 있지 말고 대항하라고 말한다. 원수를 갚으라고 말한다. 그러나 성경은 그렇게 말하지 않는다. 원수를 갚는 일은 내가 할 일이 아니라고 말한다. 하나님께서 모든 사람을 공의롭게 심판하시기 때문이다. 그분의 정의로운 심판에 맡겨드리는 것이 내가 할 일이다.  

 

"아무에게도 악을 악으로 갚지 말고 모든 사람 앞에서 선한 일을 도모하라 할 수 있거든 너희로서는 모든 사람과 더불어 화목하라 내 사랑하는 자들아 너희가 친히 원수를 갚지 말고 하나님의 진노하심에 맡기라 기록되었으되 원수 갚는 것이 내게 있으니 내가 갚으리라고 주께서 말씀하시니라 네 원수가 주리거든 먹이고 목마르거든 마시게 하라 그리함으로 네가 숯불을 그 머리에 쌓아 놓으리라 악에게 지지 말고 선으로 악을 이기라" (로마서 12장 17-21절) 

 

아무리 지도자들이 마음에 들지 않더라도 내가 원수를 갚으려고 하지 말자. 하나님께서 공의롭게 심판하실 것이다. 동시에 나도 하나님 앞에서 심판을 받아야하는 미약한 한 인간일 뿐이다. 어쩌면 내가 더 문제일 수도 있다. 

 

[python] opencv-python 패키지 유용한 함수 10개 정리

코딩/python|2020. 2. 29. 20:18

opencv-python은 영상처리 및 컴퓨터비전에 관한 대표적인 패키지입니다. opencv-python의 유용한 함수들을 이 곳에 정리해보려고 합니다. 제가 자주 사용하는 함수들을 위주로 정리하도록 하겠습니다. 각 함수에 대해서 아주 상세히 다루지는 않겠지만, 기본적인 사용법과 이후 추가 검색을 위한 힌트는 얻으실 수 있을 것이라고 생각합니다.^^ 

 

1. 이미지 읽기: cv2.imread()

컬러 이미지를 읽으려면 cv2.IMREAD_COLOR를, 그레이스케일 모드로 읽으려면 cv2.IMREAD_GRAYSCALE을 입력해주시면 됩니다. 참고로 opencv-python에서 컬러이미지는 BGR 순서로 구성되어 있음을 주의하세요.^^

 

2. 이미지 컬러 공간 변환: cv2.cvtColor()

BGR 색공간을 gray-scale로 변환하고 싶은 경우에는 cv2.COLOR_BGR2GRAY를, BGR 색공간을 HSV 색공간으로 변환하고 싶은 경우에는 cv2.COLOR_BGR2HSV를 선택하시면 됩니다. 2개만 예로 들었는데 150개 이상의 색공간 변환 기능을 지원한다고 합니다. 

 

3. 이미지 사이즈 변경: cv2.resize()

이미지를 축소시킬 때는 보간법(interpolation) 설정을 cv2.INTER_AREA로 해주는 것을, 확대시킬 때는 cv2.INTER_CUBIC 또는 cv2.INTER_LINEAR를 사용할 것을 권장합니다. cv2.INTER_CUBIC보다는 cv2.INTER_LINEAR가 좀 더 빠릅니다. 

 

4. 이미지 보여주기: cv2.imshow()

보통 cv2.waitKey(0), cv2.destroyAllWindows()와 같이 다닙니다. 

 

5. 이미지 저장: cv2.imwrite()

 

위 다섯 함수들을 모두 사용한 예제 코드는 다음과 같습니다. 컬러 이미지를 읽은 후 그레이스케일로 변환했고, 그 이미지를 가로, 세로 각각 반으로 줄였고, 마지막으로 그것을 result.jpg라는 이름의 파일로 저장했습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cv2
 
# 이미지 읽기
img_color = cv2.imread('test1.jpg', cv2.IMREAD_COLOR)
 
# 컬러 이미지를 그레이스케일로 변환
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
 
# 이미지 사이즈 변경
img_gray_reduced = cv2.resize(img_gray, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) # 가로, 세로 모두 반으로 줄이기
 
# 이미지 보여주기
cv2.imshow('color', img_color) # color라는 이름의 윈도우 안에 img_color라는 이미지를 보여줌
cv2.imshow('gray-scale', img_gray)
cv2.imshow('gray-scale reduced', img_gray_reduced)
 
cv2.waitKey(0)
cv2.destroyAllWindows()
 
# 이미지 저장
cv2.imwrite('result.jpg', img_gray_reduced) #img_gray_reduced를 result.jpg 이미지 파일로 저장
cs

 

실행해보면 다음과 같은 이미지들이 보여지고, 현재 디렉토리 내에 result.jpg라는 이미지 파일이 생성된 것을 알 수 있습니다. 원하는 결과가 제대로 나왔습니다. 

 

 

 

6. 선, 사각형, 원, 타원 그리기: cv2.line(), cv2.rectangle(), cv2.circle(), cv2.ellipse()

 

7. 텍스트 넣기: cv2.putText()

 

사각형 그리기와 텍스트 넣기를 이용해서 다음과 같은 결과 이미지를 만들어냈습니다. 마치 객체 검출 알고리즘이 찾아낸 것처럼 말이죠.ㅎㅎ 

 

 

필요한 코드는 다음과 같습니다. 

 

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('test1.jpg', cv2.IMREAD_COLOR)
 
# 사각형 그리기
img = cv2.rectangle(img, (35025), (610230), (25500), 3)
# 사각형을 그릴 이미지, 사각형의 좌측상단좌표, 우측하단좌표, 테두리 색, 테두리 두께
img = cv2.rectangle(img, (490180), (760360), (25500), 3)
img = cv2.rectangle(img, (390380), (670530), (25500), 3)
img = cv2.rectangle(img, (110180), (365480), (02550), 3)
 
# 텍스트 넣기
cv2.putText(img, 'Coffee', (360220), cv2.FONT_HERSHEY_SIMPLEX, 1, (25500), 2, cv2.LINE_AA)
# 텍스트를 넣을 이미지, 텍스트 내용, 텍스트 시작 좌측하단좌표, 글자체, 글자크기, 글자색, 글자두께, cv2.LINE_AA(좀 더 예쁘게 해주기 위해)
cv2.putText(img, 'Coffee', (500350), cv2.FONT_HERSHEY_SIMPLEX, 1, (25500), 2, cv2.LINE_AA)
cv2.putText(img, 'Coffee', (400520), cv2.FONT_HERSHEY_SIMPLEX, 1, (25500), 2, cv2.LINE_AA)
cv2.putText(img, 'Cake', (120470), cv2.FONT_HERSHEY_SIMPLEX, 1, (02550), 2, cv2.LINE_AA) 
 
 
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cs

 

 

8. 이미지 채널 분리: cv2.split()

 

9. 이미지 채널 병합: cv2.merge()

 

cv2.split()과 cv2.merge()를 활용하여 다음과 같은 예제를 만들어봤습니다. HSV 색공간으로 변환한 후에 채널을 각각 분리해줍니다. 그리고 H 채널의 값을 모두 반으로 줄인 다음에 채널을 병합한 후에 BGR 색공간으로 다시 변환해줍니다. 참고로 HSV 색공간에서 H는 Hue 채널로 색상을, S는 Saturation 채널로 색상의 짙음과 옅음의 정도를, V는 Value 채널로 밝기를 담당합니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import cv2
 
# 이미지 읽기
img = cv2.imread('test1.jpg', cv2.IMREAD_COLOR)
 
# 이미지 사이즈 축소
img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
 
cv2.imshow('original image', img)
 
# 색공간 변환
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR 색공간을 HSV로
 
# 이미지 채널 분리
(H, S, V) = cv2.split(img)
 
cv2.imshow('Hue channel', H)
cv2.imshow('Saturation channel', S)
cv2.imshow('Value channel', V)
 
# Hue 채널값 변화주기
= H//2;
 
# 이미지 채널 병합
HSV = cv2.merge((H, S, V))
 
# 색공간 변환
img = cv2.cvtColor(HSV, cv2.COLOR_HSV2BGR)
 
cv2.imshow('new image', img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()
cs

 

 

Hue 채널, 즉 색상을 담당하는 채널을 건드렸더니 색이 많이 바뀐 것을 확인할 수 있습니다. 하늘색을 띄던 커피가 연두색으로 바뀌었죠? 

 

10. 값의 범위 바꿔주기: cv2.normalize()

영상처리를 하다보면 값의 범위를 바꿔줘야할 경우가 꽤 자주 있습니다. 0-255 범위의 값을 0-1로 매핑해줘야할 때도 있고, 0-1 범위의 값을 0-255로 바꿔줘야할 때도 있습니다. cv2.normalize() 함수가 그런 용도로 사용될 수 있습니다. 아래 예제는 1부터 10까지의 정수를 0-1의 범위로 바꿔준 것과 0-255의 범위로 바꿔준 것을 포함합니다. 자주 사용할 일이 있을테니 꼭 기억해두세요.^^

 

 

끝까지 읽어주셔서 감사합니다. 수고하셨습니다. 항상 질문과 지적에는 열려있으니 댓글로 남겨주세요.^^ 

 

 

bskyvision의 추천글 ☞

[python] 파이썬 유용한 내장 함수들 10개 정리

[python] numpy 패키지 유용한 함수들 10개 정리

[python] numpy 다차원배열 클래스 객체 유용한 메소드 20개 정리

 

 

<참고자료>

[1] https://readthedocs.org/projects/opencv-python-tutroals/downloads/pdf/latest/