RaLSGAN cho bài toán Motorbike Generator trong cuộc thi Zalo Challenge

Tram Ho

Zalo đang tổ chức một cuộc thi về Ai cho toàn thể ACE trong “Ngành”. Một trong ba bài toán đó là bài Motorbike Generator và tất nhiên requirement của nó y hệt như cái bài Dog Generator trên Kaggle, khác mỗi đầu ra là 128×128 còn bài Dog Generator là 64×64 :v. Và mình cũng tham gia góp vui với một tinh thần 3H – Ham học hỏi :v. Bài viết này mình đề cập tới những kinh nghiệm của mình trong việc quan sát dữ liệu, xử lý ảnh, cũng như cách training mô hình… Đây chỉ là kinh nghiệm của mình trong quá trình mình làm và học đc, nếu có chỗ nào sai sót mong mọi người gạch đá nhè nhẹ 😃)

Yêu cầu bài toán

Hiểu đơn giản là sử dụng 10000 mà bên Zalo cho và sinh ra 10000 ảnh với định dạng là PNG từ bộ dữ liệu cho trước , evaluation metric là FID.

Lý thuyết

Để đọc thêm về FID evalutation mời các bạn đọc Tại đây

Mình sẽ sử dụng RaLSGAN cho bài toán này. Vậy RaLSGAN là cái vẹo gì? TL: nó chỉ là mạng GAN thông thường nhưng với một loss function tối ưu hơn

Loss Functions

Một Discriminator đầu ra có thể là hàm kích hoạt sigmoid hoặc linear. Nếu là sigmoid chúng ta có phân bố xác xuất rời rạc của một hình ảnh là thực là Pr(real) . Còn với linear chúng ta có C(x) = logit . Xác suất nằm trong khoảng (0,1). Và logit có thể là bất cứ số nào trong khoảng (0,1) . Số dương đại diện cho ảnh real còn âm đại diện cho ảnh fake.

Simple loss

Ta gọi x_r là ảnh thật, và x_f là ảnh fake thì ta sẽ có D(x) = Pr(Real) hay C(x) = Logit sẽ trở thành 2 ouptput của một Discriminator khi input là một hình ảnh, Loss Function sẽ như sau:

Chúng ta muốn Discriminator D(x_r) = 1 và D(x_f) = 0 tương đương với nhãn real và fake, và sau khi huấn luyện xong ta thì Generator càng gần 1 càng tốt. Nói nôm na là ta dùng ảnh thật làm bộ dữ liệu huấn luyện cho vào Discriminator để mạng có thể phân biệt được ảnh real và ảnh fake, và từ đó Discriminator sẽ phản hồi về cho Generator để nó tự hoàn thiện mình dựa vào phản hồi đó đó là lý do D(x_r) = 1 và D(x_f) = 0. Nếu các bạn muốn tìm hiểu sâu hơn về mạng GAN mời đọc Tại đây

DCGAN Loss

Ta thấy rõ Basic GAN và DCGAN sử dụng D(x):

RaLSGAN Loss

RaLSGAN sử dụng C(x) = logit:

Code

Ta sẽ sử dụng pytorch để code cho bài toán này, việc đầu tiên là thay đổi hàm kích hoạt từ sigmoid sang logit(có thể là tanh) ở dòng cuối:

Tiếp theo ta sẽ update loss của G và D:

Xử lý dữ liệu

Trong tất cả các bài toán DL thì dữ liệu luôn là thứ quan trọng nhất, và việc đầu tiên ta phải làm là quan sát bộ dữ liệu và tìm ra đặc điểm để xử lý theo yêu cầu. Và như ta thấy bộ dữ liệu của ta gồm 10.000 ảnh gồm:

  • Các kích cỡ và định dạng khác nhau
  • Nhiều ảnh GIF đặc trưng và lỗi
  • Dữ liệu không đồng đều
  • Nhiều xe hoặc nhiều vật cản trong một ảnh
  • Đa phần là những ảnh có chiều quay là ngang
  • Nhiều xe có đặc điểm gị thường và không đồng nhất với bộ dữ liệu

Cách xử lý:

  • Loại bỏ những vật thừa trong ảnh và phân loại xe bằng cách sử dụng yolov3 Ở đây.
  • sau khi loại bỏ những vật thừa và phân loại xe ta sẽ lọc dữ liệu bằng tay, vì bộ dữ liệu bao gồm rất nhiều xe đa dạng và ảnh không đúng định dạng bị lỗi
  • Loại bỏ những xe có chi tiết thừa thãi và có ít trong bộ dữ liệu, chung quy là những xe không đa dạng và có đặc điểm “dị”
  • Loại bỏ những ảnh có background quá màu mè

Preprocessing

Sau khi xử lý xong công đoạn trên để đưa ra được tập dữ liệu tốt thì việc chúng ta cần làm tiếp theo là đưa ảnh về kích cỡ 128×128 để đưa vào mạng. Có 2 option cho việc này:

  • Padding images: thêm khoảng không gian bên trong ảnh, khoảng không gian này sẽ được cộng dồn thêm vào chiều rộng hoặc chiều cao của ảnh mà không bị biến dạng ảnh
  • Resize images: Đưa ảnh về kích thước 128×128 luôn và co giãn ảnh theo chiều rộng hoặc chiều cao
    Nhưng vấn đề ở chỗ khi mình training xong và thử cả hai trường hợp và FID evaluation thì thấy padding images cho kết quả đầu ra tốt hơn, tức là mạng học hiệu quả hơn

Đọc đường dẫn của ảnh:

Tạo vòng lặp và gọi hàm để padding Images:

Sau khi padding images xong thì chúng ta images augmentation. Mình đã xử dụng các kỹ thuật lất ảnh và quay ảnh, trước đó mình có tăng độ tương phản nhưng kết quả ra khá tệ

Training mô hình

Như mình đã nói ở trên RaLSGan là một mạng GAN bình thường nó có thể là DCGAN, hay SGAN … nhưng với một hàm loss tốt hơn.

Generator sẽ như sau:

Như ta có thể thấy output đầu ra của G là 128×128 với hơn 13 triệu tham số

Discriminator:

Output

Mình đã thử rất nhiều trường hợp để ra kết quả tốt nhất thì thấy nên đặt trong khoảng 550 – 750 epochs là ra kết quả khá đẹp FID khoảng từ 80 -> 62

Một số kết quả:

Nguồn tham khảo

https://www.kaggle.com/c/generative-dog-images/discussion/99485

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo