Giới thiệu dự án

Thị trường xuất bản số và thương mại điện tử sách (E-book Commerce) đang chứng kiến mức tăng trưởng kép hàng năm (CAGR) đạt 6.4% giai đoạn 2021–2026, với doanh thu toàn cầu dự kiến vượt 18.7 tỷ USD. Tại Việt Nam, xu hướng chuyển đổi từ sách in truyền thống sang các định dạng số hóa tăng mạnh sau đại dịch COVID-19. Tuy nhiên, các nhà xuất bản và đơn vị phát hành trung bình phải xử lý từ hàng trăm đến hàng chục nghìn đầu sách mỗi quý, đối mặt với bài toán tắc nghẽn dữ liệu trong khâu phân loại và gán nhãn thủ công (manual metadata tagging).

                     [Hệ thống AI Phân loại Bìa sách (ResNet-50)]
                          [Gợi ý tự động Top-K Thể loại]
                 [OpenBook Store: Người đọc Tìm kiếm / Mua / Đọc]

Vấn đề thực tiễn (Problem Statement)

Quy trình số hóa sách hiện tại gặp các nút thắt lớn:

  • Tốn thời gian nhập liệu: Việc đọc sơ lược và chọn thủ công 3–5 thể loại phù hợp cho mỗi đầu sách tiêu tốn trung bình 3–7 phút/cuốn.
  • Sai lệch phân loại: Tính chủ quan của nhân sự nhập liệu dẫn đến phân loại thiếu nhất quán, làm giảm 35% hiệu quả của các công cụ tìm kiếm và lọc nâng cao.
  • Rào cản tải lên hàng loạt (Bulk Upload): Các nền tảng thương mại điện tử hiện nay (như Tiki, Shopee) bắt buộc người bán cấu hình từng trường danh mục một cách tuần tự, gây quá tải khi cập nhật danh mục quy mô lớn.

Mục tiêu dự án

  1. Xây dựng nền tảng thương mại điện tử sách điện tử OpenBook hoàn chỉnh với kiến trúc phân quyền 3 cấp độ: Anonymous, Viewer, và Store.
  2. Tích hợp hệ thống thị giác máy tính sử dụng mô hình học sâu (Deep Learning) để tự động phân tích ảnh bìa sách và gán nhãn thể loại đa lớp (Multi-class Genre Classification).
  3. Thiết kế luồng xử lý tải lên hàng loạt (Bulk Ingestion Pipeline) bất đồng bộ, hỗ trợ giải quyết tự động các bản ghi bị lỗi dữ liệu.
  4. Tối ưu hóa hiệu năng backend bằng mô hình xử lý song song đa luồng, giảm tối đa độ trễ hệ thống và mức chiếm dụng bộ nhớ (CPU/RAM).

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

  • Giải pháp: Tích hợp mô hình mạng nơ-ron tích chập ResNet-50 thông qua microservice FastAPI độc lập, giao tiếp với hệ thống lõi backend viết bằng Go (Gin Framework) và frontend Next.js.
  • Chỉ số kỳ vọng: Độ chính xác gợi ý Top-5 đạt trên 85%, giảm hơn 70% thời gian tạo danh mục sách hàng loạt, thời gian phản hồi API dưới 200ms với các tác vụ thông thường.
  • Phạm vi & Giới hạn: Hệ thống tập trung vào trải nghiệm đọc trực tuyến, đánh giá, phân loại bìa sách; không bao gồm cổng thanh toán trực tuyến bên thứ ba (Payment Gateway) và dịch vụ vận chuyển vật lý.

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

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

Hiện nay, các giải pháp phát hành sách trực tuyến trên thị trường có sự phân hóa rõ rệt:

Tiêu chí Tiki / Shopee Waka / Voiz FM Amazon KDP OpenBook (Đề tài)
Mô hình phục vụ Bán lẻ đa ngành (Sách giấy là phụ) Đọc sách/nghe sách thuê bao Tự xuất bản & phân phối toàn cầu Nền tảng chuyên biệt cho E-book
Gán nhãn thể loại Thủ công 100% Biên tập viên nội bộ duyệt Tự chọn từ danh mục cây cố định Tự động hóa qua AI Cover Classification
Nhập liệu hàng loạt Phức tạp qua file Excel mẫu Không hỗ trợ người bán ngoài Hỗ trợ qua API/Dashboard chuyên dụng Upload đa tệp trực quan + Auto-tagging
Trải nghiệm đọc Không có (Giao sách giấy) Có trình đọc chuyên dụng Đọc qua Kindle Reader/Web Tích hợp Web PDF Reader trực tiếp

Ma trận ưu tiên yêu cầu người dùng (MoSCoW)

  • Must have: Đăng ký/đăng nhập (JWT authentication), phân quyền RBAC, xem và đọc trực tuyến PDF, tìm kiếm/lọc sách theo tên/tác giả/thể loại, upload ảnh bìa và trích xuất thể loại tự động.
  • Should have: Đánh giá & bình luận sao (Ratings/Reviews), hệ thống đánh dấu trang (Bookmarks), Dashboard quản trị kho sách cho Store, sửa lỗi metadata hàng loạt.
  • Could have: Upload tệp hàng loạt kéo-thả, lọc nâng cao kết hợp nhiều trường dữ liệu, hiển thị Top-K gợi ý nhãn.
  • Won't have (lần này): Tích hợp cổng thanh toán trực tiếp, quản lý DRM chống sao chép nâng cao.

Thiết kế hệ thống

Technology Stack

Frontend:   Next.js v12.1.0 (React v18), Material UI v5.6, Axios
Backend:    Go v1.17, Gin Framework v1.7.7, GORM / pgx driver
Database:   PostgreSQL v14.2
AI / ML:    Python v3.9, PyTorch v1.11, Keras / TensorFlow v2.8, FastAPI v0.75
Storage:    Cloudinary Media API
DevOps:     Docker v20.10, Docker Compose v2.4

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

-- DDL rút gọn biểu diễn cấu trúc dữ liệu chính
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(100) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    role VARCHAR(20) DEFAULT 'viewer' CHECK (role IN ('anonymous', 'viewer', 'store')),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    author VARCHAR(255) NOT NULL,
    description TEXT,
    publication_year INT,
    thumbnail_url VARCHAR(500) NOT NULL,
    pdf_url VARCHAR(500) NOT NULL,
    store_id INT REFERENCES users(id) ON DELETE CASCADE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE genres (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) UNIQUE NOT NULL
);

CREATE TABLE book_genres (
    book_id INT REFERENCES books(id) ON DELETE CASCADE,
    genre_id INT REFERENCES genres(id) ON DELETE CASCADE,
    PRIMARY KEY (book_id, genre_id)
);

Đặc tả API Endpoints chính

Method Endpoint Quyền hạn Chức năng
POST /api/v1/auth/login Public Đăng nhập hệ thống, cấp Bearer JWT Token
GET /api/v1/books Public Lấy danh mục sách (có hỗ trợ phân trang, lọc, tìm kiếm)
POST /api/v1/books Store Tạo mới 1 đầu sách đơn lẻ
POST /api/v1/books/bulk Store Xử lý tải lên danh sách nhiều sách kèm tự động phân loại
POST /api/v1/classify/predict Internal/Store Gửi URL ảnh bìa, nhận mảng nhãn thể loại dự đoán Top-K

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

Dự án áp dụng mô hình phát triển Agile/Scrum trong chu kỳ 16 tuần:

  • Tuần 1–2: Khảo sát yêu cầu, xây dựng đề cương, thu thập bộ dữ liệu ảnh bìa sách đa thể loại.
  • Tuần 3–6: Phát triển khung giao diện Next.js, xây dựng CRUD backend bằng Go-Gin và thiết kế CSDL PostgreSQL.
  • Tuần 7–10: Huấn luyện, đánh giá mô hình học sâu ResNet-50 trên PyTorch/Keras qua Google Colab; đóng gói service FastAPI.
  • Tuần 11–13: Tích hợp pipeline AI vào hệ thống web, kiểm thử tải và tối ưu hóa xử lý đồng thời (Concurrency).
  • Tuần 14–16: Đánh giá hiệu năng, viết tài liệu kỹ thuật và hoàn thiện báo cáo khóa luận.

Implementation và kết quả

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

1. Pipeline phân loại bìa sách bằng ResNet-50 (Deep Learning)

Mạng ResNet-50 áp dụng cơ chế kết nối tắt (Residual Shortcut Connections) giúp khắc phục triệt để hiện tượng suy giảm đạo hàm (Vanishing Gradient) trong mạng nhiều tầng.

$$\mathcal{F}(x) = \mathcal{H}(x) - x \implies \mathcal{H}(x) = \mathcal{F}(x) + x$$

Vector đặc trưng trích xuất từ lớp pooling cuối cùng được truyền vào Fully Connected Layer với hàm kích hoạt Softmax để tính toán phân phối xác suất trên $C$ thể loại:

$$P(y = i \mid \mathbf{x}) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}}$$

# FastAPI Classification Service (PyTorch Inference)
import torch
import torchvision.transforms as transforms
from PIL import Image
import requests
from io import BytesIO
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI(title="Book Cover Classification Service")

# Chuẩn hóa ảnh đầu vào theo phân phối ImageNet
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

GENRE_CLASSES = ['Art', 'Biographies', 'Business', 'Comics', 'Computers', 'History', 'Mystery', 'Sci-Fi']

model = torch.load("models/resnet50_book_genre.pth", map_location=torch.device('cpu'))
model.eval()

class ImageRequest(BaseModel):
    image_url: str
    top_k: int = 3

@app.post("/predict")
async def predict_genre(payload: ImageRequest):
    try:
        response = requests.get(payload.image_url, timeout=5)
        image = Image.open(BytesIO(response.content)).convert('RGB')
        input_tensor = transform(image).unsqueeze(0)
        
        with torch.no_grad():
            outputs = model(input_tensor)
            probabilities = torch.nn.functional.softmax(outputs[0], dim=0)
            top_probs, top_indices = torch.topk(probabilities, payload.top_k)
            
        results = [
            {"genre": GENRE_CLASSES[idx], "confidence": float(prob)}
            for prob, idx in zip(top_probs, top_indices)
        ]
        return {"predictions": results}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

2. Xử lý tải lên đồng thời trong Go Backend (Concurrency Pipeline)

// Go-Gin Concurrent Bulk Book Processor using Goroutines and Channels
package services

import (
	"sync"
	"openbook/models"
)

type BookResult struct {
	Book models.Book
	Err  error
}

func ProcessBulkBooksConcurrent(booksInput []models.BookCreateDTO, storeID uint) ([]models.Book, []models.BookErrorDTO) {
	var wg sync.WaitGroup
	resultChan := make(chan BookResult, len(booksInput))
	
	// Khởi tạo Goroutines xử lý đồng thời danh sách sách
	for _, item := range booksInput {
		wg.Add(1)
		go func(dto models.BookCreateDTO) {
			defer wg.Done()
			
			// 1. Gọi service AI lấy nhãn thể loại nếu chưa được gán
			predictedGenres, err := ClassifyCover(dto.ThumbnailURL)
			if err != nil {
				resultChan <- BookResult{Err: err}
				return
			}
			
			// 2. Lưu sách và quan hệ thể loại vào CSDL
			createdBook, dbErr := models.SaveBookWithGenres(dto, predictedGenres, storeID)
			resultChan <- BookResult{Book: createdBook, Err: dbErr}
		}(item)
	}

	wg.Wait()
	close(resultChan)

	var successBooks []models.Book
	var failedBooks []models.BookErrorDTO

	for res := range resultChan {
		if res.Err != nil {
			failedBooks = append(failedBooks, models.BookErrorDTO{Error: res.Err.Error()})
		} else {
			successBooks = append(successBooks, res.Book)
		}
	}
	return successBooks, failedBooks
}

Thử nghiệm và đánh giá hiệu năng

1. Đánh giá mô hình học sâu (Deep Learning Model Metrics)

Framework / Mô hình Số thể loại Top-1 Accuracy Top-5 Accuracy Mean Average Precision (mAP)
Keras (ResNet-50) 10 thể loại 52.4% 81.6% 0.542
Keras (ResNet-50) 8 thể loại 57.8% 86.2% 0.598
PyTorch (ResNet-50) 8 thể loại 61.2% 89.5% 0.634

Mô hình triển khai trên PyTorch với 8 nhãn thể loại chuẩn hóa cho kết quả tối ưu nhất, đạt độ chính xác Top-5 xấp xỉ 90%, đáp ứng tốt tiêu chí gợi ý tự động cho người quản trị cửa hàng.

2. Đánh giá hiệu năng xử lý hệ thống (Batch Ingestion Benchmark)

Thử nghiệm tải lên tập dữ liệu 500 E-books trong hai kịch bản:

Kịch bản thử nghiệm Thời gian thực thi Tải CPU trung bình Tiêu thụ RAM trung bình Tỷ lệ thành công
Phase 1: Tuần tự (Sequential) 184.6 giây 18% 320 MB 100%
Phase 1: Đồng thời chưa tối ưu 42.1 giây 88% (Spike) 1.4 GB 97.4% (Có lỗi timeout)
Phase 2: Đồng thời có Worker Pool (Tối ưu) 24.3 giây 46% (Ổn định) 580 MB 100%
Thời gian thực thi 500 E-books (Giây):
Phase 1 Tuần tự:   [==================================================] 184.6s
Phase 1 Đồng thời: [============] 42.1s
Phase 2 Tối ưu:    [======] 24.3s (Nhanh hơn 7.6 lần so với tuần tự)

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

  1. Ứng dụng AI phân loại bìa sách vào E-Commerce: Khắc phục hạn chế của các giải pháp truyền thống vốn phụ thuộc hoàn toàn vào chuỗi văn bản (metadata text). Việc nhận diện trực quan từ ảnh bìa khai thác đặc trưng đồ họa, màu sắc và typography, giúp phân loại tự động với tốc độ dưới 80ms/ảnh.
  2. Kiến trúc phân tán Microservices hiệu năng cao: Kết hợp sự linh hoạt của Python trong tính toán khoa học dữ liệu và sức mạnh xử lý đa luồng tốn ít tài nguyên của Go-Gin, giúp hệ thống chịu tải cao mà không cần hạ tầng máy chủ đắt tiền.
  3. Cải tiến quy trình số hóa danh mục: Giảm thiểu 75–85% thời gian tạo danh mục sách của Store, giải quyết hoàn toàn bài toán quá tải khi nhập liệu hàng loạt (bulk cataloging).
Đặc tính kỹ thuật Hệ thống truyền thống Nền tảng OpenBook Mức độ cải thiện
Thời gian gán nhãn 100 đầu sách ~350 phút (Thủ công) ~1.2 phút (AI Batch Processing) Giảm 99.6% thời gian
Cơ chế xử lý nhập liệu Đơn luồng (Single-thread) Đa luồng đồng thời (Goroutines Worker Pool) Thông lượng tăng 7.6x
Giao diện quản lý lỗi Báo lỗi toàn bộ tệp (Fail all) Modal cô lập bản ghi lỗi (Partial Success) Tối ưu hóa UX vận hành

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

Tình huống ứng dụng thực tế (Use Cases)

  • Nhà xuất bản số: Triển khai kho sách điện tử trực tuyến, tự động hóa quy trình phân loại hàng nghìn tài liệu PDF và ấn phẩm mỗi ngày.
  • Thư viện trường đại học: Quản lý kho giáo trình điện tử, số hóa đồ án, nghiên cứu khoa học với khả năng gán danh mục tự động.
  • Tác giả tự do (Self-publishing): Tải lên và phân phối sách cá nhân nhanh chóng chỉ với việc cung cấp tệp PDF và ảnh bìa.

Hướng dẫn triển khai hạ tầng với Docker Compose

version: '3.8'

services:
  database:
    image: postgres:14-alpine
    container_name: openbook_db
    environment:
      POSTGRES_USER: openbook_user
      POSTGRES_PASSWORD: secure_password
      POSTGRES_DB: openbook_db
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  classify_service:
    build: ./classifier_backend
    container_name: openbook_classifier
    ports:
      - "8001:8001"
    environment:
      - MODEL_PATH=/app/models/resnet50_book_genre.pth

  api_backend:
    build: ./go_backend
    container_name: openbook_api
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=database
      - DB_PORT=5432
      - CLASSIFIER_URL=http://classify_service:8001/predict
    depends_on:
      - database
      - classify_service

volumes:
  pgdata:

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

Hạn chế kỹ thuật hiện tại

  • Độ nhập nhằng của bìa sách tối giản (Minimalist Covers): Các cuốn sách có bìa trừu tượng hoặc chỉ có chữ đơn sắc đôi khi làm giảm độ chính xác của mạng ResNet-50 do thiếu đặc trưng thị giác rõ rệt.
  • Giới hạn số lớp thể loại: Mô hình hiện được huấn luyện tối ưu trên 8–10 nhóm thể loại chính; chưa bao phủ các thể loại chuyên sâu hoặc liên ngành (Interdisciplinary).

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

  • Mô hình đa phương thức (Multimodal Fusion): Kết hợp trích xuất văn bản từ bìa sách qua OCR (Tesseract / EasyOCR) cùng tóm tắt nội dung bằng mô hình ngôn ngữ (BERT / RoBERTa) để nâng cao độ chính xác Top-1 lên trên 85%.
  • Hoàn thiện giải pháp thương mại: Bổ sung cổng thanh toán VNPay/Momo, tích hợp mã hóa DRM động cho các tệp PDF chống sao chép trái phép.

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

Nhóm đối tượng Lợi ích cụ thể
Sinh viên & Độc giả Trải nghiệm giao diện đọc sách tối ưu, tìm kiếm sách chuẩn xác theo danh mục phân loại chi tiết.
Nhà phát triển (Developers) Tài liệu tham khảo toàn diện về tích hợp mô hình AI Python vào kiến trúc ứng dụng Web hiệu năng cao bằng Go và Next.js.
Doanh nghiệp & Nhà sách Cắt giảm đáng kể chi phí nhân sự nhập liệu danh mục, đẩy nhanh thời gian đưa sản phẩm số ra thị trường (Time-to-market).
Nhà nghiên cứu AI Thực nghiệm so sánh thực tế giữa Keras và PyTorch trên bài toán phân loại dữ liệu thị giác bìa sách thực tế.

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

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

Máy chủ triển khai Docker tiêu chuẩn chỉ cần 2 vCPU, 4GB RAM và 20GB SSD để vận hành toàn bộ 3 dịch vụ (Next.js, Go-Gin, FastAPI CPU-inference, PostgreSQL). Không bắt buộc trang bị GPU chuyên dụng trong môi trường sản xuất quy mô vừa.

2. Khi ảnh bìa có thiết kế quá trừu tượng, hệ thống xử lý như thế nào?

Mô hình trả về danh sách xác suất Top-K (mặc định Top-3 hoặc Top-5). Giao diện Store sẽ hiển thị các thể loại này dưới dạng gợi ý lựa chọn (Chips/Dropdown) để người bán xác nhận hoặc điều chỉnh nhanh chỉ với 1 click, thay vì phải gõ lại từ đầu.

3. Hệ thống có khả năng mở rộng (Scalability) ra sao khi lượng truy cập tăng vọt?

Nhờ thiết kế Stateless của Backend Go-Gin và AI Microservice, hệ thống có thể dễ dàng mở rộng theo chiều ngang (Horizontal Scaling) thông qua Kubernetes hoặc Docker Swarm kết hợp Nginx/Traefik Reverse Proxy để cân bằng tải.

4. Chi phí lưu trữ hình ảnh và PDF được quản lý như thế nào?

Toàn bộ tài nguyên đa phương tiện (Media Assets) được phân tải sang Cloudinary CDN, giúp máy chủ ứng dụng chính giải phóng băng thông truyền tải và tận dụng khả năng tự động tối ưu định dạng hình ảnh (WebP/AVIF).

5. Dự án xử lý các bản ghi lỗi khi tải lên hàng loạt như thế nào?

Hệ thống sử dụng cơ chế xử lý lỗi cục bộ (Partial Failure Isolation). Các cuốn sách hợp lệ vẫn được thêm thành công vào cơ sở dữ liệu, trong khi các bản ghi bị lỗi được trả về giao diện Modal riêng biệt để người quản trị chỉnh sửa trực tiếp mà không cần tải lại từ đầu.


Kết luận

Đồ án khóa luận tốt nghiệp "Xây dựng nền tảng thương mại sách điện tử tích hợp hệ thống phân loại thông qua bìa sách" của nhóm tác giả tại Trường Đại học Công nghệ Thông tin - ĐHQG TP.HCM đã giải quyết thành công bài toán thực tiễn trong quy trình số hóa và phân phối sách điện tử.

Thông qua việc kết hợp mạng học sâu ResNet-50, kiến trúc backend đa luồng Go-Gin, và giao diện Next.js SSR, hệ thống OpenBook chứng minh hiệu quả vượt trội trong việc tự động hóa khâu gán nhãn thể loại, nâng cao hiệu năng xử lý danh mục lên gấp 7.6 lần so với phương pháp truyền thống. Đây là tiền đề công nghệ vững chắc, mở ra hướng ứng dụng thị giác máy tính vào các bài toán tối ưu hóa thương mại điện tử hiện đại.