🎨 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ CycleGAN для примСнСния стиля ΠΊ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌΡƒ с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹

Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ, ΠΊΠ°ΠΊ выглядСл Π±Ρ‹ ваш ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ МонС? Или Π»Π΅Π³Π΅Π½Π΄Π°Ρ€Π½ΠΎΠ³ΠΎ Π’Π°Π½ Π“ΠΎΠ³Π°? Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ это своими Π³Π»Π°Π·Π°ΠΌΠΈ.

ВСкст публикуСтся Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅, Π°Π²Ρ‚ΠΎΡ€ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π‘Π΅Π½ Бантос.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ GANΡ‹. Π’ΠΎΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ рСсурс, ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅.

Π§Π΅ΠΌ большС я ΠΈΠ·ΡƒΡ‡Π°Π» CycleGAN, Ρ‚Π΅ΠΌ большС мСня ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Π»Π° ΠΎΠ΄Π½Π° ΠΈΠ· областСй Π΅Π³ΠΎ примСнСния: ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° стиля (style transfer). ЦСль ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ стиля – это ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² соотвСтствиС изобраТСниям ΠΈΠ· пространства A изобраТСния ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ пространства B. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – ΠΎΠ΄Π½ΠΎ ΠΈΠ· пространств являСтся ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΉ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ – ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚ΠΎΠ³ΠΎ Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Клода МонС. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ стиля заставляСт ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΈΡ… рисовал МонС.

Взято ΠΈΠ· "БСспарного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»ΠΎ-устойчивых ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСй"

Π­Ρ‚ΠΎΡ‚ процСсс извСстСн ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большого Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠ°Ρ€Π½Ρ‹ΠΌΠΈ изобраТСниями – Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, для обучСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρƒ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ рисунки ΠΈ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ мСст, сдСланныС ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΡƒΠ³Π»ΠΎΠΌ, Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ врСмя дня ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. По ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… нСрСалистично, Π° Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π Π°Π·Π²Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ изобраТСния Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹ Π±Π΅Π· ΠΏΠ°Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²? Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π±Ρ‹Π»Π° исслСдована, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ появился эффСктивный бСспарный ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Π²ΠΈΠ΄Π΅ "цикличСски-согласованных ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСй" (CycleGAN), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ GAN для изучСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… соотвСтствий ΠΈ выполнСния высококачСствСнного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. МСня заинтСрСсовало, насколько эффСктивСн CycleGAN ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, поэтому Π² этой ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ CycleGAN, Π° ΠΏΠΎΡ‚ΠΎΠΌ расскаТу, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ CycleGAN для примСнСния худоТСствСнных стилСй МонС, Π’Π°Π½ Π“ΠΎΠ³Π° ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΊ вашСй собствСнной Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Π΅.

ИдСи, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π² основС CycleGAN

ΠŸΠΎΠ½ΡΡ‚ΡŒ всю Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ CycleGAN довольно слоТно. Π”Π΅Ρ€ΠΆΠ° Π² ΡƒΠΌΠ΅ Ρ†Π΅Π»ΠΈ CycleGAN ΠΈ влияниС этих Ρ†Π΅Π»Π΅ΠΉ Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, Π²Ρ‹ сильно упроститС сСбС Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. CycleGAN ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ†Π΅Π»ΠΈ:

  • ΠΠ°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ соотвСтствиС ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ изобраТСния ΠΈΠ· пространства X Π² пространство Y (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚)
  • Π‘ΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· пространства X, ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π² пространство Y (ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ исходноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… стилистичСских ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Для достиТСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ†Π΅Π»ΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π²Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с двумя ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ дискриминаторами ΠΈ примСняСм ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅ (Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° взята ΠΈΠ· "БСспарного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»ΠΎ-устойчивых ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСй"):

LGAN(G,DY,X,Y)=Ey∼pdata(y)[logDY(y)]+Ex∼pdata(x)[log(1βˆ’DY(G(x)))]

Π—Π΄Π΅ΡΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ G ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ X ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ G(X), выглядящСС Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· пространства Y. Дискриминатор DY пытаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ сгСнСрированныС изобраТСния ΠΎΡ‚ случайно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· пространства Y. G пытаСтся ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ†Π΅Π»ΡŒ (гСнСрируя рСалистичныС изобраТСния), Π° DY пытаСтся Π΅Π³ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π²Π΅Ρ€Π½ΠΎ различая сгСнСрированныС ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ изобраТСния). Π­Ρ‚Π° ΠΆΠ΅ Ρ†Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ установкС соотвСтствия ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΈΠ· пространства Y Π² пространство X.

Одного этого нСдостаточно для достиТСния ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ стиля. ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ потСрями ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· пространства X Π² пространство Y, Π½ΠΎ Π½Π΅ даст Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ сгСнСрированноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π». ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ "Ρ†ΠΈΠΊΠ»ΠΎ-устойчивым", Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ пространство, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ исходному ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ: X -> G(X) -> F(G(X)) ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ эквивалСнтно X, Π³Π΄Π΅ F – это Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, пСрСводящий изобраТСния ΠΈΠ· пространства Y Π² пространство X.

Взято ΠΈΠ· "БСспарного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»ΠΎ-устойчивых ΡΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСй"

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΈ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ нашСй Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ†Π΅Π»ΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Ρ†ΠΈΠΊΠ»ΠΎ-устойчивости, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅. Π­Ρ‚Π° функция ΠΏΠΎΡ‚Π΅Ρ€ΡŒ стимулируСт, Ρ‡Ρ‚ΠΎΠ±Ρ‹ X -> G(X) -> F(G(X)) Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ эквивалСнтно X, Π° Y -> F(Y) -> G(F(Y)) Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ эквивалСнтно Y.

Lcyc(G,F)=Ex∼pdata(x)[β€–F(G(x)βˆ’x)β€–1]+Ey∼pdata(y)[β€–G(F(y))βˆ’yβ€–1]

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для обновлСния вСсов CycleGAN Π² процСссС обучСния:

  • Π‘ΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ G ΠΏΡ€ΠΎΡ‚ΠΈΠ² DY (X -> Y)
  • Π‘ΠΎΡ€Π΅Π²Π½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ F ΠΏΡ€ΠΎΡ‚ΠΈΠ² DX (Y -> X)
  • ΠŸΠΎΡ‚Π΅Ρ€ΠΈ Ρ†ΠΈΠΊΠ»ΠΎ-устойчивости.

Π­Ρ‚ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ достаточно для обучСния CycleGAN. Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ идСнтичности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ ΠΈ Ρ‚ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Автор CycleGAN Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ этим функциям ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вСса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ lambda. Если вас интСрСсуСт, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ аспСкты Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ CycleGAN, (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° слоСв), я ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π²Π°ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ исходной ΡΡ‚Π°Ρ‚ΡŒΠ΅. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, имСя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставлСниС ΠΎ CycleGAN, Π΄Π°Π²Π°ΠΉΡ‚Π΅ заставим Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Π°ΠΌΠΈ!

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ стиля ΠΊ вашСй Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Π΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ МонС, Π’Π°Π½ Π“ΠΎΠ³Π° ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊ вашСй Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ CycleGAN, созданныС Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ. НачнСм с клонирования рСпозитория ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° ΠΊΠΎΡ€Π΅Π½ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. ΠžΡ‚Ρ‚ΡƒΠ΄Π° Π½ΡƒΠΆΠ΅Π½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСсколько bash-ΠΊΠΎΠΌΠ°Π½Π΄, прСдоставлСнных Π² ΠΏΠ°ΠΏΠΊΠ΅ ./scripts, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

bash ./scripts/download_cyclegan_model.sh style_monet_pretrained
bash ./scripts/download_cyclegan_model.sh style_ukiyoe_pretrained
bash ./scripts/download_cyclegan_model.sh style_cezanne_pretrained
bash ./scripts/download_cyclegan_model.sh style_vangogh_pretrained

Π­Ρ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ сохранят ΠΏΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ CycleGAN'Ρ‹ Π² ΠΏΠ°ΠΏΠΊΠ΅ ./checkpoints.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ создадим Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Ρ„Π°ΠΉΠ» Python ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ webcam.py – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ test.py, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вмСсто ΠΏΡ€ΠΎΠ³ΠΎΠ½Π° Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· CycleGAN пропустит Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹.

Когда Π²Ρ‹ создадитС Ρ„Π°ΠΉΠ» webcam.py, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

webcam.py
import os
from options.test_options import TestOptions
from data import create_dataset
from models import create_model
import cv2
import torch
import numpy as np

Π—Π°Ρ‚Π΅ΠΌ скопируйтС ΠΈΠ· test.py строки ΠΊΠΎΠ΄Π° для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

webcam.py
if __name__ == '__main__':
    opt = TestOptions().parse()  # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΠΈ тСста
    # прописываСм значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для тСста
    opt.num_threads = 0   # тСстовый ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ num_threads = 0
    opt.batch_size = 1    # тСстовый ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ batch_size = 1
    opt.serial_batches = True  # Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ пСрСтасовку Π΄Π°Π½Π½Ρ‹Ρ…; Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ эту строку, Ссли Π½ΡƒΠΆΠ½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для случайно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ 
    opt.no_flip = True    # Π½Π΅Ρ‚ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ²; Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ эту строку, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ изобраТСния
    opt.display_id = -1   # тСстовый ΠΊΠΎΠ΄ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Ρ„Π°ΠΉΠ» HTML
    model = create_model(opt)      # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ модСль ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ opt.model ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ
    model.setup(opt)               # ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ настройки: ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ; созданиС scheduler'ΠΎΠ²
    if opt.eval:
        model.eval()

ΠœΡ‹ собираСмся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ webcam.py, ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π² ./options/base_options.py ΠΈ установив Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ --dataroot Π² False, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ использовании Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ cv2 для настройки нашСй Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ Π²Ρ‹Π΄Π°Ρ‡ΠΈ ошибки Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ:

webcam.py
# Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ / настройка Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹
    webcam = cv2.VideoCapture(0)
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΡƒΠ΄Π°Ρ‡Π½ΠΎ Π»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π»Π°ΡΡŒ ΠΊΠ°ΠΌΠ΅Ρ€Π°
    if not webcam.isOpened():
        raise IOError("Cannot open webcam")

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ΄, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π΅ΠΉΠΌΡ‹ с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ прСобразования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наша загруТСнная модСль ΠΌΠΎΠ³Π»Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ…:

webcam.py
 # CycleGan ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ словаря
    # ΠΏΡ€ΠΎΡ‰Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ
    # Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ бСсконСчный Ρ†ΠΈΠΊΠ» - Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ„Ρ€Π΅ΠΉΠΌΡ‹ с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΏΡ€Π΅Ρ€Π²Π΅Ρ‚ Ρ†ΠΈΠΊΠ» с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    data = {"A": None, "A_paths": None}
    while True:

        #ret - это bool, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ»Π° cap.read() -> нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌ
        #Ссли считали ΡƒΠ΄Π°Ρ‡Π½ΠΎ, сохраняСм Π΅Π³ΠΎ Π² frame
        ret, frame = webcam.read()

        #измСняСм Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ frame
        frame = cv2.resize(frame, (256,256), interpolation=cv2.INTER_AREA)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #модСль рассчитываСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ batchsize * channels * h * w
        #добавляСм ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° 
        frame = np.array([frame])
        #Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„ΠΎΡ€ΠΌΠ° - batchsize * channels * h * w
        frame = frame.transpose([0,3,1,2])

        #ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ массив numpy Π² Ρ‚Π΅Π½Π·ΠΎΡ€
        #Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π΅Π½Π·ΠΎΡ€ΠΎΠΌ для совмСстимости с Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ модСлью, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΉ floatTensor'Ρ‹
        data['A'] = torch.FloatTensor(frame)
        
        model.set_input(data)  # Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° 
        model.test()

        #ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сгСнСрированноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - ΠΈΡ‰Π΅ΠΌ Π² словарС ΠΊΠ»ΡŽΡ‡ "fake"
        result_image = model.get_current_visuals()['fake']
        #ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ tensor2im, прСдоставлСнный Π² Ρ„Π°ΠΉΠ»Π΅ util
        result_image = util.tensor2im(result_image)
        result_image = cv2.cvtColor(np.array(result_image), cv2.COLOR_BGR2RGB)  
        result_image = cv2.resize(result_image, (512, 512))  

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ стилизованныС Ρ„Ρ€Π΅ΠΉΠΌΡ‹ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ "Esc", это ΠΎΠΊΠ½ΠΎ закроСтся.

webcam.py
    cv2.imshow('style', result_image)

    #код ASCII клавиши Esc - 27.
    c = cv2.waitKey(1)
    if c == 27:
        break
  cap.release()
  cv2.destroyAllWindows()

Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ webcam.py с Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ модСлью CycleGAN, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ:

python webcam.py  --name MODEL_NAME --model test --preprocess none --no_dropout

Если это вас устраиваСт – прСкрасно! Π’Ρ‹ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, измСняя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ --name. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ стиля ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ клавиши.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ стиля ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ

Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ стилСй вашСй Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ слоТно. НачнСм с создания списка ΠΈΠΌΠ΅Π½ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ цикличСски ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, хранящСй индСкс Π² этом спискС.

webcam.py
#настройка цикличСского ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ стилСй
style_models = ['style_monet_pretrained', 'style_vangogh_pretrained', 'style_ukiyoe_pretrained', 'style_cezanne_pretrained']
style_model_index = 0

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ вывСсти тСкст Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ ΠΎΠΊΠ½Π°, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ примСняСмом стилС. НачнСм с задания Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для располоТСния надписи ΠΈ Π΅Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Π°.

Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ этот ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄ Ρ†ΠΈΠΊΠ»ΠΎΠΌ while, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°
#настройка тСкста
# ΡˆΡ€ΠΈΡ„Ρ‚
font = cv2.FONT_HERSHEY_SIMPLEX 
# располоТСниС
org = (0, 25) 
# ΠΌΠ°ΡΡˆΡ‚Π°Π± ΡˆΡ€ΠΈΡ„Ρ‚Π°
fontScale = 1
# Π‘ΠΈΠ½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° 
color = (255, 255, 255) 
# Π’ΠΎΠ»Ρ‰ΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΉ 2 пиксСля
thickness = 2

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ тСкст Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cv2.putText(), Π° для измСнСния стилСй Π΄ΠΎΠ±Π°Π²ΠΈΠΌ условиС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши 'c' ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ модСль ΠΈΠ· списка style_models. Полная итоговая рСализация webcam.py ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅:

webcam.py
"""ВСстовый скрипт ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ПослС обучСния вашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ train.py, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот скрипт для Π΅Π΅ тСстирования.
Он Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ модСль ΠΈΠ· '--checkpoints_dir' ΠΈ сохранит Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² '--results_dir'.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ создаСт модСль ΠΈ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² соотвСтствии с опциями. НСкоторыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ТСстко прописаны Π² ΠΊΠΎΠ΄Π΅.
Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ запускаСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ для '--num_test' ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Ρ„Π°ΠΉΠ» HTML.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ (Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π°Π΄ΠΎ ΠΎΠ±ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ с нашСго сайта):
    Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль CycleGAN (Π² ΠΎΠ±Π΅ стороны):
        python test.py --dataroot ./datasets/maps --name maps_cyclegan --model cycle_gan

    Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль CycleGAN (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону):
        python test.py --dataroot datasets/horse2zebra/testA --name horse2zebra_pretrained --model test --no_dropout

    ΠžΠΏΡ†ΠΈΡ '--model test' ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² CycleGAN Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону.
    Π­Ρ‚Π° опция автоматичСски устанавливаСт '--dataset_mode single', ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ изобраТСния Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.
    Напротив, использованиС '--model cycle_gan' Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² ΠΎΠ±Π΅ стороны,
    Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ сохранСны Π² ./results/.
    Use '--results_dir <directory_path_to_save_result>' to specify the results directory.

    Test a pix2pix model:
        python test.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --direction BtoA

Π‘ΠΌ. большС ΠΎΠΏΡ†ΠΈΠΉ Π² options/base_options.py ΠΈ options/test_options.py.
Π‘ΠΌ. подсказки для обучСния ΠΈ тСстов Π½Π°: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/docs/tips.md
Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы см: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/docs/qa.md
"""
import os
from options.test_options import TestOptions
from data import create_dataset
from models import create_model
import cv2
import torch
import numpy as np


if __name__ == '__main__':
    opt = TestOptions().parse()  # Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ тСстовыС ΠΎΠΏΡ†ΠΈΠΈ
    # ТСстко ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для тСста
    opt.num_threads = 0   # тСстовый ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ num_threads = 0
    opt.batch_size = 1    # тСстовыС ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ batch_size = 1
    opt.serial_batches = True  # Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ пСрСтасовку Π΄Π°Π½Π½Ρ‹Ρ…; Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ эту строку, Ссли Π½ΡƒΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ случайно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.
    opt.no_flip = True    # Π½Π΅Ρ‚ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ²; Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ эту строку, Ссли Π½ΡƒΠΆΠ΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… изобраТСниях.
    opt.display_id = -1   # тСстовый ΠΊΠΎΠ΄ сохраняСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Ρ„Π°ΠΉΠ» HTML.
    model = create_model(opt)      # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ модСль ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ opt.model ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ
    model.setup(opt)               # ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ настройки: ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ; созданиС scheduler'ΠΎΠ²
    if opt.eval:
        model.eval()
    
    #Π½Π°Ρ‡Π°Ρ‚ΡŒ ΡΡŠΠ΅ΠΌΠΊΡƒ Π²ΠΈΠ΄Π΅ΠΎ/Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ
    webcam = cv2.VideoCapture(0)
    # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π»Π°ΡΡŒ ΠΊΠ°ΠΌΠ΅Ρ€Π°
    if not webcam.isOpened():
        raise IOError("Cannot open webcam")
    
    #цикличСский ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ стилям
    style_models = ['style_monet_pretrained', 'style_vangogh_pretrained', 'style_ukiyoe_pretrained', 'style_cezanne_pretrained']
    style_model_index = 0

    #настройка тСкста
    # ΡˆΡ€ΠΈΡ„Ρ‚
    font = cv2.FONT_HERSHEY_SIMPLEX 
    # Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°
    org = (0, 25) 
    # ΠΌΠ°ΡΡˆΡ‚Π°Π± ΡˆΡ€ΠΈΡ„Ρ‚Π°
    fontScale = 1
    # Π‘ΠΈΠ½ΠΈΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°
    color = (255, 255, 255) 
    # Π’ΠΎΠ»Ρ‰ΠΈΠ½Π° Π»ΠΈΠ½ΠΈΠΉ 2 пиксСля
    thickness = 2


    #CycleGan ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ словаря
    # ΠΏΡ€ΠΎΡ‰Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ это Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ
    # Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ бСсконСчный Ρ†ΠΈΠΊΠ» - Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ„Ρ€Π΅ΠΉΠΌΡ‹ с Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΏΡ€Π΅Ρ€Π²Π΅Ρ‚ Ρ†ΠΈΠΊΠ» с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
    data = {"A": None, "A_paths": None}
    while True:

        #ret - это bool, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ»Π° cap.read() -> нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌ
        #Ссли считали ΡƒΠ΄Π°Ρ‡Π½ΠΎ, сохраняСм Π΅Π³ΠΎ Π² frame
        ret, frame = webcam.read()

        #измСняСм Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ frame
        frame = cv2.resize(frame, (256,256), interpolation=cv2.INTER_AREA)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        #модСль рассчитываСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ batchsize * channels * h * w
        #добавляСм ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°
        frame = np.array([frame])
        #Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„ΠΎΡ€ΠΌΠ° - batchsize * channels * h * w
        frame = frame.transpose([0,3,1,2])

        #ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ массив numpy Π² Ρ‚Π΅Π½Π·ΠΎΡ€
        #Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π΅Π½Π·ΠΎΡ€ΠΎΠΌ для совмСстимости с Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ модСлью, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΉ floatTensor'Ρ‹
        data['A'] = torch.FloatTensor(frame)
        
        model.set_input(data)  # Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°
        model.test()

        #ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сгСнСрированноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ - ΠΈΡ‰Π΅ΠΌ Π² словарС ΠΊΠ»ΡŽΡ‡ "fake"
        result_image = model.get_current_visuals()['fake']
        #ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ tensor2im, прСдоставлСнный Π² Ρ„Π°ΠΉΠ»Π΅ util
        result_image = util.tensor2im(result_image)
        result_image = cv2.cvtColor(np.array(result_image), cv2.COLOR_BGR2RGB)  
        result_image = cv2.resize(result_image, (512, 512))      
        result_image = cv2.putText(result_image, str(opt.name)[6:-11], org, font,  
                   fontScale, color, thickness, cv2.LINE_AA)   
        cv2.imshow('style', result_image)

        #ASCII value of Esc is 27.
        c = cv2.waitKey(1)
        if c == 27:
            break
        if c == 99:
            if style_model_index == len(style_models):
                style_model_index = 0
            opt.name = style_models[style_model_index]
            style_model_index += 1
            model = create_model(opt)      # создаСм модСль с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ опциями create a model given opt.model and other options
            model.setup(opt) 
      
        
    cap.release()
    cv2.destroyAllWindows()
        

Π­Ρ‚ΠΎΡ‚ скрипт ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ bash:

python webcam.py  --name MODEL_NAME --model test --preprocess none --no_dropout

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅/ΡˆΡƒΠΌ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ стилС. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ стиля ΠΊ Π²ΠΈΠ΄Π΅ΠΎ – ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ новая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΎ сдСлано Π½Π΅ΠΌΠ°Π»ΠΎ прСкрасной, Π½ΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ смыслС Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними Ρ„Ρ€Π΅ΠΉΠΌΠ°ΠΌΠΈ Π±Ρ‹Π»Π° Π±ΠΎΠ»Π΅Π΅ Π³Π»Π°Π΄ΠΊΠΎΠΉ.

ДокумСнтация Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ StyleGAN Π½Π°ΡƒΡ‡ΠΈΡ‚ вас, ΠΊΠ°ΠΊ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° собствСнных Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС стили! МнС каТСтся, Ρ‡Ρ‚ΠΎ коллСкция комичСских ΠΊΠ½ΠΈΠ³ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ интСрСсный ΡΡ‚ΠΈΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²ΠΈΠ΄Π΅ΠΎ.

Π₯отя ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²ΠΈΠ΄Π΅ΠΎ, Π²Ρ€ΠΎΠ΄Π΅ Photo Booth, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° стиля – это ΠΊΡ€ΡƒΡ‚ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ модСль, обучСнная Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌΡƒ пониманию ΠΈ нюансам стиля, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ эффСктивно. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ этого Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎ с Π½ΠΈΠ·ΠΊΠΈΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Π½Π° фотографиях с высоким Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ всю Π΅Π΅ ΠΌΠΎΡ‰ΡŒ:

Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠŸΡŒΠ΅Ρ‚Ρ€ΠΎ Π”ΠΈ Π“Ρ€Π°Π½Π΄ΠΈ
"Π’Π°Π½-Π“ΠΎΠ³Π½ΡƒΡ‚ΠΎΠ΅" ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅!
Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ всСго лишь ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ CycleGAN, ΠΈ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π‘Π΅Ρ‚ΠΈ ΠΈΠ»ΠΈ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚.

Π€Π°ΠΉΠ» webcam.py ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ рСпозитория ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΅ΠΉ Π²Π΅Ρ‚ΠΊΠ΅ Π½Π° GitHub.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

matyushkin
07 апрСля 2020

ВОП-15 ΠΊΠ½ΠΈΠ³ ΠΏΠΎ Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Книги ΠΏΠΎ Python (ΠΈ связанным с Π½ΠΈΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚Π΅ΠΌΠ°ΠΌ) Π½Π° русском языкС. Рас...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 ноября 2019

DeepFake-Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»: создаСм собствСнный Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊ Π² DeepFaceLab

РассказываСм ΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DeepFake ΠΈ шаг Π·Π° шагом учимся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊΠΈ Π² ...
admin
14 июля 2017

ПишСм свою Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ: пошаговоС руководство

ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π³Π°ΠΉΠ΄ ΠΏΡ€ΠΎ Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… элСмС...