관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

에지와 영역 5 - 영역 분할 2 : 최적화 분할 본문

카테고리 없음

에지와 영역 5 - 영역 분할 2 : 최적화 분할

huenuri 2024. 11. 10. 09:31

영역 분할에서 최적화 분할을 하는 부분을 이어서 학습해 보겠다. 새벽 공부할 시간이 이제 1시간밖에 남지 않아서 무척 아쉽다.


 

 

 

 

3. 최적화 분할

분할 알고리즘은 지역적 명암 변화만 살핀다. 예를 들어 이런 알고리즘에서는 양말의 색이 배경색과 비숫하면 양말 부분에서 경계가 형성되지 않아 사람 영역이 배경과 섞이게 된다. 이 문제를 해결하는 좋은 접근 방법은 지역적 명암 변화를 보되 전역적 정보를 같이 고려하는 것이다. 

비록 지역적으로는 아주 약한 색상 변화지만 전역적으로 유리한 측면이 있다면 그곳을 물체 경계로 간주하는 발상이다. 이 발상을 구현할 때는 주로 영상을 그래프로 표현하고 분할을 최적화 문제로 푼다.

 

 

영상의 그래프 표현

영상을 그래프로 표현할 때 화소 또는 슈퍼 화소를 노드로 취한다. 프로그램 4-5에서 사용한 커피잔은 400 x 600 크기로, 화소를 노드로 사용하면 노드가 24만 개라서 계산 효율 측면에서 큰 부담이다. 14행처럼 n_segments 인수를 600으로 설정하여 슈퍼 화소를 구하면 노드 개수를 400배 줄일 수 있다. 두 노드를 연결하는 에지의 가중치로는 유사도를 사용한다.

 


 

 

 

정규화 절단 알고리즘


 

 

 

 

정규화 절단 알고리즘을 이용한 영역 분할

다음 프로그램은 정규화 절단 알고리즘으로 영역을 분할하는 프로그램이다. 

 

 

정규화 절단 알고리즘으로 영역 분할하기

 

 

하지만 실행하니 이런 오류가 떴다. 이 오류는 skimage.future 모듈 내의 graph 기능을 찾을 수 없을 때 발생한다. skimage 라이브러리의 특정 버전에서는 graph 모듈이 포함되지 않거나, 설치된 버전에 따라 일부 기능이 누락될 수 있다. 조금 전에 설치했던 skimage 라이브러리가 뭔가 문제가 있는 것 같다.

최신 버전으로 한번 업데이트를 하려고 한다.

 

 

 

 

하지만 이렇게 시도했음에도 문제는 해결되지 않았다. 이번에는 skimage.future.graph.rag_mean_color와 비슷한 기능을 수행하도록 코드를 수정해 보았다.


 

 

 

NetworkX를 사용하도록 코드 수정하기

 

 

 

 

원래 책에 있는 코드에서 의도한 바는 과잉 분할인데 정상적으로 출력이 잘 되었다. 과잉 분할을 유도할 수 있게 코드를 한번 더 수정해 보기로 했다.


 

 

 

networkx로 RAG 생성 및 색상 유사성에 따른 병합 해보기

이 코드는 slic을 통해 얻은 슈퍼픽셀을 기반으로 RAG를 수동으로 구성하고, 평균 색상 간의 유사성을 기준으로 가중치를 추가하여 비슷한 색상의 인접 슈퍼픽셀을 병합하는 방식으로 코드를 수정했다.

 

 

 

 

 

하지만 이번에는 분할이 하나도 되지 않았다. 아마도 이전의 코드가 완벽하게 분할이 잘 되어서 그런 것 같다. 그냥 이 문제는 여기서 덮어두기로 했다. 대신 입력 창에 영역 분할의 개수를 알아내는 코드를 작성해 볼 것이다.

 

 

하지만 ncut이 정의되지 않았다는 문구가 뜬다. 오류 메시지에서 ncut 변수가 정의되지 않았다고 나오는 이유는 코드에서 ncut이라는 변수를 실제로 생성하거나 정의하지 않았기 때문이다. 원래 ncut 변수는 skimage.future.graph.cut_normalized 함수를 통해 생성된 정규화 절단(이미지 분할) 결과를 의미했지만, 현재 코드에서는 이 함수가 networkx로 대체되어 직접 구현해야 한다.

 

아래에 networkx를 사용하여 수동으로 RAG를 생성하고, 슈퍼픽셀의 평균 색상 차이를 기반으로 유사한 영역을 병합하는 방식으로 코드를 업데이트해 보겠다.


 

 

코드 한번 더 수정하기

이 코드는 rag_mean_color와 cut_normalized 대신 networkx를 사용해 그래프를 생성하고, 슈퍼픽셀 간 색상 차이를 이용해 분할을 수행하는 예제이다.

 

 

 

하지만 코드를 수정해도 분할한 이미지는 찍히지 않았다.

 

 

색상값은 잘 출력되었는데 책과 다르게 변수를 ncut이 아닌 new_labels를 사용했기에 이 변수로는 사용할 수 없다는 오류가 뜬 거였다.

 

 

분할 사이즈를 보니 1이다. 이건 분할이 되지 않았다는 것이다.

 


 

 

 

학습을 마치고

이렇게 해서 영역을 분할할 수 있는 최적화 분할을 진행해 보았다. 중간에 잘 안 되는 코드가 있어서 이 공부를 하는데 몇 시간이 걸렸는지 모른다. 그리고 중간에 집안일이 좀 있어서 아침까지 먹고 나머지 공부를 마무리해 보았다.

아직 공부할 게 남아있지만 조금씩 이해가 되고 있다.