Trong các bài toán thực tế, dữ liệu đóng vai trò vô cùng quan trọng trong việc xây dựng các hệ thống AI có độ chính xác cao và khả năng áp dụng thực tiễn. Nhận thức được điều này, nhiều công ty và tổ chức đã chuyển hướng phát triển AI theo hướng data-centric AI (AI tập trung vào dữ liệu), trong đó dữ liệu được coi là trung tâm và trọng tâm của quá trình xây dựng mô hình (xem thêm tại: Data Centric AI - Landing AI). Trong thử thách AI tập trung vào dữ liệu, các đội chơi sẽ thể hiện khả năng trong việc xây dựng một bộ dữ liệu đủ tốt, đa dạng và đại diện để huấn luyện mô hình AI có độ chính xác cao cho bài toán phát hiện biển báo.
Data-centric AI vs. model-centric AI - Hình ảnh từ towardsdatascience.
Mã nguồn và cách đánh giá
Mã nguồn và các siêu tham số của mô hình sẽ được cung cấp sẵn và cố định. Điều này đảm bảo các đội chơi có cùng một công cụ để huấn luyện và đánh giá mô hình. Các đội chơi sẽ phải tập trung vào việc xây dựng một bộ dữ liệu đủ tốt để huấn luyện mô hình AI có độ chính xác tốt nhất, với phần cứng hạn chế (số lượng iterations được hạn chế). Độ chính xác của mô hình AI sẽ được đánh giá trên tập dữ liệu bí mật (private test) mà các đội chơi không được tiếp xúc trước đó.
Data-centric AI đặt dữ liệu làm trọng tâm bởi vì một mô hình AI chỉ có thể hiểu và học từ những gì nó đã thấy. Để có một hệ thống AI chính xác, chúng ta cần xây dựng một tập dữ liệu phát hiện biển báo đa dạng, đại diện cho các tình huống thực tế và có khả năng tổng quát hóa. Các đội chơi sẽ phải đối mặt với các thách thức như thu thập dữ liệu, tiền xử lý và gán nhãn để tạo ra một tập dữ liệu chất lượng cao.
Các đội chơi có thể sử dụng môi trường local, Google Colab, hoặc Kaggle Notebook để thử nghiệm và nộp kết quả. Tuy nhiên, các đội chơi cần đảm bảo môi trường thử nghiệm có đủ các thư viện và phiên bản như sau:
- Python 3 (khuyến nghị Python 3.9).
- PyTorch 2.0.1.
- Các đội chơi sử dụng Windows cần tải và sử dụng Git Bash.
Ở môi trường local, các đội chơi sử dụng Anaconda/Miniconda để thiết lập môi trường. Sau khi cài Conda, để tạo môi trường thử nghiệm với tên tfs
, các đội chơi chạy lệnh sau:
conda create -n tfs python=3.9 -y
Sau khi tạo môi trường, các đội chơi cần kích hoạt môi trường tfs
bằng lệnh:
conda activate tfs
Clone mã nguồn và cài đặt các gói cần thiết:
git clone https://github.com/makerviet/tfs-data-centric
cd tfs-data-centric
conda activate tfs
pip install torch==2.0.1
pip install -e .
Mã nguồn huấn luyện được phát triển từ mã nguồn của YOLOX, với mô hình YOLOX Nano. Các đội chơi chỉ sử dụng mã nguồn có sẵn, không tinh chỉnh kiến trúc mô hình, các siêu tham số của mô hình. Các đội chơi trước khi vào vòng cuối sẽ nộp lại toàn bộ dữ liệu và kết quả cuối cùng sẽ được huấn luyện và xếp hạng trên toàn bộ dữ liệu, theo mã nguồn và các siêu tham số đã được cung cấp từ trước.
Để tải về dữ liệu mẫu, các đội chơi chạy lệnh sau:
bash tools/download_data.sh
Hoặc tải về dữ liệu mẫu tại đây vàm giải nén vào thư mục datasets/vtfs/COCO
. Sau khi chạy lệnh trên, hoặc giải nén thủ công, cấu trúc dữ liệu sẽ như sau:
+ datasets
+ vtfs
+ COCO
+ annotations
- train.json
- val.json
+ images
- train
- 000001.jpg
- ...
- val
- 000001.jpg
- ...
+ docs
+ exps
...
Tập dữ liệu mẫu là dữ liệu phát hiện biển báo cho xe tự hành mô hình, gồm 11095 ảnh đóng góp bởi 2 nhóm Goodgame và ICT, gồm 6 lớp dữ liệu biển: stop
, left
, right
, straight
, no_left
, no_right
. Xem thêm tại đây.
Tập dữ liệu đánh giá (private test) để xếp hạng các đội chơi sẽ bao gồm các dữ liệu biển báo trên đường, trong các điều kiện thời tiết khác nhau, bị che khuất, bị mờ. Tập dữ liệu đánh giá sẽ được công bố sau khi kết thúc thử thách.
Xoá kết quả huấn luyện cũ (nếu có):
rm -rf YOLOX_outputs/tfs_nano
Các bạn cũng có thể di chuyển kết quả huấn luyện cũ vào một thư mục khác để lưu trữ, ví dụ:
mv YOLOX_outputs/tfs_nano YOLOX_outputs/tfs_nano_20230716
Để huấn luyện mô hình, các đội chơi chạy lệnh sau:
YOLOX_DATADIR=datasets/vtfs python3 tools/train.py
Thay datasets/vtfs
bằng đường dẫn tới thư mục chứa dữ liệu của đội chơi.
Để đánh giá mô hình, các đội chơi chạy lệnh sau:
YOLOX_WEIGHTS=YOLOX_outputs/tfs_nano/best_ckpt.pth YOLOX_DATADIR=datasets/vtfs python3 tools/eval.py --output_result="result.json"
Kết quả đánh giá trên môi trường local, tập validation (val.json
) sẽ được in ra như sau:
...
Final mAP (Average Precision (AP) @[ IoU=0.50:0.95 ]): 42.80084 %
- Kết quả đánh giá sẽ dựa trên
Final mAP (Average Precision (AP) @[ IoU=0.50:0.95 ])
, trong TH này là42.80084
(%). - Kết quả đánh giá được ghi ra tệp
result.json
trong thư mục hiện tại.
Sau khi hoàn thành bước đánh giá, các bạn đóng gói mô hình hiện tại và gửi lên hệ thống với lệnh:
python tools/create_submission.py --exp_dir="YOLOX_outputs/tfs_nano" --output="submissions/submission_01.zip"
Gửi mô hình lên hệ thống bằng cách tải lên tệp submissions/submission_01.zip
. Sau khi tải lên, các đội chơi sẽ nhận được kết quả đánh giá trên tập dữ liệu bí mật (private test) và xếp hạng trên bảng xếp hạng.
Việc thu thập dữ liệu biển báo có thể được thực hiện từ nhiều nguồn:
- Các bộ dữ liệu có sẵn.
- Hình ảnh từ internet.
- Ảnh chụp thực tế.
- Ảnh chụp từ các xe mô hình.
- Ảnh từ các giả lập.
Các đội chơi có thể sử dụng các kĩ thuật xử lý ảnh để tăng cường dữ liệu, tham khảo thêm tại đây. Việc thu thập dữ liệu nên đảm bảo:
- Các dữ liệu thu thập được đủ đa dạng, đại diện cho các tình huống thực tế.
- Cân bằng số lượng biển báo trong các lớp dữ liệu. Điều này giúp đảm bảo độ chính xác của mô hình.
Chú ý: Số lượng dữ liệu trong toàn bộ tập dữ liệu không vượt quá 30.000 ảnh.
Việc gán nhãn có thể sử dụng bất cứ công cụ nào. Chúng tôi khuyến nghị một số công cụ sau:
- AnyLabeling: Gán nhãn trực tiếp trên giao diện Desktop, hỗ trợ gán nhãn tự động với Segment Anything Model. Sau khi gán nhãn dữ liệu, sử dụng labelme2coco để chuyển đổi sang định dạng COCO.
- Labelme: Gán nhãn trực tiếp trên giao diện Desktop, sau đó sử dụng labelme2coco để chuyển đổi sang định dạng COCO.
- CVAT, Label Studio: Công cụ gán nhãn trên giao diện web, hỗ trợ xuât sang định dạng COCO.
Lưu ý: Thứ tự các category trong định dạng COCO như sau:
"categories": [
{
"id": 1,
"name": "stop",
"supercategory": "trafficsign"
},
{
"id": 2,
"name": "left",
"supercategory": "trafficsign"
},
{
"id": 3,
"name": "right",
"supercategory": "trafficsign"
},
{
"id": 4,
"name": "straight",
"supercategory": "trafficsign"
},
{
"id": 5,
"name": "no_left",
"supercategory": "trafficsign"
},
{
"id": 6,
"name": "no_right",
"supercategory": "trafficsign"
},
{
"id": 7,
"name": "speed_limit_50",
"supercategory": "trafficsign"
},
{
"id": 8,
"name": "no_parking_or_waiting",
"supercategory": "trafficsign"
}
]
Một số team có thể gặp khó khăn trong việc sắp xếp lại thứ tự các category trong định dạng COCO. Các bạn có thể tham khảo script convert_labelme_tfs.py
để chuyển đổi đúng thứ tự khi label với AnyLabeling hoặc Labelme:
pip install sahi tqdm
python tools/convert_labelme_tfs.py <folder ảnh labelme> <file annotation đầu ra COCO>
Ví dụ:
python tools/convert_labelme_tfs.py ./labeled_images ./annotations.json
Các đội chơi có thể sử dụng các công cụ khác, tuy nhiên cần đảm bảo định dạng đầu ra là định dạng COCO, hoặc có thể chuyển đổi sang COCO để huấn luyện mô hình.
Sau khi gán nhãn dữ liệu, các đội chơi có thể chia dữ liệu thành 2 tập nhỏ:
- Tập huấn luyện (train): Tập dữ liệu được sử dụng để huấn luyện mô hình. Tập dữ liệu này có thể chiếm khoảng 80% tổng số dữ liệu.
- Tập đánh giá (val): Tập dữ liệu được sử dụng để đánh giá mô hình. Tập dữ liệu này có thể chiếm khoảng 20% tổng số dữ liệu.
Các bạn dựa vào notebook sau để huấn luyện trên Colab hoặc Kaggle: