วิธีฝึกโมเดลสร้างภาพ AI ของตัวเองโดยตรง
(coryzue.com)- ลองทำโปรเจ็กต์ฝึกโมเดลสร้างภาพ AI ของตัวเองอยู่หลายชั่วโมง เพื่อสร้างภาพที่ดูเหมือนถ่ายเองจริง ๆ
- ตัวอย่าง: สร้างภาพตัวเองใส่ชุด "ซูเปอร์แมน"
- เหตุผลที่ลองทำ: ดูน่าสนุก เด็ก ๆ ก็เล่นด้วยกันได้ และยังช่วยให้ได้เรียนรู้เรื่องโมเดลแบบคัสตอม/AI เชิงลึกมากขึ้น
- เมื่อ 12–18 เดือนก่อน งานนี้ค่อนข้างซับซ้อนมาก แต่ตอนนี้กลายเป็นเรื่องง่ายมากแล้ว
- ภายในไม่ถึง 2 ชั่วโมงก็สร้างโมเดลและได้ภาพตามที่ต้องการ โดยหัวใจสำคัญคือการหาเครื่องมือที่เหมาะให้เจออย่างรวดเร็ว
การเลือกโมเดล/รูปแบบการฝึก
- องค์ประกอบที่ต้องใช้
- โมเดลตั้งต้น (base model)
- เทคนิคการฝึก/ฟाइनจูน
- ชุดข้อมูลฝึก (เช่น รูปถ่ายของตัวเองไม่กี่รูป)
- AI หลายตัวแนะนำ Stable Diffusion แต่เลือกใช้ Flux เพราะ Pieter Levels บอกว่าให้ประสิทธิภาพดีกว่า
- แม้จะไม่ใช่โมเดล SOTA ล่าสุดแบบเต็มตัว แต่ก็ดีพอมาก
- เทคนิคที่ใช้ฝึกคือ LoRA(Low-Rank Adaptation)
- ไม่ได้เทรนโมเดลใหม่ทั้งตัว แต่ฝึกเฉพาะส่วนที่เชื่อมกับ "คำวิเศษ" บางคำ
- ตัวอย่าง: สอนให้โมเดลรู้จักคำที่ไม่ค่อยพบอย่าง "czue" และเมื่อใช้คำนั้นในพรอมป์ต์ ก็จะสะท้อนลักษณะของชุดข้อมูลนั้นออกมา
การสร้างชุดฝึก
- ต้องเตรียมรูปของสิ่งที่ต้องการฝึกหลายภาพ (ประมาณ 10–15 ภาพ)
- ยิ่งมีสีหน้า ฉากหลัง แสง และมุมที่หลากหลายยิ่งดี
- ควรมีเพียงคนเดียวในแต่ละภาพ
- ระหว่างฝึกต้องมีคำอธิบายข้อความ และในนั้นควรมีคำวิเศษรวมอยู่ด้วย
- ตัวอย่าง: "a photo of czue on the beach, wearing a blue shirt"
- แต่เครื่องมือสมัยใหม่จะสร้าง caption ของภาพให้อัตโนมัติแล้ว จึงไม่จำเป็นต้องพิมพ์คำอธิบายเอง
การฝึกโมเดล
- ตอนแรกตั้งใจจะฝึกบนเครื่องตัวเอง แต่ติดปัญหา GPU และ RAM ไม่พอ
- จะไปรันโค้ดเองบนเซิร์ฟเวอร์คลาวด์ที่มี GPU ก็ได้ แต่สุดท้ายเลือกใช้ Replicate
- เป็นบริการเช่า GPU ที่สามารถใช้ recipe ที่มีคนทำไว้แล้วได้ทันที
- ในกรณีนี้ใช้ recipe ostris/flux-dev-lora-trainer
- หลังสร้างบัญชี Replicate ต้องตั้งค่าข้อมูลการเรียกเก็บเงินด้วย
- พารามิเตอร์หลัก
- input_images: รูปสำหรับฝึก (zip)
- trigger_word: คำวิเศษ เช่น "czue"
- hf_repo_id, hf_token: รีโพซิทอรี/โทเค็นของ Hugging Face
- autocaption_prefix: ข้อความที่เติมไว้หน้าคำบรรยายที่สร้างอัตโนมัติ (เช่น "A photo of czue,")
การเก็บโมเดลไว้บน Hugging Face
- Hugging Face คือแพลตฟอร์มสำหรับเก็บและแชร์โมเดล
- แม้ Replicate จะเก็บโมเดลที่ฝึกแล้วไว้ที่ไหนสักแห่งให้ด้วย แต่ถ้าอัปโหลดขึ้น Hugging Face จะเชื่อมกับเครื่องมืออื่นได้ง่ายกว่า
- หลังสร้างบัญชีและสร้างโมเดลแล้ว ก็ส่งค่า
hf_repo_idเข้าไป- โทเค็นสำหรับเข้าถึงสามารถออกได้ที่ settings/tokens
- เมื่อฝึกเสร็จ ไฟล์ขนาดใหญ่ชื่อ "lora.safetensors" (ประมาณ 180MB) จะถูกอัปโหลดขึ้น Hugging Face
การสร้างภาพด้วยโมเดล
- เมื่อฝึกเสร็จแล้ว ก็เข้าสู่ขั้นตอนอนุมาน (inference) โดยป้อนข้อความให้โมเดลสร้างภาพ
- จะลองทำบนเครื่องตัวเองก็ได้ แต่ก็ยังใช้ Replicate อีกครั้ง
- ใน lucataco/flux-dev-lora แค่ตั้งค่า field hf_lora ก็พอ
- ใช้ได้ทั้ง ID ของรีโพสาธารณะบน Hugging Face หรือ ลิงก์โมเดลที่ฝึกแล้วซึ่งอัปโหลดไว้บน Replicate
- ใน lucataco/flux-dev-lora แค่ตั้งค่า field hf_lora ก็พอ
- ตัวอย่าง: ถ้าป้อน "a photo of czue surfing" ก็จะได้ภาพตัวเองกำลังโต้คลื่นออกมาแบบนี้
การรันโมเดลด้วยการเขียนโปรแกรม
- ถ้าต้องการลองพรอมป์ต์หลายแบบและบันทึกผลลัพธ์อัตโนมัติ การเรียกผ่าน API จะสะดวกกว่า
- มีการเขียนสคริปต์ Python ตัวอย่างไว้ด้านล่าง (โค้ดเต็มอยู่ใน Github)
# /// script # requires-python = ">=3.12" # dependencies = [ # "replicate", # ] # /// import argparse import os import re import replicate import uuid DEFAULT_MODEL = "czue/me-v1" DEFAULT_COUNT = 1 def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT): return { "prompt": prompt, "hf_lora": model, "num_outputs": count } def main(): parser = argparse.ArgumentParser() parser.add_argument("prompt", help="Prompt for the photo") parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use (default: %(default)s)") parser.add_argument("--count", default=DEFAULT_COUNT, help="Number of photos to generate (default: %(default)s)", type=int) args = parser.parse_args() input = get_input(args.prompt, args.model, args.count) output = replicate.run( "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3", input=input ) output_dir = "output" os.makedirs(output_dir, exist_ok=True) prompt_slug = "-".join(args.prompt.split(" ")[-3:]) prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower() for index, item in enumerate(output): file_id = uuid.uuid4().hex[:5] output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp") with open(output_path, "wb") as file: file.write(item.read()) print(f"Saved photo {output_path}") if __name__ == "__main__": main() - ตัวอย่างการใช้งาน
uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \ --model="czue/me-v1" \ --count=4
ผลลัพธ์
- ประสิทธิภาพของโมเดลยังไม่สม่ำเสมอ
- บางครั้งจับลักษณะของบุคคลได้ค่อนข้างคล้าย แต่บางครั้งก็สร้างเป็นคนละคนไปเลย
- ถ้าใส่อายุ เพศ เป็นต้น เพิ่มในพรอมป์ต์อย่างชัดเจน ก็จะได้ความแม่นยำมากขึ้น
- ตัวอย่างเช่น "a photo of czue, a 40 year old man, writing a blog post" ให้ภาพที่ค่อนข้างสม่ำเสมอ
- แต่ "a photo of czue writing a blog post" ให้ผลลัพธ์ที่หลากหลายกว่ามาก
- ถ้าใส่บุคคลอื่นเข้าไปด้วย จะเกิดปัญหาอย่างใบหน้าปะปนกัน
- เช่น ลองสร้างภาพตัวเองอยู่กับบารัก โอบามา ก็พบว่าส่วนหนึ่งของใบหน้าตัวเองไปสะท้อนในฝั่งโอบามา และกลับกันก็เช่นกัน
- ถึงอย่างนั้นก็ยังสนุกและมีประโยชน์มากพอที่จะลองทำอะไรหลาย ๆ แบบร่วมกับเด็ก ๆ ได้
ค่าใช้จ่าย
- ไม่ได้ฟรี แต่ก็ไม่ได้แพงมาก
- ฝึกโมเดลไป 3 ตัวรวมของตัวเองและของลูก ๆ แต่ละตัวตกประมาณ ~$2.50
- การสร้างภาพมีค่าใช้จ่ายประมาณ $0.03 ต่อภาพ ดังนั้นสร้าง 30 ภาพก็ราว ๆ $1
- การทดลองทั้งหมดใช้เงินไม่ถึง $10 และรู้สึกพอใจกับต้นทุนที่เบากว่าที่คิด
- ถ้าสนใจการฝึกโมเดล AI และการสร้างภาพ ก็เป็นสิ่งที่ลองทำได้ง่ายกว่าที่คิดและน่าลองมาก
5 ความคิดเห็น
ลองทำตามเล่น ๆ แล้ว ง่ายจริง ๆ ครับ
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
ลองทำโน่นทำนี่ดูแล้วก็หัวเราะอยู่พักใหญ่...
สุดท้ายแล้ว ก่อนที่เราจะตาย เราคงอยากอัปโหลดโมเดลที่ฝึกจากตัวเราเองขึ้นไปบนเครือข่ายแล้วค่อยตายกันไม่ใช่หรือ? เหมือนสัญชาตญาณเอาตัวรอด... แม้นั่นจะไม่ใช่ 'ฉัน' ก็ตาม
พอเห็นเทคโนโลยีนี้ก็ทำให้นึกถึงนิยายเรื่องหนึ่งขึ้นมาเลยอยากแนะนำค่ะ เป็นเรื่องสั้นชื่อ 'Chronos' ที่อยู่ในรวมเรื่องสั้น Bisutbangul Pong ของนักเขียนอียูริ เนื้อหาเกี่ยวกับ AI ที่เก็บและเรียนรู้ข้อมูลของคนคนหนึ่ง ก็คือตัวเราเองนั่นแหละค่ะ เหมือนแมวในคอมเมนต์นั้นเลย คุณแม่ที่เป็นภาวะสมองเสื่อมใช้มันก่อนที่อาการจะหนักไปกว่านี้ แล้วลูก ๆ ก็เกิดความขัดแย้งกัน ทั้งได้รับการปลอบโยนและก็รู้สึกผิดไปพร้อมกัน ถ้าใครสนใจเทคโนโลยีนี้ หรือเรื่องของแมวตัวนั้น ก็ลองหาอ่านดูนะคะ
มีคอมเมนต์หนึ่งบน Hacker News ที่สะดุดตา
และก็มีคอมเมนต์เชิงข้อมูลอีกอัน
"วิทยาศาสตร์และเทคโนโลยีที่พัฒนาไปไกลพอ ย่อมแยกไม่ออกจากเวทมนตร์ - Arthur C. Clarke"
เพียงแค่ 2 ปีก่อน เรื่องแบบนี้ยังดูเหมือนมีให้เห็นได้แค่ในหนังไซไฟ แต่ตอนนี้เรากำลังได้เห็นช่วงเวลาที่เวทมนตร์กลายเป็นความจริงแบบเรียลไทม์กันจริง ๆ 😳