Data Augmentation: What You Need To Know

Lời nói đầu

Chào mừng các bạn đã quay trở lại với chuỗi bài viết về Machine Learning của CLB AI – KHMT. Ở các bài viết trước các bạn đã được tìm hiểu và tiếp cận với các thuật toán cơ bản trong Machine Learning. Quay trở lại với bài viết này, mình sẽ đề cập đến một vấn đề, một thứ không thể thiếu trước khi huấn luyện mô hình. Đó chính là dữ liệu (data)

“Hiding within [existing] mounds of data is knowledge that could change the life of a patient, or change the world” – Atul Butte , Stanford School of Medicine

Có thể thấy, dữ liệu đã chứng minh được tầm quan trọng của mình trong khoa học và cuộc sống. Với Deep Learning, một lĩnh vực trong thời gian qua đã được áp dụng để đem đến những giải pháp hiệu quả trong cuộc sống như xe tự hành, mô hình nhận diện, trợ lý ảo, … Tuy nhiên, để một mô hình Deep Learning thực hiện có độ chính xác cao thì phải cần đến một bộ dữ liệu đủ tốt và đẹp. Vấn đề khó khăn ở đây – “Deep learning is a data-hungry framework”. Hoặc với máy học, một điều tồi tệ có thể sẽ ra khi dữ liệu bạn đưa vào tồn tại quá nhiều các điểm overfitting – from the training data to unseen data.
Vậy khi có quá ít dữ liệu cho việc training model, chúng ta phải làm sao: [1]

  • Không dùng DeepLearning nữa! (Cái này trông dễ mà khó nhỉ)
  • Thay đổi kiến trúc mạng.
  • Transfer learning – sử dụng lại kiến thức của các ứng dụng có nhiều data.
  • Thiếu thì thêm – một câu trả lời trực quan đó là chúng ta phải tìm cách thêm dữ liệu.

Vậy ta phải thêm dữ liệu bằng cách nào?

  • Collect more data: Dùng tiền để mua dữ liệu, ngồi và lấy dữ liệu trên mạng hoặc phải tự mình đi thu thập dữ liệu .v.v. Các bạn thấy đó, tốn thời gian, công sức và cả money nữa.
  • Data synthesis: Đối với một số bài toán dữ liệu có thể được mô phỏng qua computer graphic. Như ảnh depth, ảnh ở chiều góc nhìn khác nhau, .v.v.
  • Data augmentation: Là kỹ thuật đơn giản nhất bằng việc xử lý đơn giản dữ liệu sẵn có bằng các phép tuyến tính hay phi tuyến (như tạo dữ liệu qua mạng GAN)
image

Có thể thấy data augmentation là cách tiếp cận “dễ” và “rẻ” nhất. Hầu hết các ứng dụng Deep Learning, các topic từ tín hiệu 1D, 2D, 3D tới ứng dụng bên thị giác máy, giọng nói, ngôn ngữ tự nhiên .v.v. đều sử dụng kỹ thuật augmetnation trong quá trình huấn luyện. Trong bài viết này, mình sẽ đề cập đến:

Data Augmentation là gì?

Data Augmentation (Tăng cường dữ liệu) là một kỹ thuật được sử dụng để mở rộng kích thước của tập huấn luyện bằng cách tạo thêm dữ liệu đã được sửa đổi từ dữ liệu ban đầu.
Lấy một mẫu từ tập dữ liệu, sửa đổi nó bằng cách nào đó, thêm nó vào tập dữ liệu ban đầu – và bây giờ tập dữ liệu của bạn lớn hơn một mẫu. [2]

Tăng cường dữ liệu giúp khắc phục vấn đề “không đủ dữ liệu”, khắc phục các điểm overfitting và giúp cho mô hình hoạt động tốt hơn với đa dạng mẫu dữ liệu.
Data Agumentation thường được sử dụng khi xây dựng mô hình Deep Learning . Và chắc chắn rằng, nó cũng đã hỗ trợ tốt trong trong việc tăng cường dữ liệu khi xử lý các vấn đề về Machine Learning như âm thanh, hình ảnh, văn bản, … hay bất kì loại dữ liệu nào.

Trong bài viết này mình sẽ tập trung đề cấp đến việc tăng cường hình ảnh vì đó là thứ hay được sử dụng nhất. Tuy nhiên, việc tăng cường các loại dữ liệu khác cũng không kém phần hiệu quả. Đó là lý do tại sao bạn nên biết một số kỹ thuật phổ biến có thể được thực hiện để tăng cường dữ liệu.

Kỹ thuật tăng cường dữ liệu

Chúng ta có thể áp dụng các thay đổi khác nhau đối với dữ liệu ban đầu. Ví dụ, đối với hình ảnh, chúng ta có thể sử dụng: [1]

  1. Các phép biến đổi hình học ( Geometry based ) – lật, cắt, xoay hoặc dịch hình ảnh một cách ngẫu nhiên
  2. Chuyển đổi không gian màu ( Color based) – thay đổi các kênh màu RGB, tăng hoặc giảm bất kỳ màu nào, tăng độ sắc nét, tăng tính tương phản, .v.v
  3. Thêm nhiễu ( Noise/occlusion ) – thêm nhiễu cho ảnh như nhiễu ngẫu nhiên, nhiễu có mẫu, nhiễu do nén ảnh, .v.v
  4. Xóa ngẫu nhiên (Random crop) – xóa ngẫu nhiên một phần của hình ảnh ban đầu
  5. Biến đổi thời tiết (Weather) thêm tác dụng cảu thời tiết như mưa, tuyết, sương mờ, …
image

Đối với văn bản có: [3]

  1. Xáo trộn từ / câu ( Shuffling )
  2. Thay thế từ ( replacement ) – thay thế từ bằng từ đồng nghĩa
  3. Syntax-tree (Cây cú pháp): diễn giải câu sao cho đúng ngữ pháp bằng cách sử dụng các từ liên quan nhau.
  4. Còn rất nhiều phương pháp khác được mô tả kĩ trong bài viết về Tăng cường dữ liệu trong NLP


Các vấn đề của Data Augmentation

Tính phụ thuộc dữ liệu và ứng dụng

Vấn đề là có quá nhiều cách thức augmentation, vậy đâu sẽ là cách chọn cho ra chất lượng tốt nhất ? Câu trả lời là – tùy thuộc vào dữ liệu (số lượng mẫu, tính balance/imbalance của mẫu, dữ liệu test, v.v. và ứng dụng tương ứng).
Nghĩa là mỗi bộ dữ liệu sẽ có cách thức riêng để augmentation sao cho ra kết quả tốt nhất.

Chẳng hạn khi muốn nhận dạng quả bóng tròn, thì ta xoay kiểu gì nó vẫn ra quả bóng. Tuy nhiên, hãy thử với việc nhận diện chữ số, với việc xoay theo chiều ngang số 8 vẫn là 8, nhưng 6 sẽ thành 9 và sẽ không ra số gì theo chiều dọc.

Theo bạn đây là số mấy, số 6 hay số 9? - Đố vui IQ - Đố vui IQ có đáp án -  Câu hỏi IQ - Câu hỏi IQ có đáp

Sự đa dạng của augmentation

Với danh sách các thương thức augmentation kể trên. Bản thân mỗi augmenation lại có các yếu tố điều khiển riêng. Ta có thể phân loại thành:

  • Các phương thức augmentation: flip, rotation, random crop, v.v.
  • Các yếu tố điều khiển augmentation: mỗi augmenation sẽ có các yếu tố điều khiển riêng. Ví dụ rotation thì bao nhiêu độ, scaling thì scaling lên xuống bao nhiêu lần, crop random thì random trong khoảng bao nhiêu …
  • Tần suất sử dụng từng phương thức augmentation?
  • Cách augmentation tốt nhất là một bộ các phương thức augmentation
  • Cách augmenation cho từng giai đoạn training/epoch có thể khác nhau. Epoch đầu ở leanring rate lớn có thể khác với các epoch cuối ở learning rate nhỏ
  • Cách augmenation cho từng class, tần suất dùng augmenation có thể khác nhau
  • Cách augmenation cũng có thể bị ảnh hưởng bở cấu trúc mạng. Tức là augmentation cho mức gain khác nhau tới từng network

Các phương pháp hay nhất cùng mẹo và thủ thuật

Việc phụ thuộc vào dữ liệu và ứng dụng, kiến trúc mạng, sự đa dạng kể trên đồng nghĩa với việc bạn cần phải thử kha khá, và chắc chắn sẽ tốn rất nhiều thời gian cho việc đi tìm ra cách augmentation tốt nhất.

Điều đáng nói là mặc dù Data Augmentation là một công cụ mạnh mẽ nhưng bạn nên sử dụng nó một cách cẩn thận. Mình sẽ viết ra một vài quy tắc chung mà bạn có thể sử dụng được khi dùng đến nó: [3]

  • Chọn lựa phương pháp tăng cường phù hợp với mục đích của bạn. Hãy tưởng tượng rằng bạn đang cố gắng phát hiện một khuôn mặt trên hình ảnh. Bạn chọn Random Crop làm kỹ thuật tăng cường và đột nhiên … bạn biết điều gì rồi đấy. Không có khuôn mặt nào trên ảnh vì nó đã bị xóa một cách ngẫu nhiên. Hãy thật sự logic khi lựa chọn các kỹ thuật tăng cường dữ liệu .
  • Không nên tích hợp quá nhiều augmentation trong cùng một lúc. Bạn có thể chỉ cần tạo một dữ liệu thử nghiệm có sự khác biệt với dữ liệu ban đầu là thành công rồi.
  • Hãy luôn hiển thị dữ liệu được tăng cường (hình ảnh và văn bản) trong notebook của bạn, hãy nghe mẫu âm thanh đã chuyển đổi trước khi bắt đầu training. Rất dễ mắc sai lầm, đó là lý do tại sao tốt hơn hết là bạn nên kiểm tra lại kết quả.
  • Định lượng thời gian cho quá trình tăng cường và kiểm tra số lượng tài nguyên có được để áp dụng các tính toán liên quan. .

Các thư viện trong việc tăng cường dữ liệu

Augmentor

Chuyển sang các thư viện, Augmentor là một gói Python nhằm mục đích vừa là một công cụ tăng cường dữ liệu vừa là một thư viện với các chức năng xử lý hình ảnh cơ bản

Nó khá dễ dàng để cài đặt Augmentor thông qua pip:

pip install Augmentor 

Augmentor bao gồm một số lớp cho các chức năng chuyển đổi hình ảnh, chẳng hạn như cắt, xoay , lật, .v.v

Augmentor cho phép người dùng chọn một tham số xác suất cho các hoạt động chuyển đổi. Tham số này kiểm soát tần suất hoạt động được áp dụng. Do đó, Augmentor như là hình thành một đường ống dẫn liên kết các hoạt động tăng cường với nhau.

Điều này có nghĩa là mỗi lần một hình ảnh được truyền qua ống dẫn, một hình ảnh hoàn toàn khác sẽ được trả về. Tùy thuộc vào số lượng tác vụ trong đường ống và tham số xác suất, một lượng rất lớn dữ liệu hình ảnh mới có thể được tạo ra. Về cơ bản, đây là một cách tăng cường dữ liệu khá tốt.

Chúng ta có thể làm gì với hình ảnh bằng Augmentor? Augmentor tập trung hơn vào biến đổi hình học mặc dù nó cũng có các phép bổ sung khác. Các tính năng chính của Augmentor đó là:

  1. Perspective skewing – nhìn hình ảnh từ một góc độ khác
  2. Elastic distortions – thêm các biến dạng vào hình ảnh
  3. Rotating – đơn giản là việc xoay ảnh
  4. Shearing/Cropping – cắt xén và nghiêng ảnh
  5. Mirroring – áp dụng nhiều kiểu lật lại với nhau

Augmentor là một thư viện tốt. Bạn có thể sử dụng nó với framework khác nhau của DeepLearning ( TF, Keras, PyTorch, MxNet ).

Thật không may, Augmentor không phải là một tính năng nhanh và linh hoạt . Có những thư viện có sẵn với nhiều chức năng chuyển đổi hơn và có thể thực hiện tăng cường theo cách nhanh hơn và hiệu quả hơn. Đó là lý do tại sao Augmentor có lẽ là ít phổ biến nhất trong thư viện Deep Learning.

Cách dùng đơn giản của Augmentor :

import Augmentor 
#Gọi nó 
p = Augmentor.Pipeline("/path/to/images") 

#Tạo ống dẫn  
p.rotate(probability=0.7, max_left_rotation=10, max_right_rotation=10) 

#Bổ sung tác vụ 
p.zoom(probability=0.3, min_factor=1.1, max_factor=1.6) 

#Xây dựng hình ảnh tăng cường từ mẫu 
p.sample(10000)

ImgAug

ImgAug cũng là một thư viện để tăng cường hình ảnh. Tuy nhiên nó khá khác với Augmentors chỉ tập trung vào các phép biến đổi hình học thì ImgAug lại có tính năng chính hơi kì lạ là khả năng thực thi các phép tăng cường trên nhiều lõi CPU . Nếu các bạn muốn hiểu hơn về điều đó, có thể xem thêm ở hướng dẫn .

ImgAug có thể được cài đặt dễ dàng thông qua pip hoặc conda

pip install imgaug

Cách sử dụng ImgAug:

Giống như các thư viện tăng cường hình ảnh khác , ImgAug rất dễ sử dụng. Để xác định một đường ống dẫn tăng cường, hãy sử dụng tuần tự các phương pháp và sau đó chỉ cần xếp chồng các hoạt động chuyển đổi khác nhau như trong các thư viện khác.

from imgaug import augmenters as iaa

seq = iaa.Sequential([
     iaa.Crop(px=(0, 16)),
     iaa.Fliplr(0.5),
     iaa.GaussianBlur(sigma=(0, 3.0))])

for batch_idx in range(1000):
     images = load_batch(batch_idx)
     images_aug = seq(images=images)

Autoaugment/DeepAugment

Autoaugment đã giúp cải thiện hiệu suất của mô hình hiện đại nhất trên các tập dữ liệu như các bộ dữ liệu CIFAR-10, CIFAR-100, ImageNet và khác.

Tuy nhiên, AutoAugment khó sử dụng vì nó không cung cấp các module điều khiển, điều này ngăn người dùng chạy nó cho tập dữ liệu của riêng họ.

Qua đó, chúng ta hãy xem xét kỹ hơn về DeepAugment , một giải pháp thay thế nhanh hơn và linh hoạt hơn cho AutoAugment . DeepAugment không có mối liên hệ chặt chẽ nào với AutoAugment ngoài ý tưởng chung và được phát triển bởi một nhóm người. Bạn có thể cài đặt nó qua pip:

pip install deepaugment

Điều quan trọng là chúng ta phải biết cách sử dụng DeepAugment để có được các chiến lược tăng cường tốt nhất cho hình ảnh của mình. Để làm được điều đó, bạn cần tìm hiểu qua kho lưu trữ chính thức của Github .

Nhìn chung, cả AutoAugment DeepAugment đều không được sử dụng phổ biến. Tuy nhiên, có thể sẽ khá hữu ích khi chạy chúng nếu bạn không biết kỹ thuật tăng cường nâng cao nào sẽ là tốt nhất cho dữ liệu của mình. Bạn chỉ nên nhớ rằng sẽ mất nhiều thời gian vì sẽ đào tạo nhiều người mẫu.

Data Augmentaion trong bài toán Scene Text

SynthText

SynthText là một phương pháp generation được giới thiệu tại hội nghị CVPR2016 với tên đầy đủ là “Synthetic Data for Text Localisation in Natural Images” [4]

Đây là phương pháp tạo ra ảnh chứa text (từ, câu, văn bản) dạng Graphic text bằng cách đặt các từ có nghĩa (word instances) vào những hình ảnh với bối cảnh tự nhiên (natural scene images), đặc biệt nó không đặt các text một các ngẫu nhiên mà có tính toán bố cục cụ thể

Mẫu văn bản cảnh tổng hợp
Một vài hình ảnh trong SynthText dataset

Nhóm nghiên cứu đã công bố bộ dữ liệu tạo trước với 800000 hình ảnh. Hiện nay, SynthText đã chạy được với bộ từ điển của nhiều ngôn ngữ khác nhau, trong đó có cả Tiếng Việt. Bạn có thể tìm hiểu thông tin chi tiết về mã nguồn và cách chạy tại GitHub

SRNet

Dẫn lời tác giả Niwhskal “SRNet – a neural network that tackles the problem of text editing in images. It marks the inception of an area of research that could automate advanced editing mechanisms in the future.” [5] Có thể thấy SRNet là một phương pháp tăng cường dữ liệu khi nó có thể chỉnh sửa văn bản trong bất kỳ hình ảnh nào trong khi vẫn duy trì ngữ cảnh, kiểu chữ và màu sắc.

L – Source ; R – Modified

Phương pháp này chính là dạng Editing Text in the Wild, làm đa dạng word instances trong khi bố cục hình ảnh không thay đổi so với ảnh gốc. Để hiểu về SRNet, bạn có thể tìm hiểu vài viết gốc và mã nguồn lưu trữ tại GitHub

Lời kết

Cảm ơn các bạn đọc đã đồng hành cùng mình xuyên suốt bài viết. Mong rằng qua bài viết này mình đã giúp đỡ các bạn hiểu biết thêm về Data Augmentation – một cách tiếp cận “dễ”, “rẻ” cho việc tăng cường dữ liệu. Bên cạnh đó cũng đã đề cấp đến 2 phương pháp (SynthText và SRNet) có thể hỗ trợ các bạn trong việc đa dạng dữ liệu cho bài toán Scene Text Detection từ cuộc thi Tempo Run của CLB AI – KHMT.

Hẹn gặp lại các bạn ở những bài viết sau!

Hoai Nam Nguyen – KHNT2020


Reference:

Leave a Reply

Your email address will not be published. Required fields are marked *