Stanislav Pidhorskyi • โดนัลด์ เอ. อัดเจโรห์ • จานฟรังโก โดเรตโต
โฟลเดอร์ Google Drive พร้อมโมเดลและผลลัพธ์เชิงคุณภาพ
ตัวเข้ารหัสอัตโนมัติแฝงของฝ่ายตรงข้าม
สตานิสลาฟ พิดอร์สกี้, โดนัลด์ อัดเจโรห์, จานฟรังโก โดเรตโตบทคัดย่อ: เครือข่ายตัวเข้ารหัสอัตโนมัติเป็นแนวทางที่ไม่ได้รับการดูแลโดยมีจุดประสงค์เพื่อรวมคุณสมบัติการสร้างและการเป็นตัวแทนโดยการเรียนรู้แผนที่ตัวเข้ารหัสและตัวสร้างไปพร้อม ๆ กัน แม้ว่าจะมีการศึกษาอย่างกว้างขวาง แต่ประเด็นที่ว่าพวกมันมีพลังในการสร้าง GAN แบบเดียวกันหรือเรียนรู้การเป็นตัวแทนที่ไม่พันกันนั้นยังไม่ได้รับการแก้ไขอย่างสมบูรณ์ เราขอแนะนำโปรแกรมเข้ารหัสอัตโนมัติที่จะจัดการปัญหาเหล่านี้ร่วมกัน ซึ่งเราเรียกว่า Adversarial Latent Autoencoder (ALAE) เป็นสถาปัตยกรรมทั่วไปที่สามารถใช้ประโยชน์จากการปรับปรุงล่าสุดเกี่ยวกับขั้นตอนการฝึกอบรม GAN เราได้ออกแบบตัวเข้ารหัสอัตโนมัติสองตัว ตัวหนึ่งใช้ตัวเข้ารหัส MLP และอีกตัวใช้ตัวสร้าง StyleGAN ซึ่งเราเรียกว่า StyleALAE เราตรวจสอบคุณสมบัติการแยกตัวของสถาปัตยกรรมทั้งสอง เราแสดงให้เห็นว่า StyleALAE ไม่เพียงแต่สามารถสร้างภาพใบหน้าขนาด 1024x1024 ที่มีคุณภาพเทียบเท่ากับ StyleGAN เท่านั้น แต่ที่ความละเอียดเท่ากัน ยังสามารถสร้างการสร้างใบหน้าใหม่และการปรับเปลี่ยนตามภาพจริงได้อีกด้วย สิ่งนี้ทำให้ ALAE เป็นตัวเข้ารหัสอัตโนมัติตัวแรกที่สามารถเปรียบเทียบได้ และเหนือกว่าความสามารถของสถาปัตยกรรมประเภทตัวสร้างเท่านั้น
@InProceedings{pidhorskyi2020adversarial,
author = {Pidhorskyi, Stanislav and Adjeroh, Donald A and Doretto, Gianfranco},
booktitle = {Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR)},
title = {Adversarial Latent Autoencoders},
year = {2020},
note = {[to appear]},
}
หากต้องการเรียกใช้การสาธิต คุณจะต้องติดตั้ง GPU ที่รองรับ CUDA, PyTorch >= v1.3.1 และไดรเวอร์ cuda/cuDNN ติดตั้งแพ็คเกจที่จำเป็น:
pip install -r requirements.txt
ดาวน์โหลดโมเดลที่ได้รับการฝึกอบรมล่วงหน้า:
python training_artifacts/download_all.py
เรียกใช้การสาธิต:
python interactive_demo.py
คุณสามารถระบุการกำหนดค่า yaml ที่จะใช้ได้ การกำหนดค่าอยู่ที่นี่: https://github.com/podgorskiy/ALAE/tree/master/configs โดยค่าเริ่มต้น จะใช้หนึ่งรายการสำหรับชุดข้อมูล FFHQ คุณสามารถเปลี่ยนการกำหนดค่าโดยใช้พารามิเตอร์ -c
หากต้องการทำงานบน celeb-hq
ในความละเอียด 256x256 ให้รัน:
python interactive_demo.py -c celeba-hq256
อย่างไรก็ตาม สำหรับการกำหนดค่าอื่นที่ไม่ใช่ FFHQ คุณจะต้องได้รับเวกเตอร์ทิศทางหลักใหม่สำหรับแอตทริบิวต์
โค้ดในที่เก็บถูกจัดระเบียบในลักษณะที่ต้องเรียกใช้สคริปต์ทั้งหมดจากรากของที่เก็บ หากคุณใช้ IDE (เช่น PyCharm หรือ Visual Studio Code) เพียงตั้งค่า Working Directory ให้ชี้ไปที่รูทของที่เก็บ
หากคุณต้องการเรียกใช้จากบรรทัดคำสั่ง คุณจะต้องตั้งค่าตัวแปร PYTHONPATH ให้ชี้ไปที่รูทของที่เก็บด้วย
ตัวอย่างเช่น สมมติว่าเราได้โคลนพื้นที่เก็บข้อมูลไปยังไดเร็กทอรี ~/ALAE จากนั้นให้ทำดังนี้:
$ cd ~/ALAE
$ export PYTHONPATH=$PYTHONPATH:$(pwd)
ตอนนี้คุณสามารถรันสคริปต์ได้ดังนี้:
$ python style_mixing/stylemix.py
เส้นทาง | คำอธิบาย |
---|---|
อลาเอ | โฟลเดอร์รูทของที่เก็บ |
├ การกำหนดค่า | โฟลเดอร์ที่มีไฟล์กำหนดค่า yaml |
│ ├ ห้องนอน.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูลห้องนอน LSUN ที่ความละเอียด 256x256 |
│ ├ celeba.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูล CelebA ที่ความละเอียด 128x128 |
│ ├ เซเลบา-hq256.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูล CelebA-HQ ที่ความละเอียด 256x256 |
│ ├ celeba_ablation_nostyle.yaml | ไฟล์กำหนดค่าสำหรับชุดข้อมูล CelebA 128x128 สำหรับการศึกษาการระเหย (ไม่มีสไตล์) |
│ ├ celeba_ablation_separate.yaml | ไฟล์กำหนดค่าสำหรับชุดข้อมูล CelebA 128x128 สำหรับการศึกษาการระเหย (ตัวเข้ารหัสและตัวจำแนกแยกกัน) |
│ ├ celeba_ablation_z_reg.yaml | ไฟล์กำหนดค่าสำหรับชุดข้อมูล CelebA 128x128 สำหรับการศึกษาการระเหย (การถดถอยในพื้นที่ Z ไม่ใช่ W) |
│ ├ ffhq.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูล FFHQ ที่ความละเอียด 1024x1024 |
│ ├ mnist.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูล MNIST โดยใช้สถาปัตยกรรมสไตล์ |
│ └ mnist_fc.yaml | กำหนดค่าไฟล์สำหรับชุดข้อมูล MNIST โดยใช้เลเยอร์ที่เชื่อมต่อโดยสมบูรณ์เท่านั้น (Permutation Invariant MNIST) |
├ ชุดข้อมูล_การเตรียมการ | โฟลเดอร์ที่มีสคริปต์สำหรับการเตรียมชุดข้อมูล |
│ ├ wait_celeba_hq_tfrec.py | เพื่อเตรียม TFRecords สำหรับชุดข้อมูล CelebA-HQ ที่ความละเอียด 256x256 |
│ ├เตรียม_celeba_tfrec.py | เพื่อเตรียม TFRecords สำหรับชุดข้อมูล CelebA ที่ความละเอียด 128x128 |
│ ├เตรียม_mnist_tfrec.py | เพื่อเตรียม TFRecords สำหรับชุดข้อมูล MNIST |
│ ├ split_tfrecords_bedroom.py | เพื่อแยก TFRecords อย่างเป็นทางการจากกระดาษ StyleGAN สำหรับชุดข้อมูลห้องนอน LSUN |
│ └ split_tfrecords_ffhq.py | เพื่อแยก TFRecords อย่างเป็นทางการจากกระดาษ StyleGAN สำหรับชุดข้อมูล FFHQ |
├ ชุดข้อมูล_ตัวอย่าง | โฟลเดอร์ที่มีอินพุตตัวอย่างสำหรับชุดข้อมูลต่างๆ ใช้สำหรับตัวเลขและอินพุตทดสอบระหว่างการฝึก |
├ make_figures | สคริปต์สำหรับสร้างตัวเลขต่างๆ |
├ ตัวชี้วัด | สคริปต์สำหรับการคำนวณเมตริก |
├ หลักการ_ทิศทาง | สคริปต์สำหรับการคำนวณเวกเตอร์ทิศทางหลักสำหรับคุณลักษณะต่างๆ สำหรับการสาธิตเชิงโต้ตอบ |
├ style_mixing | ตัวอย่างอินพุตและสคริปต์สำหรับสร้างตัวเลขที่ผสมผสานสไตล์ |
├ การฝึกอบรม_สิ่งประดิษฐ์ | ตำแหน่งเริ่มต้นสำหรับการบันทึกจุดตรวจ/เอาต์พุตตัวอย่าง/แปลง |
│ └ download_all.py | สคริปต์สำหรับดาวน์โหลดโมเดลที่ฝึกไว้ล่วงหน้าทั้งหมด |
├ Interactive_demo.py | สคริปต์ที่รันได้สำหรับการสาธิตเชิงโต้ตอบ |
├ train_alae.py | สคริปต์ที่รันได้สำหรับการฝึกอบรม |
├ train_alae_separate.py | สคริปต์ที่รันได้สำหรับการฝึกอบรมการศึกษาการผ่าตัดทำลาย (ตัวเข้ารหัสและตัวจำแนกแยกกัน) |
├ checkpointer.py | โมดูลสำหรับการบันทึก/กู้คืนน้ำหนักโมเดล สถานะเครื่องมือเพิ่มประสิทธิภาพ และประวัติการสูญเสีย |
├ custom_adam.py | เครื่องมือเพิ่มประสิทธิภาพอดัมที่กำหนดเองสำหรับการปรับสมดุลอัตราการเรียนรู้และเบต้าศูนย์วินาที |
├ dataloader.py | โมดูลที่มีคลาสชุดข้อมูล ตัวโหลด ตัววนซ้ำ ฯลฯ |
├ defaults.py | คำจำกัดความสำหรับตัวแปรการกำหนดค่าด้วยค่าเริ่มต้น |
├ launcher.py | ตัวช่วยสำหรับการรัน multi-GPU, การฝึกแบบหลายกระบวนการ ตั้งค่าคอนฟิกและการบันทึก |
├ lod_driver.py | คลาสตัวช่วยสำหรับการจัดการเครือข่ายที่กำลังเติบโต/มีเสถียรภาพ |
├ lreq.py | โมดูล Linear , Conv2d และ ConvTranspose2d แบบกำหนดเองสำหรับการปรับอัตราการเรียนรู้ให้เท่ากัน |
├ model.py | โมดูลที่มีการกำหนดโมเดลระดับสูง |
├ model_separate.py | เช่นเดียวกับข้างต้น แต่สำหรับการศึกษาการระเหย |
├ net.py | คำจำกัดความของบล็อกเครือข่ายทั้งหมดสำหรับสถาปัตยกรรมหลายรายการ |
├registry.py | รีจิสทรีของบล็อกเครือข่ายสำหรับการเลือกจากไฟล์กำหนดค่า |
├ scheduler.py | ตัวกำหนดเวลาแบบกำหนดเองพร้อมการเริ่มต้นอย่างอบอุ่นและรวบรวมเครื่องมือเพิ่มประสิทธิภาพหลายตัว |
├ tracker.py | โมดูลสำหรับการวางแผนการสูญเสีย |
└ utils.py | มัณฑนากรสำหรับการโทรแบบอะซิงก์, มัณฑนากรสำหรับการแคช, รีจิสตรีสำหรับการบล็อกเครือข่าย |
ใน codebase yacs นี้ใช้เพื่อจัดการการกำหนดค่า
สคริปต์ที่รันได้ส่วนใหญ่ยอมรับพารามิเตอร์ -c
ที่สามารถระบุไฟล์กำหนดค่าที่จะใช้ได้ ตัวอย่างเช่น หากต้องการสร้างตัวเลขการบูรณะใหม่ คุณสามารถเรียกใช้:
python make_figures/make_recon_figure_paged.py
python make_figures/make_recon_figure_paged.py -c celeba
python make_figures/make_recon_figure_paged.py -c celeba-hq256
python make_figures/make_recon_figure_paged.py -c bedroom
การกำหนดค่าเริ่มต้นคือ ffhq
การฝึกอบรมเสร็จสิ้นโดยใช้ TFRecords TFRecords ถูกอ่านโดยใช้ DareBlopy ซึ่งอนุญาตให้ใช้กับ Pytorch
ในไฟล์กำหนดค่าและสคริปต์การเตรียมการทั้งหมด จะถือว่าชุดข้อมูลทั้งหมดอยู่ใน /data/datasets/
คุณสามารถเปลี่ยนเส้นทางในไฟล์กำหนดค่าหรือสร้างลิงก์สัญลักษณ์ไปยังตำแหน่งที่คุณจัดเก็บชุดข้อมูลได้
วิธีการอย่างเป็นทางการในการสร้าง CelebA-HQ อาจเป็นเรื่องที่ท้าทาย โปรดดูหน้านี้: https://github.com/suvojit-0x55aa/celebA-HQ-dataset-download คุณสามารถรับชุดข้อมูลที่สร้างไว้ล่วงหน้าได้จาก: https://drive.google.com/drive/folders/11Vz0fqHS2rXDb5pprgTjpD7S2BAJhi1P
หากต้องการดาวน์โหลดโมเดลที่ได้รับการฝึกล่วงหน้าให้รัน:
python training_artifacts/download_all.py
หมายเหตุ : เคยมีปัญหาในการดาวน์โหลดโมเดลจาก Google Drive เนื่องจากขีดจำกัดการดาวน์โหลด ตอนนี้สคริปต์ได้รับการตั้งค่าในลักษณะที่หากล้มเหลวในการดาวน์โหลดข้อมูลจาก Google Drive สคริปต์จะพยายามดาวน์โหลดจาก S3
หากคุณประสบปัญหา ให้ลองลบไฟล์ *.pth ทั้งหมด อัปเดตแพ็คเกจ dlutils ( pip install dlutils --upgrade
) จากนั้นเรียกใช้ download_all.py
อีกครั้ง หากไม่สามารถแก้ปัญหาได้ โปรดเปิดปัญหา นอกจากนี้ คุณสามารถลองดาวน์โหลดโมเดลด้วยตนเองได้จากที่นี่: https://drive.google.com/drive/folders/1tsI1q1u8QRX5t7_lWCSjpniLGlNY-3VY?usp=sharing
ในไฟล์กำหนด OUTPUT_DIR
จะชี้ไปที่ตำแหน่งที่บันทึกและอ่านน้ำหนัก ตัวอย่างเช่น: OUTPUT_DIR: training_artifacts/celeba-hq256
ใน OUTPUT_DIR
จะบันทึกไฟล์ last_checkpoint
ซึ่งมีพาธไปยัง .pth
Pickle จริงพร้อมน้ำหนักโมเดล หากคุณต้องการทดสอบโมเดลด้วยไฟล์น้ำหนักเฉพาะ คุณสามารถแก้ไขไฟล์ last_checkpoint
ได้
หากต้องการสร้างตัวเลขที่ผสมผสานสไตล์ให้รัน:
python style_mixing/stylemix.py -c <config>
โดยที่แทนที่จะ <config>
ใส่อย่างใดอย่างหนึ่ง: ffhq
, celeba
, celeba-hq256
, bedroom
วิธีสร้างการสร้างใหม่ด้วยรูปภาพหลายขนาด:
python make_figures/make_recon_figure_multires.py -c <config>
หากต้องการสร้างการสร้างใหม่จากอินพุตตัวอย่างทั้งหมดบนหลายหน้า:
python make_figures/make_recon_figure_paged.py -c <config>
นอกจากนี้ยังมี:
python make_figures/old/make_recon_figure_celeba.py
python make_figures/old/make_recon_figure_bed.py
หากต้องการสร้างการสร้างใหม่จากชุดทดสอบของ FFHQ:
python make_figures/make_recon_figure_ffhq_real.py
ในการสร้างตัวเลขการประมาณค่า:
python make_figures/make_recon_figure_interpolation.py -c <config>
เพื่อสร้างตัวเลขการข้าม:
(สำหรับชุดข้อมูลอื่นที่ไม่ใช่ FFHQ คุณจะต้องค้นหาทิศทางหลักก่อน)
python make_figures/make_traversarls.py -c <config>
วิธีทำให้การสร้างโมเดลรัน:
make_generation_figure.py -c <config>
นอกเหนือจากการติดตั้งแพ็คเกจที่จำเป็น:
pip install -r requirements.txt
คุณจะต้องติดตั้ง DareBlopy:
pip install dareblopy
หากต้องการดำเนินการฝึกอบรม:
python train_alae.py -c <config>
มันจะรันการฝึกอบรม multi-GPU บน GPU ที่มีอยู่ทั้งหมด ใช้ DistributedDataParallel
สำหรับการขนาน หากมี GPU เพียงตัวเดียว มันจะทำงานบน GPU ตัวเดียว ไม่จำเป็นต้องดูแลเป็นพิเศษ
จำนวน GPU ที่แนะนำคือ 8 ความสามารถในการทำซ้ำกับ GPU จำนวนน้อยอาจมีปัญหา คุณอาจต้องปรับขนาดแบตช์ในไฟล์กำหนดค่าโดยขึ้นอยู่กับขนาดหน่วยความจำของ GPU
นอกเหนือจากการติดตั้งแพ็คเกจที่จำเป็นและ DareBlopy แล้ว คุณต้องติดตั้ง TensorFlow และ dnnlib จาก StyleGAN
Tensorflow ต้องเป็นเวอร์ชัน 1.10
:
pip install tensorflow-gpu==1.10
ต้องใช้ CUDA เวอร์ชัน 9.0
บางทีวิธีที่ดีที่สุดคือใช้ Anaconda เพื่อจัดการสิ่งนี้ แต่ฉันชอบติดตั้ง CUDA 9.0 จากที่เก็บ pop-os (ทำงานบน Ubuntu):
sudo echo "deb http://apt.pop-os.org/proprietary bionic main" | sudo tee -a /etc/apt/sources.list.d/pop-proprietary.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 204DD8AEC33A7AFF
sudo apt update
sudo apt install system76-cuda-9.0
sudo apt install system76-cudnn-9.0
จากนั้นเพียงตั้งค่าตัวแปร LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=/usr/lib/cuda-9.0/lib64
Dnnlib เป็นแพ็คเกจที่ใช้ใน StyleGAN คุณสามารถติดตั้งได้ด้วย:
pip install https://github.com/podgorskiy/dnnlib/releases/download/0.0.1/dnnlib-0.0.1-py3-none-any.whl
โค้ดทั้งหมดสำหรับการรันเมทริกนั้นอิงจากโค้ดจากที่เก็บ StyleGAN เป็นหลัก นอกจากนี้ยังใช้โมเดลที่ได้รับการฝึกล่วงหน้าแบบเดียวกันด้วย:
https://github.com/NVlabs/stylegan#licenses
inception_v3_features.pkl และ inception_v3_softmax.pkl มาจากเครือข่าย Inception-v3 ที่ได้รับการฝึกอบรมล่วงหน้าโดย Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens และ Zbigniew Wojna เดิมเครือข่ายนี้แชร์ภายใต้ลิขสิทธิ์ Apache 2.0 บนพื้นที่เก็บข้อมูล TensorFlow Models
vgg16.pkl และ vgg16_zhang_perceptual.pkl มาจากเครือข่าย VGG-16 ที่ได้รับการฝึกอบรมล่วงหน้าโดย Karen Simonyan และ Andrew Zisserman เดิมเครือข่ายนี้แชร์ภายใต้ใบอนุญาต Creative Commons BY 4.0 บนหน้าโครงการ Very Deep Convolutional Networks for Large-Scale Visual Recognition
vgg16_zhang_perceptual.pkl ได้มาจากตุ้มน้ำหนัก LPIPS ที่ได้รับการฝึกล่วงหน้าโดย Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman และ Oliver Wang เดิมน้ำหนักถูกแชร์ภายใต้สิทธิ์การใช้งาน "แบบง่าย" ของ BSD 2-Clause บนพื้นที่เก็บข้อมูล PerceptualSimilarity
สุดท้าย หากต้องการเรียกใช้เมตริก:
python metrics/fid.py -c <config> # FID score on generations
python metrics/fid_rec.py -c <config> # FID score on reconstructions
python metrics/ppl.py -c <config> # PPL score on generations
python metrics/lpips.py -c <config> # LPIPS score of reconstructions