Ứng dụng mô hình CycleGAN trong style transfer ảnh

by Tiểu Thành

image2image translations là bài toán phổ biến trong những năm gần đây và trở thành đề tài mà nhiều người quan tâm. Một trong những ví dụ cho bài toán này đó là chuyển đổi phong cách của một bức ảnh (ảnh A) dựa trên phong cách của một bức ảnh trước đó (ảnh B): Chuyển đổi một bức ảnh bất kỳ theo style của hoạ sĩ vangogh (nghe thôi đã thấy thú vị đúng không nào? ), chuyển đổi một bức ảnh từ mùa xuân sang mùa đông, từ ngựa thường và ngựa vằn,… và ngược lại. Trong bài viết này, mình sẽ hướng dẫn bạn chuyển đổi một bức ảnh thường sang phong cách của hoạ sĩ vangogh bằng mô hình CycleGAN. Let’s go!!!!

Trước tiên đi vào thực hành, chúng ta sẽ tìm hiểu sơ qua về thuật toán của mô hình CycleGAN, nó là cái gì, tại sao nó lại hay ho như vậy?

1. Mô hình CycleGAN

Cycle Generative Adversarial Network(CycleGAN) là một cách tiếp cận dựa vào việc đào tạo mạng convolution network cho nhiệm vụ image2image. Đó là một mô hình học không giám sát. Mô hình của CycleGAN được mô tả như hình dưới:

 

Mô hình CycleGAN

Nhìn vào mô hình, ta thấy rằng CycleGAN sẽ có 2 module chính: Generator (G) và Discriminator (D). Trong Generator lại chia thành 2 module nhỏ đó là G(X->Y) và G(Y->X). G có chức năng sinh ra ảnh giả và D làm nhiệm vụ phân biệt một bức ảnh là ảnh thật hay ảnh giả. Một câu hỏi đặt ra tại sao chúng ta lại phải có tới 2 module Generator trong khi các phiên bản GAN trước đó chỉ có một module. Lý do của việc này được giải thích như sau: Đây là bài toán không giám sát nên sẽ data của chúng ta sẽ không có dạng là pair(input ,output) mà chỉ là các tập input. Chính điều này chúng ta khó lòng tính toán được sự sai khác giữa ảnh tạo ra nhờ generator(X->Y) và output. Chính vì vậy chúng ta cần có một G(Y->X) để đưa ảnh trở về input ban đầu. Sự sai khác sẽ được tính dựa trên input ban đầu và ảnh được tạo ra thông qua quá trình G(Y->X). Nói cách khác, sau 2 quá trình biến đổi G(X->Y) và G(Y->X) ta phải thu được một bức ảnh sắp xỉ như ảnh ban đầu :

Nói tóm lại, trong bài này, chúng ta sẽ xây dựng các module chính như sau:

  • G(X->Y): Biến một bức ảnh thật từ miền X (style A)  sang miền Y (stye B)
  • G(Y->X): Từ ảnh giả tạo ra ở trên (style B) lại được biến đổi về style A (miền X)
  • D_x :  Phân biệt ảnh thực X và ảnh do G(Y->X) tạo ra
  • D_y: Phân biệt ảnh thực Y và ảnh do G(X->Y) tạo ra
1.1 Generator

Kiến trúc cụ thể của G được mô tả như hình dưới:

 

Generator gồm 3 phần: encoder, transformer và decoder. Phần encoder giảm kích thước ảnh cũng như tăng depth bằng 3 conv liên tiếp. Sau đó output được cho qua phần transformer với 6 residual block và cuối cùng được cho qua phần decoder để về ảnh có kích thước giống ban đầu.

1.2 Discriminator

Kiến trúc cụ thể của D được mô tả như hình dưới:

1.3 Loss function

Gồm 3 loại:

  • Loss G(X->Y)
  • Loss G(Y->X)
  • Loss cho cả quá trình G(X->Y->X)

Như vậy, trên đây chúng ta đã tìm hiểu sơ qua về kiến trúc của CycleGAN. Bây giờ sẽ là lúc chúng ta bắt tay vào thực hành nào!!!

2. Thực hành

2.1 Data

Các bạn có thể dowload data từ đường link sau: https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/vangogh2photo.zip

2.2 import một số thư viện cần thiết

2.3 Thiết lập một số hàm cần thiết

Thiết lập một số biến

 

Hàm lưu lại kết quả sau mỗi lần lặp checkpoint

Hàm load checkpoint

Hàm hiển thị ảnh

Class Custom lại data

Hàm revert lại ảnh có pixel từ [0;1] sang [0,255]

2.4 Load data

 

Load data kiểm tra

Kết quả:

Kết quả:

2.5 Xây dựng mô hình

Định nghĩa lại một lớp conv

Xây dựng class cho D

Xây dựng class ResidualBlock

Định nghĩa lại lớp deconv

Xây dựng class G

Xây dựng hàm khởi tạo trọng số ban đầu –> tuân theo một phân phối nhất định

Kết hợp lại giữa G và D, xây dựng kiến trúc model CycleGAN hoàn chỉnh

Định nghĩa hàm loss

Khởi tạo optimizer, trong trường hợp này ta sử dụng Adam

Cuối cùng là xây dựng hàm train model từ đầu đến cuối

Sau đây là một số kết quả trong quá trình train ở eporch thứ 100 :

 

Sau đây là kết quả test:

Ảnh gốc

Ảnh sau khi chuyển đổi

Ảnh gốc

Ảnh sau khi chuyển đổi

Việc thực hiện train lại mô hình này tốn khá nhiều thời gian, bạn đọc muốn thực hành có thể dowload các weight mình train sẵn tại đây :https://drive.google.com/drive/folders/119o4p_-3X4BpdZrrwmsp3SaRwAHPD3I0?usp=sharing

3. Kết luận

Trên đây mình đã hướng dẫn các bạn thực hiện chuyển đổi một bức ảnh theo phong cách của vangogh. Trong quá trình đọc và thực hành, nếu có gì thắc mắc và góp ý mọi người hãy comment phía dưới mình sẽ tiếp thu và giải đáp nhiệt tình. Cảm ơn mọi người đã dành thời gian đọc bài viết này. Trong bài viết tiếp theo, kính mong mọi người theo dõi và ủng hộ để bọn mình có động lực ra những bài viết hay và chất lượng hơn. Xin cảm ơn !!!

4. Tài liệu tham khảo

https://junyanz.github.io/CycleGAN/

https://nttuan8.com/bai-8-cyclegan/

https://towardsdatascience.com/image-to-image-translation-using-cyclegan-model-d58cfff04755

https://github.com/junyanz/CycleGAN

 

Bài viết liên quan

Thêm bình luận