신경망은 그림을 그립니다. 오스타그램: 사진과 장식품을 예술품으로 결합한 신경망 기반 서비스

2015년 8월부터 독일 튀빙겐 대학 연구진이 스타일 전이 가능성에 대해 발표 유명한 예술가다른 사진에는 이 기회를 수익화하는 서비스가 나타나기 시작했습니다. 그것은 서구 시장과 러시아 시장에서 출시되었습니다. 완전한 사본입니다.

북마크로

Ostagram은 12월에 출시되었음에도 불구하고 4월 중순부터 소셜 네트워크에서 빠르게 인기를 얻기 시작했습니다. 동시에 4월 19일 현재 VKontakte 프로젝트에 참여한 사람은 천 명 미만이었습니다.

서비스를 이용하려면 가공이 필요한 사진과 원본 사진에 오버레이할 스타일의 예시 사진 두 가지 이미지를 준비해야 합니다.

이 서비스에는 무료 버전이 있습니다. 이미지의 가장 긴 면을 따라 최대 600픽셀의 최소 해상도로 이미지를 생성합니다. 사용자는 사진에 필터를 적용한 반복 중 한 번의 결과만 받습니다.

두 가지 유료 버전이 있습니다. Premium은 가장 긴 면을 따라 최대 700픽셀의 이미지를 생성하고 이미지에 600회 반복되는 신경망 처리를 적용합니다(반복이 많을수록 처리가 더 흥미롭고 집중적임). 그러한 사진 중 하나는 50 루블입니다.

HD 버전에서는 반복 횟수를 조정할 수 있습니다. 100은 50 루블, 1000-250 루블입니다. 이 경우 이미지의 가장 긴 면의 해상도는 최대 1200픽셀이며 캔버스에 인쇄하는 데 사용할 수 있습니다. Ostagram은 1800 루블에서 배송하는 이 서비스를 제공합니다.

2 월에 Ostagram 대표는 "자본주의가 발전된 국가"사용자의 이미지 처리 요청을 수락하지 않고 전 세계 VKontakte 사용자를 위해 사진 처리에 액세스합니다. GitHub에 게시된 Ostagram 코드로 판단하면 Nizhny Novgorod에 거주하는 30세 Sergey Morugin이 개발했습니다.

TJ가 연락함 상업 감독 Andrey가 소개 한 프로젝트. 그에 따르면 Ostagram은 Instapainting 이전에 등장했지만 Vipart라는 유사한 프로젝트에서 영감을 받았습니다.

Ostagram은 NNSTU의 학생 그룹에 의해 개발되었습니다. Alekseeva: 2015년 말 소수의 친구 그룹에 대한 초기 테스트 후 프로젝트를 공개하기로 결정했습니다. 처음에는 이미지 처리가 완전히 무료였으며 인쇄된 그림을 판매하여 수익을 올릴 계획이었습니다. Andrey에 따르면 인쇄가 가장 큰 문제였습니다. 신경망에 의해 처리된 사람들의 사진은 인간의 눈에 거의 보기 좋지 않으며 최종 클라이언트는 결과를 캔버스에 적용하기 전에 오랜 시간 동안 조정해야 합니다. 많은 기계 자원이 필요합니다.

이미지 처리를 위해 Ostagram의 제작자는 Amazon 클라우드 서버를 사용하기를 원했지만 사용자 유입 후 최소한의 투자 수익으로 비용이 하루에 천 달러를 초과한다는 것이 분명해졌습니다. 이 프로젝트의 투자자이기도 한 Andrey는 Nizhny Novgorod에서 서버 시설을 임대했습니다.

프로젝트의 청중은 하루에 약 천명이지만 국내보다 먼저 프로젝트를 이미 알아 차린 외국 미디어의 전환으로 인해 어떤 날에는 4 만 명에 이르렀습니다 (Ostagram은 유럽 DJ와 협력하기도했습니다). 트래픽이 적은 밤에는 이미지 처리에 5분이 소요될 수 있으며 낮에는 최대 1시간이 소요될 수 있습니다.

초기 외국 사용자가 의도적으로 이미지 처리에 대한 액세스를 제한했다면(러시아에서 수익 창출을 시작한 것으로 생각됨) 이제 Ostagram은 이미 서구 사용자에게 더 많이 의존하고 있습니다.

현재까지 회수 전망은 조건부입니다. 각 사용자가 처리를 위해 10 루블을 지불했다면 아마도 갚을 것입니다. [...]

우리나라에서 수익을 창출하는 것은 매우 어렵습니다. 우리 국민은 일주일을 기다릴 준비가되어 있지만 한 푼도 지불하지 않을 것입니다. 유럽인들은 속도 향상, 품질 향상에 대한 비용 측면에서 이에 더 호의적이므로 오리엔테이션은 해당 시장으로 이동합니다.

오스타그램 대표 안드레이

Andrey에 따르면 Ostagram 팀은 새로운 버전사회성에 중점을 둔 사이트 : "잘 알려진 서비스처럼 보이지만 어떻게해야합니까?" 러시아의 Facebook 대표는 이미이 프로젝트에 관심이 있었지만 아직 판매 협상에 도달하지 않았습니다.

서비스 작업 예

Ostagram 웹사이트의 피드에서 어떤 이미지 조합으로 최종 사진이 만들어졌는지도 확인할 수 있습니다. 결과 자체보다 훨씬 더 흥미로운 경우가 많습니다. 동시에 필터(처리 효과로 사용되는 사진)는 나중에 사용할 수 있도록 저장할 수 있습니다.

반가워요, 하브르! 확실히 당신은 다양한 스타일 사진의 주제가 예술적 스타일귀하의 인터넷에서 적극적으로 논의되었습니다. 이 인기 있는 기사를 모두 읽으면 이러한 응용 프로그램의 후드 아래에서 마법이 진행되고 있으며 신경망이 실제로 이미지를 처음부터 상상하고 다시 그리는 것이라고 생각할 수 있습니다. 우연히도 우리 팀은 비슷한 작업에 직면했습니다. 내부 기업 해커톤의 일환으로 비디오 스타일링을 만들었습니다. 이미 사진용 앱이 있었습니다. 이 게시물에서는 네트워크가 이미지를 "다시 그리는" 방법을 살펴보고 이를 가능하게 한 기사를 살펴보겠습니다. 이 자료를 읽기 전에 마지막 게시물과 일반적으로 컨볼루션 신경망의 기본 사항을 숙지하는 것이 좋습니다. 몇 가지 공식, 몇 가지 코드(Theano 및 Lasagne에 대한 예를 제공할 것임) 및 많은 그림을 찾을 수 있습니다. 이 게시물은 내장되어 있습니다 시간 순서기사의 모양과 그에 따른 아이디어 자체. 때때로 나는 그것을 우리의 최근 경험으로 희석할 것입니다. 관심을 끌기 위해 지옥에서 온 소년이 있습니다.


컨볼루션 네트워크 시각화 및 이해(2013년 11월 28일)

우선, 저자가 신경망이 블랙 박스가 아니라 상당히 해석 가능한 것임을 보여줄 수 있었던 기사를 언급할 가치가 있습니다. 비전). 저자는 숨겨진 계층 뉴런의 활성화를 해석하는 방법을 배우기로 결정했습니다. 이를 위해 그들은 몇 년 전에 제안된 deconvolutional 신경망(deconvnet)을 사용했습니다(그런데 이 출판물의 저자인 동일한 Zeiler 및 Fergus가 잘). 디컨볼루션 네트워크는 실제로 컨볼루션과 풀링이 역순으로 적용된 동일한 네트워크입니다. deconvnet의 원래 작업은 비지도 학습 모드에서 네트워크를 사용하여 이미지를 생성했습니다. 이번에 저자는 네트워크를 통과한 후 얻은 특징에서 원본 이미지로 역방향 통과를 위해 단순히 사용했습니다. 결과는 뉴런에서 이 활성화를 유발한 신호로 해석될 수 있는 이미지입니다. 당연히 컨볼루션과 비선형성을 통해 역방향 패스를 만드는 방법에 대한 질문이 생깁니다. 그리고 더욱이 최대 풀링을 통해 이것은 확실히 반전된 작업이 아닙니다. 세 가지 구성 요소를 모두 살펴보겠습니다.

리버스 렐루

컨볼루션 네트워크에서는 활성화 함수가 자주 사용됩니다. ReLu(x) = 최대(0, x), 레이어의 모든 활성화를 음수가 아닌 값으로 만듭니다. 따라서 비선형성을 역으로 통과할 때에도 음이 아닌 결과를 얻을 필요가 있다. 이를 위해 저자는 동일한 ReLu를 사용할 것을 제안합니다. Theano 아키텍처 관점에서 작업의 그래디언트 기능을 재정의해야 합니다(무한히 귀중한 노트북은 라자냐 레시피에 있으며 거기에서 ModifiedBackprop 클래스가 무엇인지에 대한 세부 정보를 수집할 것입니다).

Class ZeilerBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = inputs (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # 명시적으로 수정 return (self.nonlinearity(grd),) # 주어진 비선형성을 사용

역 컨벌루션

여기서는 조금 더 복잡하지만 모든 것이 논리적입니다. 동일한 컨볼루션 커널의 전치된 버전을 적용하는 것으로 충분하지만 순방향 패스에서 사용된 이전 레이어 대신 역방향 ReLu의 출력에 적용합니다. 그러나 유감스럽게도 말로는 그렇게 명확하지 않습니다. 이 절차의 시각화를 살펴보겠습니다(더 많은 컨볼루션 시각화를 찾을 수 있습니다).


stride=1일 때 컨벌루션

stride=1일 때 컨벌루션 리버스 버전

stride=2일 때 컨벌루션

stride=2일 때 컨벌루션 리버스 버전

리버스 풀링

이 작업(이전 작업과 달리)은 일반적으로 되돌릴 수 없습니다. 그러나 우리는 여전히 리버스 패스 중에 어떤 식으로든 최대값을 통과하고 싶습니다. 이를 위해 저자는 직접 패스(최대 위치 전환) 동안 최대값이 있었던 위치의 맵을 사용할 것을 제안합니다. 리버스 패스 동안 입력 신호는 원래 신호의 구조를 대략적으로 보존하는 방식으로 풀링으로 변환됩니다. 여기에서 설명하는 것보다 보기가 더 쉽습니다.



결과

시각화 알고리즘은 매우 간단합니다.

  1. 직선 패스를 합니다.
  2. 관심 있는 레이어를 선택합니다.
  3. 하나 이상의 뉴런 활성화를 수정하고 나머지는 재설정합니다.
  4. 추론해 보세요.

아래 이미지의 각 회색 사각형은 필터의 시각화(컨볼루션에 적용됨) 또는 단일 뉴런의 가중치에 해당하며, 각 컬러 사진해당 뉴런을 활성화하는 원본 이미지의 일부입니다. 명확성을 위해 한 계층 내의 뉴런은 다음과 같이 그룹화됩니다. 주제별 그룹. 일반적으로 신경망은 Hubel과 Weisel이 시각 시스템의 구조에 대한 연구에서 쓴 내용을 정확히 학습한다는 것이 갑자기 밝혀졌습니다. 노벨상 1981년. 이 기사 덕분에 우리는 컨볼루션 신경망이 각 계층에서 학습하는 내용을 시각적으로 표현했습니다. 나중에 생성된 이미지의 내용을 조작할 수 있는 것은 이 지식이지만 아직 멀었습니다. 향후 몇 년 동안 신경망의 "트레파네이션" 방법을 개선하는 데 사용되었습니다. 또한 기사의 저자는 컨볼루션 신경망의 아키텍처를 구축하는 가장 좋은 방법을 분석하여 달성할 수 있는 방법을 제안했습니다. 최상의 결과(단, ImageNet 2013에서는 우승하지 못했지만 1위를 차지했습니다. UPD: 그들이 이겼다는 것이 밝혀졌습니다. Clarifai는 그들이 무엇인지).


기능 시각화


다음은 deconvnet을 사용한 활성화 시각화의 예입니다. 오늘날 이 결과는 이미 그렇게 보이지만 그 당시에는 획기적인 것이었습니다.


deconvnet을 사용한 Saliency Maps

Deep Inside Convolutional Networks: 이미지 분류 모델 및 돌출 맵 시각화(2014년 4월 19일)

이 기사는 컨볼루션 신경망에 포함된 지식 시각화 방법에 대한 연구에 전념합니다. 저자는 경사하강법에 기반한 두 가지 시각화 방법을 제안합니다.

클래스 모델 시각화

따라서 특정 수의 클래스로 분류 문제를 해결하기 위해 훈련된 신경망이 있다고 상상해보십시오. 클래스에 해당하는 출력 뉴런의 활성화 값으로 표시 . 그런 다음 다음 최적화 문제는 선택한 클래스를 최대화하는 이미지를 정확하게 제공합니다.



이 작업은 Theano를 사용하여 쉽게 해결할 수 있습니다. 일반적으로 프레임워크에 모델 매개변수의 파생물을 취하도록 요청하지만 이번에는 매개변수가 고정되어 있고 입력 이미지에서 파생물을 가져온다고 가정합니다. 다음 함수는 출력 레이어의 최대값을 선택하고 입력 이미지에 대한 도함수를 계산하는 함수를 반환합니다.


def compile_saliency_function(net): """ 입력 이미지의 주어진 미니배치에 대한 돌출 맵과 예측 클래스를 계산하는 함수를 컴파일합니다. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], 결정론적=참) max_outp = T.max(outp, 축=1) 현저성 = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, 축=1) theano.function(,)을 반환합니다.

인터넷에서 강아지의 이상한 이미지인 DeepDream을 본 적이 있을 것입니다. 원래 기사에서 저자는 다음을 사용합니다. 다음 프로세스선택한 클래스를 최대화하는 이미지를 생성하려면:

  1. 초기 이미지를 0으로 초기화합니다.
  2. 이 이미지에서 미분 값을 계산합니다.
  3. 파생물의 결과 이미지를 추가하여 이미지를 변경합니다.
  4. 2단계로 돌아가거나 루프를 종료합니다.

결과 이미지는 다음과 같습니다.




하지만 실제 사진으로 첫 번째 이미지를 초기화하고 동일한 프로세스를 시작하면 어떻게 될까요? 그러나 각 반복에서 우리는 임의의 클래스를 선택하고 나머지는 0으로 설정하고 미분 값을 계산하면 깊은 꿈을 꿉니다.


주의 60MB


개 얼굴과 눈이 왜 그렇게 많은가요? 간단합니다. 이미지 네트워크에는 1000개의 클래스 중 거의 200마리의 개가 있고 눈이 있습니다. 또한 사람만 있는 수업도 많습니다.

클래스 현저성 추출

이 프로세스가 실제 사진으로 초기화되고 첫 번째 반복 후 중지되고 미분 값을 그리는 경우 이러한 이미지를 얻고 원본 이미지에 추가하면 선택한 클래스의 활성화 값이 증가합니다.


도함수를 사용한 돌출 지도


다시 말하지만 결과는 "so-so"입니다. 이 점에 유의하는 것이 중요합니다. 새로운 길활성화 시각화 다음 기사에서는 이전 접근 방식을 결합하고 나중에 설명할 스타일 전송을 설정하는 방법에 대한 도구를 제공합니다.

단순성을 위한 노력: All Convolutional Net(2015년 4월 13일)

이 기사는 일반적으로 시각화에 관한 것이 아니라 풀링을 보폭이 큰 컨볼 루션으로 대체해도 품질 손실이 발생하지 않는다는 사실에 관한 것입니다. 그러나 연구의 부산물로 저자는 모델이 학습한 내용을 보다 정확하게 분석하기 위해 적용한 기능을 시각화하는 새로운 방법을 제안했습니다. 그들의 아이디어는 다음과 같습니다. 단순히 도함수를 취하면 입력 이미지에서 0보다 작은 기능은 디콘볼루션(입력 이미지에 ReLu 사용) 중에 되돌아가지 않습니다. 그리고 이것은 전파된 후면 이미지에 음수 값이 나타난다는 사실로 이어집니다. 반면에 deconvnet을 사용하는 경우 ReLu의 파생물에서 다른 ReLu를 가져옵니다. 이를 통해 음수 값을 건너뛸 수 없지만 본 것처럼 결과는 "so-so"입니다. 하지만 이 두 가지 방법을 결합하면 어떨까요?




class GuidedBackprop(ModifiedBackprop): def grad(self, inputs, out_grads): (inp,) = 입력 (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd > 0).astype(dtype),)

그러면 완전히 깨끗하고 해석 가능한 이미지를 얻을 수 있습니다.


Guided Backpropagation을 사용한 Saliency Maps

더 깊이

이제 이것이 우리에게 무엇을 주는지 생각해 봅시다. 각 컨볼루션 레이어는 3차원 텐서를 입력으로 받고 출력으로 3차원 텐서를 생성하는 함수라는 점을 상기시켜 드리겠습니다. 엑스 엑스 시간; epth는 레이어의 뉴런 수이며 각 뉴런은 크기가 있는 기능 맵을 생성합니다. igth x 시간여덟.


VGG-19 네트워크에서 다음 실험을 시도해 봅시다.



전환1_2

예, 거의 아무것도 볼 수 없기 때문입니다. 수용 영역은 매우 작습니다. 이것은 각각 두 번째 컨볼루션 3x3이며 총 영역은 5x5입니다. 그러나 확대하면 기능이 기울기 감지기일 뿐이라는 것을 알 수 있습니다.




전환3_3


전환4_3


전환5_3


풀5


그리고 이제 플레이트에 대한 최대값 대신 입력 이미지에 대한 플레이트의 모든 요소 합계 값의 미분값을 취한다고 상상해 보십시오. 그런 다음 분명히 뉴런 그룹의 수용 영역이 전체 입력 이미지를 덮을 것입니다. 초기 레이어의 경우 밝은 맵을 볼 수 있으며, 여기에서 색상 감지기, 그라데이션, 테두리 등이 더 복잡한 패턴임을 추론합니다. 레이어가 깊을수록 디머 이미지를 얻습니다. 이것은 더 깊은 레이어가 감지하는 더 복잡한 패턴을 가지고 있고 복잡한 패턴이 단순한 패턴보다 덜 자주 나타나므로 활성화 맵이 흐려진다는 사실에 의해 설명됩니다. 첫 번째 방법은 복잡한 패턴이 있는 레이어를 이해하는 데 적합하고 두 번째 방법은 간단한 패턴에 적합합니다.


전환1_1


전환2_2


전환4_3


여러 이미지 및 에 대한 보다 완전한 활성화 데이터베이스를 다운로드할 수 있습니다.

예술적 스타일의 신경 알고리즘(2015년 9월 2일)

따라서 신경망의 첫 번째 성공적인 천공 이후 몇 년이 지났습니다. 우리는 (인류적 의미에서) 신경망이 학습하는 것을 이해하고 실제로 학습하기를 원하지 않는 것을 제거할 수 있는 강력한 도구를 가지고 있습니다. 이 문서의 작성자는 하나의 이미지가 일부 대상 이미지에 대해 유사한 활성화 맵을 생성하도록 허용하는 방법을 개발하고 있으며, 가능하면 둘 이상일 수도 있습니다. 이것이 스타일 지정의 기초입니다. 입력에 백색 잡음을 공급하고 딥 드림에서와 유사한 반복 프로세스에서 이 이미지를 특징 맵이 대상 이미지와 유사한 이미지로 가져옵니다.

콘텐츠 손실

이미 언급했듯이 신경망의 각 계층은 일정 차원의 3차원 텐서를 생성합니다.




출력을 나타내자 입력에서 th 레이어를 . 그런 다음 입력 이미지 사이의 잔차의 가중 합을 최소화하면 그리고 우리가 열망하는 어떤 이미지 , 그러면 필요한 것을 정확히 얻을 수 있습니다. 아마도.



이 기사를 실험하기 위해 계산이 수행되는(GPU와 CPU 모두에서) 이 마법의 노트북을 사용할 수 있습니다. GPU는 신경망의 특징과 비용 함수의 값을 계산하는 데 사용됩니다. Theano는 목적 함수의 그래디언트를 계산할 수 있는 함수를 생성합니다. eval_grad입력 이미지로 엑스. 그런 다음 lbfgs에 입력되고 반복 프로세스가 시작됩니다.


# 노이즈 이미지로 초기화 generated_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generated_image.get_value().astype("float64") xs = xs.append(x0) # 최적화, range(8)에서 i에 대한 결과를 주기적으로 저장: print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generated_image.get_value().astype("float64") xs.append(x0)

이러한 기능의 최적화를 실행하면 대상 이미지와 유사한 이미지를 빠르게 얻을 수 있습니다. 이제 콘텐츠 이미지처럼 보이는 백색 잡음에서 이미지를 다시 만들 수 있습니다.


콘텐츠 손실: conv4_2



최적화 프로세스




결과 이미지의 두 가지 특징을 쉽게 알 수 있습니다.

  • 잃어버린 색상 - 이것은 사실의 결과입니다 구체적인 예 conv4_2 레이어만 사용되었습니다(즉, 가중치 w는 0이 아니었고 다른 레이어는 0이었습니다). 기억하시겠지만 초기 레이어에는 색상 및 그라데이션 전환에 대한 정보가 포함되어 있고 이후 레이어에는 우리가 관찰한 더 큰 세부 정보에 대한 정보가 포함되어 있습니다. 즉, 색상은 손실되지만 내용은 손실되지 않습니다.
  • 일부 집 "가자", 즉 직선은 약간 구부러져 있습니다. 이는 레이어가 깊을수록 포함된 피처의 공간 위치에 대한 정보가 적기 때문입니다(컨볼루션 및 풀링을 적용한 결과).

초기 레이어를 추가하면 색상으로 상황을 즉시 수정합니다.


콘텐츠 손실: conv1_1, conv2_1, conv4_2


이제 백색 잡음 이미지에 다시 그려지는 것을 제어할 수 있다는 느낌을 받으셨기를 바랍니다.

스타일 손실

이제 가장 흥미로운 문제에 도달했습니다. 어떻게 스타일을 전달할 수 있을까요? 스타일이란 무엇입니까? 분명히 스타일은 피처의 공간적 위치에 대한 많은 정보를 포함하고 있기 때문에 Content Loss에서 최적화한 것이 아닙니다.그래서 가장 먼저 해야 할 일은 각 레이어에서 받은 뷰에서 이 정보를 제거하는 것입니다.


저자는 다음과 같은 방법을 제안합니다. 일부 레이어의 출력에서 ​​텐서를 가져와 공간 좌표로 확장하고 플레이트 사이의 공분산 행렬을 계산해 봅시다. 이 변환을 다음과 같이 나타내자. G. 우리는 정말로 무엇을 했습니까? 플레이트 내부의 특징이 쌍으로 발생하는 빈도를 세었다고 할 수 있습니다. 즉, 플레이트의 특징 분포를 다변량 정규 분포로 근사했습니다.




그러면 다음과 같이 Style Loss가 입력됩니다. 여기서 에스스타일이 있는 이미지입니다.



Vincent를 위해 노력해 볼까요? 원칙적으로 우리는 예상되는 것을 얻습니다. Van Gogh 스타일의 노이즈, 기능의 공간 배열에 대한 정보가 완전히 손실됩니다.


빈센트




스타일 이미지 대신 사진을 넣으면 어떨까요? 이미 친숙한 기능과 친숙한 색상을 얻을 수 있지만 공간적 위치는 완전히 손실됩니다.


스타일 손실이 있는 사진


다른 것이 아닌 공분산 행렬을 계산하는 이유가 궁금하셨습니까? 결국 공간 좌표가 손실되도록 피처를 집계하는 방법에는 여러 가지가 있습니다. 이것은 정말 공개적인 질문이며 매우 간단한 것을 취하더라도 결과는 크게 변하지 않을 것입니다. 공분산 행렬을 계산하지 않고 단순히 각 플레이트의 평균값을 계산합니다.




간단한 스타일 손실

결합 손실

당연히 이 두 가지 비용 함수를 혼합하려는 욕구가 있습니다. 그런 다음 콘텐츠 이미지(공간 좌표에 바인딩됨)의 기능을 유지하고 공간 좌표에 연결되지 않은 "스타일" 기능도 있는 백색 잡음에서 이러한 이미지를 생성합니다. 콘텐츠 이미지 세부 정보는 제자리에 그대로 유지하되 올바른 스타일로 다시 그릴 수 있기를 바랍니다.



사실 regularizer도 있지만 간단하게 생략하겠습니다. 다음 질문에 답해야 합니다. 최적화에 사용할 레이어(가중치)는 무엇입니까? 유감스럽게도 저는 이 질문에 대한 답을 갖고 있지 않으며 기사 작성자도 마찬가지입니다. 다음을 사용하라는 제안이 있지만 이것이 다른 조합이 더 나쁘게 작동하고 검색 공간이 너무 크다는 것을 의미하지는 않습니다. 모델에 대한 이해에서 따르는 유일한 규칙은 이웃 레이어를 가져오는 것이 의미가 없다는 것입니다. 그들의 기호는 서로 크게 다르지 않으므로 각 conv*_1 그룹의 레이어가 스타일에 추가됩니다.


# 손실 함수 손실 정의 = # 콘텐츠 손실 loss.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # 스타일 손실 loss.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) loss.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # 총 편차 패널티 loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(losses)

최종 모델은 다음과 같은 형식으로 나타낼 수 있습니다.




그리고 여기 Van Gogh가 있는 집의 결과가 있습니다.



프로세스를 제어하려는 시도

현재 기사가 나오기 2년 전부터 다른 과학자들이 신경망이 실제로 학습하는 것을 탐구해 온 이전 부분을 기억해 봅시다. 이 모든 기사로 무장하면 다양한 스타일의 기능 시각화를 생성할 수 있습니다. 다양한 이미지, 다양한 해상도와 크기, 어떤 레이어에 어떤 무게를 적용할지 이해하려고 노력합니다. 그러나 레이어에 가중치를 다시 부여해도 상황을 완전히 제어할 수는 없습니다. 여기서 문제는 보다 개념적입니다. 잘못된 기능을 최적화하고 있습니다.! 어때요? 답은 간단합니다. 이 함수는 잔차를 최소화합니다. 그러나 우리가 정말로 원하는 것은 이미지를 좋아하는 것입니다. 내용과 스타일 손실 함수의 볼록한 조합은 우리 마음이 아름답다고 생각하는 것을 측정하지 않습니다. 스타일링이 너무 오래 지속되면 자연히 코스트 함수는 점점 낮아지지만 결과의 미적 아름다움은 급격히 떨어지는 것이 관찰되었습니다.




자, 문제가 하나 더 있습니다. 필요한 기능을 추출하는 레이어를 찾았다고 가정해 보겠습니다. 일부 텍스처가 삼각형이라고 가정해 보겠습니다. 그러나 이 레이어에는 결과 이미지에서 보고 싶지 않은 원과 같은 다른 많은 기능이 여전히 포함되어 있습니다. 일반적으로 백만 명의 중국인을 고용할 수 있다면 스타일 이미지의 모든 기능을 시각화하고 철저한 검색을 통해 필요한 기능만 표시하고 비용 함수에만 포함할 수 있습니다. 그러나 명백한 이유로 그렇게 쉽지는 않습니다. 하지만 스타일시트의 결과에 표시하고 싶지 않은 원을 모두 제거하면 어떻게 될까요? 그러면 원에 반응하는 해당 뉴런의 활성화가 작동하지 않습니다. 물론 결과 사진에는 나타나지 않습니다. 꽃도 마찬가지입니다. 다양한 색상으로 밝은 이미지를 표현합니다. 색상의 분포는 공간 전체에 걸쳐 매우 번지고 결과 이미지의 분포는 동일하지만 최적화 프로세스 중에 원본에 있던 피크가 손실될 수 있습니다. 비트 심도의 단순한 감소가 밝혀졌습니다. 색상 팔레트이 문제를 해결합니다. 대부분의 색상 분포 밀도는 0에 가깝고 여러 영역에서 큰 피크가 나타납니다. 따라서 Photoshop에서 원본을 조작하여 이미지에서 추출한 특징을 조작하고 있습니다. 사람이 자신의 욕망을 수학 언어로 공식화하는 것보다 시각적으로 표현하는 것이 더 쉽습니다. 안녕. 그 결과 기능 시각화를 위한 Photoshop과 스크립트로 무장한 디자이너와 관리자는 수학자 및 프로그래머보다 3배 빠른 결과를 달성했습니다.


피처의 색상과 크기를 조작하는 예


그리고 간단한 이미지를 스타일로 즉시 가져갈 수 있습니다.



결과








그리고 여기 vidosik이 있지만 올바른 질감만 있습니다.

텍스처 네트워크: 텍스처 및 양식화된 이미지의 피드포워드 합성(2016년 3월 10일)

하나의 뉘앙스가 아니라면 멈출 수있을 것 같습니다. 위의 스타일링 알고리즘은 매우 오랫동안 작동합니다. lbfgs가 CPU에서 실행되는 구현을 취하는 경우 프로세스는 약 5분 정도 걸립니다. 최적화가 GPU로 이동하도록 다시 작성하면 프로세스에 10-15초가 걸립니다. 좋지 않습니다. 아마도 이 기사와 다음 기사의 저자는 같은 생각을 했을 것입니다. 두 간행물은 이전 기사 이후 거의 1년 후인 17일 간격으로 독립적으로 발행되었습니다. 현재 기사의 저자는 이전 기사의 저자와 마찬가지로 텍스처 생성에 참여했습니다(스타일 손실만 재설정하면 대략적인 결과입니다). 그들은 백색 잡음에서 얻은 이미지를 최적화하는 것이 아니라 양식화된 이미지를 생성하는 일부 신경망을 제안했습니다.




이제 스타일링 프로세스에 최적화가 포함되지 않은 경우 순방향 패스만 수행하면 됩니다. 그리고 최적화는 생성기 네트워크를 훈련하는 데 한 번만 필요합니다. 이 기사에서는 다음과 같은 계층적 생성기를 사용합니다. 이전 것보다 크고 텍스처 생성의 경우 노이즈에서 샘플링되고 스타일라이저 교육을 위해 일부 이미지 데이터베이스에서 샘플링됩니다. 이미지넷의 훈련 부분이 아닌 다른 것을 사용하는 것이 중요합니다. 손실 네트워크 내부의 기능은 훈련 부분에서만 훈련된 네트워크에 의해 계산됩니다.



실시간 스타일 전송 및 초해상도에 대한 지각 손실(2016년 3월 27일)

이름에서 알 수 있듯이 생성 네트워크에 대한 아이디어로 불과 17일 뒤처진 저자들은 이미지의 해상도를 높이느라 바빴습니다. 그들은 최신 이미지넷에서 잔차 학습의 성공에 영감을 받은 것 같습니다.




따라서 잔차 블록 및 전환 블록.



따라서 이제 스타일링 제어 외에도 빠른 생성기를 사용할 수 있습니다(이 두 기사 덕분에 한 이미지의 생성 시간이 수십 ms로 측정됨).

종결

첫 번째 비디오 스타일링 애플리케이션을 위한 또 다른 스타일링 애플리케이션을 만들기 위한 출발점으로 검토된 기사의 정보와 작성자의 코드를 사용했습니다.



이와 같은 것을 생성하십시오.


가장 일반적인 사진에는 완전히 구별할 수 없는 수많은 개체가 나타납니다. 대부분 어떤 이유로 개. 이러한 이미지는 신경망을 기반으로 하고 이미지 처리를 위해 설계된 최초의 공개 서비스 중 하나인 Google의 DeepDream이 출시된 2015년 6월에 인터넷을 채우기 시작했습니다.

대략 다음과 같이 발생합니다. 알고리즘은 사진을 분석하고 친숙한 물체를 상기시키는 조각을 찾고 이러한 데이터에 따라 이미지를 왜곡합니다.

먼저 오픈소스로 프로젝트를 기획했고, 같은 원리로 만든 온라인 서비스가 인터넷에 등장했다. 가장 편리하고 인기 있는 것 중 하나는 Deep Dream Generator입니다. 여기에서 작은 사진을 처리하는 데 약 15초밖에 걸리지 않습니다(이전에는 사용자가 1시간 이상 기다려야 했습니다).

신경망은 그러한 이미지를 생성하는 방법을 어떻게 학습합니까? 그런데 왜 그렇게 부릅니까?

설계상의 신경망은 살아있는 유기체의 실제 신경망을 모방하지만 수학적 알고리즘의 도움을 받아 이를 수행합니다. 기본 구조를 만든 후 기계 학습 방법을 사용하여 훈련할 수 있습니다. 패턴 인식에 대해 이야기하는 경우 수천 개의 이미지가 신경망을 통과해야 합니다. 신경망의 작업이 다르면 훈련도 달라집니다.

예를 들어 체스를 두는 알고리즘은 체스 게임을 분석합니다. 같은 경로를 따라 Google의 DeepMind의 AlphaGo 알고리즘을 중국 바둑 게임에 도입했습니다. 바둑은 체스보다 훨씬 더 복잡하고 비선형이기 때문에 돌파구로 환영받았습니다.

    단순화된 신경망 모델을 가지고 놀면서 그 원리를 더 잘 이해할 수 있습니다.

    YouTube에는 이해하기 쉬운 손으로 그린 ​​시리즈도 있습니다. 롤러신경망이 어떻게 작동하는지에 대해.

또 다른 인기 서비스는 드림스코프(Dreamscope)로 개를 꿈꾸는 것은 물론 다양한 그림 스타일을 흉내낼 수 있다. 여기서 이미지 처리도 매우 간단하고 빠릅니다(약 30초).

분명히 서비스의 알고리즘 부분은 우리가 이미 논의한 Neural 스타일 프로그램의 수정입니다.

최근에는 흑백 이미지를 사실적으로 그리는 프로그램이 등장했습니다. 이전 버전에서는 유사한 프로그램이 훨씬 더 잘 작동하지 않았으며 적어도 20%의 사람들이 실제 그림과 컴퓨터 색상의 차이를 구분할 수 없는 경우 큰 성과로 간주되었습니다.

게다가 여기서 채색은 약 1분밖에 걸리지 않습니다.

같은 개발사에서 사진으로 인식하는 서비스도 출시 다른 유형사물.

이러한 서비스는 재미있는 엔터테인먼트처럼 보일 수 있지만 실제로는 모든 것이 훨씬 더 흥미 롭습니다. 새로운 기술은 인간 예술가의 작업에 들어가고 예술에 대한 우리의 이해를 변화시킵니다. 아마도 곧 사람들은 창의성 분야에서 기계와 경쟁해야 할 것입니다.

패턴 인식 알고리즘을 가르치는 것은 AI 개발자들이 오랫동안 고군분투해 온 작업입니다. 따라서 오래된 사진을 채색하고 하늘의 개를 그리는 프로그램은 더 크고 흥미로운 과정의 일부라고 할 수 있습니다.


맨 위