เครือข่ายประสาท (Neural networks) ทำได้เยอะ: ตีความภาพ เข้าใจเสียง แปลภาษา แต่มันวาดภาพได้ด้วยไหม?
เอกสารวิจัยล่าสุด ("A Neural Algorithm of Artistic Style") กระตุ้นการอภิปรายออนไลน์พร้อมตัวอย่างภาพสะดุดตา กล่าวคือ เทคนิคฝึก Deep Neural Network แยก "สไตล์ศิลปะ" ออกจาก "โครงสร้างภาพ" แล้วนำสไตล์ภาพหนึ่งมารวมกับโครงสร้างอีกภาพ ผลลัพธ์: เปลี่ยนรูปถ่ายเป็น "ภาพวาดประสาท" ดูเหมือนวาดโดยศิลปินดัง "ปลอมดิจิทัล" ในความหมายที่ดี
ตัวอย่างจากบทความ: ภาพแรก = ต้นฉบับ ภาพต่อไป = ผลลัพธ์ ภาพเล็กมุม = ภาพวาดที่ดึงสไตล์มา
นักวิจัยต้นฉบับไม่ปล่อยโค้ด แต่โปรแกรมเมอร์ผู้กล้าได้ทำซ้ำผลสำเร็จ โค้ดเปิดโซสออนไลน์ ต้องการแค่เครื่อง Linux และความอดทน
วันนี้จะแนะนำวิธีทำ พร้อมผลลัพธ์ของผม คิดว่านี่คือตอนต่อจากบทความ DeepDream ซับซ้อนหน่อย แต่ใครมี Linux ทำตามได้ ไม่ต้องรู้เขียนโค้ด
ติดตั้งซอฟต์แวร์
ถ้าไม่เร่งหรือไม่มี Linux ใช้ DeepForger Twitter bot แทนได้ ส่งรูปและสไตล์ จะตอบกลับมาด้วยผลลัพธ์ แต่ถ้าอยากประมวลผลหลายรูป เร็ว และควบคุมผลลัพธ์มากขึ้น อ่านต่อ
เตรียม Ubuntu ล่าสุด (ผมใช้ 14.04) พื้นที่ฮาร์ดดิสก์ว่างหลาย GB สิทธิ์ root ด้วย
เครื่องมือพื้นฐาน
โปรเจกต์โอเพนซอร์ส ต้องมี Git มาตรฐานควบคุมเวอร์ชัน โปรเจกต์โอเพนซอร์สเกือบทุกตัวอยู่ GitHub
ติดตั้ง Git: เปิดเทอร์มินัล พิมพ์
sudo apt-get install git
ติดตั้ง Lua (ภาษาที่เครื่องมือเขียนด้วย)
sudo apt-get install lua5.2
ติดตั้ง Luarocks (จัดการแพ็กเกจ Lua)
sudo apt-get install luarocks
ติดตั้ง Luajit (JIT compiler ให้ Lua เร็วขึ้น)
sudo apt-get install luajit
Frameworks
ติดตั้ง Torch (Machine Learning framework) ไม่ได้ผ่าน apt-get แต่มีติดตั้งบรรทัดเดียว
curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-all | bash
ทดสอบ: luajit -ltorch เข้า Torch interface ได้ = ติดตั้งสำเร็จ ออกจากนั้น
ติดตั้ง loadcaffe (แพ็กเกจ neural network) ติดตั้ง dependency ก่อน
sudo apt-get install libprotobuf-dev protobuf-compiler
จากนั้น
sudo luarocks install loadcaffe
ตรวจสอบ Dependencies
อัปเดตล่วงหน้าป้องกันปัญหา
sudo luarocks install image
luarocks install nn
ติดตั้ง Deep Style
สร้างโฟลเดอร์ใน home: mkdir DeepStyle เข้าไป cd DeepStyle โคลนโค้ด
sudo git clone https://github.com/jcjohnson/neural-style.git
ดาวน์โหลดโมเดล (นาน ใช้เวลากาแฟหนึ่งถ้วย)
sudo sh models/download_models.sh
ถ้า error permission ใช้ chmod ให้สิทธิ์อ่าน-เขียน
ใช้งาน Deep Style
อยู่ใน DeepStyle/neural-style ในเทอร์มินัล เตรียมรูปภาพ (ดาวน์โหลด/ถ่าย) คัดลอกไปโฟลเดอร์นี้
คำสั่งประมวลผล:
th neural_style.lua -style_image YOURPAINTINGHERE.jpg -content_image YOURPHOTOHERE.jpg -gpu -1
(แทนที่ตัวอักษรใหญ่ด้วยชื่อไฟล์จริง)
รันประมาณ 1 ชั่วโมง บันทึกรูประหว่างทางทุกไม่กี่นาที -gpu -1 ปิดการใช้ GPU
ผมพยายามทำให้ GPU (NVIDIA GTX 970) ทำงานกับ Ubuntu + CUDA หลายชั่วโมง ไม่สำเร็จ (บริก OS หลายครั้ง) ถ้าคุณโชคดี ติดตั้ง CUDA และ cudann.torch (ดู GitHub) ไม่ได้ก็ใช้ CPU ช้ากว่าแต่ทำงานได้
มีปัญหา? ถามในความคิดเห็น ช่วยได้มากที่สุด
ผลลัพธ์
รูปที่สร้างใน 2-3 วันที่ผ่านมา ผลสบายๆ แต่มากน่าประทับใจ
เพื่อน Zack เดินป่า Yellowstone สไตล์จากภาพวาดแนวออบสแตรกของ Theresa Paden ลองดูระบบทำงานกับภาพไร้โครงสร้าง ผลสนุก สามารถเห็นความคล้ายสไตล์ชัด
ศิลปินโปรด Charles Demuth (Incense of a New Church, Figure 5 in Gold) เขาเป็นแรงบันดาลใจศิลปะ Team Fortress 2 ใส่รูป Jersey City จาก Wikimedia ผล... ดีจริง ไม่จับความโค้งหงอของ Demuth แต่จับลุคเนื้อสัมผัสนุ่ม และพาเลทสีได้ดี
พยายามสร้าง O'Keeffe เทียมจากรูปดอกไม้ธรรมดา ผล สPECTACULAR ความอุดมสมบูรณ์ของสีและรูปทรง O'Keeffe โผล่ชัด ขอบกลีบดอกไม้ซ้อนกันกลายเป็นขอบใบไม้หลัง ดอกไม้ละลายเป็นสี เกือบออบสแตรก
จะเป็นภาพวาดดีแล้วถ้ามนุษย์วาด ลังเลจะรันความละเอียดสูงกว่าและใส่กรอบ
เพื่อน Shannon ชุดยุทธี Halloween ด้วยสไตล์ Picasso ผลน่าประทับใจ: ส่วนล่างใบหน้าสีขาว (คลุมสีของ Picasso) ไม่แน่ใจว่า संयोग หรือจริง แต่จับผมด้านซ้ายและหมวกได้ดี วาดใหม่ด้วยสีและเส้นของภาพสไตล์
ข้อจำกัดของเทคนิคเริ่มชัด: Picasso จริงๆ จะทำลายโครงสร้างใบหน้า บิดเบือนลักษณะเพื่อเอฟเฟกต์ ระบบนี้ไม่เข้าใจแนวคิดระดับสูงเลียนแบบได้แค่ด้านพื้นผิว: เส้นโค้งมุม สีเข้ม พาเลท
หอไอเฟล + Starry Night ของ Van Gogh (อีกภาพ) ทำเมฆสไตล์ Van Gogh ดี แปลงกลางวันเป็นกลางคืนได้ดี
ไม่เข้าใจไทำปลายหอไอเฟลกลายเสาไฟ ดูสวยแต่ไม่อ้างอิงจากข้อมูลได้ ต่อมาคิดว่า: ภาพสไตล์มีแถบเหลืองแนวตั้ง 13 เส้น (การสะท้อนในน้ำ) คลัสเตอร์ใหญ่เกินไปข้อมูลน้อย ระบบเรียนรู้ว่า "ขอบแนวตั้งคอนทราสต์สูง = การสะท้อน" เห็นเส้นแนวตั้งซ้ำในเมฆอีกด้วย
ภาพ Starry Night เดียวกัน แต่ใส่ดาวจริง: เสา Eagle Nebula ผลชอบ แต่ยังคง執着กับเส้นเหลืองแนวตั้ง ทุกส่วนแนวตั้งของเสากลายเป็นเส้นเหลืองโยกย่น พยายามกำจัดสีเขียว (ไม่มีใน training data) ให้กลายเป็นสีน้ำเงิน-ดำ
เทคโนโลยีเบื้องหลัง
ผลบางอย่างน่าสนใจมาก แต่เทคนิคมีข้อจำกัดชัด: บางภาพคอมโปซิชันแย่ ระบบลำบากกับศิลปินออบสแตรกอย่าง Picasso ที่ชอบบิดเบือนธีม ระบบจับเส้นมุม สีชนกัน ได้ แต่ยังเป็นทาสของค่าพิกเซลต้นฉบับ ไม่มีความเข้าใจที่จะเบี่ยงเบนจากต้นฉบับมาก
สิ่งที่น่าตื่นเต้น: ข้อจำกัดเหล่านี้ ไม่ใช่ข้อจำกัดพื้นฐาน
วิธีที่ใช้: ฝึกเครือข่ายกับภาพเดียว ใช้สร้างอีกภาพ = แฮ็กพื้นฐาน ให้ข้อมูลน้อยมาก เวอร์ชันขั้นสูงควรใช้เครือข่ายที่มีข้อมูลหลายภาพวาด และภาพจริง เพื่อให้บริบทมากขึ้น
ความเข้าใจสไตล์ลึก ต้องมีบริบทกว้าง ไม่ได้มาจากภาพเดียว การออกแบบสถาปัตยกรรมให้เข้าถึงข้อมูลกว้าง อาจทำให้ระบบเข้าใจภาพ "เหมือนมนุษย์" มากขึ้น ผลลัพธ์อาจออบสแตรกมากขึ้น คอมโปซิชันดีขึ้น อัลกอริทึมเหล่านี้จะเลิกเป็นของเล่นกลายเป็นเครื่องมือสร้างศิลปะต้นฉบับจริง
ความคิดนี้น่าสนใจในมุมมองบางมุม
สร้างภาพของตัวเอง
ผลไม่ดี? ปรับตัวเลือกดู (รายละเอียดเต็มบน GitHub) สำคัญคือ:
- -content_weight -value น้ำหนักการสร้างเนื้อหา ค่าเริ่มต้น 5e0
- -style_weight -value: น้ำหนักสไตล์ ค่าเริ่มต้น 1e2
- -style_scale - value: ขนาดแพตช์ภาพที่วิเคราะห์ (ใหญ่ = ออบสแตรกมากขึ้น) ค่าเริ่มต้น 1.0
พอทำงานได้แล้ว โพสต์รูปน่าสนใจในความคิดเห็น! ผมอยากดูสิ่งที่ทุกคนสร้าง
Image Credits: human brain painter via Shutterstock