Bài 8: Ứng dụng CNN cho ô tô tự lái | Deep Learning cơ bản
 

Bài 8: Ứng dụng CNN cho ô tô tự lái

| Posted in Deep Learning cơ bản

Bài trước đã giới thiệu về thư viện keras và dùng keras để xây dựng mô hình convolutional neural network (CNN) cho bài toán phân loại ảnh. Bài này sẽ dùng mô hình CNN để dự đoán các giá trị thực và áp dụng cho bài toán ô tô tự lái.

Giới thiệu mô phỏng ô tô tự lái

Ứng dụng mô phỏng ô tô tự lái là phần mềm mã nguồn mở được phát triển bởi Udacity, được viết bằng Unity ( công cụ dùng để phát triển game).

Mọi người tải phần mềm ở đây. Kéo xuống dưới và chọn hệ điều hành tương ứng.

Sau khi tải về, giải nén thì bạn có thể chạy được luôn như trên window thì bạn sẽ thấy file .exe

Chọn kích thước, cấu hình (máy khỏe thì để nét hơn không thì cứ để Fastest)

Sau đó bạn chọn Play!

Bạn sẽ thấy có 2 chế độ: training mode (sẽ cho dữ liệu về ô tô tự lái để train mô hình) và autonomous mode (sau khi học được mô hình rồi thì đây là phần ô tô tự lái).

Ở ô tô có gắn 3 cameras (trái, giữa, phải)

Ô tô có thể di chuyển sang bên trái (←), sang bên phải ( →), tăng tốc (↑), giảm tốc (↓)

Trong phần training mode, ở mỗi vị trí ô tô di chuyển thì sẽ cho ta các dữ liệu: ảnh ở 3 camera, góc lái của bô lăng, tốc độ xe, độ giảm tốc (throttle) và phanh (brake)

Bài toán ô tô tự lái

Xây dựng bài toán

Bạn muốn dự đoán góc lái của bô lăng bằng ảnh ở camera trên ô tô. Vì input là ảnh nên nghĩ ngay đến việc dùng CNN.

Dữ liệu training set sẽ được lấy từ traning mode của phần mềm mô phỏng.

Chuẩn bị dữ liệu

Sau khi bạn chọn traning mode thì hãy làm quen với việc di chuyển của ô tô bằng các phím mũi tên. Đến khi bạn lái mượt rồi thì chọn nút record. Chọn folder bạn muốn lưu dữ liệu và chọn select.

Bạn lái xe khoảng 10 phút sẽ ra khoảng 18000 ảnh (6000 ảnh từ mỗi camera).

Bạn cũng thấy file driving_log.csv để mô tả dữ liệu

đường dẫn ảnh camera giữađường dẫn ảnh camera tráiđường dẫn ảnh camera phảigóc láiđộ giảm tốcphanhtốc độ

Tiền xử lý dữ liệu (Preprocessing)

Ảnh màu từ camera ở ô tô có kích thước 320*160

Để tăng lượng ảnh cho việc training, với các ảnh ở camera giữa ta dùng góc lái như trong file csv. Tuy nhiên với ảnh camera trái ta tăng góc lái lên 0.2 và ảnh camera phải ta giảm góc lái đi 0.2.

Thêm vào đó ta có thể lật ngược ảnh lại và đổi dấu góc lái của bô lăng.

Tiếp, ta có thể dịch chuyển ảnh hoặc thêm độ sáng tối cho ảnh và giữ nguyên góc lái

Quá trình thêm ảnh như trên gọi là data augmentation để tránh overfitting, hiểu đơn giản là khi luyện thi thay vì chỉ luyện kĩ 10 đề thì lên mạng tải thêm 100 đề nữa để làm và chữa chi tiết như vậy khi thi đại học thật điểm có thể sẽ tốt hơn vì làm nhiều đề và gặp nhiều dạng bài hơn.

Phần mũi xe ô tô và bầu trời thì không liên quan đến việc dự đoán góc lái bô lăng nên ta sẽ cắt bỏ đi.

Do dùng CNN, các ảnh input cần cùng kích thước nên sẽ reshape ảnh thành 66*200.

Xây dựng model

Input layer: Ảnh màu kích thước 66*200

Output layer: 1 node dự đoán góc lái của bô lăng

Loss function

Vì giá trị dự đoán là giá trị thực nên ta sẽ dùng mean square error giống như trong bài 1 khi dự đoán giá nhà.

Train model

Áp dụng model cho ô tô tự lái

Khi ta bật chế độ autonomous mode trong phần mềm mô phỏng, ta sẽ dùng socket để lấy được dữ liệu từ camera giữa của ô tô sau đó dùng model để dự đoán góc lại. Cuối cùng ta sẽ chuyển lại dữ liệu về góc lái, tốc độ lại cho phần mềm để ô tô di chuyển.

Code cụ thể trong file drive.py trong github nhưng đây là những phần quan trọng nhất

# Load model mà ta đã train được từ bước trước
model = load_model('model.h5')

# Góc lái hiện tại của ô tô
steering_angle = float(data["steering_angle"])
# Tốc độ hiện tại của ô tô
speed = float(data["speed"])
# Ảnh từ camera giữa
image = Image.open(BytesIO(base64.b64decode(data["image"])))
try:
    # Tiền xử lý ảnh, cắt, reshape
    image = np.asarray(image)       
    image = utils.preprocess(image)
    image = np.array([image])
    print('*****************************************************')
    steering_angle = float(model.predict(image, batch_size=1))
    
    # Tốc độ ta để trong khoảng từ 10 đến 25
    global speed_limit
    if speed > speed_limit:
        speed_limit = MIN_SPEED  # giảm tốc độ
    else:
        speed_limit = MAX_SPEED
    throttle = 1.0 - steering_angle**2 - (speed/speed_limit)**2

    print('{} {} {}'.format(steering_angle, throttle, speed))
			
    # Gửi lại dữ liệu về góc lái, tốc độ cho phần mềm để ô tô tự lái
    send_control(steering_angle, throttle)

Đầu tiên các bạn mở phần mềm chọn autonomous mode, ô tô sẽ đứng yên. Sau đó mở command line chạy python drive.py model.h5 và ô tô sẽ bắt đầu tự lái. model.h5 là tên model mà bạn đã lưu ở bước trên.

Code mọi người lấy ở đây.


Deep Learning cơ bản ©2024. All Rights Reserved.
Powered by WordPress. Theme by Phoenix Web Solutions