本文写下的时间是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。