유전알고리즘으로 이미지 진화시키기

푸름을 생성하자·2021년 2월 11일
0
post-thumbnail

배경


유전알고리즘은 다윈의 적자생존 이론을 기본으로, 1975년 존 홀랜드가 고안한 알고리즘입니다. 실제 생물이 진화하는 과정과 같이 교배, 돌연변이, 세대, 인구 등의 개념이 활용되어 전역 최적화 값을 찾을 수 있도록 하는 알고리즘입니다. 저는 해당 알고리즘을 그림에 적용해보았습니다.
만약, 컴퓨터에게 무작위적으로 이미지를 생성하라고 했을 때, 내가 원하는 이미지를 얻기는 수백, 수천, 수만 번을 반복해도 얻기 힘들 것입니다. 하지만 유전 알고리즘을 활용하면, 어느 정도 근사한 이미지를 얻을 수 도 있고 그 과정이 꽤나 흥미롭고 아름답습니다.

결과물


by Picassoby Genetic Algorithm

유전알고리즘을 활용하여 100,000세대까지 이미지를 진화시킨 결과, 피카소의 그림과 유사한 그림이 나타나기 시작했습니다. 단순히 랜덤한 이미지를 100,000개를 생성했다면 이와 같은 이미지는 절대 나타나지 못했을 것입니다.

원리


유전알고리즘에는 염색체, 인구, 교배 등 용어로 인해 복잡할 수 있으나 사실 이해하면 생각보다 단순합니다. 스토리로 풀어보자면 아래와 같지 않을까 생각합니다.

  1. 태초에 전지전능한 신께서 100명(남자 50, 여자 50)의 인구를 만들고 그들에게 랜덤한 유전자를 주었고
  2. 거친 환경 속에서 열등한 유전자를 가진 45쌍의 커플은 일찍 죽게 되었고, 우등한 유전자인 15쌍만이 교배를 통해 자식을 낳을 수 있었으나
  3. 자식들 중에서는 부모를 쏙 빼닮은 유전자를 가진 개체들이 대부분이나 미약한 확률로 부모의 유전자와는 생판 다른 돌연변이들이 등장하였다.
  4. 부족한 자원과 더욱 거칠어지는 환경 속에서 자식들 중 또 상대적으로 우월한 유전자를 지닌 개체들이 살아 남을 수 있게 되는데 여기에는 우연히 만들어진 돌연변이의 유전자가 더 환경에 적합하여 포함되게 된다.
  5. 결국 세대를 거듭하게 되어 인간은 더욱더욱 뛰어난 존재가 되게 된다.

결국 유전알고리즘을 구현하기 위해 필요한 것은 아래와 같습니다

  • 유전자(Chrosome) : 하나의 개체의 값을 표현하기 위한 데이터
  • 인구(Population) : 유전자들의 집합
  • 우등의 기준(Fitness) : 유전자가 주어진 환경에서 얼만큼 우등한지 계산할 수 있는 산식
  • 생존(Selection) : Fitness값을 기반으로 생존할 개체를 선택
  • 교배(Crossoever) : 자식을 생성하기 위한 유전자간의 교배 규칙
  • 돌연변이(Mutation) : 자식 중 일부를 임의의 값으로 만드는 규칙

구현


OpenCV를 활용하여 유전 알고리즘을 기반으로 주어진 이미지와 얼마나 비슷하게 재현해내는지를 구현해보았습니다. 구현을 하는데 사용한 조건은 아래와 같습니다

  • 유전자 : 0~100개의 랜덤한 숫자의 랜덤한 크기, 랜덤한 색상을 가진 원형, 폴리곤 모형
  • 인구 : 100개의 유전자 집합
  • 우등의 기준 : 원형 이미지와 유전자간의 차의 L2 Norm 값의 평균값
  • 생존 : Fitness가 높은 상위 2개 선택
  • 교배 : 각 이미지 2개를 랜덤한 가중치로 합성하여 100개의 자식을 생성
  • 돌연변이 : 10%의 자식들에게 랜덤한 1~10개의 랜덤한 원, 폴리곤 이미지를 더 생성함

결과물을 몇가지 더 공유하면 아래와 같습니다.

Originalby Genetic Algorithm

생각


  • 생각보다 비슷하게 구현해 나가는 것을 확인할 수 있습니다
  • 데이빗호크니 작품은 이미지가 매우 또렷하여, 생성된 이미지의 특징을 잘 잡아내지는 못하지만 색대비가 명확하여 느낌을 잘 나타내고 있습니다
  • 모네의 작품은 인상주의답게 이미지가 흐릿흐릿(?)하여 전반적인 느낌은 비슷하나 원래의 이미지가 그렇다보니 만들어진 이미지도 형체를 알아보기는 더욱 어려운 것 같습니다.
  • 피카소의 작품은 다양한 폴리곤으로, 모네의 작품과 호크니 작품은 원형의 이미지로 구현하게 했는데 확실히 폴리곤이 정확도가 높으며, 그 과정도 더 아름다운 것 같습니다
  • 100만, 1000만 세대까지 가면 어떨까 싶지만, 아무래도 어느정도는 랜덤한 값에 의존하다보니 한계가 분명 존재하는 것 같습니다. 결국엔 잘 때려맞혀져야 하니깐요...
  • 생각보다 코드구현도 어렵지 않아서 한 번쯤은 해볼만 합니다!
  • 자세한 코드는 https://github.com/greenned/genetic_algorithm 에서 확인가능합니다.

0개의 댓글