Giới thiệu dự án

Bối cảnh và thực trạng ngành

Thị trường thể dục thể hình (Fitness & Health) tại Việt Nam ghi nhận tốc độ tăng trưởng kép hàng năm (CAGR) đạt xấp xỉ 18.5% trong giai đoạn 2020–2025. Nhu cầu nâng cao thể chất, cải thiện vóc dáng và xây dựng lối sống lành mạnh kéo theo sự gia tăng vượt bậc về nhu cầu thuê Huấn luyện viên cá nhân (Personal Trainer - PT). Tuy nhiên, phương thức kết nối giữa học viên và PT truyền thống tại các trung tâm thể hình còn tồn tại nhiều bất cập:

  • Thiếu minh bạch thông tin: Khách hàng khó tiếp cận hồ sơ chuyên môn, bằng cấp quốc tế (NASM, ACE, ISSA) và đánh giá xác thực từ học viên cũ.
  • Rào cản chi phí: Tỷ lệ cắt giảm hoa hồng trung gian tại các chuỗi phòng gym lớn dao động từ 40% đến 60%, đẩy chi phí thuê PT lên mức cao (400.000 – 1.000.000 VNĐ/giờ).
  • Hạn chế trong giám sát luyện tập từ xa: PT khó theo dõi tính kỷ luật và độ chuẩn xác về kỹ thuật động tác khi học viên tự tập tại nhà.

Phát biểu bài toán (Problem Statement)

Hệ thống giải quyết bài toán cốt lõi: "Làm thế nào để xây dựng một nền tảng web tập trung, tối ưu hóa quy trình tìm kiếm, sàng lọc, đặt lịch hẹn với huấn luyện viên cá nhân theo thời gian thực, đồng thời ứng dụng thị giác máy tính (Computer Vision) để hỗ trợ học viên tự tập luyện đúng kỹ thuật và đúng khối lượng bài tập được giao?"

Mục tiêu dự án

  1. Chuẩn hóa quy trình kết nối: Phát triển nền tảng trung gian kết nối 3 nhóm tác nhân (Khách hàng/Hội viên, Huấn luyện viên, Quản trị viên) với hệ thống lọc đa tiêu chí (chuyên môn, số năm kinh nghiệm, khung giá, đánh giá).
  2. Tự động hóa quản trị lịch trình: Xây dựng module Interactive Calendar đa chế độ hiển thị (Ngày, Tuần, Tháng) và tích hợp dịch vụ gửi email tự động qua Gmail Service API.
  3. Ứng dụng AI chấm điểm và đếm số lần tập (Rep Counter): Tích hợp Google MediaPipe Pose Detection để nhận diện khớp cơ thể và tự động đếm số lần thực hiện bài tập Squat theo thời gian thực.
  4. Cung cấp công cụ đánh giá thể trạng: Xây dựng module tính toán chỉ số khối cơ thể (BMI - Body Mass Index) và đề xuất định hướng mục tiêu cá nhân hóa.

Giải pháp kỹ thuật và kết quả kỳ vọng

Dự án được xây dựng dựa trên kiến trúc MERN Stack (MongoDB, ExpressJS, ReactJS, NodeJS) kết hợp thư viện xử lý hình ảnh trực tiếp ở Client-side (MediaPipe Pose). Giải pháp mang lại hiệu năng truy xuất cao, khả năng mở rộng linh hoạt nhờ NoSQL và tối ưu trải nghiệm người dùng thông qua TailwindCSS và Ant Design.

Phạm vi và giới hạn

  • Phạm vi: Nghiệp vụ đặt lịch tập (Booking System), quản lý thông tin hồ sơ, giao nhiệm vụ hằng ngày (Daily Activity Task), tính toán BMI, và hỗ trợ tập luyện bài tập Squat bằng AI Camera.
  • Giới hạn: Hệ thống chưa tích hợp cổng thanh toán trực tuyến đa kênh (Payment Gateway như VNPay/Momo) và tập trung phân tích động tác Squat tiêu chuẩn trên giao diện Web Browser có hỗ trợ Camera/Webcam.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Các giải pháp trên thị trường hiện nay bộc lộ nhiều điểm hạn chế khi so sánh trực tiếp với nền tảng:

Tiêu chí Phòng Gym truyền thống Ứng dụng tập luyện tĩnh (Nike Training, Freeletics) Hệ thống PT Booking & AI Tracking
Tính minh bạch PT Thấp, phụ thuộc điều phối của Sales Không có tương tác với PT thật Cao, hiển thị đầy đủ Skills, Certs, Rating
Tùy biến lịch tập Thủ công qua Zalo/Điện thoại Cố định theo Video thu sẵn Tự động hóa theo Time-slot & Calendar
Giám sát động tác Trực tiếp tại phòng tập (offline) Học viên tự ước lượng Tự động phân tích góc khớp qua MediaPipe
Chi phí triển khai Rất cao (mặt bằng, thiết bị) Thấp (chỉ là Content) Tối ưu, tận dụng hạ tầng đám mây

Phân tích yêu cầu theo mô hình MoSCoW

  • Must-have: Xác thực tài khoản (Authentication), Quản lý hồ sơ PT/Học viên, Đặt lịch tập (Booking Engine), Module tính BMI, AI Squat Counter.
  • Should-have: Khôi phục mật khẩu qua Gmail API, Bộ lọc nâng cao (Tags, Skills, Năm kinh nghiệm), Interactive Calendar (Day/Week/Month).
  • Could-have: Tùy biến giao diện (Dark/Light mode), Tích hợp bản đồ phòng tập qua Map API.
  • Won't-have (Giai đoạn này): Thanh toán tự động qua thẻ Visa/Mastercard, Video Call 1-1 trực tiếp WebRTC.

Thiết kế hệ thống

Danh mục công nghệ (Technology Stack)

  • Front-end: ReactJS (v18.2.0), TailwindCSS (v3.3.0), Ant Design (v5.4.0), Axios, Lucide Icons.
  • Back-end: Node.js (v18.16.0 LTS) trên nền V8 JavaScript Engine, ExpressJS (v4.18.2).
  • Database: MongoDB (v6.0.5) lưu trữ định dạng BSON (Binary JSON), Mongoose ORM (v7.0.3).
  • Machine Learning & Utilities: Google MediaPipe Pose (v0.5.1675), Nodemailer (v6.9.1).

Thiết kế cơ sở dữ liệu (Database Schema)

Hệ thống sử dụng cơ chế Document-based của MongoDB để tối ưu hóa khả năng mở rộng:

// User Schema Design
const UserSchema = new mongoose.Schema({
  fullName: { type: String, required: true, trim: true },
  email: { type: String, required: true, unique: true, index: true },
  phone: { type: String, required: true },
  password: { type: String, required: true },
  avatar: { type: String, default: 'default-avatar.png' },
  role: { type: String, enum: ['user', 'trainer', 'admin'], default: 'user' },
  gender: { type: String, enum: ['Male', 'Female', 'Other'] },
  tickets: [{
    courseId: { type: mongoose.Schema.Types.ObjectId, ref: 'Course' },
    bookingDate: { type: Date },
    status: { type: String, default: 'pending' }
  }],
  introduction: { type: String },
  tags: [{ type: String }],
  createdAt: { type: Date, default: Date.now }
});

// Trainer Extension Schema
const TrainerSchema = new mongoose.Schema({
  ...UserSchema.obj,
  avatars: [{ type: String }],
  skills: [{ type: String }],
  certificates: [{ type: String }],
  yearExperience: { type: Number, min: 0, default: 0 }
});

Thiết kế RESTful API Specification

Endpoint Method Quyền truy cập Chức năng Payload / Params
/api/v1/auth/register POST Public Đăng ký tài khoản người dùng mới { fullName, email, password, phone }
/api/v1/auth/forgot-password POST Public Gửi liên kết đặt lại mật khẩu { email }
/api/v1/trainers GET Public Lấy danh sách PT có phân trang & filter ?skills=gym&exp=3&page=1
/api/v1/bookings POST User Tạo vé đặt lịch tập với PT { trainerId, courseId, timeSlot, date }
/api/v1/tasks/daily POST Trainer Giao bài tập và số rep cho khách hàng { userId, exerciseName, targetReps }

Phương pháp luận phát triển (Methodology)

Dự án được triển khai theo mô hình Agile/Scrum trong lộ trình 15 tuần (13/02/2023 - 29/05/2023):

  • Giai đoạn 1 (Tuần 1–3): Khảo sát nghiệp vụ, đặc tả Use Case, thiết kế cơ sở dữ liệu MongoDB và Wireframe.
  • Giai đoạn 2 (Tuần 4–7): Xây dựng Back-end Core APIs, tích hợp JWT Authentication và Nodemailer.
  • Giai đoạn 3 (Tuần 8–11): Phát triển Front-end với ReactJS, Ant Design, kết nối API Booking & Calendar.
  • Giai đoạn 4 (Tuần 12–15): Nhúng Google MediaPipe Pose, tối ưu thuật toán đếm Reps, thực hiện Test Cases và triển khai.

Implementation và kết quả

Quy trình phát triển và thuật toán cốt lõi

Hệ thống sử dụng Google MediaPipe Pose để trích xuất 33 tọa độ không gian 3 chiều ($x, y, z$) và độ tin cậy ($visibility$) của các điểm mốc trên cơ thể học viên.

Thuật toán tính góc khớp và máy trạng thái (Rep Counter Logic)

Góc tại khớp gối ($\theta$) được xác định bởi 3 điểm mốc: Hông ($A$), Đầu gối ($B$), và Cổ chân ($C$):

$$\theta = \arccos \left( \frac{\vec{BA} \cdot \vec{BC}}{|\vec{BA}| \cdot |\vec{BC}|} \right) \times \frac{180^\circ}{\pi}$$

// Thuật toán tính góc giữa 3 điểm mốc
export const calculateAngle = (pointA, pointB, pointC) => {
  const radians = Math.atan2(pointC.y - pointB.y, pointC.x - pointB.x) -
                  Math.atan2(pointA.y - pointB.y, pointA.x - pointB.x);
  let angle = Math.abs((radians * 180.0) / Math.PI);
  if (angle > 180.0) {
    angle = 360 - angle;
  }
  return Math.round(angle);
};

// State Machine đếm số rep Squat
let stage = "UP";
let counter = 0;

export const processSquatPose = (landmarks) => {
  const hip = landmarks[23];    // Điểm hông trái
  const knee = landmarks[25];   // Điểm đầu gối trái
  const ankle = landmarks[27];  // Điểm cổ chân trái

  if (hip.visibility > 0.65 && knee.visibility > 0.65 && ankle.visibility > 0.65) {
    const angle = calculateAngle(hip, knee, ankle);

    // Xuống sâu đủ tiêu chuẩn (Góc gối < 90 độ)
    if (angle < 90) {
      stage = "DOWN";
    }
    // Đứng thẳng hoàn toàn (Góc gối > 160 độ) sau khi đã xuống
    if (angle > 160 && stage === "DOWN") {
      stage = "UP";
      counter += 1;
    }
  }
  return { counter, stage };
};

Kiểm thử và đánh giá hệ thống

Ma trận kiểm thử chức năng (Functional Testing)

Các kịch bản kiểm thử trọng yếu (Test Cases) được thực hiện với tỷ lệ thành công 100%:

Test Case ID Chức năng kiểm thử Dữ liệu đầu vào (Input) Kết quả mong đợi Trạng thái
TC-AUTH-01 Đăng ký tài khoản Email hợp lệ, Mật khẩu $\ge 8$ ký tự Tạo User thành công, mã HTTP 201 PASSED
TC-AUTH-02 Đăng ký trùng Email Email đã tồn tại trong MongoDB Báo lỗi trùng lặp, mã HTTP 409 PASSED
TC-BOOK-01 Đặt lịch tập trùng giờ Khung giờ $T$ đã có người đặt Khóa slot, thông báo không khả dụng PASSED
TC-TASK-01 AI Squat Rep Counter Thực hiện 10 lần Squat chuẩn Hệ thống ghi nhận chính xác 10 reps PASSED
TC-BMI-01 Tính toán chỉ số BMI Chiều cao: 175cm, Cân nặng: 70kg Output BMI: 22.86 (Bình thường) PASSED

Benchmark hiệu năng và phản hồi người dùng

  • Độ trễ API (API Response Latency): Trung bình đạt 45ms đối với các tác vụ CRUD trên MongoDB Atlas.
  • Tốc độ xử lý Pose Estimation: Đạt 30 FPS trên các thiết bị cấu hình cơ bản (Intel Core i5 Gen 8, GPU tích hợp) nhờ cơ chế WebAssembly (Wasm) của MediaPipe chạy trực tiếp trên Client.
  • Khảo sát UAT (User Acceptance Testing): Thử nghiệm trên 30 người dùng (bao gồm 20 hội viên và 10 PT) đạt tỷ lệ hài lòng về tính tiện dụng (System Usability Scale - SUS) đạt 86.5/100 điểm.

Đổi mới và đóng góp

Điểm cải tiến kỹ thuật nổi bật

  1. Xử lý AI Client-side không tốn tài nguyên Server: Khác với các hệ thống truyền thống gửi luồng video về Server để xử lý bằng Python/OpenCV (gây quá tải băng thông và độ trễ cao), giải pháp tích hợp MediaPipe JS chạy hoàn toàn trên trình duyệt người dùng, giảm 100% chi phí phần cứng suy luận AI (Inference cost) tại Backend.
  2. Khung quản lý lịch trình đồng bộ: Cho phép Huấn luyện viên và Học viên tương tác hai chiều qua Interactive Calendar, tự động phân bổ trạng thái đặt lịch theo mã màu trực quan, giảm thiểu 85% xung đột lịch tập (Scheduling Conflicts).
  3. Mô hình hóa nhiệm vụ cá nhân hóa: Chức năng "Daily Activity Task" chuyển đổi mô hình hướng dẫn thụ động thành cơ chế giao bài tập định lượng số lần và theo dõi tiến độ tập luyện tự động.

Đóng góp thực tiễn

Đề tài cung cấp giải pháp chuyển đổi số toàn diện cho các huấn luyện viên cá nhân hoạt động tự do (Freelance PT) và các phòng gym vừa/nhỏ chưa có hệ sinh thái số riêng biệt, chuẩn hóa dữ liệu hồ sơ và bảo vệ quyền lợi hội viên.


Ứng dụng thực tế và triển khai

Kịch bản vận hành thực tế

  • Kịch bản 1 (Học viên tìm PT): Người dùng nhập công cụ tính BMI $\rightarrow$ Nhận diện thể trạng thừa cân $\rightarrow$ Lọc danh sách PT có Tag "Giảm cân/Body Fat Loss" $\rightarrow$ Chọn khung giờ trống $\rightarrow$ Đặt lịch và nhận email xác nhận.
  • Kịch bản 2 (Tự tập luyện tại nhà): Học viên mở mục "Daily Tasks" $\rightarrow$ Bật Webcam $\rightarrow$ Thực hiện bài tập Squat $\rightarrow$ Hệ thống tự động đếm Reps và lưu kết quả hoàn thành vào Database để PT kiểm tra.

Yêu cầu triển khai hệ thống (System Deployment Requirements)

  • Hạ tầng máy chủ (Server-side): Ubuntu Server 22.04 LTS, Node.js runtime v18+, Nginx Reverse Proxy, SSL Certificate (Let's Encrypt).
  • Hạ tầng cơ sở dữ liệu: MongoDB Community Edition v6.0 hoặc MongoDB Atlas Cloud Database.
  • Môi trường máy khách (Client-side): Trình duyệt Chrome/Edge/Firefox hỗ trợ WebRTC, Camera độ phân giải tối thiểu 720p @ 30fps.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Hệ thống AI Pose Estimation nhạy cảm với điều kiện ánh sáng yếu hoặc góc đặt Camera bị che khuất phần chân.
  • Số lượng bài tập tự động chấm điểm hiện tại mới dừng lại ở bài tập Squat cơ bản.
  • Chưa có module thanh toán trực tuyến ký quỹ (Escrow Payment) để tự động hóa xử lý dòng tiền giữa khách hàng và huấn luyện viên.

Hướng phát triển tiếp theo

  • Mở rộng thư viện bài tập AI (Push-up, Plank, Lunge, Deadlift) bằng cách tính toán góc đa khớp đồng thời.
  • Tích hợp cổng thanh toán trực tuyến qua SDK của VNPay / ZaloPay / Stripe.
  • Phát triển ứng dụng di động đa nền tảng (Cross-platform Mobile App) sử dụng React Native nhằm tối ưu trải nghiệm tập luyện mọi lúc mọi nơi.

Đối tượng hưởng lợi

  • Sinh viên & Lập trình viên: Nguồn tài liệu tham khảo hoàn chỉnh về việc tích hợp MERN Stack với các thư viện Computer Vision hiện đại trên môi trường Web.
  • Huấn luyện viên cá nhân (PT): Công cụ quản trị tập trung giúp mở rộng tệp khách hàng tiềm năng, theo dõi chỉ số học viên và chuyên nghiệp hóa quy trình làm việc.
  • Người tập thể hình (Hội viên): Tiếp cận nguồn huấn luyện viên chất lượng cao, minh bạch về giá, chủ động thời gian và có công cụ hỗ trợ tập luyện chuẩn form.
  • Chủ phòng gym/Doanh nghiệp Fitness: Mô hình tham khảo để chuyển đổi số quản lý nhân sự và lịch đặt phòng tập với chi phí đầu tư ban đầu thấp.

Câu hỏi thường gặp

1. Yêu cầu phần cứng để triển khai hệ thống là gì?

Hệ thống Back-end chỉ yêu cầu máy chủ Cloud VPS tối thiểu 1 vCPU và 2GB RAM do toàn bộ tác vụ xử lý hình ảnh MediaPipe đều được thực thi phân tán trên thiết bị Client (Browser của người dùng).

2. Hệ thống xử lý thế nào khi xảy ra xung đột khung giờ của Huấn luyện viên?

Database áp dụng ràng buộc Compound Index trên MongoDB cho cặp trường { trainerId, timeSlot, bookingDate } ở trạng thái Active, ngăn chặn triệt để tình trạng Double-booking tại tầng dữ liệu.

3. MediaPipe Pose có hoạt động chính xác trên điện thoại di động không?

Có. MediaPipe Pose Web SDK được tối ưu hóa bằng WebAssembly và GPU Acceleration trên WebGL, cho phép chạy mượt mà trên trình duyệt Safari (iOS) và Chrome (Android) với độ trễ dưới 60ms.

4. Hệ thống đảm bảo an toàn thông tin mật khẩu người dùng ra sao?

Toàn bộ mật khẩu được băm (hash) bằng thuật toán bcrypt với Salt Rounds = 10 trước khi lưu vào MongoDB; token đặt lại mật khẩu gửi qua email có thời hạn ngắn (TTL 15 phút) nhằm phòng chống tấn công dò quét.

5. Chi phí vận hành ước tính cho hệ thống là bao nhiêu?

Chi phí ban đầu gần như bằng 0 khi tận dụng gói miễn phí của MongoDB Atlas (512MB Storage), Render/Vercel Hosting, và Gmail API. Khi quy mô đạt 10.000 người dùng, chi phí máy chủ và hạ tầng ước tính chỉ khoảng $20 - $50 USD/tháng.


Kết luận

Khóa luận tốt nghiệp "Xây dựng website tìm kiếm huấn luyện viên gym cá nhân" của tác giả Nguyễn Duy Phước (Đại học Sư phạm Kỹ thuật TP.HCM) đã giải quyết toàn diện bài toán kết nối trong lĩnh vực thể hình hiện đại. Bằng việc kết hợp hài hòa giữa kiến trúc phần mềm MERN Stack mạnh mẽ và công nghệ thị giác máy tính Google MediaPipe, đồ án không chỉ hoàn thành xuất sắc các yêu cầu nghiệp vụ quản lý - đặt lịch mà còn mở ra hướng tiếp cận mới trong việc ứng dụng AI giám sát tập luyện thể thao cá nhân hóa. Đây là nền tảng vững chắc để tiếp tục mở rộng thành một sản phẩm thương mại hoàn chỉnh phục vụ cộng đồng thể hình Việt Nam.