π¨ ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ CycleGAN Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΈΠ»Ρ ΠΊ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ Ρ Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅ΡΡ
ΠΡ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΠΈΡΡ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄Π΅Π» Π±Ρ Π²Π°Ρ ΠΏΠΎΡΡΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΠΎΠ½Π΅? ΠΠ»ΠΈ Π»Π΅Π³Π΅Π½Π΄Π°ΡΠ½ΠΎΠ³ΠΎ ΠΠ°Π½ ΠΠΎΠ³Π°? Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ Π³Π»Π°Π·Π°ΠΌΠΈ.
Π’Π΅ΠΊΡΡ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ Π² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅, Π°Π²ΡΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΠΠ΅Π½ Π‘Π°Π½ΡΠΎΡ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΡΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΡΠΆΠ΅ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ GANΡ. ΠΠΎΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠ΅ΡΡΡΡ, ΠΎΠ±ΡΡΡΠ½ΡΡΡΠΈΠΉ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅.
Π§Π΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ ΠΈΠ·ΡΡΠ°Π» CycleGAN, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°Π»Π° ΠΎΠ΄Π½Π° ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ: ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΡΠΈΠ»Ρ (style transfer). Π¦Π΅Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΡΠΈΠ»Ρ β ΡΡΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° A ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° B. ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠ΅ΠΉ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΠΉ, Π° Π²ΡΠΎΡΠΎΠ΅ β ΠΊΠ°ΡΡΠΈΠ½Ρ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΠ³ΠΎ Ρ
ΡΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΠ»ΠΎΠ΄Π° ΠΠΎΠ½Π΅. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΡΠΈΠ»Ρ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΈΡ
ΡΠΈΡΠΎΠ²Π°Π» ΠΠΎΠ½Π΅.
ΠΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΠΎΠ½ ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ Ρ ΠΏΠ°ΡΠ½ΡΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ β ΡΠΎ Π΅ΡΡΡ, Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ Π²Π°ΠΌ Π½ΡΠΆΠ½Ρ ΡΠΈΡΡΠ½ΠΊΠΈ ΠΈ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΠΈ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ ΠΌΠ΅ΡΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ³Π»ΠΎΠΌ, Π² ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Π΄Π½Ρ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. ΠΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ ΠΏΠ°ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π½Π΅ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΠΎ, Π° Π·Π°ΡΠ°ΡΡΡΡ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π Π°Π·Π²Π΅ Π½Π΅ Π±ΡΠ»ΠΎ Π±Ρ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠ°ΡΡΠΈΠ½Ρ Π±Π΅Π· ΠΏΠ°ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²? ΠΡΠ° Π·Π°Π΄Π°ΡΠ° Π±ΡΠ»Π° ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π°, ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ Π±Π΅ΡΠΏΠ°ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² Π²ΠΈΠ΄Π΅ "ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ-ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΎΡΠ΅Π²Π½ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ΅ΠΉ" (CycleGAN), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ GAN Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΠ΅Π½Ρ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π»ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ CycleGAN ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΡΠΎΠΉ ΠΊΡΠ°ΡΠΊΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΠΏΡΠΈΠ²Π΅Π΄Ρ ΠΊΡΠ°ΡΠΊΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² ΡΠ°Π±ΠΎΡΡ CycleGAN, Π° ΠΏΠΎΡΠΎΠΌ ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ CycleGAN Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Ρ ΡΠ΄ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠΈΠ»Π΅ΠΉ ΠΠΎΠ½Π΅, ΠΠ°Π½ ΠΠΎΠ³Π° ΠΈ ΠΏΡΠΎΡΠΈΡ ΠΊ Π²Π°ΡΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅ΡΠ΅.
ΠΠ΄Π΅ΠΈ, Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π² ΠΎΡΠ½ΠΎΠ²Π΅ CycleGAN
ΠΠΎΠ½ΡΡΡ Π²ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ CycleGAN Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΠ΅ΡΠΆΠ° Π² ΡΠΌΠ΅ ΡΠ΅Π»ΠΈ CycleGAN ΠΈ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ, Π²Ρ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΠ΅ ΡΠ΅Π±Π΅ Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. CycleGAN ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅Π»ΠΈ:
- ΠΠ°ΡΡΠΈΡΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° X Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Y (ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ)
- Π‘ΠΎΡ ΡΠ°Π½ΡΡΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ: ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° X, ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Y (ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΠΈΠ»ΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ΅Π»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π²Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Ρ Π΄Π²ΡΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π΄ΠΈΡΠΊΡΠΈΠΌΠΈΠ½Π°ΡΠΎΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΎΡΠ΅Π²Π½ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠ΅ΡΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ (ΡΠΎΡΠΌΡΠ»Π° Π²Π·ΡΡΠ° ΠΈΠ· "ΠΠ΅ΡΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠΊΠ»ΠΎ-ΡΡΡΠΎΠΉΡΠΈΠ²ΡΡ ΡΠΎΡΠ΅Π²Π½ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ΅ΠΉ"):
ΠΠ΄Π΅ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ 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.
ΠΡΠ°ΠΊ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²Π΅ΡΠΎΠ² 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, Π½Π°ΡΠ½ΠΈΡΠ΅ Ρ ΠΈΠΌΠΏΠΎΡΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²:
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 ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ:
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 = cv2.VideoCapture(0) # ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΠ΄Π°ΡΠ½ΠΎ Π»ΠΈ ΠΎΡΠΊΡΡΠ»Π°ΡΡ ΠΊΠ°ΠΌΠ΅ΡΠ° if not webcam.isOpened(): raise IOError("Cannot open webcam")
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠ΄, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΡΠ΅ΠΉΠΌΡ Ρ Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅ΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π½Π°ΡΠ° Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΎΠ³Π»Π° ΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΠΈΡ :
# 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", ΡΡΠΎ ΠΎΠΊΠ½ΠΎ Π·Π°ΠΊΡΠΎΠ΅ΡΡΡ.
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. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ Π²Π°ΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ: ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ.
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠΈΠ»Ρ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ
ΠΡΡΠ°Π²ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΈΠ»Π΅ΠΉ Π²Π°ΡΠ΅ΠΉ Π²Π΅Π±-ΠΊΠ°ΠΌΠ΅ΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΈΠΌΠ΅Π½ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ ΡΠ°Π½ΡΡΠ΅ΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΡΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅.
#Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΈΠ»Π΅ΠΉ 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
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅ΠΊΡΡ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΠ³Π»Ρ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ cv2.putText(), Π° Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΈΠ»Π΅ΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ 'c' ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° style_models. ΠΠΎΠ»Π½Π°Ρ ΠΈΡΠΎΠ³ΠΎΠ²Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ 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, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΡΠΈΠ»Ρ β ΡΡΠΎ ΠΊΡΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΎΠ±ΡΡΠ΅Π½Π½Π°Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠΌΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΈ Π½ΡΠ°Π½ΡΠ°ΠΌ ΡΡΠΈΠ»Ρ, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΅Π³ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π½Π° ΠΏΠΎΡΠΎΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Ρ Π½ΠΈΠ·ΠΊΠΈΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Π½Π° ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΡΡ Ρ Π²ΡΡΠΎΠΊΠΈΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π²ΡΡ Π΅Π΅ ΠΌΠΎΡΡ:
Π€Π°ΠΉΠ» webcam.py ΠΈ ΡΠ°ΠΉΠ»Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΠΌΠΎΠ΅ΠΉ Π²Π΅ΡΠΊΠ΅ Π½Π° GitHub.