Semantic Segmentation Dataset

  • 由于图像的名字中有:
  • 1、中文、空格、数字开头、label
  • 2、origin的对应图像名字不同
  • 等各种各样的问题,数据探索和数据预处理尤为重要。针对1,可以用下面的代码来避免opencv在读取、保存时可能报错;针对2,尤其是我所不了解的,他人的数据、脏数据,要先搞清楚数据集的结构,将其整理成符合模型训练的结构。
  • 可见opencv路径报错
import cv2 as cv
import numpy as np
import os

def get_files(path):
    files=os.listdir(path)
    return files

def cv_imread(file):
    img = cv.imdecode(np.fromfile(file, dtype=np.uint8), -1)
    return img

def cv_imwrite(filename, src):
    cv.imencode(".jpg", src)[1].tofile(filename)
  • 数据集:label RGB 3通道;origin 灰度图,虽然读取后显示的也是三维数组,但三个维度都一样
  • label 绿色血管图做二值化 threshold
  • origin 灰度图做归一化 /255,在训练的时候做
  • 因此对origin只需进行滑动窗口分割预处理,对label需要先做__二值化__(去掉模糊的部分,让特征更明显),再做滑动窗口分割。
  • 因为语义分割本质上是分类问题(这里是二分类),即 某一个像素属于哪一类(0 或 255)
#origin直接分割
def img_process(in_path,out_path,size):
    files=get_files(in_path)
    for k in range(len(files)):
        img=cv_imread(in_path+files[k])#第k张图
        
        i=0
        while (i+1)*size<=len(img):#i行
            j=0
            while (j+1)*size<=len(img[0]):#j列,假设图片是矩形的
                part=img[i*size:(i+1)*size,j*size:(j+1)*size]
               
                j+=1
                save_path=out_path+str(k)+'_'+str(i)+'_'+str(j)+'.jpg'
                cv.imwrite(save_path,part)
            i+=1

in_path='F:/data2/train/origin/'
out_path='F:/data2/train/origin_depart/'
img_process(in_path,out_path,256)

in_path='F:/data2/val/origin/'
out_path='F:/data2/val/origin_depart/'
img_process(in_path,out_path,256)
import matplotlib.pyplot as plt
msk = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
plt.imshow(msk)

在这里插入图片描述

img=cv_imread(path)
plt.imshow(img)

在这里插入图片描述

  • python中的图像的BGR,只要认准中间的G通道,两边的B和R无所谓
msk[np.where((img[...,0] < 50) & (img[..., 1] > 200) & (img[..., 2] < 50))] = 255
plt.imshow(msk)

在这里插入图片描述

#label 需要二值化
def img_process(in_path,out_path,size):
    files=get_files(in_path)
    for k in range(len(files)):
        img=cv_imread(in_path+files[k])#第k张图
        msk = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
        msk[np.where((img[...,0] < 50) & (img[..., 1] > 200) & (img[..., 2] < 50))] = 255
        #...,表示去之前的所有维数据,这里是三维数组,因此等价于 :: ,img[::, 2] 
        i=0
        while (i+1)*size<=len(msk):#i行
            j=0
            while (j+1)*size<=len(msk[0]):#j列,假设图片是矩形的
                part=msk[i*size:(i+1)*size,j*size:(j+1)*size]
               
                j+=1
                save_path=out_path+str(k)+'_'+str(i)+'_'+str(j)+'.jpg'
                cv.imwrite(save_path,part)
            i+=1
            
in_path='F:/data2/train/label/'
out_path='F:/data2/train/label_depart/'
img_process(in_path,out_path,256)

in_path='F:/data2/val/label/'
out_path='F:/data2/val/label_depart/'
img_process(in_path,out_path,256)
  • 最后分别在train、val文件夹中得到label_depart、origin_depart
  • train、val数据比例大概3:1
    在这里插入图片描述
Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐