Tạo dữ liệu hình ảnh bị nhiễu để huấn luyện mô hình xử lý ảnh

Tạo dữ liệu hình ảnh bị nhiễu để huấn luyện mô hình xử lý ảnh

avatar

Minh Huynh

2025.05.06

Tạo dữ liệu hình ảnh bị nhiễu để huấn luyện mô hình xử lý ảnh (ví dụ như autoencoder, denoising models).

Lab Introduction

  • AWS experience: Beginner
  • Time to complete: 20 minutes
  • Cost to complete: Free Tier
  • Services used: Google Colab

Giới thiệu về Lab

Bài thực hành này sẽ hướng dẫn mọi người cách tạo dữ liệu hình ảnh bị nhiễu để huấn luyện mô hình xử lý ảnh (ví dụ như autoencoder, denoising models).

🎯 Ứng dụng thực tế:

  • Dùng để huấn luyện mô hình khử nhiễu ảnh (denoising autoencoder).
  • Tạo thêm tập dữ liệu mở rộng khi gặp trường hợp tập dữ liệu bị mất cân bằng (Imbalanced Dataset) phục vụ học sâu.

1. Làm quen với Google Colab

Google Colab là dịch vụ đám mây miễn phí độc đáo được cung cấp bởi Google, phát triển từ Dự án Jupyter. Google Colab mang đến môi trường lập trình Python linh hoạt và dễ sử dụng cho cộng đồng AI. Ưu điểm của Google Colab bao gồm truy cập miễn phí, sử dụng GPU và TPU, tích hợp mượt mà với Google Drive.

Để sử dụng Colaboratory, bạn phải có tài khoản Google, sau đó truy cập Colaboratory bằng tài khoản của bạn vào được link: https://colab.research.google.com/

Dưới đây là các bước hướng dẫn bạn sử dụng Google Colab.

  1. Tạo thư mục trên Google Drive

Vì Colab được lưu trữ trên Google Drive, vì thế bạn nên gom những file Colab này vào cùng một thư mục, để tránh sau này lưu trữ và chia sẽ nhầm file và folder. Trong giao diện Google Drive bạn nhấn New  để tạo ra một Folder mới và đặt tên cho nó.

  1. Tạo Colab Notebook mới và đặt tên

Để tạo một Colab Notebook mới, bạn nhấp chuột phải => More => Colaboratory

Để đổi tên Notebook, bạn hãy nhấp vào tên tệp.

Sau đó mở file vừa tạo lên, bạn sẽ thấy giao diện như sau:

  1. Bạn double click vào Title (mặc định là Untitiled) và tiến hành đổi tên file.

2. Viết code triển khai step-by-step

1. Tải ảnh từ máy người dùng lên Colab

from google.colab import files
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

📌 Giải thích:

  • google.colab.files: Thư viện hỗ trợ upload/download file giữa máy tính và Colab.
  • PIL.Image: Xử lý ảnh (mở, lưu, chuyển đổi định dạng).
  • numpy: Thư viện toán học xử lý dữ liệu mảng (như ảnh số).
  • matplotlib.pyplot: Vẽ biểu đồ và hiển thị ảnh.
uploaded = files.upload()

➡️ Mở giao diện để người dùng chọn và upload ảnh từ máy tính lên Colab.

filename = next(iter(uploaded))

➡️ Lấy tên file đầu tiên mà người dùng vừa upload (vì uploaded là dict).

image = Image.open(filename).convert("RGB")
image_np = np.array(image) / 255.0

➡️ Mở ảnh và chuyển sang định dạng RGB (đảm bảo không phải đen trắng hoặc RGBA). ➡️ Chuyển ảnh sang numpy array và chuẩn hóa pixel về khoảng [0, 1] (phổ biến trong xử lý ảnh cho AI).

2. Hàm thêm nhiễu Gaussian

def add_noise(image_np, noise_level):
    noise = np.random.normal(loc=0, scale=noise_level, size=image_np.shape)
    noisy_image = image_np + noise
    noisy_image = np.clip(noisy_image, 0, 1)
    return (noisy_image * 255).astype(np.uint8)

📌 Giải thích:

  • Hàm này thêm nhiễu Gaussian (nhiễu trắng) vào ảnh.
  • np.random.normal(...): Tạo mảng nhiễu với phân phối chuẩn có trung bình 0 và độ lệch chuẩn là noise_level.
  • image_np + noise: Cộng nhiễu vào ảnh gốc.
  • np.clip(...): Đảm bảo giá trị pixel không vượt ngoài [0, 1].
  • * 255.astype(np.uint8): Chuyển ảnh về lại định dạng gốc (0-255 và kiểu uint8).

3. Tạo và lưu 10 ảnh nhiễu (có thể tạo nhiều hơn hoặc ít hơn)

os.makedirs("noisy_images", exist_ok=True)
num_images = 10
noise_levels = np.linspace(0.2, 0.6, num_images)  # hoặc dùng np.random.uniform()
noisy_image_list = []

📌 Giải thích:

  • Tạo thư mục "noisy_images" để lưu ảnh bị nhiễu.
  • num_images: Số lượng ảnh nhiễu sẽ tạo.
  • np.linspace(...): Tạo 10 giá trị nhiễu đều từ 0.2 đến 0.6.
    • 📝 Lựa chọn hợp lý để có nhiều mức độ nhiễu.
  • noisy_image_list: Danh sách chứa các ảnh nhiễu để hiển thị sau.
for i in range(num_images):
    noisy_img = add_noise(image_np, noise_levels[i])
    noisy_image_list.append(noisy_img)
    Image.fromarray(noisy_img).save(f"noisy_images/noisy_image_{i+1}.png")

➡️ Duyệt qua từng mức nhiễu:

  • Gọi hàm add_noise để tạo ảnh bị nhiễu.
  • Lưu ảnh vào danh sách để hiển thị.
  • Ghi ảnh ra file với tên noisy_image_1.png, ..., noisy_image_10.png.

4. Hiển thị toàn bộ ảnh nhiễu để review

plt.figure(figsize=(20, 5))
for i, img in enumerate(noisy_image_list):
    plt.subplot(2, 5, i + 1)
    plt.imshow(img)
    plt.title(f"Noise level: {noise_levels[i]:.2f}")
    plt.axis("off")
plt.tight_layout()
plt.show()

📌 Giải thích:

  • Tạo khung ảnh có kích thước rộng (20x5 inch).
  • Vẽ 10 ảnh bị nhiễu trong lưới 2 hàng x 5 cột.
  • plt.imshow(img): Hiển thị ảnh.
  • plt.title(...): Ghi mức độ nhiễu phía trên ảnh.
  • plt.axis("off"): Ẩn trục tọa độ.
  • plt.tight_layout(): Tự động căn chỉnh bố cục không bị đè.
  • plt.show(): Hiển thị toàn bộ ảnh.

Full code:

# 1. Tải ảnh từ máy người dùng lên Colab
from google.colab import files
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import os

# Upload ảnh
uploaded = files.upload()

# Lấy tên file đầu tiên
filename = next(iter(uploaded))

# Đọc ảnh gốc
image = Image.open(filename).convert("RGB")
image_np = np.array(image) / 255.0

# 2. Hàm thêm nhiễu Gaussian
def add_noise(image_np, noise_level):
    noise = np.random.normal(loc=0, scale=noise_level, size=image_np.shape)
    noisy_image = image_np + noise
    noisy_image = np.clip(noisy_image, 0, 1)
    return (noisy_image * 255).astype(np.uint8)

# 3. Tạo và lưu 10 ảnh nhiễu
os.makedirs("noisy_images", exist_ok=True)
num_images = 10
noise_levels = np.linspace(0.2, 0.6, num_images)  # hoặc dùng np.random.uniform()

noisy_image_list = []

for i in range(num_images):
    noisy_img = add_noise(image_np, noise_levels[i])
    noisy_image_list.append(noisy_img)
    Image.fromarray(noisy_img).save(f"noisy_images/noisy_image_{i+1}.png")

# 4. Hiển thị toàn bộ ảnh nhiễu ra màn hình
plt.figure(figsize=(20, 5))
for i, img in enumerate(noisy_image_list):
    plt.subplot(2, 5, i + 1)
    plt.imshow(img)
    plt.title(f"Noise level: {noise_levels[i]:.2f}")
    plt.axis("off")
plt.tight_layout()
plt.show()

3. Test kết quả

Nhấn nút Run Cell (icon hình tam giác). Nhấn nút Choose Files -> chọn hình ảnh cần tạo nhiễu. Đợi vài phút hình ảnh sẽ được thêm nhiễu và hiển thị.

Tổng kết:

Trong bài thực hành này minh họa đơn giản:

  • Cách lấy ảnh người dùng.
  • Thêm nhiễu Gaussian để mô phỏng ảnh bị lỗi/hỏng.
  • Lưu và hiển thị ảnh sau khi đã bị nhiễu.