이것은 제가 최근 트위터와 vimeo에 게시한 웹캠 pix2pix 데모의 소스 코드이자 사전 훈련된 모델입니다. 딥 러닝을 사용하거나 몇 가지 전문 용어를 사용하면 딥 컨볼루션 조건 생성 적대 네트워크 자동 인코더가 있습니다 .
비디오 1
비디오 2
이 특정 저장소의 코드는 실제로 pix2pix, GAN 또는 딥 러닝과 아무 관련이 없습니다. 사전 훈련된 텐서플로우 모델(몇 가지 제약 조건을 준수하는 한)을 로드하고, 처리된 웹캠 입력을 제공하고, 모델의 출력을 표시합니다. 제가 훈련하고 사용한 모델은 pix2pix입니다(자세한 내용은 아래 참조).
즉, 단계는 다음과 같이 요약될 수 있습니다.
저는 위키미디어의 Google Art Project에서 전 세계 미술 컬렉션을 스크랩했습니다. 많은 이미지가 부유한 백인 친구들의 고전적인 초상화이기 때문에 가능한 한 지리적으로나 문화적으로 다양한 데이터를 유지하려고 노력하면서 약 150개의 컬렉션만 사용했습니다(사용한 전체 목록은 여기에 있습니다). 그러나 단일 유럽 박물관에서는 수백 또는 수천 개의 스캔이 있을 수 있지만 아랍 박물관에서는 단 8개의 스캔만 있기 때문에 데이터는 여전히 매우 유럽 중심적입니다.
300px 버전의 이미지를 다운로드하고 일괄 프로세스를 실행하여 다음을 수행했습니다.
또한 (균일하지 않은 크기 조정 대신) 이미지에서 여러 자르기를 가져오기 위해 배치 프로세스를 실행했지만 아직 이에 대해 교육하지 않았습니다. 캐니 에지 감지 대신 Xie와 Tu(원본 pix2pix 논문에서 사용됨)의 훨씬 더 나은 '전체적으로 중첩된 에지 감지'(일명 HED)를 조사하기 시작했지만 아직 이에 대해 교육하지 않았습니다.
이는 preprocess.py 스크립트에 의해 수행됩니다(죄송하지만 명령줄 인수가 없습니다. 스크립트를 편집하여 경로와 설정을 변경하면 설명이 매우 필요합니다).
훈련된 모델의 예측을 포함한 훈련 데이터의 작은 샘플을 여기에서 볼 수 있습니다. 가장 오른쪽 열은 원본 이미지이고, 가장 왼쪽 열은 전처리된 버전입니다. 이 두 이미지는 학습할 '쌍'으로 pix2pix 네트워크에 공급됩니다. 가운데 열은 가장 왼쪽 열만 주어진 경우 모델이 생성하도록 학습한 것입니다. (이미지는 각 훈련 반복을 보여줍니다. 즉, 왼쪽의 숫자는 20,000에서 58,000까지이므로 페이지에서 아래로 내려갈수록 점차 좋아집니다.)
나는 또한 무조건적인 GAN(즉, 동일한 훈련 데이터에 대한 일반 DCGAN)을 훈련했습니다. 출력의 예는 아래에서 볼 수 있습니다. (이것은 훈련 데이터와 유사한 '완전히 무작위' 이미지를 생성합니다).
교육 및 아키텍처는 Isola et al(일명 pix2pix)의 ' 조건부 적대 네트워크를 사용한 이미지-이미지 변환 '입니다. 저는 @affinelayer(Christopher Hesse)의 tensorflow 포트로 교육했는데, 이는 최근 입소문이 난 'sketch-to-cat' 데모의 원동력이기도 합니다. 그는 또한 pix2pix 작동 방식에 대한 훌륭한 튜토리얼을 작성했습니다. 코드를 오픈 소스로 만들어 주신 작성자(및 그들이 기반으로 구축한 모든 사람)에게 무한한 감사를 드립니다!
저는 tensorflow-pix2pix 훈련 코드에서 아주 작은 변경 사항을 한 번만 적용했는데, 그것은 사람이 읽을 수 있는 이름으로 생성기 입력 및 출력에 tf.Identity를 추가하여 쉽게 텐서를 제공하고 가져올 수 있도록 하는 것입니다. 따라서 이 애플리케이션에서 자신의 모델을 사용하려면 동일한 작업을 수행해야 합니다 . (또는 입력/출력 텐서 이름을 기록하고 그에 따라 json을 수정합니다. 이에 대한 자세한 내용은 아래에서 설명합니다.)
릴리스 탭에서 사전 훈련된 모델을 다운로드할 수 있습니다.
이 특정 애플리케이션이 수행하는 작업은 사전 학습된 모델을 로드하고, 웹캠 입력을 실시간으로 전처리하고, 이를 모델에 제공하는 것입니다. 나는 opencv를 사용하여 구식 기본 컴퓨터 비전으로 전처리를 수행합니다. 정말 아주 최소한이고 기본적인 내용입니다. 아래에서 GUI를 볼 수 있습니다(GUI는 pyqtgraph를 사용함).
장면마다 다른 설정이 필요합니다.
예를 들어 '실사'의 경우 더 나은(IMHO) 결과를 제공하기 위해 canny를 찾았으며 이것이 맨 위의 첫 번째 비디오에서 사용한 것입니다. 임계값(canny_t1, canny_t2)은 장면, 세부 묘사의 정도, 원하는 모양에 따라 달라집니다.
이미지에 노이즈가 많으면 pre_blur 또는 pre_median을 약간 추가하는 것이 좋습니다. 아니면 '예술적 효과'를 위해 그것들을 가지고 놀 수도 있습니다. 예를 들어 첫 번째 동영상의 1:05~1:40쯤에 중간값(약 30~50 정도)을 추가했습니다.
장면을 그리는 경우(예: 두 번째 비디오) 캐니보다 더 흥미로운 결과를 제공하는 적응형 임계값을 찾았습니다(즉, 캐니를 비활성화하고 적응형 임계값을 활성화함). 하지만 동의하지 않으실 수도 있습니다.
완전히 정적인 입력 (예: 캡처를 정지하고 카메라 업데이트를 비활성화하는 경우)의 경우 모델이 동일한 입력에 대해 서로 다른 예측을 하기 때문에 출력이 매우 작은 양으로 깜박일 가능성이 있지만 이는 일반적으로 매우 미묘합니다. 그러나 라이브 카메라 피드의 경우 입력의 노이즈로 인해 출력에서 깜박임이 많이 발생할 수 있습니다. 특히 노이즈에 대한 취약성 또는 적응형 임계값의 높은 민감성으로 인해 일시적인 흐림이 도움이 될 수 있습니다.
accum_w1 및 accum_w2 는 모델에 들어가기 전에 입력의 일시적인 흐림을 위한 것입니다. new_image = old_image * w1 + new_image * w2 (따라서 이상적으로는 최대 1 또는 그에 가까워야 합니다).
Prediction.pre_time_lerp 및 post_time_lerp 도 시간적 평활화를 수행합니다. new_image = old_image * xxx_lerp + new_image * (1 - xxx_lerp) pre_time_lerp는 모델에 들어가기 전이고 post_time_lerp는 모델에서 나온 후입니다.
시간적 흐림이 0이면 비활성화됩니다. 이들 값은 취향에 따라 다릅니다. 위의 두 비디오 모두 pre_model 블러(예: accum_w1, accum_w2 및 pre_time_lerp)를 0으로 설정하고 0.0(매우 깜빡거리고 깜박임)에서 0.9(매우 느리고 희미하며 '꿈같은') 범위의 다양한 post_time_lerp 설정으로 재생했습니다. ). 일반적으로 약 0.5-0.8이 제가 가장 좋아하는 범위입니다.
다른 모델을 사용하려면 아래와 유사한 JSON 파일을 설정해야 합니다. 여기서 동기는 실제로 내 app/models 폴더에 동적으로 스캔하고 다시 로드할 수 있는 JSON이 많이 있고, 모델 데이터는 다른 디스크의 다른 곳에 저장되어 있으며, 앱이 런타임 및 규모에 따라 모델 간에 로드하고 교체할 수 있다는 것입니다. 입력/출력 등을 자동으로 수행합니다.
{
"name" : "gart_canny_256", # name of the model (for GUI)
"ckpt_path" : "./models/gart_canny_256", # path to saved model (meta + checkpoints). Loads latest if points to a folder, otherwise loads specific checkpoint
"input" : { # info for input tensor
"shape" : [256, 256, 3], # expected shape (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # expected range of values
"opname" : "generator/generator_inputs" # name of tensor (':0' is appended in code)
},
"output" : { # info for output tensor
"shape" : [256, 256, 3], # shape that is output (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # value range that is output
"opname" : "generator/generator_outputs" # name of tensor (':0' is appended in code)
}
}
Ubuntu 16.04에서만 테스트되었지만 다른 플랫폼에서도 작동합니다.
나는 필요한 거의 모든 것이 포함된 Anaconda Python 배포판을 사용합니다. 그러면 다음과 같이 간단합니다.
https://www.continuum.io/downloads에서 아나콘다를 다운로드하고 설치합니다.
tensorflow 설치 https://www.tensorflow.org/install/ (anaconda가 있는 경우 대부분의 종속성이 포함되어 있으므로 매우 간단합니다)
opencv와 pyqtgraph 설치
conda 설치 -c menpo opencv3 conda 설치 pyqtgraph
다시한번 무한한 감사를 드립니다