cv2 style-transfer model 사용하기

be1le·2022년 3월 5일
10

Open-CV

목록 보기
5/11
post-thumbnail

오늘은 cv2를 사용하여 style-transfer model을 사용하는 구체적인 방법을 블로깅할 생각이다.
내용 자체가 복잡하여 다소 어렵게 느끼고 지루하다 생각할 수도 있지만 최대한 가볍게, 또한 내용은 심오하게 구성해보려고 노력을 했다!
딥러닝 모델을 직접 설계하는것도 너무나도 멋진 일이라고 생각하지만(동시에 정말 어렵지만),이미 만들어진 모델을 능숙하게 사용할줄 아는것도 머신러닝 엔지니어 꿈나무들의 중요한 자질이라고 생각한다. 오늘은 우리를 성장시켜줄수 있는 실습을 진행해 보자.

패키지부터 로드하기!


단 두줄이면 끝난다!
우리는 오늘 cv2와 numpy만으로 style transfer model을 사용해 볼 것이다!

모델 로드하기 +딥러닝 모델사용시 flow


work flow를 알고있다는 것은 업무에 혹은 개인의 성장에 정말 큰 기여를 한다고 생각한다. 우리가 이미 완성된 딥러닝 model을 사용할때는 이러한 flow를 거치게 된다.
전처리(img처리에 한해서) -> 추론-> 후처리 -> 출력(결과표시) 이러한 flow를 거친다는 것을 상기하며 실습을 진행하면 큰 어려움 없이 어떠한 모델도 도전해 볼수 있을 것이다!
우리는 open cv의 dnn으로 토치로부터 모델을 읽어내고,그후 net이라는 변수에 할당을 해줌으로써 net이라는 변수에 고흐의 화풍을 따라해주는 모델 "eccv16/starry_night.t7"이 담겨지게 되었다!

전처리


이렇게 hwc에 img의 shape을 담아준후

이런식으로 방정식을 사용하여 원본의 비율을 유지한채로 resizing을 해준다.


여기서 MEAN_VALUE라는 낮선 개념이 등장하는데 쉽게 생각해서

"라면 봉지뒤에 적힌 조리법"

이라고 생각하면 된다. 이렇게 요리를 하면 가장 맛있습니다! 즉 이렇게 전처리 해주시면 가장 결과가 잘나옵니다!! 라는 부분이다. 사실상 제품 제작사의 메뉴얼에 맞게 사용 할때 가장 맛있는 라면이 완성되듯 모델 설계자가 정해준 MEAN_VALUE값을 따를때 가장 맛좋은 결과가 나온다! 라고 이해하면 된다. 물론 물이 끓기도전에 면을 넣어도 되지만 우리가 기대하는 최고의 라면맛을 기대하긴 어려울 것이다 ! 내가한 비유지만 뿌듯한것 같다! ㅎ

또한 cv2.dnn.blobFromImage는 차원변형을 해준다.

cv2.dnn.blobFromImage함수 설명.

차원 변형이 왜필요하지? 라고 생각할 수있지만 우리가 알다시피는 프로그래밍 언어는 인간 친화적인 언어가 아닌 컴퓨터 친화적인 언어이다. 컴퓨터가 처리하기 쉽게, 컴퓨터가 이해하기 쉽게 만들어주는 것이 인간의 역할이라고 생각을 해보면 차원변형을 통해 컴퓨터 친화적인 차원으로 만들어 주는구나... 예상해볼수 있다.

그래서 차원변형을 왜하는데요?

의미심장한 주석을 달아놨다. 우리는 tensor4차원 구조로 만들어서 넣어주어야 컴퓨터가 추론을 해줄수 있다. 4차원 구조인건 알겠는데.. 왜 tensor4차원 구조라는 걸까?
이에대한 답으로는 자료형은 분명히 4차원이지만 컴퓨터는 이를 3차원 자료구조 처럼 처리해 주기때문에 특별히 그냥 4차원 구조가아닌 tensor 4차원 구조라고 부르게 됬다고 한다.
구박사님 감사합니다.

추론 시작하기

이 두줄의 코드를 위해서 우리는 전처리라는 고비를 넘겼다.
net.setInput(blob) 이구문으로 blob을 인풋으로 지정해주고
net.forward()라는 함수는

실질적인 추론을 하는 함수라고 생각하면 된다.

후처리(아름다운 사람은 머문자리도 아름답습니다.)

우린모두 아름다운 사람이라서 머문 추론도 아름다워야 하니 후처리를 해야한다!

이렇게 차원을 다시 줄여주고,


빼주었던 MEAN_VALUE 값을 다시 더해준뒤

(MEAN_VALUE 는 돌아오는 거야)

output = np.clip(output, 0, 255)이 구문으로 255가 넘는걸 clip함수로 제한한다.
clip함수는 최솟값,최댓값을 제한하는 함수이다!

드디어 출력!

인내는 쓰고 열매는 달다했다. 우리는 전처리,추론,후처리 라는 강풍과 비바람을 이겨냈으니 print라는 잘익은 열매를 수확할 자격이 있다!
직접 수확해 보자!

출력하는 코드

컴퓨터가 이해하던 자료를 사람이 이해하는 자료형으로 바꿔주기위해 output = output.astype('uint8')구문을 사용하여 사람이 알아 볼수있는 정수형 자료형으로 바꿔주고 난뒤
우리가 늘 해오던 imshow()와 waitkey를 사용하면 드디어 결과를 볼 수 있게된다.이랬던 사진이
이렇게 바뀌게 된다.
이게나의 cpu에서 0.1초만에 일어난 일이라니 .. 이 사진 한장만으로도 나의 노고가 보상받는 기분이다.

글을 마치며

오늘 우리가 함께 해보았던 실습은
net = cv2.dnn.readNetFromTorch('적용할 모델')
이부분만 이렇게 적용을 한다면 그어떠한 styletransfer 모델이라도 우리는 적용해 볼 수 있다. 정말 너무너무 중요한 개념이 많이 들어있던 실습이라 개인적으로 신경을 많이써서 블로깅을 해보았다. 짧지않은 길을 읽어주심에 깊은 감사를 표하며 글을 마치겠다! 감사합니다! >~<

profile
그저 그런 개발자가 되지 않겠습니다.

2개의 댓글

comment-user-thumbnail
2022년 3월 14일

대박신기......저게 머신러닝이란건가요

1개의 답글