ไอเดีย #90: ระบบค้นหารูปภาพด้วยข้อความ (semantic image search)
ฝ่ายประชาสัมพันธ์ของหน่วยงานหรือโรงเรียนมีรูปกิจกรรมสะสมเป็นแสนรูป พอผู้บริหารขอ "รูปงานกีฬาสีที่นักเรียนถือธงเมื่อสองปีก่อน" ก็ต้องเปิดโฟลเดอร์ไล่ดูทีละรูป เพราะชื่อไฟล์เป็นตัวเลขจากกล้องทั้งหมด ไอเดียนี้คือระบบค้นหารูปภาพด้วยข้อความ (semantic image search) ที่พิมพ์บรรยายเป็นภาษาธรรมดาแล้วเจอรูปที่ตรงความหมาย โดยไม่ต้องติดแท็กทีละรูป
ใครจะใช้
- เจ้าหน้าที่ประชาสัมพันธ์/ช่างภาพ — อัปโหลดอัลบั้ม ค้นหา ดาวน์โหลด
- บุคลากรทั่วไป — ค้นหาและขอใช้รูปตามสิทธิ์
- ผู้ดูแลระบบ — จัดการอัลบั้ม สิทธิ์ และการประมวลผล
ฟีเจอร์ขั้นต่ำ (MVP)
- อัปโหลดรูปจำนวนมากเป็นอัลบั้ม อ่าน EXIF (วันที่ถ่าย) และสร้าง thumbnail
- สร้าง image embedding ด้วยโมเดลที่แปลงทั้งรูปและข้อความไปอยู่ใน vector space เดียวกัน
- เก็บ embedding ใน pgvector พร้อม index สำหรับค้นหาเร็ว
- ค้นด้วยข้อความ เช่น "เด็กนักเรียนวิ่งแข่งบนสนามหญ้า" แล้วเรียงผลตามความใกล้
- กรองเพิ่มด้วยช่วงวันที่ อัลบั้ม หรือกิจกรรม
- ค้นหาด้วยรูป: อัปโหลดรูปตัวอย่างแล้วหารูปที่คล้ายกัน
- หน้าแสดงผลแบบ grid โหลดแบบ lazy load
ต่อยอดได้อีก
- ทดสอบและเลือกโมเดลที่เข้าใจคำค้นภาษาไทยได้ดี หรือแปลคำค้นเป็นอังกฤษก่อน
- สร้างคำบรรยายรูปอัตโนมัติเพื่อเสริม full-text search (ให้คนแก้ได้)
- ตรวจรูปซ้ำหรือรูปเกือบเหมือนกัน เพื่อลดพื้นที่
- คัดรูปเด่นของแต่ละกิจกรรมเพื่อทำอัลบั้มสรุป
โครงข้อมูลตั้งต้น
CREATE TABLE photo (
id BIGSERIAL PRIMARY KEY,
album_id INT NOT NULL,
file_path TEXT NOT NULL,
taken_at TIMESTAMP,
caption TEXT,
embedding VECTOR(512) -- ขนาดตาม model
);
CREATE INDEX ON photo USING hnsw (embedding vector_cosine_ops);
ตารางอื่น: album (ชื่อ วันที่ กิจกรรม visibility), embedding_job (สถานะการประมวลผล), search_log (คำค้นและรูปที่ผู้ใช้คลิก ใช้ปรับปรุงผล)
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ปานกลาง — ส่วนใหญ่เป็นงานต่อชิ้นส่วน ไม่ต้องเทรนโมเดลเอง
- เข้าใจแนวคิด multimodal embedding และ cosine similarity
- ทำ background job ประมวลผลรูปจำนวนมาก (อาจต้องใช้ GPU หรือ service แยกภาษา Python)
- ใช้ index แบบ approximate nearest neighbor ใน pgvector
- จัดการ storage รูปและ thumbnail อย่างมีประสิทธิภาพ
ข้อควรระวัง
- รูปที่มีใบหน้าคน โดยเฉพาะเด็กนักเรียน เป็นข้อมูลส่วนบุคคล ต้องจำกัดสิทธิ์และวัตถุประสงค์การใช้ตาม PDPA และไม่ควรทำระบบจดจำใบหน้าโดยไม่มีฐานทางกฎหมายและความยินยอม
- ผลค้นหาด้วย AI อาจมีอคติหรือผิดพลาด ไม่ควรใช้ผลอัตโนมัติไปเผยแพร่โดยไม่มีคนเลือกรูป
- ถ้าส่งรูปไปประมวลผลภายนอก ต้องพิจารณาความเสี่ยงเรื่องข้อมูลรั่ว การรันโมเดลเองอาจเหมาะกว่า
ใครเคยลองค้นรูปด้วยคำภาษาไทยผ่าน embedding แล้วบ้างครับ ผลออกมาเป็นอย่างไร ต้องแปลเป็นอังกฤษก่อนไหม? และคลังรูปที่มีเป็นแสนรูป ควรประมวลผลบนเครื่องตัวเองหรือเช่า GPU ชั่วคราว มาเล่าให้ฟังหน่อย ใครทำแล้วเอามาโชว์ในกระทู้ได้เลย