Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການແບ່ງສ່ວນຮູບພາບ (Image Segmentation): ການວິເຄາະພື້ນທີ່ປ່າໄມ້ໃນລາວ

ໂພສເມື່ອ # Computer Vision # Deep Learning # Image Segmentation # Remote Sensing # PyTorch

ການແບ່ງສ່ວນຮູບພາບ (Image Segmentation): ການວິເຄາະພື້ນທີ່ປ່າໄມ້ໃນລາວດ້ວຍ U-Net

ປະເທດລາວອຸດົມສົມບູນໄປດ້ວຍຊັບພະຍາກອນປ່າໄມ້, ໂດຍສະເພາະເຂດສາຍພູຫຼວງ ແລະ ພາກເໜືອ. ແນວໃດກໍຕາມ, ບັນຫາການຖາງປ່າເຮັດໄຮ່ ແລະ ການລັກລອບຕັດໄມ້ ຍັງຄົງເປັນສິ່ງທ້າທາຍໃຫຍ່ສຳລັບການອະນຸລັກ. ເພື່ອແກ້ໄຂບັນຫານີ້ໃນລະດັບມະຫາພາກ, ການນຳໃຊ້ Computer Vision (CV) ໂດຍສະເພາະເທັກນິກ Semantic Image Segmentation ຮ່ວມກັບຮູບພາບດາວທຽມ (ເຊັ່ນ: Sentinel-2 ຫຼື Landsat) ແມ່ນກາຍເປັນເຄື່ອງມືທີ່ຊົງພະລັງທີ່ສຸດ.

ໃນບົດຄວາມນີ້, ເຮົາຈະລົງເລິກເຖິງສະຖາປັດຕະຍະກຳ U-Net ເຊິ່ງເປັນໂມເດວ Deep Learning ທີ່ໄດ້ຮັບຄວາມນິຍົມສູງສຸດໃນການຈັດແຍກພິກເຊວ (Pixel-level classification) ຂອງຮູບພາບດາວທຽມ, ພ້ອມທັງວິທີການແກ້ໄຂບັນຫາ Class Imbalance (ຄວາມບໍ່ສົມດຸນຂອງຂໍ້ມູນ) ທີ່ມັກພົບໃນວຽກງານການຕິດຕາມການສູນເສຍປ່າໄມ້.


1. ເປັນຫຍັງຕ້ອງໃຊ້ U-Net ສຳລັບຮູບພາບດາວທຽມໃນລາວ?

ຮູບພາບດາວທຽມຂອງພື້ນທີ່ປ່າໄມ້ໃນລາວ (ເຊັ່ນ: ບໍລິເວນພູພຽງນາກາຍ) ມັກຈະມີຄວາມຊັບຊ້ອນສູງ ເນື່ອງຈາກມີເມກບັງ, ເງົາຂອງພູເຂົາ, ແລະ ສີຂອງດິນແດງລູກຮັງທີ່ມັກຈະປົນກັບພື້ນທີ່ປ່າເຊື່ອມໂຊມ. U-Net ຖືກພັດທະນາມາເພື່ອກວດຈັບລາຍລະອຽດທີ່ຊັດເຈນໃນລະດັບພິກເຊວ ຜ່ານສະຖາປັດຕະຍະກຳແບບ Encoder-Decoder ທີ່ມີ Skip Connections.

ສະຖາປັດຕະຍະກຳພື້ນຖານ (Architecture Overview)


2. ການກຽມຂໍ້ມູນ (Data Preparation) : Multi-spectral Tensors

ໃນການດຶງຂໍ້ມູນດາວທຽມ, ເຮົາຈະບໍ່ໃຊ້ພຽງແຕ່ພາບສີ RGB ເທົ່ານັ້ນ. ການຕິດຕາມພືດພັນໃນລາວຈະຕ້ອງອາໄສແບນ (Band) ໄລຍະຄື້ນອິນຟາເຣດໃກ້ (Near-Infrared - NIR) ເພື່ອຄິດໄລ່ຄ່າ NDVI (Normalized Difference Vegetation Index).

ສູດການຄິດໄລ່ຄ່າ NDVI: NDVI=(NIRRed)(NIR+Red)NDVI = \frac{(NIR - Red)}{(NIR + Red)}

ໃນ PyTorch, ຮູບພາບດາວທຽມຈະຖືກໂຫຼດເຂົ້າເປັນ Tensors ໃນຮູບແບບ (Batch_Size, Channels, Height, Width) ໂດຍ Channels ສາມາດມີເຖິງ 13 ແບນສຳລັບ Sentinel-2.


3. ການສ້າງໂມເດວ U-Net ດ້ວຍ PyTorch ຄົບວົງຈອນ (Implementation)

ນີ້ຄືຕົວຢ່າງຂອງການຂຽນໂມເດວ U-Net ຂັ້ນພື້ນຖານໃນ PyTorch ສໍາລັບຮັບຂໍ້ມູນພາບດາວທຽມແບບ 4 ຂະໜາດ (RGB + NIR):

import torch
import torch.nn as nn
import torch.nn.functional as F

class DoubleConv(nn.Module):
    """ ເຮັດ Spatial Convolutions ສອງຄັ້ງດ້ວຍ Batch Normalization """
    def __init__(self, in_channels, out_channels):
        super().__init__()
        self.double_conv = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        return self.double_conv(x)

class UNet(nn.Module):
    def __init__(self, n_channels=4, n_classes=1): # 4 channels: RGB+NIR, 1 class: Deforestation
        super(UNet, self).__init__()
        
        self.inc = DoubleConv(n_channels, 64)
        self.down1 = nn.Sequential(nn.MaxPool2d(2), DoubleConv(64, 128))
        self.down2 = nn.Sequential(nn.MaxPool2d(2), DoubleConv(128, 256))
        
        self.up1 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2)
        self.conv_up1 = DoubleConv(256, 128) # 128 + 128 (skip connection)
        
        self.up2 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)
        self.conv_up2 = DoubleConv(128, 64)
        
        self.outc = nn.Conv2d(64, n_classes, kernel_size=1)

    def forward(self, x):
        # Encoder
        x1 = self.inc(x)
        x2 = self.down1(x1)
        x3 = self.down2(x2)
        
        # Decoder ກັບ Skip Connections
        y = self.up1(x3)
        # Handle padding inconsistencies
        diffY = x2.size()[2] - y.size()[2]
        diffX = x2.size()[3] - y.size()[3]
        y = F.pad(y, [diffX // 2, diffX - diffX // 2, diffY // 2, diffY - diffY // 2])
        
        y = torch.cat([x2, y], dim=1) # Skip connection
        y = self.conv_up1(y)
        
        y2 = self.up2(y)
        diffY = x1.size()[2] - y2.size()[2]
        diffX = x1.size()[3] - y2.size()[3]
        y2 = F.pad(y2, [diffX // 2, diffX - diffX // 2, diffY // 2, diffY - diffY // 2])
        
        y2 = torch.cat([x1, y2], dim=1) # Skip connection
        y2 = self.conv_up2(y2)
        
        logits = self.outc(y2)
        return torch.sigmoid(logits)

# ທົດສອບ Tensor Input
model = UNet(n_channels=4, n_classes=1)
dummy_tensor = torch.randn(1, 4, 256, 256) # Batch=1, Channels=4, 256x256 image
output = model(dummy_tensor)
print(f"Output shape: {output.shape}") 

4. ການປັບປຸງຄວາມແມ່ນຍຳ (Optimization) ດ້ວຍ Loss Functions ຂັ້ນສູງ

ໃນປະເທດລາວການກວດຈັບການຖາງປ່າ ມີລັກສະນະເປັນ Highly Imbalanced Data Problem. ໝາຍຄວາມວ່າ ໃນຮູບດາວທຽມຂະໜາດ 1024×10241024 \times 1024 ພິກເຊວ, ພື້ນທີ່ເຊິ່ງຖືກຕັດໄມ້ອາດຈະກວມເອົາພຽງແຕ່ 5%5\% ຂອງຮູບພາບທັງໝົດ, ອີກ 95%95\% ແມ່ນປ່າໄມ້ທີ່ອຸດົມສົມບູນ.

ຖ້າເຮົາໃຊ້ Binary Cross Entropy (BCE) Loss, ໂມເດວອາດຈະຮຽນຮູ້ທີ່ຈະທຳນາຍທຸກຢ່າງວ່າເປັນ “ປ່າໄມ້” ໝົດ ແລ້ວໄດ້ Accuracy ທີ່ສູງເຖິງ 95% ແຕ່ໃຊ້ງານຈິງບໍ່ໄດ້. ວິທີການແກ້ໄຂແມ່ນການນຳໃຊ້ Dice Loss ຫຼື Focal Loss:

Dice Coefficient Loss

Dice Loss ແມ່ນການວັດແທກຄວາມທັບຊ້ອນ (Overlap) ລະຫວ່າງການທຳນາຍຂອງໂມເດວ ແລະ Ground Truth (Annotation) ທີ່ອະນຸຍາດໃຫ້ໂມເດວເລັ່ງເປົ້າໃສ່ການ Segmentation ທີ່ຊັດເຈນ.

Dice Loss=12(pigi)+ϵpi+gi+ϵ\text{Dice Loss} = 1 - \frac{2 \sum (p_i \cdot g_i) + \epsilon}{\sum p_i + \sum g_i + \epsilon} (ໂດຍ pip_i ແມ່ນຄ່າຄວາມໜ້າຈະເປັນທີ່ໂມເດວທຳນາຍ ແລະ gig_i ແມ່ນຄ່າຄວາມຈິງ (Ground Truth), ϵ\epsilon ແມ່ນຄ່າຄົງທີ່ນ້ອຍໆເພື່ອປ້ອງກັນການຫານດ້ວຍສູນ)

Focal Loss

Focal loss ຈະລົງໂທດ (penalize) ການທຳນາຍທີ່ຜິດພາດໃນກຸ່ມ Class ທີ່ຫາຍາກ (Minority class - ໃນກໍລະນີນີ້ຄືພື້ນທີ່ປ່າຖືກທຳລາຍ) ຫຼາຍກວ່າປົກກະຕິ ໂດຍການຕື່ມປັດໄຈການດັດປັບ (1pt)γ(1 - p_t)^\gamma.


ຂໍ້ສັງເກດສຳຄັນ ສຳລັບການໃຊ້ງານໃນລາວ (Key Takeaways)


ບົດສະຫຼຸບ

ເຕັກໂນໂລຊີ Computer Vision ໂດຍສະເພາະແບບຈຳລອງ U-Net ໄດ້ຍົກລະດັບວິທີການຕິດຕາມແລະຄຸ້ມຄອງຊັບພະຍາກອນທຳມະຊາດໃນປະເທດລາວໄປອີກຂັ້ນ. ຈາກແຕ່ກ່ອນທີ່ເຈົ້າໜ້າທີ່ກະຊວງກະສິກຳ ແລະ ປ່າໄມ້ ຕ້ອງໃຊ້ເວລາຫຼາຍເດືອນໃນການລົງພື້ນທີ່ສຳຫຼວດດິນແດນອັນກວ້າງໃຫຍ່ໄພສານແລະຫຍຸ້ງຍາກໃນການເຂົ້າເຖິງ ດຽວນີ້ດ້ວຍການຂຽນໂມເດວ Deep Learning ຮ່ວມກັບພາບດາວທຽມ ເຮົາສາມາດທີ່ຈະລະບຸຈຸດພິກັດທີ່ມີການບຸກລຸກ ຫຼື ການປ່ຽນແປງພື້ນທີ່ປ່າໄດ້ໃນລະດັບຄວາມແມ່ນຍຳສູງ ແລະ ເປັນແບບ Real-time. ສິ່ງນີ້ບໍ່ພຽງແຕ່ເປັນການປະຍຸກໃຊ້ຄະນິດສາດ ແລະ ວິທະຍາການຄອມພິວເຕີລະດັບສູງ ແຕ່ມັນຄືອາວຸດສຳຄັນໃນການຊ່ວຍປົກປັກຮັກສາສິ່ງແວດລ້ອມສີຂຽວຂອງລາວໃຫ້ຍືນຍົງຕໍ່ໄປ.