入门语义分割-地表建筑物识别 的学习笔记

本文写下的时间是2023年10月8日下午16:35分

这篇文章严格来说不能算是一篇合格的学习笔记,只能算是我的一些困惑和烦恼。

day1:

我本身不是特别了解AI相关的东西,然后看到几个datawhale的方向感觉语义分割挺高大上的,想了想就说选吧。进去之后果然教程里面没有教什么原理方面的东西,基本上都是一些如何将已有的模型拿来引用,也是成功避免了小白不会的情况。学完了这些东西,我觉得我又行了,然后迫不及待地点开了天池的地标建筑物识别的比赛,然后看了看界面

好吧,又是这种不清楚的东西,然后查了查,发现其实就是将连续的01进行压缩的一种编码,然后用csv文件读进去,decode完成后就可以生成mask掩膜矩阵了

然后就是到教程里干以下的事情

1.安装mmsegmentation,然后调配环境。(用的云GPU平台所以这部没花多少时间)

2.将csv文件里的东西解码,然后将解码后的mask矩阵转成png格式的图片放到训练集里面

3.将对应的图片也放到训练集里面

4.调数据集的配置文件,具体来说就是将里面的类别改成自己想要识别的类别

from mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset

@DATASETS.register_module()
class Building_Identify(BaseSegDataset):
    # 类别和对应的 RGB配色
    METAINFO = {
        'classes':['background', 'building'],
        'palette':[[127,127,127], [200,0,0]]
    }
    
    # 指定图像扩展名、标注扩展名
    def __init__(self,
                 seg_map_suffix='.png',   # 标注mask图像的格式
                 reduce_zero_label=False, # 类别ID为0的类别是否需要除去
                 **kwargs) -> None:
        super().__init__(
            seg_map_suffix=seg_map_suffix,
            reduce_zero_label=reduce_zero_label,
            **kwargs)

5.注册数据集类,具体来说就是将__init__.py里面的引用一下自己的数据集

from .Building_Identify import Building_Identify

再在后面的all里面加上自己的类

__all__ = [
    'BaseSegDataset', 'BioMedical3DRandomCrop', 'BioMedical3DRandomFlip',
    'CityscapesDataset', 'PascalVOCDataset', 'ADE20KDataset',
    'PascalContextDataset', 'PascalContextDataset59', 'ChaseDB1Dataset',
    'DRIVEDataset', 'HRFDataset', 'STAREDataset', 'DarkZurichDataset',
    'NightDrivingDataset', 'COCOStuffDataset', 'LoveDADataset',
    'MultiImageMixDataset', 'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset',
    'LoadAnnotations', 'RandomCrop', 'SegRescale', 'PhotoMetricDistortion',
    'RandomRotate', 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray',
    'RandomCutOut', 'RandomMosaic', 'PackSegInputs', 'ResizeToMultiple',
    'LoadImageFromNDArray', 'LoadBiomedicalImageFromFile',
    'LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge',
    'DecathlonDataset', 'LIPDataset', 'ResizeShortestEdge',
    'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur',
    'BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip',
    'SynapseDataset', 'Building_Identify'#<--就是这个
]

6.接着就是调整pipeline配置文件

然后调整的时候我发现了我的验证集还没有分配出来,于是又将前25000张图片分成训练集,然后后5000张分成验证集

7.然后使用KNet算法,简单改一下config里面的参数,然后就可以开始训练了

训练的结果是这样的

(第2500次)

(第5000次)

看到这个dice的值,我感觉分应该挺高(

8.接着就用训练好的模型权重pth文件加进model里面训练

import os
os.chdir('mmsegmentation')

os.getcwd()

import numpy as np
import cv2
from tqdm import tqdm

from mmseg.apis import init_model, inference_model, show_result_pyplot
import mmcv

import matplotlib.pyplot as plt
%matplotlib inline

import pandas as pd

# 模型 config 配置文件
config_file = 'Building_Identify-Configs/Building_Identify_KNet.py'

# 模型 checkpoint 权重文件
checkpoint_file = 'checkpoint/best_mIoU_iter_5000.pth'

# 计算硬件
# device = 'cpu'
device = 'cuda:0'

model = init_model(config_file, checkpoint_file, device=device)

PATH_IMAGE = 'Building_Identify/test_a'

os.chdir(PATH_IMAGE)

subm = []

# 将图片编码为rle格式
def rle_encode(im):
    '''
    im: numpy array, 1 - mask, 0 - background
    Returns run length as string formated
    '''
    pixels = im.flatten(order = 'F')
    pixels = np.concatenate([[0], pixels, [0]])
    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1
    runs[1::2] -= runs[::2]
    return ' '.join(str(x) for x in runs)

def process_single_img(img_path, save=False):
    
    img_bgr = cv2.imread(img_path)

    # 语义分割预测
    result = inference_model(model, img_bgr)
    pred_mask = result.pred_sem_seg.data[0].cpu().numpy()
    subm.append([img_path, rle_encode(pred_mask)])
    
for each in tqdm(os.listdir()):
    process_single_img(each, save=True)

subm = pd.DataFrame(subm)
subm.to_csv('tmp1.csv', index=None, header=None, sep='\t')

理论来说没什么问题,我看了几张预测的图片

(这张效果感觉大差不差)

(该识别不到的确实也没有)

好好好,于是自信满满地交上去,一看结果

爬了,对不起

day2

第二天早上马不停蹄爬起来检查,加了好几个同学的微信,然后问了半天 

有人说我训练次数少了,于是我训练了20000次

然后

呵呵

由于查不出错,我只能怀疑是我csv文件保存错了。于是我删掉了gpt写的代码,然后去讨论扒了一个代码下来,改了改输出的格式

然后

不好评价

改了一天,啥也没改出来,然后云gpu平台还要每个小时2块钱,两天烧了30多块钱了吧

累了

day3

今天我一定要改出来,我凌晨的时候这样想到,然后早上就睡到了10点才起来

然后又要去做物理实验,写实验报告,这一天就这样过去了

晚上的时候找了一个也在搞AI的同学帮我看了看,没发现什么问题

要是你给我个正常的0.5以上的分数我也认了,但这0.17是啥啊

好好好,这样玩是吧。

大不了重新搞一遍

day4

最后一天了,我一边问其他同学之前处理数据的时候的问题,一边重新开始把整套流程又做了一遍,到了下午3点的时候重新又训练出来了模型,然后跑出来了rle编码

很符合我的想象

然后我觉得是不是0和1的掩码反了啊,怎么会这么低的离谱

于是吧mask矩阵01反转了一下

不懂了语义分割,累了

总结

对于一个基本是应用的教程,我真不是很清楚他的理论。或许知道一点理论会好一点,但这应该是后面才应该去深入了解的东西吧。

搞不明白,奇奇怪怪的错误太多,不知道怎么解决,问了人也都说不出个123,感觉挺累的。

但我还是在这次学习中收获了很多,我希望这次没有功劳也有个苦劳吧。

就是这样了,peace。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值