นี่คือการใช้งาน Pytorch ของกระดาษอัลกอริทึมระบบประสาทของสไตล์ศิลปะโดย Leon A. Gatys, Alexander S. Ecker และ Matthias Bethge รหัสขึ้นอยู่กับสไตล์ประสาทของจัสตินจอห์นสัน
กระดาษนำเสนออัลกอริทึมสำหรับการรวมเนื้อหาของภาพหนึ่งเข้ากับรูปแบบของภาพอื่นโดยใช้เครือข่ายประสาท Convolutional นี่คือตัวอย่างที่แมปสไตล์ศิลปะของ The Starry Night ไปสู่ภาพถ่ายกลางคืนของวิทยาเขต Stanford:
การใช้รูปแบบของภาพที่แตกต่างกับภาพเนื้อหาเดียวกันให้ผลลัพธ์ที่น่าสนใจ ที่นี่เราทำซ้ำรูปที่ 2 จากกระดาษซึ่งแสดงภาพถ่ายของท่อในเยอรมนีในหลากหลายรูปแบบ:
นี่คือผลลัพธ์ของการใช้รูปแบบของงานศิลปะต่าง ๆ กับภาพถ่ายของสะพาน Golden Gate:
อัลกอริทึมช่วยให้ผู้ใช้สามารถแลกเปลี่ยนน้ำหนักสัมพัทธ์ของรูปแบบและเงื่อนไขการสร้างเนื้อหาได้ดังแสดงในตัวอย่างนี้ที่เราพอร์ตรูปแบบของการถ่ายภาพตัวเองของ Picasso ในปี 1907 ไปยัง Brad Pitt:
ด้วยการปรับขนาดภาพสไตล์ก่อนที่จะแยกคุณสมบัติสไตล์เราสามารถควบคุมประเภทของคุณสมบัติทางศิลปะที่ถ่ายโอนจากภาพสไตล์ คุณสามารถควบคุมพฤติกรรมนี้ด้วยธง -style_scale ด้านล่างเราเห็นสามตัวอย่างของการแสดงผลสะพาน Golden Gate ในสไตล์ของคืนดวงดาว จากซ้ายไปขวา -style_scale คือ 2.0, 1.0 และ 0.5
คุณสามารถใช้ภาพสไตล์มากกว่าหนึ่งภาพเพื่อผสมผสานสไตล์ศิลปะที่หลากหลาย
ตามเข็มนาฬิกาจากซ้ายบน: "The Starry Night" + "The Scream", "The Scream" + "Composition VII", "Seated Nude" + "Composition VII" และ "Seated Nude" + "The Starry Night"
เมื่อใช้รูปภาพหลายรูปแบบคุณสามารถควบคุมระดับที่พวกเขาได้รับการผสม:
หากคุณเพิ่มธง -original_colors 1 ภาพเอาต์พุตจะรักษาสีของภาพต้นฉบับไว้
การพึ่งพา:
การพึ่งพาทางเลือก:
หลังจากติดตั้งการอ้างอิงคุณจะต้องเรียกใช้สคริปต์ต่อไปนี้เพื่อดาวน์โหลด VGG Model:
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>
การใช้งาน CUDNN กับ NIN Model:
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 : ID ดัชนี Zero ของ GPU ที่จะใช้; สำหรับโหมด CPU Set -gpu เป็น cตัวเลือกการเพิ่มประสิทธิภาพ :
-content_weight : คำศัพท์การฟื้นฟูเนื้อหามีน้ำหนักเท่าใด ค่าเริ่มต้นคือ 5E0-style_weight : คำศัพท์การสร้างสไตล์การสร้างสไตล์มากแค่ไหน ค่าเริ่มต้นคือ 1E2-tv_weight : น้ำหนักของความแปรปรวนทั้งหมด (ทีวี) การทำให้เป็นมาตรฐาน; สิ่งนี้ช่วยให้ภาพราบรื่น ค่าเริ่มต้นคือ 1E-3 ตั้งค่าเป็น 0 เพื่อปิดการใช้งานการทำให้เป็นปกติของทีวี-num_iterations : ค่าเริ่มต้นคือ 1,000-init : วิธีการสร้างภาพที่สร้างขึ้น; หนึ่งใน random หรือ image ค่าเริ่มต้นคือ random ซึ่งใช้การเริ่มต้นเสียงรบกวนเช่นเดียวกับในกระดาษ image เริ่มต้นด้วยภาพเนื้อหา-init_image : แทนที่ภาพการเริ่มต้นด้วยภาพที่ผู้ใช้ระบุ-optimizer : อัลกอริทึมการเพิ่มประสิทธิภาพที่จะใช้; lbfgs หรือ adam ; ค่าเริ่มต้นคือ lbfgs L-BFGs มีแนวโน้มที่จะให้ผลลัพธ์ที่ดีกว่า แต่ใช้หน่วยความจำมากขึ้น การเปลี่ยนไปใช้อดัมจะลดการใช้หน่วยความจำ เมื่อใช้อดัมคุณอาจต้องเล่นกับพารามิเตอร์อื่น ๆ เพื่อให้ได้ผลลัพธ์ที่ดีโดยเฉพาะน้ำหนักสไตล์น้ำหนักเนื้อหาและอัตราการเรียนรู้-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 : พา ธ ไปยังไฟล์ .pth สำหรับรุ่น VGG Caffe ค่าเริ่มต้นคือรุ่น VGG-19 ดั้งเดิม คุณยังสามารถลองรุ่น VGG-16 ดั้งเดิม-pooling : ประเภทของเลเยอร์การรวมที่จะใช้; หนึ่งใน max หรือ avg ค่าเริ่มต้นคือ max รุ่น VGG-19 ใช้เลเยอร์การรวมสูงสุด แต่กระดาษกล่าวถึงการแทนที่เลเยอร์เหล่านี้ด้วยเลเยอร์การรวมกลุ่มโดยเฉลี่ยสามารถปรับปรุงผลลัพธ์ได้ ฉันไม่สามารถได้รับผลลัพธ์ที่ดีโดยใช้การรวมโดยเฉลี่ย แต่ตัวเลือกอยู่ที่นี่-seed : ค่าจำนวนเต็มที่คุณสามารถระบุสำหรับผลลัพธ์ที่ทำซ้ำได้ โดยค่าเริ่มต้นค่านี้จะสุ่มสำหรับการรันแต่ละครั้ง-multidevice_strategy : รายการดัชนีเลเยอร์ที่คั่นด้วยเครื่องหมายจุลภาคซึ่งจะแยกเครือข่ายเมื่อใช้อุปกรณ์หลายตัว ดูการปรับสเกลแบบ Multi-GPU สำหรับรายละเอียดเพิ่มเติม-backend : nn , cudnn , openmp หรือ mkl ค่าเริ่มต้นคือ nn mkl ต้องการแบ็กเอนด์ MKL ของ Intel-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 ใช้แบ็กเอนด์ nn สำหรับ Convolutions และ L-BFGs เพื่อเพิ่มประสิทธิภาพ สิ่งเหล่านี้ให้ผลลัพธ์ที่ดี แต่ทั้งคู่สามารถใช้หน่วยความจำได้มาก คุณสามารถลดการใช้หน่วยความจำด้วยสิ่งต่อไปนี้:
-backend cudnn เพื่อใช้แบ็กเอนด์ CUDNN สิ่งนี้จะใช้งานได้ในโหมด GPU เท่านั้น-optimizer adam Flag เพื่อใช้ Adam แทน L -BFGS สิ่งนี้ควรลดการใช้หน่วยความจำอย่างมีนัยสำคัญ แต่อาจต้องปรับค่าพารามิเตอร์อื่น ๆ เพื่อผลลัพธ์ที่ดี โดยเฉพาะอย่างยิ่งคุณควรเล่นกับอัตราการเรียนรู้น้ำหนักเนื้อหาและน้ำหนักสไตล์ สิ่งนี้ควรใช้งานได้ทั้งในโหมด CPU และ GPU-image_size 256 เพื่อสร้างภาพที่ครึ่งขนาดเริ่มต้นด้วยการตั้งค่าเริ่มต้นสไตล์ Neural-PT ใช้หน่วยความจำ GPU ประมาณ 3.7 GB ในระบบของฉัน การเปลี่ยนไปใช้ Adam และ Cudnn ช่วยลดรอยเท้าหน่วยความจำ GPU เป็นประมาณ 1GB
ความเร็วอาจแตกต่างกันมากขึ้นอยู่กับแบ็กเอนด์และเครื่องมือเพิ่มประสิทธิภาพ นี่คือบางครั้งสำหรับการเรียกใช้การวนซ้ำ 500 ด้วย -image_size=512 บน Tesla K80 ที่มีการตั้งค่าที่แตกต่างกัน:
-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 และ CPU ที่ใช้กับธง -gpu และคุณสามารถควบคุมวิธีการแยกเลเยอร์ข้ามอุปกรณ์โดยใช้ธง -multidevice_strategy
ตัวอย่างเช่นในเซิร์ฟเวอร์ที่มีสี่ GPU คุณสามารถให้ธง -gpu 0,1,2,3 เพื่อประมวลผลบน GPU 0, 1, 2 และ 3 ในลำดับนั้น ด้วยการให้ธง -multidevice_strategy 3,6,12 คุณระบุว่าควรคำนวณสองชั้นแรกบน GPU 0 ชั้น 3 ถึง 5 ควรคำนวณบน GPU 1 ชั้นที่ 6 ถึง 11 ควร -multidevice_strategy บน GPU 2
เราสามารถบรรลุผลลัพธ์ที่มีคุณภาพสูงมากที่ความละเอียดสูงโดยการรวมการประมวลผลแบบหลาย GPU เข้ากับการสร้างหลายระดับตามที่อธิบายไว้ในกระดาษ ควบคุมปัจจัยการรับรู้ในการถ่ายโอนรูปแบบประสาท โดย Leon A. Gatys, Alexander S. Ecker, Matthias Bethge, Aaron Hertzmann และ Eli Shechtman
นี่คือภาพ 4016 x 2213 ที่สร้างขึ้นบนเซิร์ฟเวอร์ที่มีแปด Tesla K80 GPU:
สคริปต์ที่ใช้ในการสร้างภาพนี้สามารถพบได้ที่นี่
รูปภาพจะเริ่มต้นด้วยเสียงสีขาวและปรับให้เหมาะสมโดยใช้ L-BFG
เราดำเนินการสร้างแบบจำลองแบบโดยใช้ conv1_1 , conv2_1 , conv3_1 , conv4_1 และ Layers conv5_1 และการสร้างเนื้อหาโดยใช้เลเยอร์ conv4_2 เช่นเดียวกับในกระดาษการสูญเสียการฟื้นฟูสไตล์ทั้งห้ามีน้ำหนักเท่ากัน
หากคุณพบว่ารหัสนี้มีประโยชน์สำหรับการวิจัยของคุณโปรดอ้างอิงโดยใช้การอ้างอิงที่ให้ไว้