1. Tại sao bạn cần tự tạo một bộ dữ liệu 6D Pose?
Nếu bạn đang nghiên cứu hoặc phát triển các ứng dụng liên quan đến robot cầm nắm, thực tế tăng cường (AR) hoặc bất kỳ dự án nào yêu cầu máy móc "hiểu" vị trí và hướng của vật thể trong không gian 3 chiều, thuật ngữ "ước lượng 6D Pose" chắc chắn không còn xa lạ. Nói đơn giản, 6D Pose mô tả vị trí của một vật thể trong không gian 3 chiều (X, Y, Z) và tư thế xoay (quanh trục X, Y, Z), tổng cộng có 6 bậc tự do. Để huấn luyện mô hình AI nhận diện chính xác, bạn cần cung cấp cho nó một lượng lớn dữ liệu đã được gắn nhãn chuẩn - tức là những bộ dữ liệu chứa thông tin chính xác về 6D Pose của các vật thể.
Bộ dữ liệu Linemod là một tiêu chuẩn phổ biến trong lĩnh vực này. Tuy nhiên, bộ dữ liệu Linemod gốc chỉ bao gồm một số lượng giới hạn các vật thể, chẳng hạn như con vịt hoặc con mèo kinh điển. Nếu dự án của bạn liên quan đến việc dạy robot cầm nắm điện thoại di động hoặc nhận diện đồ chơi cụ thể trong AR, rõ ràng bạn không thể sử dụng mô hình vịt để huấn luyện. Do đó, việc tự tạo ra một bộ dữ liệu theo định dạng Linemod cho vật thể riêng của bạn trở thành bước then chốt để đưa dự án từ lý thuyết vào thực tế.
Quá trình này khá phức tạp, bao gồm thu thập dữ liệu RGB-D, tái tạo đám mây điểm 3D và sinh các tệp tin gắn nhãn pose. Dù trên mạng có nhiều tài liệu tham khảo rải rác, nhưng chúng thường thiếu sót hoặc không đủ chi tiết ở các giai đoạn quan trọng, khiến người mới gặp khó khăn. Trong bài viết này, tôi sẽ hướng dẫn toàn bộ quy trình xây dựng bộ dữ liệu Linemod bằng công cụ ObjectDatasetTools, đồng thời giải thích các nguyên lý cơ bản và các lỗi thường gặp mà tôi đã trải qua. Mục tiêu là giúp bạn có thể sử dụng một camera độ sâu (như Intel Realsense hay Kinect) để tạo ra một bộ dữ liệu chuẩn và sẵn sàng cho việc huấn luyện các mô hình ước lượng 6D Pose hiện đại như PVNet hay DenseFusion.
2. Chuẩn bị: Phần cứng, phần mềm và môi trường
Trước khi bắt đầu, bạn cần đảm bảo mọi thứ đã sẵn sàng.
2.1 Lựa chọn thiết bị phần cứng
Bạn cần một camera độ sâu để bắt đầu quá trình thu thập dữ liệu. Một số lựa chọn phổ biến hiện nay bao gồm:
- Intel Realsense D415/D435: Đây là lựa chọn hàng đầu của tôi vì giá cả hợp lý, hỗ trợ mã nguồn mở tốt, SDK trưởng thành và độ chính xác ổn định. D415 phù hợp hơn cho khoảng cách gần, trong khi D435 có góc nhìn rộng hơn.
- Microsoft Azure Kinect: Hiệu năng cao với chất lượng hình ảnh độ sâu tốt, nhưng giá thành cũng cao hơn và driver phức tạp hơn.
- Orbbec Astra: Tùy chọn tiết kiệm nhưng có thể yêu cầu nhiều công sức hơn trong việc hiệu chỉnh và cài đặt driver.
Dù chọn loại nào, điều quan trọng là camera phải có khả năng xuất ra hình ảnh màu RGB và độ sâu được đồng bộ hóa cùng với ma trận nội tại của camera. Ma trận này thường là một ma trận 3x3 chứa thông tin về tiêu cự (fx, fy) và tọa độ tâm ảnh (cx, cy), đây là nền tảng cho mọi phép tính 3D tiếp theo. Hầu hết các SDK của camera đều cung cấp phương pháp để lấy ma trận này.
2.2 Cài đặt môi trường phần mềm
Công cụ chính của chúng ta là ObjectDatasetTools, một gói mã nguồn mở chuyên dụng để tạo bộ dữ liệu vật thể. Nó bao gồm các chức năng phức tạp như tái tạo 3D đa góc nhìn và tính toán pose, giúp đơn giản hóa công việc của bạn.
Quá trình cài đặt rất đơn giản nhưng có một số phụ thuộc cần lưu ý. Tôi khuyên bạn nên sử dụng hệ điều hành Ubuntu (phiên bản 18.04 hoặc 20.04 đều ổn định), vì nhiều thư viện thị giác máy tính hoạt động tốt nhất trên Linux.
Đầu tiên, mở terminal và thực hiện các lệnh sau để clone kho và cài đặt phụ thuộc:
# 1. Clone kho ObjectDatasetTools
git clone https://github.com/F2Wang/ObjectDatasetTools.git
cd ObjectDatasetTools
# 2. Cài đặt các phụ thuộc hệ thống
sudo apt-get update
sudo apt-get install -y \
python3-pip \
libgl1-mesa-glx \
libglib2.0-0 \
libsm6 \
libxrender1 \
libxext6
# 3. Cài đặt các phụ thuộc Python
pip3 install -r requirements.txt
Một lưu ý nhỏ: File requirements.txt gốc có thể thiếu một số gói. Theo kinh nghiệm của tôi, bạn cần cài thêm open3d (để xử lý đám mây điểm) và pyyaml (để đọc/ghi file YAML). Vì vậy, hãy chạy:
pip3 install open3d pyyaml
Sau khi cài đặt xong, hãy kiểm tra bằng cách chạy một script mẫu của công cụ, ví dụ python3 register_scene.py --help. Nếu không có lỗi, nghĩa là môi trường đã sẵn sàng.
2.3 Quy hoạch cấu trúc thư mục bộ dữ liệu
Định dạng Linemod yêu cầu tuân theo một quy tắc nghiêm ngặt về tên thư mục và tệp tin. Việc lên kế hoạch trước sẽ giúp tránh nhiều lỗi đường dẫn sau này. Trong thư mục ObjectDatasetTools, tạo một cấu trúc thư mục chuẩn cho vật thể bạn muốn làm bộ dữ liệu (ví dụ một chiếc cốc cafe, đặt tên là my_cup).
Bạn có thể dùng script sau để tạo nhanh:
#!/bin/bash
# create_dataset_structure.sh
OBJECT_NAME="my_cup"
mkdir -p LINEMOD/$OBJECT_NAME/{JPEGImages,depth,masks,labels}
touch LINEMOD/$OBJECT_NAME/intrinsics.json
echo "Cấu trúc thư mục đã được tạo tại LINEMOD/$OBJECT_NAME"
Kết quả sẽ như sau:
ObjectDatasetTools/
├── LINEMOD/
│ └── my_cup/
│ ├── JPEGImages/ # Lưu trữ tất cả ảnh màu RGB (.jpg)
│ ├── depth/ # Lưu trữ tất cả ảnh độ sâu (.png, 16-bit)
│ ├── masks/ # (Tạo bởi công cụ) Mặt nạ đối tượng
│ ├── labels/ # (Tạo bởi công cụ) Tập tin nhãn
│ └── intrinsics.json # Tập tin ma trận nội tại camera
Cấu trúc này sẽ giúp...