Để thực hiện các tính năng chỉnh sửa chi tiết cấu trúc khuôn mặt như phóng to/thu nhỏ mắt, thu gọn cánh mũi, nâng cằm, hạ trán ngay trên điện thoại, các ứng dụng nhiếp ảnh hiện nay sử dụng một nhóm công nghệ AI chuyên biệt gọi là **Mô hình Nhận diện Điểm cốt lõi Khuôn mặt (Face Landmark Detection)** kết hợp với thuật toán **Biến dạng Đồ họa Động (Image Warping/Mesh Deformation)**. Dưới đây là kế hoạch Markdown chi tiết mô tả cơ chế hoạt động của các tính năng làm đẹp này, các mô hình AI on-device (chạy trực tiếp trên chip điện thoại) phổ biến, và cách tích hợp chúng vào dự án của bạn. --- # 👤 TÀI LIỆU CÔNG NGHỆ: CHỈNH SỬA CHI TIẾT CHÂN DUNG (FACE RECOGNITION & LANDMARK WARPING) ON-DEVICE Mục tiêu cốt lõi: 1. Hiểu cách AI định vị các bộ phận: Mắt, Mũi, Miệng, Trán, Cằm. 2. Ứng dụng ma trận điểm (Mesh) để co giãn, thay đổi kích thước bộ phận mà không làm méo tổng thể bức ảnh. 3. Giới thiệu các mô hình AI siêu nhẹ, chạy mượt mà 60 FPS trực tiếp trên phần cứng điện thoại. --- ## 📐 1. Nguyên Lý Hoạt Động Của AI Làm Đẹp (The Anatomy of Digital Beauty) Quy trình chỉnh sửa chân dung bằng AI trên điện thoại diễn ra qua 3 bước nghiêm ngặt sau: ### 🔹 Bước 1: Quét hệ thống điểm cốt lõi (Face Landmark Detection) Mô hình AI sẽ không nhìn khuôn mặt như một tấm ảnh phẳng, mà nó sẽ tự động chấm lên mặt bạn từ **68 đến 468 điểm tọa độ cố định** (Landmarks). * **Mắt:** Được bao bọc bởi khoảng 6-8 điểm quanh mí mắt. * **Mũi:** Cố định bởi các điểm dọc sống mũi và cánh mũi. * **Trán và Cằm:** Định vị bằng các điểm dọc theo đường viền xương hàm (Jawline) và chân tóc. ### 🔹 Bước 2: Tạo lưới đa giác lập thể (Face Mesh Generation) Từ các điểm tọa độ này, AI nối chúng lại với nhau tạo thành một mạng lưới hàng trăm đa giác nhỏ bao bọc lấy khuôn mặt (giống như mặt nạ 3D lưới). ### 🔹 Bước 3: Biến dạng hình học cục bộ (Local Mesh Deformation / Warping) Khi bạn kéo thanh trượt Ruler trên ứng dụng (ví dụ: Thu nhỏ mũi hoặc phóng to mắt): * Thuật toán sẽ **chỉ dịch chuyển tọa độ các điểm thuộc bộ phận đó** (Ví dụ: ép các điểm cánh mũi dịch vào tâm, hoặc đẩy các điểm mí mắt giãn ra xa nhau). * Phần mềm đồ họa (thông qua GPU Shader như OpenGL/Vulkan/Metal) sẽ tự động co giãn các pixel ảnh nằm bên trong các đa giác tương ứng. Vì chỉ có vùng lưới của bộ phận đó dịch chuyển, nên phông nền xung quanh hoặc các bộ phận khác hoàn toàn không bị méo mó theo. --- ## 📦 2. Các Mô Hình AI Chuyên Chức Năng Này Trên Điện Thoại Nếu bạn muốn tích hợp tính năng này vào ứng dụng của mình, đây là những mô hình AI mã nguồn mở, siêu nhẹ (On-device) tốt nhất hiện nay: ### 🌟 1. Google MediaPipe Face Mesh (Khuyên dùng nhất) * **Dung lượng:** ~3MB - 5MB (Dạng `.tflite`). * **Khả năng:** Nhận diện thời gian thực lên tới **468 điểm tọa độ 3D** trên khuôn mặt (có bản nâng cấp lên 478 điểm bao gồm cả con ngươi mắt). * **Hiệu năng:** Chạy cực mượt (gần 60 FPS) trên cả Android và iOS nhờ tối ưu hóa GPU phần cứng. Nó bóc tách cực chi tiết viền môi, mí mắt, giúp việc phóng to mắt hay thu nhỏ môi chính xác đến từng pixel. ### 🌟 2. Ý tưởng từ InsightFace (Mô hình chuyên sâu) * **Khả năng:** Nhận diện trọn vẹn cấu trúc xương mặt để phục vụ căn chỉnh tỷ lệ vàng (Face Reshaping). * **Nhược điểm:** Nặng hơn MediaPipe, thường dùng cho việc xử lý ảnh tĩnh sau khi chụp hơn là chạy Live preview trên kính ngắm. --- ## 💻 3. Logic Thiết Kế Mã Nguồn Giả Lập Điều Chỉnh Kích Thước (`MainActivity.kt`) Khi người dùng tăng giảm thông số trên thanh kéo, chúng ta can thiệp trực tiếp vào ma trận điểm Mesh của MediaPipe trước khi render ra màn hình: ```kotlin import android.graphics.Bitmap import com.google.mediapipe.tasks.vision.facemesh.FaceMeshResult fun applyFaceReshaping( inputBitmap: Bitmap, faceMeshResult: FaceMeshResult, eyeSizeFactor: Float, // Hệ số chỉnh mắt (Ví dụ: 1.0 là gốc, 1.2 là phóng to 20%) noseSizeFactor: Float // Hệ số chỉnh mũi (Ví dụ: 0.9 là thu nhỏ cánh mũi 10%) ): Bitmap { val outputBitmap = Bitmap.createBitmap(inputBitmap.width, inputBitmap.height, Bitmap.Config.ARGB_8888) // 1. Trích xuất danh sách tọa độ 468 điểm từ MediaPipe val landmarks = faceMeshResult.multiFaceLandmarks()[0] // 2. Định vị danh sách ID điểm thuộc về Mắt trái, Mắt phải, Cánh mũi val leftEyeCenter = calculateCenterPoint(landmarks, listOf(33, 133, 159, 145)) // Điểm trung tâm mắt val noseCenter = calculateCenterPoint(landmarks, listOf(1, 2, 98, 327)) // Điểm trung tâm mũi // 3. Chạy thuật toán Warp Pixel cục bộ (Local Texture Warping) // Duyệt qua các pixel, nếu pixel nằm gần vùng mắt/mũi, ta nhân tọa độ với hệ số Factor // để ép hình ảnh co lại hoặc giãn ra từ tâm bộ phận đó. // Thuật toán này được thực thi bằng mã Shader (OpenGL ES) dưới GPU để đạt tốc độ thời gian thực. return outputBitmap } ``` --- ## 🔄 4. Định Hướng Tích Hợp Vào Dự Án Photobooth Hiện Tại Tính năng này có cấu trúc vận hành hoàn toàn đồng bộ với hệ thống **MediaPipe Multiclass Segmenter** và **Focus vật lý** mà chúng ta đã xây dựng: 1. **Hiển thị trên Viewfinder (Real-time Preview):** Luồng camera Preview thô vẫn chạy 60 FPS. Ta nạp model `Face Mesh` chạy song song (vì model này rất nhẹ, chỉ tốn khoảng 2-3ms để quét 1 khung hình). GPU của điện thoại sẽ áp lưới ma trận màu và lưới co giãn bộ phận trực tiếp lên Viewfinder. Bạn sẽ thấy mắt mình to lên hoặc mũi nhỏ lại **ngay khi đang ngắm chuẩn bị chụp**. 2. **Khi bấm Shutter:** Thấu kính camera thực hiện lấy nét vật lý chuẩn xác $\rightarrow$ Chụp ảnh gốc độ phân giải cao $\rightarrow$ Gửi ảnh gốc + Các thông số co giãn mặt (`eyeSize, noseSize`) xuống luồng ngầm Coroutine để xử lý xuất file JPG hoàn chỉnh sắc nét. --- ## 📅 5. Checklist Thử Nghiệm Tính Năng (QA Checklist) * [ ] **Kiểm thử vùng biên (No Distort):** Kéo thanh trượt "Thu nhỏ cằm" hoặc "Phóng to mắt" lên mức tối đa. Quan sát kỹ phần phông nền xung quanh (bức tường, cửa sổ sắt phía sau). (Yêu cầu: Chỉ có bộ phận trên mặt thay đổi kích thước, phông nền thẳng phía sau tuyệt đối không được bị cong hay méo theo tay kéo). * [ ] **Kiểm thử góc nghiêng (Angle Rotation):** Thử quay nghiêng mặt góc 30-45 độ rồi chỉnh thông số. (Yêu cầu: AI Face Mesh vẫn phải khóa được vị trí mắt mũi theo chiều không gian 3D để co giãn đúng hướng thấu kính, không bị lệch vùng chọn ra ngoài má).