Giới thiệu dự án

Mô hình bán lẻ truyền thống đang đối mặt với bài toán nan giải về chi phí vận hành và trải nghiệm khách hàng. Theo các nghiên cứu thị trường ngành bán lẻ toàn cầu, tình trạng khách hàng rời bỏ giỏ hàng do thời gian xếp hàng thanh toán kéo dài gây thiệt hại hàng chục tỷ USD mỗi năm. Sự bùng nổ của đại dịch và xu hướng số hóa đã thúc đẩy mạnh mẽ nhu cầu về trải nghiệm mua sắm không tiếp xúc, liền mạch và tức thì.

Khóa luận tốt nghiệp "Nghiên cứu các kỹ thuật dựa trên thị giác máy tính và máy học để xây dựng ứng dụng Just Walk Out Shopping" được thực hiện bởi sinh viên Lê Quang Trung (MSSV: 20520333) và Hà Phi Hùng (MSSV: 20520526), dưới sự hướng dẫn của TS. Nguyễn Duy Khánh tại Khoa Công nghệ Phần mềm, Trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM (UIT - VNUHCM, 2024). Đề tài tập trung giải quyết bài toán cốt lõi của mô hình cửa hàng không thu ngân (Autonomous Checkout): tự động hóa hoàn toàn quy trình nhận diện hành động mua sắm, định danh sản phẩm và đồng bộ giỏ hàng thời gian thực chỉ thông qua camera giám sát.

+------------------+       WebRTC Stream        +-----------------------------+
| Camera Giám Sát  | ------------------------> | Computer Vision Service     |
| (Edge Client)    |                           | (YOLOv8n + MoViNet-A1)      |
+------------------+                           +-----------------------------+
                                                              |
                                                    Kafka Topic 'cart-updates'
                                                              v
+------------------+       Socket.IO API       +-----------------------------+
| Next.js Frontend | <------------------------ | Business Service (NestJS)   |
| (Khách hàng xem) |                           | + PostgreSQL Database       |
+------------------+                           +-----------------------------+

Vấn đề cốt lõi và bài toán thực tiễn

Các rào cản chính khi triển khai mô hình Just Walk Out (JWO) thương mại bao gồm:

  • Chi phí hạ tầng phần cứng đắt đỏ: Các giải pháp tiên phong như Amazon Go hay hệ thống tích hợp cảm biến FAIM đòi hỏi hàng trăm camera trần kết hợp mạng lưới cảm biến áp lực (load-cell) và RFID gắn dày đặc trên từng kệ hàng.
  • Độ trễ xử lý thời gian thực: Video stream nhiều chiều đòi hỏi năng lực tính toán cực lớn, dễ gây nghẽn cổ chai nếu xử lý tập trung.
  • Xử lý thị giác trong môi trường động: Sự che khuất (occlusion), góc quay hạn chế, thay đổi diện mạo khách hàng và kích thước sản phẩm nhỏ gây khó khăn cho việc phân loại chính xác.

Mục tiêu của đề tài

  1. Nghiên cứu và làm chủ luồng hoạt động: Phân tích kiến trúc hệ thống Just Walk Out, kỹ thuật xử lý luồng video thời gian thực và mô hình mạng nơ-ron học sâu (Deep Learning).
  2. Xây dựng hệ thống Computer Vision nhận diện: Ứng dụng mô hình YOLOv8n để phát hiện tay và nhận diện mặt hàng; kết hợp mô hình 3D CNN MoViNet-A1-Stream để phân loại hành động lấy (Pick) hoặc trả (Return) sản phẩm.
  3. Thiết kế kiến trúc hướng sự kiện (Event-Driven Architecture): Tích hợp Apache Kafka điều phối dữ liệu giữa tầng xử lý thị giác máy tính và tầng logic nghiệp vụ.
  4. Phát triển Backend Service & Web Client: Xây dựng Business Service bằng NestJS kết nối cơ sở dữ liệu PostgreSQL và giao diện hiển thị giỏ hàng trực quan thời gian thực bằng Next.js qua giao thức WebSockets/Socket.IO.
  5. Thực nghiệm và đánh giá toàn diện: Đo lường độ chính xác mAP, độ trễ hệ thống, FPS và kiểm thử các kịch bản lấy/trả hàng thực tế.

Phương pháp tiếp cận và phạm vi nghiên cứu

  • Phương pháp tiếp cận: Khóa luận đề xuất mô hình Pure-Vision (thuần thị giác máy tính) kết hợp kiến trúc phân tán. Thay vì phụ thuộc vào cảm biến vật lý trên kệ, hệ thống kết hợp không gian (Spatial Features từ YOLOv8n) và thời gian (Temporal Features từ MoViNet-A1-Stream đệm luồng) để nhận diện tương tác của người mua sắm.
  • Phạm vi nghiên cứu: Đồ án tập trung xây dựng hệ thống mẫu (PoC) xử lý luồng dữ liệu cho một khách hàng đơn lẻ trong một vùng giám sát camera, phân loại tập sản phẩm xác định và tự động cập nhật giỏ hàng lên trang web theo thời gian thực.

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

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

Tiêu chí so sánh Cửa hàng truyền thống (POS Barcode) Hệ thống cảm biến tích hợp (FAIM - Falcao et al.) Mô hình Amazon Go Giải pháp JWO đề xuất trong khóa luận
Phương thức nhận diện Quét mã vạch thủ công qua đầu đọc Cảm biến trọng lượng kệ hàng + Camera phụ trợ Hàng trăm camera trần + Load-cells + Cảm biến lòng bàn tay Pure-Vision: Camera đơn + Dual YOLOv8n + MoViNet-A1-Stream
Chi phí phần cứng Thấp (chỉ cần quầy thu ngân) Rất cao (lắp đặt cảm biến toàn bộ kệ) Cực kỳ đắt đỏ (hạ tầng chuyên biệt) Tối ưu, tận dụng camera IP chuẩn WebRTC
Độ phức tạp lắp đặt Đơn giản Phức tạp, khó bảo trì cảm biến cơ học Cần thiết kế lại toàn bộ không gian cửa hàng Linh hoạt, triển khai nhanh trên nền tảng sẵn có
Độ trễ cập nhật giỏ hàng Thủ công tại quầy < 1 giây sau khi thay đổi trọng lượng Thời gian thực (< 500ms) Thời gian thực qua Kafka & Socket.IO (< 350ms)
Xử lý che khuất N/A Tốt (nhờ trọng lượng) Xuất sắc (đa camera trần & kệ) Phụ thuộc vào góc quay của camera giám sát

Ma trận yêu cầu hệ thống (MoSCoW)

  • Must Have (Bắt buộc): Nhận diện chính xác hành động lấy hàng (Pick) và trả hàng (Return); phát hiện vị trí bàn tay và sản phẩm tương tác; cập nhật giỏ hàng lên giao diện web tức thì; truyền nhận video qua WebRTC không giật lag.
  • Should Have (Nên có): Tự động xóa sản phẩm khỏi giỏ khi số lượng về 0; cơ chế hàng đợi xử lý sự kiện bất đồng bộ chống nghẽn; logging chi tiết luồng dữ liệu.
  • Could Have (Có thể có): Mở rộng nhận diện đồng thời nhiều góc camera; gom nhóm nhiều khách hàng vào một phiên giỏ hàng chung.
  • Won't Have (Chưa thực hiện): Tích hợp cổng thanh toán sinh trắc học lòng bàn tay (Amazon One); quản lý chuỗi cung ứng tồn kho kho hàng lớn.

Thiết kế hệ thống

graph TD
    subgraph Client & Ingestion Layer
        CAM[WebRTC Camera Client / Video Stream]
        WEB[Next.js Web Frontend]
    end

    subgraph Computer Vision Service - Python
        API[aiohttp Signal Server]
        RTC[aiortc RTCPeerConnection]
        TRACK[VideoVisionTrack Worker]
        HD[Hand Detector - YOLOv8n]
        ID[Item Detector - YOLOv8n]
        AD[Action Detector - MoViNet-A1-Stream]
        FUSION[Vision Event Engine]
        EMITTER[MessageEmitter - Kafka Producer]
    end

    subgraph Messaging & Orchestration
        KAFKA[(Apache Kafka Cluster - Topic: cart-updates)]
    end

    subgraph Business & Data Layer - NestJS
        KCTRL[Kafka Controller]
        CSERVICE[CartService]
        GATEWAY[CartGateway - Socket.IO]
        DB[(PostgreSQL / Prisma ORM)]
    end

    CAM -->|SDP Offer / HTTP POST| API
    API -->|SDP Answer| CAM
    CAM -->|RTP Media Stream| RTC
    RTC --> TRACK
    TRACK --> HD
    TRACK --> ID
    TRACK --> AD
    HD --> FUSION
    ID --> FUSION
    AD --> FUSION
    FUSION -->|ShoppingEvent| EMITTER
    EMITTER -->|Produce Event| KAFKA
    KAFKA -->|Consume Event| KCTRL
    KCTRL --> CSERVICE
    CSERVICE --> DB
    CSERVICE --> GATEWAY
    GATEWAY -->|WebSocket Push| WEB

Technology Stack và phiên bản chi tiết

  • Computer Vision Service: Python 3.10+, PyTorch 2.1.0, Ultralytics YOLOv8 8.1.0, OpenCV 4.9.0, aiortc 1.6.0, aiohttp 3.9.1, kafka-python 2.0.2.
  • Business Service: Node.js 20.x LTS, NestJS 10.2.0, Prisma ORM 5.9.0, Socket.IO 4.7.4, KafkaJS 2.2.4, TypeScript 5.3.
  • Frontend & Storage: Next.js 14.1.0 (App Router/React 18), Tailwind CSS, PostgreSQL 15.4.

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

-- Bảng danh mục sản phẩm
CREATE TABLE "Product" (
    "id" SERIAL PRIMARY KEY,
    "name" VARCHAR(255) NOT NULL,
    "sku" VARCHAR(100) UNIQUE NOT NULL,
    "price" DECIMAL(10, 2) NOT NULL,
    "description" TEXT,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- Bảng quản lý giỏ hàng của phiên mua sắm
CREATE TABLE "Cart" (
    "id" SERIAL PRIMARY KEY,
    "sessionId" VARCHAR(255) UNIQUE NOT NULL,
    "status" VARCHAR(50) NOT NULL DEFAULT 'ACTIVE',
    "totalAmount" DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
);

-- Bảng chi tiết từng dòng sản phẩm trong giỏ hàng
CREATE TABLE "CartItem" (
    "id" SERIAL PRIMARY KEY,
    "cartId" INTEGER NOT NULL REFERENCES "Cart"("id") ON DELETE CASCADE,
    "productId" INTEGER NOT NULL REFERENCES "Product"("id"),
    "quantity" INTEGER NOT NULL DEFAULT 1,
    "unitPrice" DECIMAL(10, 2) NOT NULL,
    "linePrice" DECIMAL(10, 2) NOT NULL,
    "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT "UQ_Cart_Product" UNIQUE ("cartId", "productId")
);

Thiết kế API và giao thức truyền thông

  1. WebRTC Signaling API (aiohttp Server):
    • POST /offer: Nhận WebRTC SDP Offer từ camera client, tạo RTCPeerConnection, thiết lập track nhận video và trả về SDP Answer.
  2. Kafka Event Topic (cart-updates) Payload:
{
  "eventId": "evt_9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "timestamp": 1718445600000,
  "actionType": "PICK",
  "items": [
    {
      "productId": 101,
      "quantityChange": 1
    }
  ]
}
  1. Socket.IO Real-time Cart Gateway:
    • Event registerNewCartListener: Client đăng ký nhận cập nhật.
    • Event cartUpdated: Server push toàn bộ snapshot giỏ hàng mới nhất gồm danh sách items, totalQuantity, totalPrice.

Methodology & Quy trình phát triển

  • Quy trình phát triển: Áp dụng mô hình Agile/Scrum rút gọn chia làm 4 giai đoạn chính (Thu thập & gán nhãn dữ liệu $\rightarrow$ Huấn luyện & tối ưu mô hình Deep Learning $\rightarrow$ Xây dựng kiến trúc Microservices $\rightarrow$ Tích hợp & Kiểm thử thực nghiệm).
  • Quản lý rủi ro:
    • Rủi ro nghẽn luồng xử lý video: Giải quyết bằng mô hình đa tiến trình ProcessPoolExecutor trong Python kết hợp cơ chế Causal Convolution Stream Buffer của MoViNet.
    • Rủi ro mất gói tin giỏ hàng: Giải quyết bằng Apache Kafka với cơ chế Replication và At-least-once Delivery.

Implementation và kết quả

Chi tiết các thuật toán và kỹ thuật cốt lõi

1. Mạng nơ-ron tích chập 2D & Phát hiện vật thể (YOLOv8n)

Mô hình tích chập 2D trích xuất đặc trưng không gian thông qua phép toán nhân chập ma trận trọng số (kernel) $\omega \in \mathbb{R}^{M \times N}$ với lân cận điểm ảnh $x$: $$h_{ij} = \alpha\left(b + \sum_{m=1}^{M}\sum_{n=1}^{N} \omega_{mn} x_{i+m-1, j+n-1}\right)$$

YOLOv8n (Nano) sử dụng cấu trúc One-stage detector, tối ưu hóa hàm mất mát phân loại (VFL/BCE) và hàm mất mát hồi quy bounding box (CIoU + DFL). Để xác định sản phẩm nào đang được thao tác, hệ thống tính toán khoảng cách không gian (Spatial Distance & IoU) giữa Bounding Box bàn tay (dự đoán từ mô hình HandDetector) và Bounding Box sản phẩm (dự đoán từ ItemDetector):

$$\text{IoU} = \frac{\text{Area}(A \cap B)}{\text{Area}(A \cup B)}$$

2. Tích chập nhân quả 3D & Bộ đệm Stream (MoViNet-A1-Stream)

Để nhận diện hành động mua sắm trong thời gian thực mà không cần nạp toàn bộ video dài vào bộ nhớ, MoViNet áp dụng Causal 3D Convolution (tích chập nhân quả chỉ dựa vào khung hình hiện tại $x_t$ và bộ đệm quá khứ $B$) kết hợp cơ chế gộp tích lũy toàn cục Cumulative Global Average Pooling (CGAP):

$$F_t = f(x_t, B_{[:b]}), \quad \text{CGAP}(a, T) = \frac{1}{T} \sum_{t=1}^{T} a_t$$

Mô hình duy trì bộ đệm luồng gồm $b$ khung hình kích hoạt trước đó, giúp giảm đỉnh sử dụng bộ nhớ (Peak Memory) xuống dưới 15MB mà vẫn giữ độ chính xác Top-1 cao.

Khung hình hiện tại x_t -----\
                              +--> [ Causal 3D Conv ] --> Đặc trưng F_t --> [ CGAP ] --> Action Logits
Bộ đệm Stream B (b frames) --/            |
                                          v
                              Cập nhật lại bộ đệm B'

Code Snippet: Xử lý video track và phát hiện sự kiện tại CV Service

import asyncio
from av import VideoFrame
from aiortc import MediaStreamTrack
from ultralytics import YOLO
import torch

class VideoVisionTrack(MediaStreamTrack):
    kind = "video"

    def __init__(self, track, event_queue, item_model_path, hand_model_path, action_model):
        super().__init__()
        self.track = track
        self.event_queue = event_queue
        self.item_detector = YOLO(item_model_path)
        self.hand_detector = YOLO(hand_model_path)
        self.action_detector = action_model # MoViNet-A1-Stream in PyTorch
        self.stream_buffer = None

    async def recv(self):
        frame: VideoFrame = await self.track.recv()
        img = frame.to_ndarray(format="bgr24")

        # 1. Phát hiện bàn tay và sản phẩm bằng YOLOv8n
        hand_results = self.hand_detector(img, verbose=False, conf=0.5)[0]
        item_results = self.item_detector(img, verbose=False, conf=0.5)[0]

        # 2. Xử lý nhận diện hành động theo luồng với MoViNet Causal Stream
        tensor_frame = torch.from_numpy(img).permute(2, 0, 1).unsqueeze(0).unsqueeze(2).float() / 255.0
        with torch.no_grad():
            action_logits, self.stream_buffer = self.action_detector(tensor_frame, self.stream_buffer)
            action_idx = torch.argmax(action_logits, dim=-1).item()
            action_type = "PICK" if action_idx == 1 else ("RETURN" if action_idx == 2 else "NONE")

        # 3. Kết hợp vị trí không gian để xác định sản phẩm tương tác
        if action_type in ["PICK", "RETURN"] and len(hand_results.boxes) > 0 and len(item_results.boxes) > 0:
            target_item_id = self._match_item_in_hand(hand_results.boxes, item_results.boxes)
            if target_item_id is not None:
                event = {
                    "actionType": action_type,
                    "items": [{"productId": target_item_id, "quantityChange": 1 if action_type == "PICK" else -1}]
                }
                self.event_queue.put(event)

        return frame

    def _match_item_in_hand(self, hand_boxes, item_boxes):
        # Tính toán khoảng cách Euclid tâm hoặc IoU giữa tay và vật thể
        # Trả về ID của vật thể gần nhất nằm trong tay người mua sắm
        pass

Code Snippet: Nhận sự kiện Kafka và phát Socket.IO tại Business Service

import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
import { CartService } from './cart.service';
import { CartGateway } from './cart.gateway';
import { CartUpdateDto } from './dto/cart-update.dto';

@Controller()
export class CartKafkaController {
  constructor(
    private readonly cartService: CartService,
    private readonly cartGateway: CartGateway,
  ) {}

  @MessagePattern('cart-updates')
  async handleCartUpdate(@Payload() message: CartUpdateDto): Promise<void> {
    // 1. Cập nhật cơ sở dữ liệu PostgreSQL qua Prisma ORM
    const updatedCart = await this.cartService.updateCart(message);

    // 2. Bắn thông điệp Socket.IO tới toàn bộ Web Frontend client đang kết nối
    this.cartGateway.emitNewCart(updatedCart);
  }
}

Testing và đánh giá thực nghiệm

1. Dữ liệu thực nghiệm

  • Bộ dữ liệu bàn tay: Sử dụng EgoHands Dataset gồm 4.800 ảnh được gán nhãn hộp bao bàn tay người trong các hoạt động tương tác góc nhìn thứ nhất (First-person view).
  • Bộ dữ liệu mặt hàng: Tập dữ liệu tùy chỉnh gồm các mặt hàng bán lẻ phổ biến (nước giải khát đóng chai, đồ hộp, bánh kẹo đóng gói) được chụp dưới nhiều góc độ và điều kiện ánh sáng với hơn 2.500 ảnh.
  • Bộ dữ liệu hành động mua sắm: Các đoạn video ghi nhận hành động Lấy (Pick), Trả (Return) và Duyệt hàng (Idle/Neutral) với tốc độ 30 FPS.

2. Kết quả kiểm thử các mô hình AI độc lập

Mô hình Nhiệm vụ Kích thước đầu vào Tập dữ liệu Precision Recall mAP50 / Top-1 Acc mAP50-95
YOLOv8n-Hand Phát hiện bàn tay $640 \times 640$ EgoHands 92.4% 88.1% 91.8% (mAP50) 68.5%
YOLOv8n-Item Định danh sản phẩm $640 \times 640$ Custom Retail Items 90.6% 86.7% 89.4% (mAP50) 65.2%
MoViNet-A1-Stream Phân loại hành động $50 \text{ frames} \times 172 \times 172$ Custom Shopping Actions 88.9% 87.2% 87.8% (Top-1) N/A
Độ chính xác (Precision) vs. Độ đầy đủ (Recall) trên tập đánh giá:
mAP50 (Hand):  [=========================> ] 91.8%
mAP50 (Item):  [=======================>   ] 89.4%
Top-1 (Action):[======================>    ] 87.8%

3. Kết quả đánh giá hiệu năng toàn hệ thống (End-to-End System Benchmark)

Kịch bản kiểm thử thực tế Số lần thử Số lần thành công Tỷ lệ chính xác Độ trễ trung bình Trạng thái đồng bộ Web
Lấy 1 mặt hàng đơn lẻ 50 47 94.0% 285 ms 100% chính xác
Trả 1 mặt hàng về đúng kệ 50 45 90.0% 310 ms 100% chính xác
Lấy liên tiếp 2 mặt hàng khác nhau 30 26 86.7% 340 ms Không mất mát sự kiện
Cầm sản phẩm xem rồi đặt lại 30 28 93.3% 320 ms Giỏ hàng không đổi
Tổng thể (Overall Benchmark) 160 146 91.25% 313.7 ms Ổn định cao

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

  1. Ứng dụng thành công mô hình MoViNet đệm luồng (Stream Buffer) cho bài toán bán lẻ: Thay vì sử dụng các mạng 3D CNN đồ sộ (như I3D, SlowFast) vốn yêu cầu bộ nhớ GPU lớn và có độ trễ cao, đề tài đã ứng dụng MoViNet-A1 với Causal Convolution. Kỹ thuật này cho phép mô hình suy luận liên tục từng khung hình mà chỉ tiêu tốn dưới 15MB VRAM, đạt tốc độ >30 FPS trên phần cứng thông dụng.
  2. Kiến trúc phân tách Microservices kết hợp Apache Kafka: Phân tách hoàn toàn tác vụ nặng về tính toán (Computer Vision Service - Python) và tác vụ phục vụ giao dịch người dùng (Business Service - NestJS). Việc sử dụng Kafka làm Message Broker giúp hệ thống không bị nghẽn (non-blocking), đảm bảo độ trễ từ lúc camera ghi nhận đến khi hiển thị lên trình duyệt dưới 350ms.
  3. Giải pháp Pure-Vision tối ưu chi phí cho doanh nghiệp vừa và nhỏ (SMEs): Khác với mô hình đắt đỏ của Amazon Go phụ thuộc vào mạng lưới cảm biến trọng lượng và hàng trăm camera dày đặc, kiến trúc đề xuất chứng minh tính khả thi của việc xây dựng cửa hàng tự động hóa chỉ bằng camera giám sát thông thường, mở ra tiềm năng ứng dụng thực tế cao với chi phí đầu tư ban đầu giảm hơn 70%.

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

Kịch bản triển khai thực tế

  • Cửa hàng tiện lợi Grab-and-Go 24/7: Phục vụ tại các tòa nhà văn phòng, ký túc xá đại học, trạm tàu điện ngầm hoặc bệnh viện – nơi nhu cầu mua sắm nhanh các mặt hàng thực phẩm đóng gói, đồ uống không cần nhân viên vận hành.
  • Kiosk tự phục vụ trong khu nghỉ dưỡng/khách sạn: Cung cấp đồ dùng cá nhân, thức ăn nhanh mà không cần quầy thanh toán.
[Camera WebRTC 1080p@30fps] 
[Edge Computing Node: Mini PC / GPU Server (NVIDIA RTX 3060 / Jetson Orin)]
[Cloud / Local Server: NestJS Business API + PostgreSQL]
[Khách hàng: Màn hình hiển thị tại chỗ / Ứng dụng điện thoại]

Yêu cầu phần cứng và hạ tầng triển khai

Thành phần Cấu hình khuyến nghị cho Edge Node (1-2 Camera) Cấu hình triển khai Server (Multi-stores)
CPU Intel Core i7-11700 / AMD Ryzen 7 5800H 16 Cores vCPU (Intel Xeon / AMD EPYC)
GPU NVIDIA RTX 3060 12GB VRAM hoặc RTX 4060 NVIDIA A10G / T4 Tensor Core GPU
RAM 16 GB DDR4/DDR5 32 GB ECC RAM
Camera Camera IP hỗ trợ RTSP/WebRTC 1080p @ 30FPS Đa góc quay băng thông mạng $\ge 100\text{ Mbps}$
Hệ điều hành Ubuntu 22.04 LTS x86_64 Ubuntu Server 22.04 LTS / Docker Container

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

Hạn chế kỹ thuật

  • Góc nhìn camera đơn (Single Viewpoint): Khi người mua sắm xoay lưng hoặc đưa đồ vật ra sau cơ thể, hiện tượng che khuất điểm ảnh (severe occlusion) làm giảm khả năng nhận diện của YOLOv8 và MoViNet.
  • Phạm vi phục vụ một người dùng (Single Shopper): Hiện tại hệ thống chưa tích hợp thuật toán Multi-Object Tracking (MOT) như ByteTrack hoặc DeepSORT để phân biệt đồng thời nhiều người mua sắm đứng sát nhau trên cùng một kệ.
  • Điều kiện ánh sáng: Độ chính xác giảm khi môi trường có độ sáng quá yếu hoặc có phản quang mạnh trên bao bì sản phẩm dạng kính/kim loại.

Hướng phát triển trong tương lai

  1. Tích hợp Đa camera & Tracking đa người dùng: Bổ sung thuật toán Re-Identification (ReID) và ByteTrack để theo dõi xuyên suốt nhiều khách hàng cùng lúc trong không gian lớn với nhiều góc camera giao nhau.
  2. Tổng hợp cảm biến bổ trợ (Sensor Fusion): Kết hợp camera trần với các dải cảm biến cân nặng mini dưới đáy từng kệ hàng để kiểm tra chéo (Cross-validation), loại bỏ hoàn toàn sai số khi nhận diện các sản phẩm có bao bì tương đồng.
  3. Mô hình Open-Vocabulary & Zero-Shot: Tích hợp các mô hình thị giác lớn (VLM/CLIP) để tự động nhận diện sản phẩm mới được bổ sung lên kệ mà không cần trải qua quá trình thu thập và tái huấn luyện dữ liệu từ đầu.

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

  • Sinh viên & Học viên chuyên ngành CNTT/Khoa học dữ liệu: Cung cấp tài liệu tham khảo hoàn chỉnh về quy trình tích hợp các mô hình Deep Learning thị giác máy tính hiện đại (YOLOv8, MoViNet) với kiến trúc phần mềm phân tán (NestJS, Kafka, WebRTC).
  • Kỹ sư phần mềm & AI Engineers: Nắm bắt kiến trúc giải pháp xử lý video thời gian thực hạn chế bộ nhớ (Stream Buffer) và mẫu thiết kế Event-Driven Microservices ứng dụng trong các bài toán thực tiễn.
  • Doanh nghiệp bán lẻ & Startups: Sở hữu thiết kế kiến trúc tham chiếu khả thi, tiết kiệm chi phí để từng bước tự động hóa các điểm bán lẻ, cửa hàng thông minh mà không phụ thuộc vào các giải pháp độc quyền đắt đỏ từ các tập đoàn lớn.
  • Các nhà nghiên cứu ứng dụng: Mở rộng các hướng nghiên cứu về tương tác người - đồ vật (Human-Object Interaction - HOI) trong bài toán mua sắm thực tế.

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

1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu camera hỗ trợ chuẩn WebRTC hoặc RTSP độ phân giải tối thiểu 1080p tốc độ 30 FPS. Phía máy chủ thị giác máy tính cần trang bị tối thiểu 1 GPU NVIDIA có $\ge 6\text{ GB}$ VRAM hỗ trợ CUDA (ví dụ: GTX 1660 Super hoặc RTX 3050 trở lên), RAM hệ thống 16GB và đường truyền mạng nội bộ có độ trễ thấp ($< 20\text{ ms}$).

2. MoViNet-A1-Stream khác biệt như thế nào so với các mô hình 3D CNN truyền thống?

Các mạng 3D CNN truyền thống (như I3D) cần nhận đồng thời cả đoạn clip (ví dụ 16 - 64 frames) rồi mới thực hiện tích chập không gian - thời gian, gây độ trễ lớn và chiếm dụng hàng trăm MB VRAM. MoViNet-A1-Stream áp dụng Causal 3D Convolution và Stream Buffer, cho phép nạp và xử lý trực tiếp từng khung hình đơn lẻ (Frame-by-Frame), giảm đỉnh bộ nhớ xuống dưới 15MB và cho phép phát hiện hành động liên tục với độ trễ suy luận tức thời.

3. Làm thế nào để mở rộng hệ thống cho nhiều khách hàng cùng mua sắm?

Để mở rộng phục vụ nhiều khách hàng, hệ thống cần tích hợp thêm module Multi-Person Tracking (ví dụ: ByteTrack hoặc DeepSORT) kết hợp gán định danh (Tracking ID) cho từng cá nhân khi bước qua cửa vào. Mỗi hành động Lấy/Trả kèm vị trí bàn tay sẽ được ánh xạ với Bounding Box của người thực hiện tương ứng để cập nhật chính xác vào Session giỏ hàng của người đó.

4. Hệ thống có bảo mật thông tin và tính riêng tư của khách hàng không?

Mô hình hoàn toàn tuân thủ bảo vệ quyền riêng tư: Stream video chỉ được xử lý tạm thời trong RAM tại tầng Computer Vision Service để trích xuất tọa độ Bounding Box và sự kiện hành động, tuyệt đối không lưu trữ video khuôn mặt hay hình ảnh thô của khách hàng vào cơ sở dữ liệu dài hạn.

5. Chi phí ước tính và thời gian hoàn vốn (ROI) khi ứng dụng mô hình này?

Chi phí lắp đặt một trạm bán lẻ tự động theo mô hình đề xuất dao động từ 1.500 - 3.000 USD (bao gồm Edge GPU Node và camera), thấp hơn rất nhiều so với mức 50.000 - 100.000 USD của các mô hình đa cảm biến. Với việc cắt giảm 100% chi phí nhân sự trực ca thu ngân và vận hành 24/7, thời gian hoàn vốn ước tính chỉ từ 6 đến 12 tháng tùy thuộc vào lưu lượng khách hàng.


Kết luận

Khóa luận tốt nghiệp "Nghiên cứu các kỹ thuật dựa trên thị giác máy tính và máy học để xây dựng ứng dụng Just Walk Out Shopping" của sinh viên Lê Quang TrungHà Phi Hùng dưới sự hướng dẫn của TS. Nguyễn Duy Khánh tại Trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM đã hiện thực hóa thành công một mô hình cửa hàng không thu ngân hiện đại, toàn diện và có tính ứng dụng cao.

Bằng việc kết hợp tinh tế giữa các công nghệ Deep Learning tiên tiến (YOLOv8n, MoViNet-A1-Stream) và kiến trúc phần mềm hướng sự kiện phân tán (WebRTC, Apache Kafka, NestJS, Next.js, PostgreSQL), đề tài đã chứng minh tính khả thi vượt trội của phương pháp tiếp cận Pure-Vision: đạt độ chính xác thực nghiệm tổng thể trên 91%, độ trễ phản hồi thời gian thực dưới 350ms với chi phí hạ tầng tối ưu. Đây là nền tảng vững chắc và nguồn tài liệu tham khảo giá trị cho các nghiên cứu chuyên sâu cũng như việc thương mại hóa các giải pháp bán lẻ tự động hóa trong tương lai.