07

Photo Face Search

ค้นหารูปการแข่งด้วยใบหน้าตัวเอง (AI Face Recognition)

🚧 อยู่ระหว่างพัฒนา • UI พร้อม • Backend รอ Proxmox

7.1 ภาพรวมและสถานะ

🚧 สถานะ: อยู่ระหว่างพัฒนา

UI ของฟีเจอร์นี้ออกแบบและ deploy แล้ว — ผู้ใช้สามารถเข้าหน้า photo_search.php?id=N ดูแกลเลอรีรูปได้ แต่ปุ่ม "อัปโหลด selfie" ยังถูกปิดอยู่จนกว่า Face API Server บน Proxmox จะติดตั้งเสร็จ

เป้าหมาย

ผู้เล่นต้องการดูรูปของตัวเองในรายการแข่ง — แทนที่จะต้อง scroll หารูปทั้งหมด ระบบจะให้ อัปโหลด selfie 1 รูป → AI หารูปที่มีใบหน้าใกล้เคียงให้ทั้งหมด

เทคโนโลยีที่จะใช้

Componentเทคโนโลยี
Face DetectionInsightFace (RetinaFace + ArcFace)
Embedding512-dim vector ต่อใบหน้า
SimilarityCosine similarity (threshold ~0.5)
BackendPython Flask API บน Ubuntu 22.04
HardwareNVIDIA RTX 3060 (Proxmox passthrough)

7.2 UI Design (เลียนแบบจากโค้ดจริง)

หน้าจอที่ออกแบบไว้ตาม photo_search.php:

Mockup — photo_search.php?id=N
← กลับหน้ารูปภาพ 🔍 ค้นหารูปด้วยใบหน้า VENSON Kamphaengphet 2026 — รูปทั้งหมด 142 รูป 🚧 ระบบค้นหาด้วยใบหน้ากำลังอยู่ระหว่างพัฒนา ดูแกลเลอรีด้านล่างไปก่อนได้ 📷 อัปโหลดเซลฟี่เพื่อค้นหารูปของคุณ รองรับ JPG, PNG, WEBP · ขนาดไม่เกิน 10 MB 📸 แกลเลอรี (142 รูป)

รูปที่ 7.2 — UI ปัจจุบัน (Backend ปิด) สร้างจากการอ่านโค้ด photo_search.php

7.3 Flow ที่วางไว้

ฝั่ง User

  1. เข้าหน้า match_detail.php?id=N → tab "รูปภาพ"
  2. กดปุ่ม "🔍 ค้นหารูปของฉัน" → ไป photo_search.php
  3. กดกล่อง "อัปโหลดเซลฟี่"
  4. เลือก/ถ่ายรูป selfie (camera permission)
  5. กด "ค้นหา" → loading 3-10 วินาที
  6. แสดงผลลัพธ์:
    • 🎯 รูปที่มีใบหน้าตรง (similarity > 0.65) — top match
    • 📷 รูปอื่นที่คล้าย (0.50 - 0.65)
    • ปุ่ม "ดาวน์โหลดทั้งหมด" (ZIP)

ฝั่ง Server

Architecture
Browser              VM1 (PHP)              VM2 (Face API)         GPU
  │                     │                         │                  │
  ├── POST selfie ─────>│                         │                  │
  │                     ├── proxy w/ tournament ─>│                  │
  │                     │                         ├── detect face ──>│
  │                     │                         │<── embedding ────│ RTX 3060
  │                     │                         │   (512-d vector) │
  │                     │                         │                  │
  │                     │                         ├── compare with ─>│
  │                     │                         │   all photo emb. │
  │                     │                         │<── ranked list ──│
  │                     │<── JSON results ────────│                  │
  │<── HTML render ─────│                         │                  │

API Spec ที่วางไว้

POST http://192.168.1.102:5000/api/face/search
Content-Type: multipart/form-data

selfie: <file>
tournament_id: 3
threshold: 0.5

Response:
{
  "status": "ok",
  "matches": [
    {"photo_id": 142, "filename": "img001.jpg", "similarity": 0.87},
    {"photo_id": 156, "filename": "img089.jpg", "similarity": 0.74},
    ...
  ],
  "processing_time_ms": 2340
}

7.4 Setup ของ Proxmox (ที่กำลังจัดทำ)

อ่านเอกสารเต็มที่ Proxmox_Setup.md

Hardware

ส่วนรายละเอียด
CPUAMD Ryzen 9 5900X (12C/24T)
RAM48 GB
GPU #1NVIDIA RTX 3060 (passthrough → VM2)
GPU #2Quadro P1000 (host)

VM Layout

VMหน้าที่vCPURAMDiskIP
VM1Web (Apache+PHP+MySQL+LINE)46 GB50 GB192.168.1.101
VM2Face Detection API816 GB80 GB192.168.1.102

Setup สรุป VM2

  1. ติดตั้ง Ubuntu 22.04 LTS
  2. ติดตั้ง NVIDIA driver + CUDA 12
  3. ติดตั้ง Python 3.10 + virtualenv
  4. pip install insightface flask onnxruntime-gpu opencv-python
  5. เขียน Flask API endpoint /api/face/search
  6. เปิด firewall port 5000 (เฉพาะ LAN)
  7. ทดสอบเรียกจาก VM1 → match กับรูปทดสอบ

7.5 ข้อพิจารณา Privacy + Performance

🔒 Privacy

⚡ Performance Target

🚦 Rate Limiting

🚨 จริยธรรม

ระบบ search ได้เฉพาะ รูปของรายการที่ผู้ใช้สมัครเข้าแข่งเท่านั้น — ไม่ใช่รูปทั้งระบบ และไม่อนุญาตให้ admin export embeddings ออกนอก server