Stranger Things Face Recognition
สวัสดีครับ ยินดีต้อนรับสู่โปรเจกต์ระบบจดจำใบหน้าตัวละครจาก Stranger Things ครับ
โปรเจกต์นี้ผมทำขึ้นมาเพื่อให้สามารถตรวจจับและจดจำใบหน้าของตัวละครจากซีรีส์ Stranger Things ได้ครับ โดยใช้เทคโนโลยี ArcFace ซึ่งเป็นโมเดล AI ที่มีความแม่นยำสูงในการจดจำใบหน้า ระบบนี้ทำงานผ่านเว็บเบราว์เซอร์ สามารถอัปโหลดรูปเข้ามาแล้วระบบจะบอกว่าในรูปมีใครบ้างครับ
สำหรับการศึกษาเท่านั้น — โปรเจกต์นี้จัดทำขึ้นเพื่อเป็นกรณีศึกษาและทดลองเกี่ยวกับ Face Recognition ครับ
ระบบทำอะไรได้บ้าง
- ตรวจจับใบหน้าทั้งหมดในรูปได้อัตโนมัติครับ
- จดจำว่าใบหน้าที่เจอเป็นของตัวละครตัวไหน
- วาดกรอบและชื่อลงบนรูปให้เลย ถ้าจดจำได้จะเป็นสีเขียว ถ้าไม่รู้จักจะเป็นสีแดงครับ
- บอกคะแนนความมั่นใจว่าเหมือนกันกี่เปอร์เซ็นต์
- รองรับหลายคนในรูปเดียวกันได้ครับ
ตัวอย่างผลลัพธ์
ลองดูตัวอย่างการตรวจจับใบหน้าตัวละครจาก Stranger Things ได้เลยครับ

ตัวละครที่มีในระบบ
ตอนนี้ผมได้เตรียมข้อมูลใบหน้าของตัวละครหลักไว้ให้แล้ว 12 คนครับ
| ตัวละคร | ตัวละคร |
|---|---|
| Eleven | Mike Wheeler |
| Dustin Henderson | Lucas Sinclair |
| Will Byers | Max Mayfield |
| Nancy Wheeler | Jonathan Byers |
| Steve Harrington | Robin Buckley |
| Joyce Byers | Hopper |
ถ้าอยากเพิ่มคนอื่นก็ทำได้ครับ ดูวิธีการได้ในหัวข้อถัดไปเลยครับ
เทคโนโลยีที่ใช้
| เทคโนโลยี | รายละเอียด |
|---|---|
| ArcFace | โมเดล AI ที่มีความแม่นยำสูงในการจดจำใบหน้าครับ |
| InsightFace | ไลบรารีสำหรับ Face Recognition |
| Flask | Web Framework สำหรับ Python |
| OpenCV | ประมวลผลรูปภาพครับ |
สิ่งที่ต้องมีก่อนเริ่มใช้งาน
ต้องมี Python 3.8 ขึ้นไปติดตั้งอยู่ในเครื่องครับ ถ้ายังไม่มีก็ไปดาวน์โหลดจากเว็บ python.org ได้เลยครับ
วิธีติดตั้ง
1. Clone โปรเจกต์มาก่อนครับ
git clone https://github.com/0x90Vold/stranger-things-face-recognition.gitcd stranger-things-face-recognition2. ติดตั้ง packages ที่จำเป็นครับ
pip install flask flask-cors opencv-python numpy pillow insightface onnxruntimeตรงนี้อาจจะใช้เวลาสักพักนะครับ โดยเฉพาะ insightface เพราะต้องดาวน์โหลดโมเดลมาด้วย
วิธีใช้งาน
เตรียมรูปสำหรับสอนระบบ
ก่อนที่ระบบจะจดจำใบหน้าได้ ต้องมีการสอนก่อนครับ โดยการเตรียมรูปภาพของแต่ละคนไว้ในโฟลเดอร์ dataset/
โครงสร้างที่ถูกต้องจะเป็นแบบนี้ครับ
dataset/├── Eleven/│ ├── eleven_01.jpg│ ├── eleven_02.jpg│ └── eleven_03.jpg├── Mike Wheeler/│ ├── mike_01.jpg│ └── mike_02.jpg└── Dustin Henderson/ └── dustin_01.jpgก็คือสร้างโฟลเดอร์ชื่อคนนั้นๆ แล้วใส่รูปเข้าไปครับ ชื่อโฟลเดอร์จะกลายเป็นชื่อที่แสดงตอนจดจำได้
คำแนะนำในการเลือกรูปครับ
- เลือกรูปที่เห็นหน้าชัดๆ ไม่เบลอ ไม่บังครับ
- ถ้ามีหลายมุมได้ยิ่งดี เช่น หน้าตรง เอียงซ้าย เอียงขวา
- มีหลายแสงก็ดีครับ ทั้งสว่างและมืดหน่อย
- ยิ่งมีหลายรูปยิ่งแม่นยำ แนะนำสัก 3-5 รูปต่อคนครับ
- พยายามหลีกเลี่ยงรูปที่มีหลายคนในภาพนะครับ ระบบอาจจะสับสนได้
- รูปที่ใส่แว่นกันแดดหรือมีอะไรบังหน้าก็ไม่ค่อยดีครับ
รันการสอนระบบ
พอเตรียมรูปเสร็จแล้วก็สั่งให้ระบบเรียนรู้ได้เลยครับ
python train_faces.pyระบบจะอ่านรูปทั้งหมด แปลงเป็นข้อมูลตัวเลข แล้วบันทึกลงไฟล์ face.json ครับ ตอนรันจะเห็นข้อความประมาณนี้
==================================================ArcFace Face Training System==================================================
Loading ArcFace model...ArcFace model loaded successfully!
Found 12 persons in dataset--------------------------------------------------
Processing: Eleven Processing image: eleven_01.jpg Face embedding created (det_score: 0.998) ...
==================================================Saving data to face.json...Successfully saved to: face.json
Training Summary: - Total Persons: 12 - Total Embeddings: 36==================================================พอเห็น Successfully saved ก็เรียบร้อยครับ
เปิดเว็บแอปพลิเคชัน
รันคำสั่งนี้เพื่อเปิด server ครับ
python app.pyจะเห็นข้อความแบบนี้ครับ
============================================================ ArcFace Recognition Server Starting... - Database: face.json - Threshold: 0.4============================================================
* Running on http://0.0.0.0:5000ใช้งานผ่านเว็บ
เปิดเบราว์เซอร์แล้วเข้าไปที่ http://localhost:5000 ครับ
จากนั้นก็อัปโหลดรูปที่ต้องการตรวจจับ ระบบจะประมวลผลแล้วแสดงผลลัพธ์ให้ดูครับ ถ้าจดจำได้จะขึ้นกรอบสีเขียวพร้อมชื่อ ถ้าไม่รู้จักจะขึ้นกรอบสีแดงเขียนว่า Unknown ครับ
โครงสร้างโปรเจกต์
stthings/├── README.md # ไฟล์คู่มือการใช้งานครับ├── app.py # ตัว server หลัก├── train_faces.py # สคริปต์สำหรับสอนระบบ├── dataset/ # โฟลเดอร์เก็บรูปสำหรับสอน├── templates/ # ไฟล์ HTML ของหน้าเว็บ├── uploads/ # เก็บไฟล์ที่อัปโหลดชั่วคราว└── face.json # ฐานข้อมูลใบหน้า (สร้างจากการสอน)API สำหรับนักพัฒนา
ถ้าอยากเรียกใช้งานผ่าน API โดยตรง ก็มีให้ใช้ 3 endpoints ครับ
ส่งรูปมาตรวจจับ
POST /api/recognizeส่งรูปมาได้ทั้งแบบไฟล์และ Base64 ครับ ตัวอย่างการเรียก
curl -X POST -F "file=@รูปของคุณ.jpg" http://localhost:5000/api/recognizeระบบจะตอบกลับมาเป็น JSON แบบนี้ครับ
{ "success": true, "faces_detected": 2, "results": [ { "face_id": 1, "name": "Eleven", "similarity": 89.5, "bbox": [100, 50, 200, 180], "det_score": 99.8 } ], "processed_image": "data:image/jpeg;base64,..."}ดูข้อมูลฐานข้อมูล
GET /api/database/infoใช้ดูว่าตอนนี้ระบบรู้จักใครบ้าง มีกี่รูปต่อคนครับ
โหลดฐานข้อมูลใหม่
POST /api/database/reloadใช้ตอนที่สอนระบบใหม่แล้วอยากให้ server โหลดข้อมูลใหม่โดยไม่ต้อง restart ครับ
การตั้งค่าเพิ่มเติม
ถ้าอยากปรับแต่งอะไร สามารถแก้ได้ในไฟล์ app.py ครับ
# ตำแหน่งไฟล์ฐานข้อมูลFACE_DATABASE_PATH = "face.json"
# ค่าความเหมือนขั้นต่ำ (0.0 - 1.0)# ถ้าตั้งสูงระบบจะเข้มงวดมาก ต้องเหมือนมากถึงจะยอมรับ# ถ้าตั้งต่ำจะผ่อนปรนขึ้น แต่อาจจะจำผิดได้SIMILARITY_THRESHOLD = 0.4ค่า 0.4 เป็นค่าเริ่มต้นที่ผมแนะนำครับ สมดุลระหว่างความแม่นยำและความยืดหยุ่น ถ้าอยากเข้มงวดขึ้นก็เพิ่มเป็น 0.5 หรือ 0.6 ได้ครับ
ปัญหาที่อาจเจอ
จดจำได้แต่ขึ้น Unknown ตลอด
อาจเป็นเพราะค่า threshold สูงเกินไปครับ ลองลดลงมาหน่อย หรืออาจเป็นเพราะรูปที่ใช้สอนไม่หลากหลายพอ ลองเพิ่มรูปหลายมุมหลายแสงดูครับ
รันแล้วหาโมเดลไม่เจอ
ตอนรัน train_faces.py ครั้งแรก ระบบจะดาวน์โหลดโมเดลมาให้อัตโนมัติครับ ต้องต่ออินเทอร์เน็ตด้วยนะครับ
อยากใช้ GPU
ได้ครับ แก้ในไฟล์ app.py และ train_faces.py ตรง providers จาก CPUExecutionProvider เป็น CUDAExecutionProvider แต่ต้องติดตั้ง CUDA กับ cuDNN ก่อนนะครับ
ลิงก์โปรเจกต์
ขอบคุณ
- InsightFace สำหรับโมเดล ArcFace ที่ยอดเยี่ยมครับ
- Flask สำหรับ framework ที่ใช้งานง่าย
- Stranger Things สำหรับแรงบันดาลใจครับ
License
โปรเจกต์นี้เป็น Open Source ภายใต้ MIT License ครับ ใช้ได้ตามสบายเลย
หากมีคำถามหรือข้อเสนอแนะ สามารถเปิด Issue ได้เลยครับ ขอบคุณที่ใช้งานครับ 🙏