管它用什么模型,有数据才是牛逼。

一、用labelme标注灌缝区域

语义分割 标注原则_List

二、json文件是这样的

json文件中包含的信息包括labelme的版本、label的名称、节点坐标、label的ID、label的形状、图像路径、行列等。

{
  "version": "4.5.2",
  "flags": {},
  "shapes": [
    {
      "label": "gf",
      "points": [
        [
          3489.8477157360408,
          324.11167512690355
        ],
        ...
        [
          3482.918149466192,
          308.5409252669039
        ]
      ],
      "group_id": 2,
      "shape_type": "polygon",
      "flags": {}
    }
  ],
  "imagePath": "1215_1_00002053_brighter2.0.jpg",
  "imageData": "/9j/4AAQSkZJR...
  "imageHeight": 2020,
  "imageWidth": 4096
}

三、解析

若解析报错,可以参照

分享给有需要的人,代码质量勿喷。

import os
import os.path as osp
import numpy as np
import base64
import json
import yaml
import PIL.Image
from labelme import utils
import copy
import warnings
warnings.filterwarnings('ignore')


def Parse(dir_json, dir_res, note):
    listFile = os.listdir(dir_json)
    for i in range(0, len(listFile)):
        # json文件的绝对路径
        jsonFullPath = os.path.join(dir_json, listFile[i])
        #文件名称,不带扩展名
        baseName = listFile[i][:-5]

        #region 判断:json文件
        # 判断:文件夹跳过
        if os.path.isdir(jsonFullPath):
            continue

        #判断:非文件跳过
        if not os.path.isfile(jsonFullPath):
            continue

        #判断:非json文件跳过
        extension = (os.path.splitext(jsonFullPath)[-1])[1:]
        if (extension!='json'):
            continue
        #endregion

        #region imageData
        jsonData = json.load(open(jsonFullPath,encoding="gbk",errors="ignore"))
        if jsonData['imageData']:
            imageData = jsonData['imageData']
        else:
            imagePath = os.path.join(os.path.dirname(jsonFullPath), jsonData['imagePath'])
            with open(imagePath, 'rb',encoding="gbk",errors="ignore") as f:
                imageData = f.read()
                imageData = base64.b64encode(imageData).decode('utf-8')
        #endregion

        img = utils.img_b64_to_arr(imageData)

        #region 调整更新标签
        #获取类别与标签
        lbl, labelNames = utils.shape.labelme_shapes_to_label(img.shape, jsonData['shapes'])

        #调整标签
        lblTmp = copy.copy(lbl)
        for key in labelNames:
            old_lbl_val = labelNames[key]
            new_lbl_val = mapName_Label[key]
            lblTmp[lbl == old_lbl_val] = new_lbl_val
        labelNamesTmp = {}
        for key in labelNames:
            labelNamesTmp[key] = mapName_Label[key]

        #更新
        lbl = np.array(lblTmp, dtype=np.uint8)
        labelNames = labelNamesTmp

        #输出:序号,路径,标签
        print('\n'+str(i)+'——'+jsonFullPath+'——'+str(labelNames))
        #endregion

        lbl_viz = utils.draw_label(lbl, img, mapLabel_Name)


        #region 输出(1)所有原图、二值图、叠加图分别放在三个文件夹中
        #原图
        out_dirImg = dir_res + "0img"
        if not osp.exists(out_dirImg):
            os.mkdir(out_dirImg)
        PIL.Image.fromarray(img).save(osp.join(out_dirImg, note+'{}.jpg'.format(baseName)))

        #label二值图
        out_dirLabel = dir_res + "4label"
        if not osp.exists(out_dirLabel):
           os.mkdir(out_dirLabel)
        PIL.Image.fromarray(lbl).save(osp.join(out_dirLabel, note+'{}.png'.format(baseName)))

        #带类别和标签的可视化叠加图
        out_dirVis = dir_res + "5vis"
        if not osp.exists(out_dirVis):
           os.mkdir(out_dirVis)
        PIL.Image.fromarray(lbl_viz).save(osp.join(out_dirVis, note + '{}.png'.format(baseName)))
        #endregion

        #region 输出(2)每个图像分别存在一个文件夹中
        out_dir = dir_res+note+baseName+'/'
        if not osp.exists(out_dir):
            os.mkdir(out_dir)
        PIL.Image.fromarray(img).save(osp.join(out_dir, note+'{}_img.png'.format(baseName)))
        PIL.Image.fromarray(lbl).save(osp.join(out_dir, note+'{}_label.png'.format(baseName)))
        PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, note+'{}_vis.png'.format(baseName)))

        with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
            for lbl_name in labelNames:
               f.write(lbl_name + '\n')

        info = dict(label_names=labelNames)
        with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
            yaml.safe_dump(info, f, default_flow_style=False)

        print('Saved to  %s' % out_dir)
        #endregion


if __name__ == '__main__':
    #region 根据需求修改
    mapName_Label = {
    '_background_': 0,
    "crack": 1,
    'gf':2}

    mapLabel_Name = ['0: _background_',
                 '1: crack',
                 '2: gf',]

    #用于标记不同时期/人/区域的数据
    note = 'xj_'

    # json文件目录
    dir_json = "F:/jsonFile/"

    # 设置输出目录
    dir_res = "F:/resJson/"
    if not osp.exists(dir_res):
        os.mkdir(dir_res)
    #endregion

    Parse(dir_json, dir_res, note)

四、结果

4.1 之后用到的结果

所有的原图在0img文件夹中,所有的二值图在4label文件夹中,所有的叠加可视化图在5vis文件夹中。

4.2 没用到的结果

每张图像对应的解析结果在单独的文件夹中。

语义分割 标注原则_List_02

五、多准备点正样本和负样本【多多益善】

可以做点数据增强。笔者做了水平镜像、亮度提升、对比度提升。

分享给有需要的人,代码质量勿喷。

# coding=utf-8
import os,shutil
import numpy as np
import cv2
from PIL import Image
from PIL import ImageEnhance
import warnings
warnings.filterwarnings("ignore")


# 数据增强
dirOriginalImage = 'E:/py/dataCrackOriginal/00AA1originalNote'
dirOriginalLabel = 'E:/py/dataCrackOriginal/00CC32label_2gf'
flip1=True
brighter=True
brightness=2.0
contraster=True
contrast=2.0

# 训练数据
dirTrainImage = 'E:/py/dataCrack/00AA1originalNote'
dirTrainLabel = 'E:/py/dataCrack/00CC32label_2gf'



if flip1:
    print('1.1 正在水平镜像----------')
    imageList = os.listdir(dirOriginalImage)
    for file in imageList:
        if os.path.isdir(dirOriginalImage+'/'+file):
            continue

        baseName,extension = os.path.splitext(file)

        #region 复制原始的图像与标签 到训练文件夹
        pathImage = dirOriginalImage+'/'+file
        pathImageNew = dirTrainImage+'/'+file
        shutil.copy(pathImage,pathImageNew)

        labelPath = dirOriginalLabel+'/'+baseName+'.png'
        labelPathNew = dirTrainLabel+'/'+baseName+'.png'
        shutil.copy(labelPath,labelPathNew)
        #endregion

        #image
        img = cv2.imread(pathImage,-1)
        imgFlip = cv2.flip(img,1)
        imgFlipResPath = dirTrainImage+'/'+baseName+'_flip1'+extension
        cv2.imwrite(imgFlipResPath,imgFlip)

        #label
        label = cv2.imread(labelPath,-1)
        labelFlip = cv2.flip(label,1)
        labelFlipResPath = dirTrainLabel+'/'+baseName+'_flip1.png'
        cv2.imwrite(labelFlipResPath,labelFlip)
        print('flip1 ',labelFlipResPath)
    print('1.1 ok 完成水平镜像----------')


dirEnhancedImage=[]
dirEnhancedLabel=[]
if brighter:
    # 亮度增强,增强因子为0.0将产生黑色图像;为1.0将保持原始图像。
    print('1.2 正在提升亮度----------')
    dirBrighter = dirTrainImage+'/'+'brighter'+str(brightness)
    if not os.path.isdir(dirBrighter):
        os.makedirs(dirBrighter)
    dirEnhancedImage.append(dirBrighter)
        
    dirBrighterLabel = dirTrainLabel+'/'+'brighter'+str(brightness)
    if not os.path.isdir(dirBrighterLabel):
        os.makedirs(dirBrighterLabel)
    dirEnhancedLabel.append(dirBrighterLabel)

    imageList = os.listdir(dirTrainImage)
    for file in imageList:
        if os.path.isdir(dirTrainImage+'/'+file):
            continue

        baseName,extension = os.path.splitext(file)

        #image
        pathImage = dirTrainImage+'/'+file
        image = Image.open(pathImage)
        enh_bri = ImageEnhance.Brightness(image)
        image_brightened = enh_bri.enhance(brightness)
        resPath = dirBrighter+'/'+baseName+'_brighter'+str(brightness)+extension
        image_brightened.save(resPath)

        #label
        labelPath = dirTrainLabel+'/'+baseName+'.png'
        labelPathNew = dirBrighterLabel+'/'+baseName+'_brighter'+str(brightness)+'.png'
        shutil.copy(labelPath,labelPathNew)
        print('brighter ',labelPath)
    print('1.2 完成亮度提升,待转移----------')


if contraster:
    #对比度增强,因子为1.0是原始图片
    print('1.3 正在提升对比度----------')
    dirContraster = dirTrainImage+'/'+'contraster'+str(brightness)
    if not os.path.isdir(dirContraster):
        os.makedirs(dirContraster)
    dirEnhancedImage.append(dirContraster)

    dirContrasterLabel = dirTrainLabel+'/'+'contraster'+str(brightness)
    if not os.path.isdir(dirContrasterLabel):
        os.makedirs(dirContrasterLabel)
    dirEnhancedLabel.append(dirContrasterLabel)

    imageList = os.listdir(dirTrainImage)
    for file in imageList:
        if os.path.isdir(dirTrainImage+'/'+file):
            continue

        baseName,extension = os.path.splitext(file)

        #image
        pathImage = dirTrainImage+'/'+file
        image = Image.open(pathImage)
        enh_con = ImageEnhance.Contrast(image)
        image_contrasted = enh_con.enhance(contrast)
        resPath = dirContraster+'/'+baseName+'_contraster'+str(brightness)+extension
        image_contrasted.save(resPath)

        #label
        labelPath = dirTrainLabel+'/'+baseName+'.png'
        labelPathNew = dirContrasterLabel+'/'+baseName+'_contraster'+str(brightness)+'.png'
        shutil.copy(labelPath,labelPathNew)
        print('contraster ',labelPath)
    print('1.2 完成对比度提升,待转移----------')



#region 转移增强的数据
print('-----正在转移增强的数据-----')

#image
for dir in dirEnhancedImage:
    imageList = os.listdir(dir)
    for file in imageList:
        if os.path.isdir(dir+'/'+file):
            continue
        pathImage = dir+'/'+file
        pathImageNew = dirTrainImage+'/'+file
        shutil.copy(pathImage,pathImageNew)

for dir in dirEnhancedImage:
    shutil.rmtree(dir)

#label
for dir in dirEnhancedLabel:
    imageList = os.listdir(dir)
    for file in imageList:
        if os.path.isdir(dir+'/'+file):
            continue
        pathLabel = dir+'/'+file
        pathLabelNew = dirTrainLabel+'/'+file
        shutil.copy(pathLabel,pathLabelNew)
for dir in dirEnhancedLabel:
    shutil.rmtree(dir)
print('-----ok 转移增强数据-----')

#endregion



if __name__ == '__main__':
    print('--------------------数据总结--------------------')
    print('原始标注数据',len(os.listdir(dirOriginalImage)),'张')
    if flip1:
        print('水平镜像',len(os.listdir(dirOriginalImage)),'张')
    if brighter:
        print(brightness,'亮度增强',len(os.listdir(dirOriginalImage)),'张')
    if contraster:
        print(contrast,'对比度增强',len(os.listdir(dirOriginalImage)),'张')

    print('样本数据共',len(os.listdir(dirTrainImage)),'张')