Chào anh em Mì AI! Hôm nay chúng ta sẽ cùng nhau giải quyết bài toán mà đa số anh em học hỏi DL đều gặp phải là “Có ít dữ liệu, làm sao train model?” bằng cách sử dụng Data Augment nhé!
Anh em join vào lĩnh vực DL đều biết rằng Dữ liệu đóng vai trò cực kỳ quan trọng trong việc thành/bại của bài toán. Tuy nhiên với các anh em mới học DL thì không thể có nhiều dữ liệu đến vậy, nhất là các dữ liệu nhạy cảm và VIP như: chứng minh nhân dân, mặt người, ảnh súng, ảnh xe….Chính điều đó đã cản trở anh em tiếp cận DL và nản lòng rất nhiều.
Do đó hôm nay mình sẽ cùng anh em tìm cách làm sao để có ít dữ liệu vẫn có thể train model thành công nhé. Chương 1 chúng ta sẽ tìm hiểu Data Augment , tạm dịch Tăng Cường Dữ liệu hay Làm Giàu Dữ liệu nhé!
Phần 1 – Nói qua tý về lý thuyết
Bài này mình sẽ focus vào Augment dữ liệu ảnh nhé, còn với các dữ liệu như số liệu, text,…sẽ có cách augment riêng, phù hợp với bài toán, mình sẽ nói sau!
Nôm na là khi train model chúng ta sẽ cần nhiều ảnh, có khi tính bằng đơn vị nghìn ảnh (tất nhiên tùy bài toán). Tuy nhiên anh em ta lại chỉ có vài trăm ảnh là đã khá lắm rồi. Nếu cứ train model với vài trăm ảnh đó thì vừa không hiệu quả vừa dễ bị Overfit nếu cứ train đi train lại nhiều epoch quá. Và đó là lúc anh em nghĩ đến Augment Data để làm giàu đống ảnh đó lên.
Từ vài trăm ảnh có thể tăng cường lên vài nghìn ảnh, vài chục nghìn ảnh như chơi 😀 Phê không? Cách tăng cường là anh em áp dụng các biện pháp chỉnh sửa ảnh như: lật ngang, lật dọc, kéo méo ảnh, phóng to, thu nhỏ ảnh, tăng giảm sáng, tương phản, add noise….và cực nhiều cách khác vào các ảnh hiện có để sinh ra các ảnh mới để train model. Như vậy model sẽ học được nhiều hơn, tổng quát hơn. Anh em tùy vào model là gì, môi trường ra sao để chọn biện pháp tăng cường phù hợp nhé!
Okie, let’s go! Thực hành thử nhé!
Phần 2 – Chuẩn bị nguyên vật liệu
Để tiếp tục thực hành bài này các bạn tạo thư mục MiAI_Data_Augment và tải mã nguồn về bằng lệnh:
git clone https://github.com/thangnch/MiAI_Data_Augment .
Sau đó các bạn chạy lệnh cài đặt thư viện
pip install -r setup.txt
Done! Đã đủ các món, bây giờ thực hành ngay nào!
Phần 3 – Thực hành các biện pháp Data Augment
Để bắt đầu, chúng ta hãy chọn một ảnh ví dụ để tiến hành các biện pháp tăng cường nhé. Mình chọn ảnh này! Xinh hông? 😀
Tất nhiên chúng ta có thể làm việc Data Augment bằng tay, tức là tự viết lệnh để thực hiện ngẫu nhiên các thao tác chỉnh sửa ảnh. Tuy nhiên tội gì mà dùng trâu khi đã có máy cày phải không? Keras đã hỗ trợ chúng ta một class để làm việc này rồi thì anh em Mì cứ dùng luôn cho tiện. Đó là class ImageDataGenerator (nghe tên đã thấy sinh ra ảnh rồi!). Giờ là lúc dùng thử class này nhé.
Cách 1. Phóng to, thu nhỏ ảnh ngẫu nhiên
Cách này sẽ tạo ra các ảnh mới từ ảnh gốc bằng cách zoom lên zoom xuống ngẫu nhiên. Từ đó model sẽ có thể nhận được các đối tượng to hơn hoặc nhỏ hơn đối tượng gốc chúng ta có. Ví dụ 1 đoạn code Augment như sau:
img = load_img('girl.jpg') img = img_to_array(img) data = expand_dims(img, 0) # Dinh nghia 1 doi tuong Data Generator voi bien phap chinh sua anh Zoom tu 0.5x den 2x myImageGen = ImageDataGenerator(zoom_range=[0.5,2.0]) # Batch_Size= 1 -> Moi lan sinh ra 1 anh gen = myImageGen.flow(data, batch_size=1)
Các bạn cần chú ý dòng này:
myImageGen = ImageDataGenerator(zoom_range=[0.5,2.0])
Dòng này định nghĩa mức zoom ngẫu nhiên trong khoảng từ 0.5 (giảm đi 1/2 size) đến 2 (zoom 2 lần) . Và kết quả như sau:
Các bạn xem file aug_zoom.py để có source chi tiết nhé!
Cách 2. Dịch trái dịch phải, dịch lên dịch xuống
Tương tự, các bạn xem file aug_shift.py để có source chi tiết. Trong đó các bạn chú ý dòng này:
myImageGen = ImageDataGenerator(width_shift_range=[-150,150])
Có nghĩa là dịch theo chiều ngang ngẫu nhiên từ -150 px (dịch trái) đến 150 px (dịch phải).
Nếu muốn dịch theo chiều dọc thì ta thay bằng câu lệnh:
myImageGen = ImageDataGenerator(height_shift_range=[-200,200])
Hoặc bạn cũng có thể thay bằng câu lệnh sau để dịch ngang qua trái/phải ngẫu nhiên tối đa 1/4 độ rộng ảnh:
myImageGen = ImageDataGenerator(width_shift_range=0.25)
Kết quả đây:
Cách 3. Tăng giảm độ sáng của ảnh
Cũng tương tự như 2 cách trên, chúng ta sẽ định nghĩa 1 dải sáng cho ảnh, và class Image Generator sẽ tăng cường cho chúng ta 1 cách ngẫu nhiên. Các bạn xem file aug_brightness.py để lấy code nhé.
Chú ý dòng lệnh định nghĩa range sinh ảnh ngẫu nhiên:
# Dinh nghia 1 doi tuong Data Generator voi bien phap chinh sua anh dieu chinh do sang tu 0.2x den 2x myImageGen = ImageDataGenerator(brightness_range=[0.2,2.0])
Kết quả sẽ như sau:
Cách 4. Lật ảnh theo chiều ngang, chiều dọc
Cách này sử dụng để lật ảnh. Ví dụ như em gái bên trên đang quay mặt sang bên trái (so với góc nhìn người xem), để tổng quát hơn thì ta sẽ lật ảnh theo chiều dọc để máy có thể nhận được em ấy khi em ấy quay sang bên phải nhé! Hoặc để có thể nhận em ấy khi em ấy dốc ngược (cho vui thôi nhé) thì mình lật cả chiều dọc 😀
Các bạn xem code file aug_flip.py, còn kết quả đây:
Cách 5. Xoay ảnh
Với cách số 4 bên trên thì máy đã có thể nhận được khi em gái quay sang phải, hay dốc ngược. Tuy nhiên nếu em ấy chỉ hơi nghiêng người tý thì sao. Okie lại augment tiếp bằng xoay ảnh.
Câu lệnh augment sẽ là (góc tối đa là rotation_range=45 độ) trong file aug_rotate.py nhé:
# Dinh nghia 1 doi tuong Data Generator voi bien phap chinh sua anh xoay toi da 45 do
myImageGen = ImageDataGenerator(rotation_range=45)
Kết quả đây:
Cách 6. Làm méo ảnh ngẫu nhiên
Đôi khi ảnh trong thực tế bị méo mó (do điều kiện nhận dạng) chứ không thẳng căng như ảnh train nên ta cũng cần làm méo tý cho model còn nhận được nào.
Đơn giản thôi, dùng câu lệnh thần thánh, file aug_shear.py:
myImageGen = ImageDataGenerator(shear_range=45)
Và ảnh sẽ ngay lập tức méo mó như chưa từng có ah:
Trong tất cả các ví dụ trên, nếu bạn muốn lưu file ảnh được sinh ra xuống ổ cứng, bạn chỉ cần dùng câu lệnh:
cv2.imwrite("Tên file.png",image)
vào trong vòng For là okie nhé! Các bạn tự thêm xem!
Và còn rất nhiều cách Data Augment khác các bạn có thể tự thêm vào như: làm noise, chuyển đen trắng, thêm các vết ố,….. cái này tùy bài toán của các bạn nhé. Mình xin tạm dừng ở đây! Trong Chương tiếp theo mình sẽ cùng tìm hiểu phần tiếp theo là sinh ra dữ liệu – Data Synthesis nhé!
Trich lời admin Tiệp “Nhân tiện (mình chỉ đóng góp thôi chứ không dìm gì đâu nhé), có một số phép augmentation không nên dùng với một vài dữ liệu cụ thể. Chẳng hạn không nên lật với dữ liệu dạng chữ viết. Cũng không nên lật trên dưới với dữ liệu cần phân biệt trời đất (dữ liệu cho xe tự lái, bao gồm người đi bộ). Khi làm nên lưu ý xem các phép augmentations nào phù hợp chứ không nên áp dụng tất cả.”
Hãy join cùng cộng đồng Mì AI nhé!
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube
Cảm ơn tác giả Jason Brownlee đã có bài tham khảo tuyệt vời!
a ơi cho em hỏi , e chạy code xoay ảnh trên colab thì imshow oke ạ nhưng khi imwrite thì màu của ảnh bị thay đổi ạ,
Em tìm cách convert từ RGB sang BGR rồi imwrite thì sẽ không bị nữa nhé.
Cần hỗ trợ thêm em post lên https://facebook.com/groups/miaigroup nhé!