Một trong những ứng dụng hay và thú vị nhất trong những năm gần đây là Neural Style Transfer. Nhờ có ứng dụng này, chúng ta có thể mô phỏng phong cách nghệ thuật của những hoạ sĩ huyền thoại như Picasso, Van Gogh hay của bất kỳ một hoạ sĩ nào khác.

Trong bài hôm nay, hãy cũng tìm hiểu sơ lược về Neural Style Transfer và cách áp dụng nó để hồi sinh những phong cách hội hoạ nổi tiếng trên thế giới.

Neural Style Transfer (NST)

NST là gì?

Neural Style Transfer là kỹ thuật áp dụng phong cách nghệ thuật từ hình ảnh này sang hình ảnh khác. Nói một cách khác, chúng ta có thể tái tạo lại một phong cách vẽ tranh bất kỳ. Nghe có vẻ ảo nhưng các bạn hãy xem thử ví dụ dưới đây với ảnh gốc và các ảnh mô phỏng bằng NST:

Ảnh gốc và các ảnh mô phỏng bằng Neural Style Transfer

NST hoạt động như thế nào

Điểm mấu chốt của NST là khả năng biểu diễn 2 thành phần của một hình ảnh: nội dung và phong cách. Từ đó, sự kết hợp khéo léo giữa nội dung của bức tranh này với phong cách của một bức tranh khác sẽ cho ra một tác phẩm nghệ thuật thú vị.

Mạng neuron dùng để trích xuất nội dung và phong cách của ảnh (ảnh từ bài báo gốc)

Cụ thể hơn, NST sử dụng mạng neuron đã được huấn luyện sẵn (phiên bản đầu tiên sử dụng mạng VGG) để phân tách các đặc điểm về nội dung và phong cách. Trong đó:

  • Nội dung ảnh được biểu diễn bởi các lớp neuron kích hoạt của mô hình mạng neuron.
  • Phong cách ảnh được biểu diễn bởi hệ số tương quan giữa các bộ lọc neuron trong cùng 1 lớp tích chập (convolutional layer).

Bên cạnh đó NST sử dụng một hàm mất mát (loss function) đặc biệt để có thể thay đổi tỷ lệ giữa nội dung và phong cách khi pha trộn với nhau.

Hàm mất mát trong NST (nguồn V7 Labs)

Cấu trúc NST trên đây là của phiên bản đầu tiên được ra mắt vào năm 2015 bởi Gatys và cộng sự. Tuy phiên bản này cho phép chạy mô hình để mô phỏng một phong cách từ ảnh bất kỳ, nó lại có tốc độ tương đối chậm. Sau đó, có 1 vài phiên bản khác tận dụng các mô hình được “học trước” các phong cách nghệ thuật rồi mới áp dụng lên ảnh mới nên có tốc độ được cải thiện rất đáng kể (thậm chí chạy đủ nhanh trên CPU). Do đó, bài thực hành hôm nay sẽ sử dụng các mô hình mới đã được huấn luyện sẵn thay vì huấn luyện từ đầu như phiên bản đầu tiên.

Thực hành

Bài hôm nay chúng ta sẽ thực hành mô phỏng từ những phong cách sau:

  • La Muse (Picasso)
  • Mosaic style
  • The Starry Night (Van Gogh)
  • The Great Wave style
  • The Scream (Edvard Munch)

Cấu trúc code

Mã nguồn được dùng trong bài hôm nay được lưu tại PandaML Blog GitHub để tiện cho việc tham khảo. Cấu trúc code cụ thể như sau:

.
├── images
│   ├── bus_and_car.jpeg
│   ├── people_and_bicyble.jpeg
│   └── ronaldo_bicycle_kick.jpeg
├── models
│   ├── la_muse.t7
│   ├── mosaic.t7
│   ├── starry_night.t7
│   ├── the_scream.t7
│   └── the_wave.t7
├── transfer_style.py
└── utils.py
  • File transfer_style.py là file code chính được sử dụng
  • File utils.py chứa các hàm được dùng trong transfer_style.py
  • Thư mục models chứa các files mô hình đã được huấn luyện
  • Thư mục images chứa các ảnh được dùng để thử nghiệm mô hình

Để áp dụng Object Detection cho một ảnh mới, chúng ta có thể dùng đoạn code dưới đây:

python transfer_style.py --image [đường dẫn đến ảnh] --model [đường dẫn đến mô hình]

Nội dung code

Trước tiên chúng ta cần đọc file mô hình:

1
2
# load model
net = cv2.dnn.readNetFromTorch(model_path)
  • Mô hình được huấn luyện từ nền tảng Torch nên hàm readNetFromTorch được sử dụng.

Bước tiếp theo là áp dụng mô hình lên ảnh:

1
2
3
4
5
6
7
8
9
# run model
blob = cv2.dnn.blobFromImage(
    image, scalefactor=1.0, size=(width, height), mean=MEAN_SUBTRACTIONS, swapRB=False, crop=False
)
net.setInput(blob)
output = net.forward()

# post process the output result
output = post_process_neural_style_image(output)
  • Dòng 2 - 4: hàm cv2.dnn.blobFromImage nhận ảnh đầu vào và sau đó chuẩn hoá ảnh với công thức (pixel_value - mean) * scalefactor, trong đó mean = MEAN_SUBTRACTIONS ([103.939, 116.779, 123.680])scalefactor= 1.
  • Dòng 9: xử lý kết quả đầu ra để có thể vẽ hình bằng hàm post_process_neural_style_image (trong file utils.py).

Bước cuối cùng là hiển thị ảnh đầu ra và ảnh mô phỏng phong cách:

1
2
3
4
5
# display image
cv2.imshow("Image", image)
cv2.imshow("Output", output)
cv2.waitKey(0)
cv2.destroyAllWindows()

Mã nguồn

PandaML Blog GitHub

Kết quả

Dưới đây là kết quả khi áp dụng mô hình của chúng ta lên ảnh trong thư mực images:

Ảnh áo dài và các ảnh mô phỏng
Ảnh cầu thủ Ronaldo với cú sút xe đạp chổng ngược và các ảnh mô phỏng

Thú thật mình rất ấn tượng với kết quả của những bức ảnh mô phỏng đạt được. Cá nhân mình thấy khá thích phong cách của The Starry Night và Mosaic. Các bạn thấy thích phong cách nào thì cho mình biết với nhé.

Tạm kết

Bài hôm nay giới thiệu đến các bạn Neural Style Transfer, một ứng dụng của thị giác máy tính trong hội hoạ. Bên cạnh đó, chúng ta cũng đã áp dụng mô hình để mô phỏng lại một vài phong cách nổi tiếng.

Các bạn hãy thử nghiệm với ảnh của các bạn và cho mình biết kết quả với nhé :)

Tham khảo

Leave a comment