Các phép biến đổi (transforms) được sử dụng để xử lý hình ảnh trong PyTorch
from torchvision import transforms
Cách tốt nhất để học về transforms là tham khảo tài liệu help để hiểu các công cụ (lớp) có sẵn và cách sử dụng chúng
————————————————————————————————————
Khi tự học một lớp, cần chú ý:
- Cách sử dụng Để sử dụng các công cụ (lớp), tuân theo quy trình: khởi tạo đối tượng (khởi tạo) -> truyền tham số, gọi hàm (nếu có phương thức __call__, gọi trực tiếp đối tượng; nếu không, gọi phương thức tương ứng) -> nhận kết quả mong muốn
- Kiểu dữ liệu đầu vào, đầu ra
Để biết cần truyền gì và ở đâu truyền, nếu __init__ cần (ngoại trừ self và các tham số có giá trị mặc định), truyền khi khởi tạo đối tượng; nếu là các phương thức khác, truyền khi gọi phương thức. Mô tả chi tiết tham số ở phần "Args"
Nếu không có thông tin về kiểu dữ liệu đầu ra, có thể sử dụng
print(type(img))để kiểm tra - Mục đích của hàm
Phương thức __init__ và __call__:
- Phương thức __init__: Được gọi tự động mỗi khi khởi tạo một đối tượng từ lớp (tham số đầu tiên luôn là self)
- Phương thức __call__: Cho phép đối tượng lớp được gọi như một hàm thông thường
__init__ luôn được định nghĩa trong lớp, còn __call__ có thể không
Nếu lớp có __call__, có thể gọi đối tượng như sau:
output = obj(input)Nếu không có, sử dụng phương thức của lớp thông qua dấu chấm:output = obj.method(input)———————————————————————————————————— Các lớp phổ biến trong transforms: 1. ToTensor: Chuyển đổi hình ảnh từ loại PIL hoặc ndarray sang Tensor -> CHW
import cv2
anh = cv2.imread(duong_dan_anh)
Sử dụng cv2.imread để đọc ảnh, loại dữ liệu mặc định là numpy (sử dụng kênh màu BGR)
from PIL import Image
anh = Image.open(duong_dan_anh)
Sử dụng Image.open để đọc ảnh, loại dữ liệu mặc định là PIL (sử dụng kênh màu RGB)
ToTensor có thể chuyển đổi cả hai loại dữ liệu trên thành Tensor Lý do sử dụng Tensor: Đóng gói các thông số cần thiết cho mạng nơ-ron ngược *Lưu ý nhỏ: ToTensor sẽ tự động đưa chiều kênh màu lên đầu tiên
from PIL import Image
from torchvision import transforms
duong_dan_anh = r'D:\ai-learning\pytorch\hymenoptera_data\train\bees\16838648_415acd9e3f.jpg'
anh = Image.open(duong_dan_anh)
# Khởi tạo đối tượng -> truyền tham số, gọi hàm -> nhận kết quả
tensor_chuyen_doi = transforms.ToTensor() # Khởi tạo đối tượng
tensor_anh = tensor_chuyen_doi(anh)
# __call__ là một công cụ đặc biệt, cho phép gọi đối tượng như hàm
2. ToPILImage: Chuyển đổi hình ảnh từ loại ndarray hoặc Tensor sang PIL 3. Normalize: Chuẩn hóa (thực chất là chuẩn hóa!) mỗi kênh của hình ảnh Tensor theo công thức \(output = \frac{input-mean}{std}\) Nhận đầu vào là mean và std của từng kênh
chuan_hoa_chuyen_doi = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
anh_chuan_hoa = chuan_hoa_chuyen_doi(tensor_anh)
4. Resize Khởi tạo đối tượng với kích thước mới (chiều cao, chiều rộng), gọi hàm với ảnh, loại ảnh có thể là PIL hoặc Tensor
doi_co_chuyen_doi = transforms.Resize((256, 256))
anh_doi_co = doi_co_chuyen_doi(tensor_anh)
5. Compose Gộp nhiều công cụ (lớp) thành một chuỗi xử lý, cần chú ý kiểu dữ liệu đầu ra của một bước có khớp với đầu vào của bước tiếp theo!
chuoi_xu_ly = transforms.Compose([doi_co_chuyen_doi, chuan_hoa_chuyen_doi])
anh_chuoi_xu_ly = chuoi_xu_ly(tensor_anh)
6. RandomCrop