Dạy AI Vẽ Hình Ngọc Trinh Phong Cách Trừu Tượng

Dạy AI Vẽ Hình Ngọc Trinh Phong Cách Trừu Tượng

Trong kỷ nguyên mà AI hay Trí tuệ nhận tạo đang bùng nổ như hiện nay, chúng ta có thể dễ dàng tìm thấy các ứng dụng của AI trong nhiều lĩnh vực trong đời sống khác nhau như Chatbot, nhận dạng khuôn mặt, nhận diện giọng nói tại khắp mọi nơi,… Thì các bạn có thấy hình ảnh cover trên không? Nó là một tác phẩm do AI sinh ra theo phong cách trừu tượng.

Trong bài viết này, chúng ta hãy xem các khái niệm, cách tư duy và tính toán làm thế nào để AI có thể học và vẽ lên bức hình như sau nhé. Phần code mẫu mình sẽ dẫn link tham khảo cho các bạn có hứng thú muốn vẽ thử một bức tranh tùy thích theo ý mình.

Neural Style Transfer là gì?

Kỹ thuật để vẽ được hình ảnh này trong AI có tên là Neural Style Transfer (NST)Neural Style Transfer (NST) là nhóm các thuật toán, phương pháp tối ưu cho phép kết hợp đặc giữa hai ảnh (ảnh content và ảnh style) để tạo một bức ảnh giữ lại những đặc trưng gần nhất với hai ảnh đầu vào. Các thuật toán NST thường sử dụng các mô hình học sâu (Deep neural network) để thực hiện trích chọn đặc trưng và chuyển đổi hình ảnh. Các bạn có thể tham khảo bài báo về NST tại đây.

Một mô hình cơ bản về NST chúng ta cần chuẩn bị một số kiến thức cơ bản:

  • Một mạng Convolution Neural Network (CNN) để trích chọn đặc trưng của các ảnh. ví dụ  VGG19
  • Tính Khoảng cách Euclid và ma trận Gram giữa đặc trưng trích xuất được từ 2 ảnh.

Giải bài toán vẽ ảnh mô phỏng hình bất kỳ

1. Đầu vào

Để thực hiện bài toán này chúng ta cần có 3 hình ảnh đầu vào cho thuật toán.

  • Content_image: Chứa nội dung mà generate_image sẽ chứa.
  • Style_image: Chứa phong cách mà generate_image sẽ chứa.
  • Generate_image: Được khởi tạo bất kỳ hoặc chính là ảnh content. Sau quá trình học thì chúng ta sẽ thu được hình ảnh mong muốn.

2. Đầu ra

Chúng ta cần sử dụng một mạng Convolution Neural Network (CNN) với mục đích trích xuất và học các thuộc tính sâu (deep features) của ảnh content và style. Khác với các bài toán khác, với Neural Style Transfer, chúng ta sẽ không cố gắng tối ưu trọng số của mạng neural của chúng ta, mà thay vào đó chúng ta sẽ cố gắng tối ưu trực tiếp đầu ra của mình (ảnh kết quả).  Việc tối ưu của chúng ta dựa trên tối ưu tổng mất mát giữa các hình ảnh với nhau:

  • Sự khác nhau giữa content_image với ảnh generate_image.
  • Sự khác nhau giữa style_image với generate_image.
  • Sự biến thiên của ảnh kết quả

Nói cách khác ảnh kết quả của chúng ta giống với ảnh content_image và ảnh style_image đồng nghĩa với chúng ta đạt được tổng mất mát nhỏ nhất. Cả 3 ảnh cùng được đưa vào 1 pretrained model CNN (VGG19) để extract ra các thông tin deep features:

  • Với content_image thì extract ra các đặc trưng của ảnh content gọi là content_features
  • Với style_image thì extract ra style_features
  • Với generate_image thì extract ra generate_features

Dựa vào các features trên ta tính khoảng cách hay sự khác việt để tính tổng mất mát giữa các hình ảnh.

Loss = D(generate_features, content_features) + D(generate_features, style_features)

Trong đó:

  • D(generate_features, content_features): là sự khác biệt giữa ảnh generate_image và ảnh content_image
  • D(generate_features, style_features): là sự khác biệt giữa ảnh generate_image và ảnh style_image

Sử dụng thuật toán Gradient để cập nhật ảnh generate_image. Quá trình sẽ lại đi lặp lại để tối ưu giá trị của hàm Loss. Vậy cách tính sự khác biệt giữa các ảnh như thế nào?

Để tính sự khác biệt giữa ảnh generate_image và ảnh content_image chúng ta thực hiện tính khoảng cách Euclid giữa features đã trích xuất được của 2 ảnh.

Với sự khác biệt giữa ảnh generate_imagestyle_image chúng ta sử dụng ma trận Gram để tính toán. Vậy chúng ta tính ma trận Gram từ ma trận đặc trưng của ảnh như thế nào?

Giả sử ta có ma trận đặc trưng A với kích thước (5, 5, 5) chúng ta cần chuyển ma trận A thành mà trận 2 chiều ta thu được ma trận B có kích thước (25, 5). Ma trận Gram sẽ là:

Trong đó:

  • là ma trận chuyển vị của B

Giá sử GA lần lượt là ma trận Gram của generate_featuresstyle_features thì sự khác biệt của ảnh generate_imagestyle_image chính là khoảng cách Euclid giữa 2 ma trận GA:


Thuật toán cơ bản để dạy cho AI có thể vẽ một bức tranh về Ngọc Trinh theo phong cách trừu tượng là như vậy đó. Nhưng khi cài đặt thì chúng ta thực hiện việc tính toán mất mát tại các lớp của model trích xuất thông tin của ảnh vì tại mỗi lớp này chúng ta sẽ thu được các đặc trưng của ảnh.

Tạm kết

Trên đây mình đã hướng dẫn các bạn cách dạy AI vẽ lại một bức ảnh theo phong cách trừu tượng. Các bạn có thể tham khảo code và tự tạo những bức ảnh theo phong cách mình mong muốn qua đây

Bài viết chia sẻ hiểu biết và ý kiến cá nhân các hãy like, share và subcribe để nhận thêm nhiều bài chia sẻ mới nhé.