Hướng dẫn huấn luyện mô hình phân vùng phủ đất đầu tiên với bộ dữ liệu OpenEarthMap-SAR

Tổng quan: Xây dựng mô hình phân vùng phủ đất từ bộ dữ liệu OpenEarthMap-SAR

1. Giới thiệu công nghệ SAR và giá trị của bộ dữ liệu OpenEarthMap-SAR

Công nghệ Cảm biến Tạo ảnh Tổng hợp (SAR) đang thay đổi cách chúng ta quan sát bề mặt Trái Đất. So với cảm quang truyền thống, SAR có khả năng hoạt động mọi thời tiết, có thể xuyên qua mây và một phần tán cây, và thu thập dữ liệu chất lượng cao ngay cả vào ban đêm. Ưu điểm độc đáo này khiến nó trở nên không thể thay thế trong các lĩnh vực như giám sát thiên tai và khảo sát tài nguyên.

OpenEarthMap-SAR, với tư cách là bộ dữ liệu chính thức của Cuộc thi Kết hợp Dữ liệu IEEE GRSS năm 2025, đại diện cho tiêu chuẩn cao nhất hiện nay trong lĩnh vực phân vùng phủ đất SAR. Bộ dữ liệu này chứa 5033 hình ảnh từ 35 khu vực ở Nhật Bản, Pháp và Mỹ, mỗi hình ảnh có độ phân giải 1024×1024 pixel và khoảng cách lấy mẫu mặt đất đạt 0.15-0.5 mét. Bộ dữ liệu cung cấp 8 nhãn phủ đất:

  • Công trình (khu vực đô thị)
  • Đường bộ (mạng lưới giao thông)
  • Nước (sông, hồ nước)
  • Cây cối (thực vật rừng)
  • Đất nông nghiệp (vùng canh tác)
  • Đất chăn nuôi (thực vật cỏ)
  • Đất trần (đất chưa phát triển)
  • Khu vực phát triển (khu vực được cải tạo bởi con người)

Lưu ý: Bộ dữ liệu chứa các nhãn giả và một số nhãn được gán thủ công, khi sử dụng thực tế nên ưu tiên sử dụng tập con có nhãn thật (5 nhãn thật cho mỗi khu vực) để tinh chỉnh mô hình.

2. Cấu hình môi trường và chuẩn bị dữ liệu

2.1 Thiết lập môi trường cơ bản

Khuyến nghị sử dụng Python 3.8+ và PyTorch 1.12+. Dưới đây là lệnh cài đặt các phụ thuộc chính:

pip install torch torchvision torchaudio
pip install opencv-python albumentations segmentation-models-pytorch

2.2 Tải và tiền xử lý bộ dữ liệu

Bộ dữ liệu có thể được lấy từ nền tảng Zenodo (số bản ghi 14622048). Sau khi tải xuống, cần thực hiện các bước tiền xử lý sau:

  1. Giải nén dữ liệu và kiểm tra cấu trúc
  2. Xác minh tính nhất quán của nhãn
  3. Thiết kế chiến lược tăng cường dữ liệu

Nên sử dụng kết hợp tăng cường sau:

import albumentations as A

train_transform = A.Compose([
    A.RandomRotate90(),
    A.HorizontalFlip(),
    A.VerticalFlip(),
    A.RandomBrightnessContrast(p=0.5),
    A.GaussNoise(var_limit=(10.0, 50.0)),
])

2.3 Triển khai trình tải dữ liệu

Ví dụ lớp Dataset tùy chỉnh:

class BoDuLieuSAR(torch.utils.data.Dataset):
    def __init__(self, thu_muc_anh, thu_muc_nhan, bien_doi=None):
        self.thu_muc_anh = thu_muc_anh
        self.thu_muc_nhan = thu_muc_nhan
        self.bien_doi = bien_doi
        self.hinh_anh = sorted(glob.glob(f"{thu_muc_anh}/*.tif"))
        
    def __getitem__(self, idx):
        hinh_anh = Image.open(self.hinh_anh[idx])
        nhan = Image.open(self.hinh_anh[idx].replace(thu_muc_anh, thu_muc_nhan))
        
        if self.bien_doi:
            thanh_phan = self.bien_doi(image=np.array(hinh_anh), mask=np.array(nhan))
            hinh_anh = thanh_phan['image']
            nhan = thanh_phan['mask']
            
        return torch.from_numpy(hinh_anh).permute(2, 0, 1).float() / 255.0, torch.from_numpy(nhan).long()
    
    def __len__(self):
        return len(self.hinh_anh)
    

3. Xây dựng kiến trúc mô hình phân vùng

Mô hình phân vùng SAR hiệu quả thường sử dụng kiến trúc U-Net với các khối Attention để nhấn mạnh các đặc trưng quan trọng. Dưới đây là cài đặt đơn giản:

import segmentation_models_pytorch as smp

mo_hinh = smp.Unet(
    encoder_name="resnet34",
    encoder_weights="imagenet",
    in_channels=1,
    classes=8,
)

4. Quy trình huấn luyện và đánh giá

4.1 Hàm mất mát và trình tối ưu

ham_mat_mat = smp.losses.DiceLoss(mode='multiclass')
toi_uu = torch.optim.Adam(mo_hinh.parameters(), lr=0.001)

4.2 Vòng lặp huấn luyện

for epoch in range(so_luong_epoch):
    mo_hinh.train()
    for anh, nhat in data_loader:
        toi_uu.zero_grad()
        
        du_doan = mo_hinh(anh)
        mat_mat = ham_mat_mat(du_doan, nhat)
        
        mat_mat.backward()
        toi_uu.step()
        
    # Đánh giá trên tập kiểm tra
    mo_hinh.eval()
    with torch.no_grad():
        for anh, nhat in data_loader_kiem_tra:
            du_doan = mo_hinh(anh)
            # Tính toán độ chính xác
            

4.3 Lưu và tải mô hình đã huấn luyện

torch.save(mo_hinh.state_dict(), 'mo_hinh_phan_vung_sar.pth')
# Để tải mô hình:
# mo_hinh.load_state_dict(torch.load('mo_hinh_phan_vung_sar.pth'))

Thẻ: phân vùng ảnh SAR Học sâu PyTorch xử lý ảnh vệ tinh

Đăng vào ngày 23 tháng 5 lúc 23:41