实例分割数据集(mask.png)转目标检测(yolo格式 .txt)+实例分割预处理

最近在做一个线粒体的实例分割数据集转目标检测数据集,记录一下

原图:

原图mask

 

尺寸4096*4096, 需要经过预处理裁成512*512,同时mask是灰度图,要先转成黑白的,顺序是先二值化rbg to mask,再统一裁成512格式,最后再转换成对应的yolo格式

二值化,师弟写的,放上来记录一下


   
import cv2
import numpy as np
import os, glob
 
 
def rgb2masks(label_name):
    lbl_id = os.path.split(label_name)[-1].split('.')[0]
    lbl = cv2.imread(label_name, 1)
    h, w = lbl.shape[:2]
    idx = 0
    num_instance = lbl[:,:,2].max()

    mask_name_list = ['Podo','ECs','GBM']

    mask = (lbl[:,:,0]!=0).astype(np.uint8)
    mask[mask==1] =255
    mask_name = save_path + lbl_id.replace('seg', 'im') + '_Mito' +'_1' + '.png'
    cv2.imwrite(mask_name, mask)
    
    # for i in range(num_instance):
    #     mask = (lbl[:,:,0]!=0).astype(np.uint8)
    #     # mask[mask==1] =255

    #     mask_name = save_path + lbl_id + '_Mito' +f'_{(i+1)}' + '.png'
    #     cv2.imwrite(mask_name, mask)

 

label_dir = './mitoem/MitoEM-H/mask_val'

save_path = './mitoem/MitoEM-H/mask_label_val/'
os.makedirs(save_path,exist_ok=True)

label_list = glob.glob(os.path.join(label_dir, '*.tif'))
for label_name in label_list:
    rgb2masks(label_name)

裁剪代码

import shutil
import os
import ast
import cv2
from PIL import Image

def crop_to_512(img_dir,save_dir,crop_list,crop_size):
    imgs = os.listdir(img_dir)  # 对应图像对应切割
    num=0
    for img in imgs:
        img_path = os.path.join(img_dir, img)
        image = cv2.imread(img_path)  # crop img
        len_x = len(crop_list)
        len_y = len(crop_list)
        for i in range(len_x):
            for j in range(len_y):
                crop_img = image[
                           crop_list[j]:crop_list[j] + crop_size[1],
                           crop_list[i]:crop_list[i] + crop_size[0],
                           ]
                new_img_name = img[:-4]
                new_img_name += '_0' + str(i) + '_0' + str(j) + '.png'
                crop_img = Image.fromarray(crop_img)
                crop_img.save(os.path.join(save_dir, new_img_name))
                num += 1
        print('finsih crop:',img)



if __name__ == '__main__':
    img_dir='./mitoem/MitoEM-H/img_train'  #png,4096*4096 to 512*512
    save_dir='./mitoem/crop_img_train'
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    img_size=[4096,4096]
    crop_size=[512,512]
    # n=0
    # list=[] #x_list
    # for i in range(0,9):
    #
    #     list.append(n)
    #     n=n+512
    #
    # print(list)
    crop_list=[0, 512, 1024, 1536, 2048, 2560, 3072, 3584]
    crop_to_512(img_dir,save_dir,crop_list,crop_size)

mask to yolo

import os
import numpy as np
from itertools import groupby
from skimage import morphology, measure
from PIL import Image
from scipy import misc
import cv2

# 因为一张图片里只有一种类别的目标,所以label图标记只有黑白两色
rgbmask = np.array([[0, 0, 0], [255, 255, 255]], dtype=np.uint8)


# 从label图得到 boundingbox 和图上连通域数量 object_num
def getboundingbox(image):
    # mask.shape = [image.shape[0], image.shape[1], classnum]
    mask = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)
    mask[np.where(np.all(image == rgbmask[1], axis=-1))[:2]] = 1
    # 删掉小于10像素的目标
    mask_without_small = morphology.remove_small_objects(mask, min_size=10, connectivity=2)
    # 连通域标记
    label_image = measure.label(mask_without_small)
    # 统计object个数
    object_num = len(measure.regionprops(label_image))
    boundingbox = list()
    bboxs=list()
    for region in measure.regionprops(label_image):  # 循环得到每一个连通域bbox
        b=[region.bbox[1],region.bbox[3],region.bbox[0],region.bbox[2]]
        bbox=convert([4096,4096],b)
        bboxs.append(bbox)
        boundingbox.append(region.bbox)#
    return object_num, boundingbox,bboxs

def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

def mask_to_yolo(mask_dir,save_dir):
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    imgs=os.listdir(mask_dir)
    for img in imgs:
        img_path=os.path.join(mask_dir,img)
        img0 = cv2.imread(img_path)
        out_file = open(save_dir+'/'+img.split('.')[0]+'.txt', 'w')
        object_num, boundingbox, bboxs = getboundingbox(img0)
        for i in bboxs:
            out_file.write('0' + " " + " ".join([str(a) for a in i]) + '\n')



if __name__ == '__main__':
    mask_to_yolo()
    # imgdir='./mitoem/MitoEM-H/mask_label_train/im0000_Mito_1.png'
    # img=cv2.imread(imgdir)
    # out_file = open('./mitoem/yolo/im0000_Mito_1.txt', 'w')
    # object_num, boundingbox,bboxs=getboundingbox(img)
    # 
    # print(object_num,boundingbox)
    # for i in bboxs:
    #     out_file.write('0' + " " + " ".join([str(a) for a in i]) + '\n')


  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要使用YOLOv8训练自己的数据集,需要完成以下步骤: 1. 数据集准备:将您的图像和标注信息准备好。YOLOv8要求图像和标注信息必须匹配,并且标注信息应该采用特定的格式。对于图像,您可以使用.PNG格式,但也可以使用其他常见的图像格式,如.JPEG。对于标注信息,可以使用PASCAL VOC或YOLO格式。 2. 标注工具:使用标注工具为您的数据集进行标注。一些常用的标注工具包括LabelImg、CVAT、RectLabel等。确保将每个对象用矩形框标注,并为每个矩形框提供类别标签。 3. 数据集划分:将数据集划分为训练集和验证集。通常,80%的数据用于训练,20%的数据用于验证。 4. 配置文件:根据您的数据集和训练需求,创建一个配置文件。配置文件包含了网络架构、超参数、数据路径等信息。您可以参考Darknet框架提供的示例配置文件,并根据您的需求进行相应修改。 5. 权重初始化:下载预训练的权重文件作为初始权重。这些权重文件通常是在大规模数据集上训练得到的模型参数。 6. 训练过程:使用YOLOv8的训练命令开始训练过程。根据您选择的框架和工具,命令可能会有所不同。确保指定正确的配置文件、数据集路径和权重文件路径。 7. 迭代训练:训练过程中,模型会逐渐优化并提高准确性。可以通过观察训练和验证集上的损失和指标来评估模型性能。 8. 模型评估:使用验证集评估模型的性能。可以计算精度、召回率、F1分数等指标来衡量模型的准确性。 9. 预测应用:使用训练好的模型进行目标检测预测。可以将模型集成到您的应用程序中,实现自定义数据集上的目标检测。 请注意,YOLOv8是一种较为复杂的算法,训练过程可能需要较长时间和大量的计算资源。确保有足够的计算能力和时间来完成训练过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值