이것은 Leon A. Gatys, Alexander S. Ecker 및 Matthias Bethge의 예술적 스타일의 신경 알고리즘을 논문의 Pytorch 구현입니다. 이 코드는 저스틴 존슨의 신경 스타일을 기반으로합니다.
이 논문은 한 이미지의 내용을 Convolutional Neural Networks를 사용하여 다른 이미지의 스타일과 결합하기위한 알고리즘을 제시합니다. 다음은 별이 빛나는 밤의 예술적 스타일을 Stanford 캠퍼스의 야간 사진에 매핑하는 예입니다.
다른 이미지의 스타일을 동일한 콘텐츠 이미지에 적용하면 흥미로운 결과가 나타납니다. 여기서 우리는 논문에서 그림 2를 재현하여 독일의 Tubingen의 사진을 다양한 스타일로 제공합니다.
Golden Gate Bridge 의이 사진에 다양한 작품의 스타일을 적용한 결과는 다음과 같습니다.
이 알고리즘을 통해 사용자는 스타일 및 컨텐츠 재건 용어의 상대적 가중치를 트레이드 오프 할 수 있습니다.이 예에서 볼 수 있듯이 Picasso의 1907 자화상 스타일을 Brad Pitt에 포팅합니다.
스타일 기능을 추출하기 전에 스타일 이미지를 조정함으로써 스타일 이미지에서 전송되는 예술적 기능의 유형을 제어 할 수 있습니다. -style_scale 플래그 로이 동작을 제어 할 수 있습니다. 아래에서 우리는 별이 빛나는 밤 스타일로 Golden Gate Bridge를 렌더링하는 세 가지 예를 봅니다. 왼쪽에서 오른쪽으로 -style_scale 2.0, 1.0 및 0.5입니다.
하나 이상의 스타일 이미지를 사용하여 여러 예술적 스타일을 혼합 할 수 있습니다.
왼쪽 상단에서 시계 방향 : "The Starry Night" + "The Scream", "The Scream" + "Composition VII", "Seated Nude" + "Composition VII"및 "Sited Nude" + "The Starry Night"
여러 스타일 이미지를 사용하는 경우 혼합 된 정도를 제어 할 수 있습니다.
플래그 -original_colors 1 추가하면 출력 이미지가 원본 이미지의 색상을 유지합니다.
종속성 :
선택적 종속성 :
종속성을 설치 한 후에는 VGG 모델을 다운로드하려면 다음 스크립트를 실행해야합니다.
python models/download_models.py
원래 VGG-19 모델을 다운로드합니다. 원래 VGG-16 모델도 다운로드됩니다. 기본적으로 원래 VGG-19 모델이 사용됩니다.
메모리 GPU가 작은 경우 Nin Imagenet 모델을 사용하는 것이 더 좋으며 약간 더 나쁘지만 비슷한 결과를 제공합니다. BVLC Caffe Modelzoo의 모델에 대한 세부 정보를 얻을 수 있습니다. NIN 모델은 download_models.py 스크립트를 실행할 때 다운로드됩니다.
Ubuntu 및 Windows에 대한 자세한 설치 지침은 설치 안내서에서 찾을 수 있습니다.
기본 사용 :
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
NIN 모델을 사용한 CUDNN 사용 :
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
여러 스타일 이미지를 사용하려면 다음과 같은 쉼표로 구분 된 목록을 전달하십시오.
-style_image starry_night.jpg,the_scream.jpg .
이미지로가는 경로에는 홈 디렉토리를 나타내는 ~ 문자가 포함되어서는 안됩니다. 대신 상대 경로 또는 완전한 절대 경로를 사용해야합니다.
옵션 :
-image_size : 생성 된 이미지의 최대 측면 길이 (픽셀). 기본값은 512입니다.-style_blend_weights : -style_blend_weights 3,7 과 같은 쉼표로 구분 된 목록으로 여러 스타일 이미지의 스타일을 혼합하기위한 가중치. 기본적으로 모든 스타일 이미지는 똑같이 가중됩니다.-gpu : 사용할 GPU의 제로 인덱스 ID; CPU 모드 세트 -gpu 의 경우 c .최적화 옵션 :
-content_weight : 컨텐츠 재구성 용어의 가중치 기본값은 5E0입니다.-style_weight : 스타일 재구성 용어의 가중치 기본값은 1E2입니다.-tv_weight : 총 변수 (TV) 정규화의 무게; 이것은 이미지를 부드럽게하는 데 도움이됩니다. 기본값은 1E-3입니다. TV 정규화를 비활성화하려면 0으로 설정하십시오.-num_iterations : 기본값은 1000입니다.-init : 생성 된 이미지를 생성하는 방법; random 또는 image 중 하나. 기본값은 종이에서와 같이 노이즈 초기화를 사용하는 random 입니다. image 컨텐츠 이미지로 초기화됩니다.-init_image : 초기화 이미지를 사용자 지정된 이미지로 대체합니다.-optimizer : 사용할 최적화 알고리즘; lbfgs 또는 adam ; 기본값은 lbfgs 입니다. L-BFG는 더 나은 결과를 제공하는 경향이 있지만 더 많은 메모리를 사용합니다. Adam으로 전환하면 메모리 사용이 줄어 듭니다. Adam을 사용할 때는 다른 매개 변수와 함께 플레이하여 스타일 무게, 콘텐츠 가중치 및 학습 속도를 얻을 수 있습니다.-learning_rate : Adam Optimizer와 함께 사용하는 학습 속도. 기본값은 1E1입니다.-normalize_gradients :이 플래그가있는 경우 각 레이어의 스타일 및 컨텐츠 그라디언트가 L1 정규화됩니다.출력 옵션 :
-output_image : 출력 이미지의 이름. 기본값이 out.png .-print_iter : 모든 print_iter 반복을 인쇄합니다. 인쇄를 비활성화하려면 0으로 설정하십시오.-save_iter : 모든 save_iter 반복 이미지를 저장하십시오. 중간 결과 저장을 비활성화하려면 0으로 설정하십시오.레이어 옵션 :
-content_layers : 컨텐츠 재구성에 사용할 쉼표로 구분 된 레이어 이름 목록. 기본값은 relu4_2 입니다.-style_layers : 스타일 재구성에 사용할 쉼표로 구분 된 레이어 이름 목록. 기본값은 relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 입니다.기타 옵션 :
-style_scale : 스타일 이미지에서 기능을 추출하는 스케일. 기본값은 1.0입니다.-original_colors : 이것을 1로 설정하면 출력 이미지가 컨텐츠 이미지의 색상을 유지합니다.-model_file : vgg caffe 모델의 .pth 파일로가는 경로. 기본값은 원래 VGG-19 모델입니다. 원래 VGG-16 모델을 시도 할 수도 있습니다.-pooling : 사용할 풀링 층의 유형; max 또는 avg 중 하나. 기본값은 max 입니다. VGG-19 모델은 최대 풀링 레이어를 사용하지만이 논문은 이러한 층을 평균 풀링 레이어로 대체하면 결과를 향상시킬 수 있다고 언급합니다. 평균 풀링을 사용하여 좋은 결과를 얻을 수 없었지만 옵션은 여기에 있습니다.-seed : 반복 가능한 결과를 위해 지정할 수있는 정수 값. 기본적 으로이 값은 각 실행에 대해 무작위입니다.-multidevice_strategy : 여러 장치를 사용할 때 네트워크를 분할 할 쉼표로 구분 된 레이어 지수 목록. 자세한 내용은 멀티 GPU 스케일링을 참조하십시오.-backend : nn , cudnn , openmp 또는 mkl . 기본값은 nn 입니다. mkl 인텔의 MKL 백엔드가 필요합니다.-cudnn_autotune : CUDNN 백엔드를 사용할 때이 플래그를 전달하여 내장 된 CUDNN AUTOTUNER를 사용하여 아키텍처에 가장 적합한 컨볼 루션 알고리즘을 선택하십시오. 이렇게하면 첫 번째 반복이 약간 느려지고 약간 더 많은 메모리가 필요할 수 있지만 CUDNN 백엔드의 속도를 크게 높일 수 있습니다. 문제 : 프로그램은 메모리가 부족하고 죽습니다
솔루션 : 이미지 크기를 줄이십시오 : -image_size 256 (또는 하단). 다른 이미지 크기는 최적의 결과를 위해 -style_weight 및 -content_weight 에 대한 비 기본 값이 필요할 수 있습니다. GPU에서 실행중인 경우 -backend cudnn 으로 실행하여 메모리 사용을 줄일 수도 있습니다.
문제 : -backend cudnn 은 기본 NN 백엔드보다 느립니다
해결책 : 플래그 -cudnn_autotune 추가하십시오. 이렇게하면 내장 CUDNN AUTOTUNER를 사용하여 최고의 컨볼 루션 알고리즘을 선택합니다.
문제 : 다음 오류 메시지 가져 오기 :
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
솔루션 : 레이어 위치와의 혼합으로 인해 이전 모델은 최신 버전의 Pytorch와 호환되도록 수정해야합니다. 포함 된 donwload_models.py 스크립트는 모델을 다운로드 한 후 이러한 수정 사항을 자동으로 수행합니다.
기본적으로 neural-style-pt 최적화를 위해 컨볼 루션 및 L-BFG의 nn 백엔드를 사용합니다. 이것들은 좋은 결과를 제공하지만 둘 다 많은 메모리를 사용할 수 있습니다. 다음과 함께 메모리 사용량을 줄일 수 있습니다.
-backend cudnn 추가하십시오. 이것은 GPU 모드에서만 작동합니다.-optimizer adam 추가하십시오. 이것은 메모리 사용량을 크게 줄여야하지만 좋은 결과를 얻으려면 다른 매개 변수의 튜닝이 필요할 수 있습니다. 특히 학습 속도, 콘텐츠 무게 및 스타일 무게를 가지고 놀아야합니다. 이것은 CPU 및 GPU 모드 모두에서 작동해야합니다.-image_size 256 전달하여 기본 크기의 절반으로 이미지를 생성하십시오.기본 설정으로 신경 스타일 -PT는 내 시스템에서 약 3.7GB의 GPU 메모리를 사용합니다. Adam과 Cudnn으로 전환하면 GPU 메모리 발자국이 약 1GB로 줄어 듭니다.
속도는 백엔드 및 최적화에 따라 크게 다를 수 있습니다. 다음은 다른 설정이있는 Tesla K80에서 -image_size=512 로 500 개의 반복을 실행하는 경우가 있습니다.
-backend nn -optimizer lbfgs : 117 초-backend nn -optimizer adam : 100 초-backend cudnn -optimizer lbfgs : 124 초-backend cudnn -optimizer adam : 107 초-backend cudnn -cudnn_autotune -optimizer lbfgs : 109 초-backend cudnn -cudnn_autotune -optimizer adam : 91 초GTX 1080의 동일한 벤치 마크는 다음과 같습니다.
-backend nn -optimizer lbfgs : 56 초-backend nn -optimizer adam : 38 초-backend cudnn -optimizer lbfgs : 40 초-backend cudnn -optimizer adam : 40 초-backend cudnn -cudnn_autotune -optimizer lbfgs : 23 초-backend cudnn -cudnn_autotune -optimizer adam : 24 초 여러 CPU 및 GPU 장치를 사용하여 더 높은 해상도에서 이미지를 처리 할 수 있습니다. 네트워크의 다른 계층은 다른 장치에서 계산됩니다. -gpu 플래그와 함께 사용되는 GPU 및 CPU 장치를 제어 할 수 있으며 -multidevice_strategy 플래그를 사용하여 장치를 통해 레이어를 분할하는 방법을 제어 할 수 있습니다.
예를 들어 4 개의 GPU가있는 서버에서는 GPU 0, 1, 2 및 3을 순서대로 처리하기 위해 플래그 -gpu 0,1,2,3 제공 할 수 있습니다. 또한 플래그 -multidevice_strategy 3,6,12 제공함으로써 첫 두 층은 GPU 0에서 계산되어야한다는 것을 나타냅니다. GPU 1에서 3 ~ 5 층을 계산해야하며, 층 6에서 11 층은 GPU 2에서 계산되어야하며 나머지 레이어는 GPU 3에서 -multidevice_strategy 해야합니다. 해결.
Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann 및 Eli Shechtman의 신경 스타일 전달의 지각 적 요인을 제어하는 논문에 설명 된대로 멀티 GPU 처리와 멀티 스케일 생성을 결합하여 고해상도에서 매우 높은 품질의 결과를 얻을 수 있습니다.
다음은 8 개의 Tesla K80 GPU가있는 서버에서 생성 된 4016 X 2213 이미지입니다.
이 이미지를 생성하는 데 사용되는 스크립트는 여기에서 찾을 수 있습니다.
이미지는 백색 노이즈로 초기화되고 L-BFG를 사용하여 최적화됩니다.
conv1_1 , conv2_1 , conv3_1 , conv4_1 및 conv5_1 층 및 conv4_2 층을 사용하여 컨텐츠 재구성을 사용하여 스타일 재구성을 수행합니다. 논문에서와 같이, 5 개의 스타일의 재건 손실은 무게가 동일합니다.
이 코드가 귀하의 연구에 유용하다고 생각되면 제공된 인용을 사용하여 인용하십시오.