Hệ thống submission nơi thực hành các bài toán AI

Tiêu chí của CLB AI đó là AI THỰC CHIẾNHỌC AI THÔNG QUA XÂY DỰNG AI do đó việc thực hành trên các bài toán – dữ liệu thực tế rất được CLB quan tâm. Hệ thống submission đóng vai trò là nơi các các bạn quan tâm có thể thực hành giải quyết các bài toán thực tế. Trong bài viết này chúng ta sẽ cùng tìm hiểu cách sử dụng trang web nộp bài, các quy tắc nộp bài trên hệ thống submission của CLB AI, khoa Khoa học Máy tính, UIT.

Truy cập hệ thống nộp bài thông qua liên kết : http://submission.aiclub.cs.uit.edu.vn.

Hệ thống nộp bài và chấm kết quả của CLB AI, khoa Khoa học Máy tính, UIT

Nội dung bài viết

  1. Hệ thống nộp bài.
  2. Lợi ích của hệ thống nộp bài.
  3. Hướng dẫn đăng nhập hệ thống nộp bài.
  4. Hướng dẫn tham gia bài toán Nhận diện chữ số trên hệ thống.
  5. Kết luận.

1. Hệ thống nộp bài


Chúng ta phải luyện tập sau hằng giờ đối với một khái niệm, phương pháp, kĩ thuật sau khi học mới có thể giúp chúng ta ghi nhớ và thông thạo nó. Việc đó có thể hiện qua việc chúng ta đọc đi đọc lại một bài thơ làm đi làm lại một dạng bài toán. Việc luyện tập đã khó khăn nhưng còn một việc quan trọng hơn nữa, đó là kiểm tra kiểm tra trình độ của bản thân sau khi luyện tập. Trong lập trình, chúng ta có các bài đơn giản, nhập môn thì không cần phải kiểm tra sát sao trình độ luyện tập sau một thời gian ôn tập nhưng đối với các bạn tham gia lập trình thi đấu thì các trang web giúp cho việc submit code và chấm điểm kết quả thực thi của chương trình chúng ta nộp lên là rất quan trọng vì nhờ vào kết quả chấm điểm mà các bạn có thể biết được bản thân mạnh ở điểm nào và còn chưa tốt ở điểm nào để có thể phát huy và rèn luyện bổ sung.

Hackerank, Codeforce, LeetCode là các trang web tiêu biểu cho việc luyện tập lập trình thi đấu. Trở lại vấn đề, vậy thì làm sao có thể đánh giá được độ chính xác của bài thi của các bạn tham gia. Câu trả lời đó là chúng ta cần một hệ thống cho phép chúng ta submit kết quả chúng ta làm ra được và nhận lại được kết quả đánh giá trả về. Từ điểm số và thứ hạng đạt được, chúng ta có thể đặt câu hỏi tại sao chúng ta đạt được kết quả đó, kết quả đó có thể cải tiến nữa hay không, làm thế nào giữ lại các điều tốt trong mô hình của chúng ta và cải tiến những đoạn đều chưa tốt.

Hình 01. Các trang web rèn luyện kĩ năng lập trình, kĩ năng thuật toán

2. Lợi ích của hệ thống


Về tổng quan, hệ thống sử dụng kiến trúc Client – Server trong quá trình nộp bài thi của các cá nhân và các đội thi. Dưới đây là một số lợi ích cơ bản của hệ thống submission trong quá trình luyện tập và tham gia cuộc thi của CLB tổ chức.

2.1 Sự đa dạng về các bài toán trong lĩnh vực CV, NLP

Không chỉ là nơi thi đấu giữa các đội khi tham gia cuộc thi do CLB AI tổ chức mà còn là nơi các bạn có thể rèn luyện tư duy, kĩ năng lập trình, kĩ năng giải quyết các bài toán học máy. Hiện tại, hệ thống đang có một số bài toán được mở ra để các bạn có thể luyện tập như sau:

  • Nhận dạng chữ số viết tay(Digit Recognizer)
  • Phát hiện hạt điều(Cashew Detection)
  • Phát hiện đường lưỡi bò(Nine-Dash Line Detection)
  • Nhận diện người nổi tiếng(Recognizing famous people)

CLB đang xây dựng các bộ dữ liệu phục vụ cho các bài toán trong các lĩnh vực thị giác máy (computer vision) và xử lý ngôn ngữ tự nhiên (natural language processing).

Mỗi bài toán được liệt kê trong diễn đàn được trình bày bằng cách giới thiệu bài toán (Problem description), cách đánh giá, yêu cầu kết quả submit cho bài toán (Evaluation), quy tắc khi tham gia cuộc thi(Rules), mô tả dữ liệu cho bài toán (Data Description), hướng dẫn nộp bài (Submission), bảng xếp hạng kết quả các đội thi (Leaderboard).

Hình 02. Các lợi ích của hệ thống submission hỗ trợ

2.2 Mô tả bài toán

Tất cả thông tin tổng quan về cuộc thi, bài toán, các kĩ năng đạt được trong và sau khi giải quyết bài toán sẽ được trình bày trong phần này. Ngoài ra, một số thông tin tham khảo giúp các bạn có thêm nguồn thông tin hữu ích cho cuộc thi sẽ được đề cập trong mục tham khảo.

Hình 03. Bài toán nhận diện chữ số – Mô tả bài toán

2.3 Mô tả cách đánh giá

Mô tả mục tiêu của kết quả submission, độ đo được dùng trong bài toán, quy định cấu trúc file nộp lên hệ thống.

Hình 04. Bài toán nhận diện chữ số – Mô tả đánh giá bài toán

2.4 Mô tả luật thi

Mô tả các quy tắc khi tham gia cuộc thi bao gồm các thông tin về hình thức thi (cá nhân, nhóm), số lượng submissions, hạn chót submission và một số điều lưu ý khi tham gia cuộc thi.

2.5 Mô tả dữ liệu bài toán

Phần này mô tả dữ liệu cho bài toán gồm các thông tin cần thiết như loại dữ liệu (văn bản, hình ảnh, âm thanh), các thông tin thống kê dữ liệu huấn luyện và dữ liệu kiểm thử, đường dẫn chứa liên kết để tải dữ liệu và một số thông tin lưu ý khi sử dụng dữ liệu.

Hình 05. Bài toán nhận diện chữ số – Mô tả dữ liệu được cung cấp

2.6 Nộp bài

Chúng ta có thể submit kết quả từ notebook (Submit from your Notebook) hoặc nộp trực tiếp bằng file kết quả (Submit with a file).

Ở tùy chọn nộp bằng file notebook ta có thể chọn ngôn ngữ lập trình là Python hoặc R để nộp bài.

Hình 06. Nộp bài bằng cách nộp file từ notebook.
Hình 07. Nộp bài bằng cách nộp file trực tiếp.

2.7 Xếp hạng dựa theo kết quả chấm điểm

Hệ thống lưu lại lịch sử nộp bài của thí sinh và xếp hạng giữa các thí sinh với nhau dựa trên điểm đạt được cao nhất trong các lần nộp bài của thí sinh.

Hình 08. Thống kê và xếp hạng hệ thống nộp bài dựa theo kết quả.

3. Hướng dẫn đăng nhập hệ thống nộp bài


Bước 1: Đi đến đường dẫn liên kết trang web submission: http://submission.aiclub.cs.uit.edu.vn

Hình 09. Di chuyển đến trang web hệ thống submission

Giao diện đăng nhập hiện ra. Chúng ta có thể sử dụng tài khoản Facebook, Github, Google sẵn có để đăng nhập vào hệ thống hoặc đăng ký tài khoản đăng nhập hệ thống.

Bước 2: Đăng ký tài khoản đăng nhập.

Hình 10. Giao diện đăng nhập hệ thống nộp bài
Hình 11. Đăng ký tài khoản bằng email

Bước 3. Login vào hệ thống băng tài khoản Google đã đăng ký.

Hình 12. Đăng nhập hệ thống sử dụng tài khoản gmail vừa đăng ký

Bước 4. Đăng nhập thành công và chuyển hướng về trang chủ

Hình 13. Trang chủ xuất hiện khi đăng nhập hệ thống thành công

4. Hướng dẫn tham gia bài toán Nhận diện chữ số trên hệ thống


Chúng ta sẽ tham gia vào bài toán Nhận diện chữ số(Digit Recognizer) với mục đích làm quen với các thao tác trên hệ thống từ lúc đọc đề bài cho đến lúc nộp kết quả và nhận về kết quả chấm điểm của hệ thống.

Hình 14. Bài toán nhận diện chữ số trên hệ thống
Hình 15. Miêu tả bài toán nhận diện chữ số

Với bài toán này, chúng ta sẽ phân tích đề bài và xây dựng baseline giải quyết bài toán với các bước như sau:

  1. Đọc và hiểu đề bài.
  2. Phân tích dữ liệu từ đề bài
  3. Tiến hành xây dựng baseline cho bài toán.
  4. Submit kết quả dựa trên baseline.

4.1. Đọc và hiểu đề bài

Với bộ dữ liệu được cho đã được rút trích đặt trưng thành các vector đặc trưng và gán nhãn, hãy đi xây dựng mô hình có khả năng dự đoán nhãn của mỗi ảnh input đầu vào chứa chứ số viết tay.

Hình 16. Quá trình giải quyết bài toán máy học

4.2. Phân tích dữ liệu từ đề bài

Dữ liệu của cuộc thi là tập dữ liệu ảnh xám (giải thích về ảnh xám, tiếng anh có tên là gray-scale image – là ảnh mà mỗi điểm ảnh có giá trị nguyên nằm trong đoạn từ 0 đến 255, màu đen được biểu diễn bằng giá trị 0 màu trắng được biểu diên bằng giá trị 255), kích thước của mỗi ảnh là 28 x 28.

Dữ liệu đầu vào gồm hai file là train.csv và test.csv chứa tương ứng với dữ liệu huấn luyện và dữ liệu kiểm thử.

  • Dữ liệu huấn luyện(training data):
    • Được đặt trong file có tên train.csv, gồm có 29400 dòng, mỗi dòng có 785 giá trị, cột giá trị đầu tiên của dòng thứ i là nhãn của dữ liệu có giá trị thuộc {1, 2, 3, 4, 5, 6, 7, 8, 9}, 784 (28×28) giá trị còn lại là vector đặc trưng của ảnh thứ i đã được rút trích từ ảnh đầu vào.
  • Dữ liệu kiểm thử (testing data):
    • Được đặt trong file có tên test.csv, gồm có 12600 dòng, mỗi dòng có 784 (28×28) giá trị, biểu diễn vector đặc trưng ứng với ảnh đầu vào.

Nhiệm vụ của chúng ta là xây dựng mô hình để từ tập dữ liệu huấn luyện( training set) có khả năng dự đoán các chữ số ứng với mỗi hàng (vector đặc trưng) trong file text.csv sao cho càng chính xác càng tốt.

4.3. Xây dựng baseline cho bài toán

Import các thư viện cần thiết

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

Chuẩn bị dữ liệu

# Định nghĩa các đường dẫn đến tập dữ liệu train và tập dữ liệu test
TRAIN_PATH = 'data/train_new.csv'
TEST_PATH = 'data/test_new.csv'

Xem một số thông tin từ tập dữ liệu huấn luyện

# Xem số kích thước bộ dữ liệu
print("Kích thước của bộ dữ liệu huấn luyện là: ", len(data))

# Xem các đặc trưng
print(data.columns)
Output
---------------------------------------------------------------------------------------------
Kích thước của bộ dữ liệu huấn luyện là:  29400
Index(['label', 'pixel0', 'pixel1', 'pixel2', 'pixel3', 'pixel4', 'pixel5',
       'pixel6', 'pixel7', 'pixel8',
       ...
       'pixel774', 'pixel775', 'pixel776', 'pixel777', 'pixel778', 'pixel779',
       'pixel780', 'pixel781', 'pixel782', 'pixel783'],
      dtype='object', length=785)

Phân bố các classes trong dữ liệu

digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
counts = [0]*10

for i in range(0, len(data)):
    index = data['label'].values[i]
    counts[index] += 1
    
fig, ax = plt.subplots(figsize=(9,6))

ax.bar(digits, counts, width=0.5)

ax.set_title('Thống kê số lượng ảnh của mỗi class', fontsize=18)
ax.set_xlabel('Chữ số', fontsize=14)
ax.set_ylabel('Số lượng ảnh', fontsize=14)

plt.xticks(digits, fontsize=14)

plt.show()
Biểu đồ 1. Thống kê số lượng dữ liệu của mỗi lớp

Chia dữ liệu huấn luyện và chọn mô hình máy học

Phân chia dữ liệu
percent_train = 0.75
len_train = int(len(data)*percent_train)

y_train = np.array(data['label'][0:len_train])
X_train = np.array(data.iloc[:len_train,1:])

y_test = np.array(data['label'][len_train:])
X_test = np.array(data.iloc[len_train:,1:])
Chọn mô hình máy học
from sklearn.ensemble import RandomForestClassifier

# Khởi tạo một mô mình máy học.
model = RandomForestClassifier(max_depth=15)

Huấn luyện mô hình máy học

# Bắt đầu huấn luyện mô hình trên dữ liệu được phân chia.
model.fit(X_train, y_train)

Đánh giá độ chính xác của mô hình được huấn luyện

from sklearn.metrics import classification_report
# Đưa ra dự đoán nhãn của các mẫu dữ liệu trong tập dữ liệu kiểm thử được phân chia ở trên
y_pred = model.predict(X_test)

# Tính toán mộ số độ đo đánh giá mô hình
print(classification_report(y_true=y_test, y_pred=y_pred, target_names=[str(i) for i in range(10)]))

# Tính độ chính xác của mô hình trên tập dữ liệu test đã được phân chia.
score = model.score(X_test, y_test)
print("Độ chính xác của mô hình là: {:.2f} %".format(score*100))
Output
---------------------------------------------------------------------------------------------
              precision    recall  f1-score   support

           0       0.97      0.98      0.97       724
           1       0.98      0.98      0.98       804
           2       0.95      0.97      0.96       728
           3       0.96      0.92      0.94       740
           4       0.95      0.95      0.95       718
           5       0.96      0.96      0.96       667
           6       0.97      0.98      0.97       727
           7       0.95      0.96      0.96       788
           8       0.96      0.94      0.95       719
           9       0.93      0.94      0.93       735

    accuracy                           0.96      7350
   macro avg       0.96      0.96      0.96      7350
weighted avg       0.96      0.96      0.96      7350

Độ chính xác của mô hình là: 95.74 %

Dự đoán nhãn cho dữ liệu test

# Đọc dữ liệu từ file test
test_data = pd.read_csv(TEST_PATH)
test_vectors = np.array(test_data.iloc[:,:])
result = np.array(model.predict(test_vectors))
# Tạo một hàng đầu tiên có hai cột là ImangeID và Label
df = pd.DataFrame(columns=['ImageId','Label'])

# Duyệt dữ kết quả và ghi vào df
for i, v in enumerate(result):
  df = df.append({'ImageId':i+1,'Label':v}, ignore_index=True)

# Ghi ra file csv
df.to_csv('submission.csv',index = False)

4.4. Submit kết quả dựa trên baseline

import math, requests

def submit_prediction(df, sep=',', comment='', compression='gzip', **kwargs):
    TOKEN='313e1d7d25f2621eed2b302b345e0214fbef7d22220fb2eab35faa70edbe2f628a5d18c289de96a2547bd0eb212949ad13fca395aa561a5b9ad2cbd7ef29a20b'
    URL='http://submission.mmlab.uit.edu.vn/api/submissions'
    df.to_csv('temporary.dat', sep=sep, compression=compression, **kwargs)
    r = requests.post(URL, headers={'Authorization': 'Bearer {}'.format(TOKEN)},files={'datafile': open('temporary.dat', 'rb')},data={'comment':comment, 'compression': compression})
    if r.status_code == 429:
        raise Exception('Submissions are too close. Next submission is only allowed in {} seconds.'.format(int(math.ceil(int(r.headers['x-rate-limit-remaining']) / 1000.0))))
    if r.status_code != 200:
        raise Exception(r.text)
path = 'submission.csv'
submit_data = pd.read_csv(path)
submit_prediction(submit_data, sep=',', index=True, comment='test submission')

Kết quả submision

Hình 17. Kết quả chấm điểm file submission
Hình 18. Xếp hạng tài khoản sau khi submit

Notebook tham khảo tại đây.

5. Tổng kết


Bài viết này giới thiệu cho bạn đọc cách sử dụng hệ thống submission của CLB AI, khoa Khoa học Máy tính, UIT. Nội dung bài viết chỉ dẫn các lợi ích khi sử dụng hệ thống submission, hướng dẫn sử dụng hệ thống, ví dụ demo sử dụng hệ thống submission cho bài toán Nhận diện chữ số.

Hi vọng bạn đọc có thể sử dụng các tiện ích của hệ thống submission mang lại trong suốt cuộc thi của CLB AI tổ chức và trong việc rèn luyện kĩ năng giải quyết các vấn đề máy học, trí tuệ nhân tạo.

Nếu các bạn gặp vấn đề trong quá trình sử dụng hệ thống submission của CLB, vui lòng phản hồi cho chúng mình bằng cách liên hệ với Fanpage của CLB hoặc để lại bình luận bên dưới bài viết.

kadikoy moto kurye umraniye moto kurye tuzla moto kurye atasehir moto kurye moto kurye moto kurye moto kurye moto kurye

Xin chào và hẹn gặp lại các bạn trong bài viết sau !

Nguyễn Văn Tiến – KHTN2018

Leave a Reply

Your email address will not be published. Required fields are marked *