实现功能

将分割的label图转换为目标检测boundingbox标注文件(VOC格式)。

注:

1.分割样本里一张图片只有同一类别的多个目标。

2.转换为boundingbox标注通过连通域实现,所以重叠的目标处理不了,会标为1个

数据集格式

其中,语义分割数据集格式如下:

原图片在JPEGImages文件夹中,命名格式为ImageID.jpg

    

Label图在labelimage文件夹中,命名格式为ImageID_classname.png

     

生成的boundingbox标注命名格式为ImageID.xml

   

XML标注格式

<annotation><folder>road_dataset</folder>                      #文件名<filename>3425.jpg</filename>                      #原图片名<path>D:\road_dataset\JPEGImages\3425.jpg</path>   #原图片地址<source><database>Unknown</database></source><size>                               #图片尺寸<width>512</width><height>512</height><depth>3</depth></size><segmented>0</segmented>            #是否用于分割,0为否<object>                            #目标<name>butt</name>                #类别名称<pose>Unspecified</pose>         #拍摄角度<truncated>0</truncated>         #是否被截断<difficult>0</difficult>         #是否为困难样本<bndbox>                         #boundingbox坐标(左下、右上)<xmin>327</xmin><ymin>38</ymin><xmax>394</xmax><ymax>69</ymax></bndbox></object><object>                             #多个目标<name>Cigarette butts</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>139</xmin><ymin>279</ymin><xmax>214</xmax><ymax>318</ymax></bndbox></object>
</annotation>

其中<pose>  <truncated> <difficult> 全是默认值。

得到label图中的连通域

使用skimage的morphology, measure通过连通域得到每一副一幅图片上的目标数量和boundingbox。

import os
import numpy as np
from itertools import groupby
from skimage import morphology,measure
from PIL import Image
from scipy import misc# 因为一张图片里只有一种类别的目标,所以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()for region in measure.regionprops(label_image):  # 循环得到每一个连通域bboxboundingbox.append(region.bbox)return object_num, boundingbox

在label图片上显示boundingbox,查看结果:

import matplotlib.pyplot as plt
import matplotlib.patches as patch# 输出成图片查看得到boundingbox效果
imagedir = r'D:\test_dataset\labelimage'if ~os.path.exists(r'D:\test_dataset\test_getbbox'):os.mkdir(r'D:\test_dataset\test_getbbox')
for root, _, fnames in sorted(os.walk(imagedir)):for fname in sorted(fnames):imagepath = os.path.join(root, fname)image = misc.imread(imagepath)objectnum, bbox = getboundingbox(image)ImageID = fname.split('.')[0]fig,ax = plt.subplots(1)ax.imshow(image)for box in bbox:rect = patch.Rectangle((box[1], box[0]), box[3]-box[1], box[2]-box[0],edgecolor = 'r', linewidth = 1,fill = False)ax.add_patch(rect)plt.savefig('D:/test_dataset/test_getbbox/'+ImageID+'.png')

输出图像为:

生成XML标注文件

createXMLlabel: 根据标注信息生成XML标注文件
import xml.etree.ElementTree as ETdef createXMLlabel(savedir,objectnum, bbox, classname, foldername='0',filename='0', path='0', database='road', width='400', height='600',depth='3', segmented='0', pose="Unspecified", truncated='0', difficult='0'):# 创建根节点root = ET.Element("annotation")# 创建子节点folder_node = ET.Element("folder")folder_node.text = foldername# 将子节点数据添加到根节点root.append(folder_node)file_node = ET.Element("filename")file_node.text = filenameroot.append(file_node)path_node = ET.Element("path")path_node.text = pathroot.append(path_node)source_node = ET.Element("source")# 也可以使用SubElement直接添加子节点db_node = ET.SubElement(source_node, "database")db_node.text = databaseroot.append(source_node)size_node = ET.Element("size")width_node = ET.SubElement(size_node, "width")height_node = ET.SubElement(size_node, "height")depth_node = ET.SubElement(size_node, "depth")width_node.text = widthheight_node.text = heightdepth_node.text = depthroot.append(size_node)seg_node = ET.Element("segmented")seg_node.text = segmentedroot.append(seg_node)for i in range(objectnum):newEle = ET.Element("object")name = ET.Element("name")name.text = classnamenewEle.append(name)pose_node = ET.Element("pose")pose_node.text = posenewEle.append(pose_node)trunc = ET.Element("truncated")trunc.text = truncatednewEle.append(trunc)dif = ET.Element("difficult")dif.text = difficultnewEle.append(dif)boundingbox = ET.Element("bndbox")xmin = ET.SubElement(boundingbox, "xmin")ymin = ET.SubElement(boundingbox, "ymin")xmax = ET.SubElement(boundingbox, "xmax")ymax = ET.SubElement(boundingbox, "ymax")xmin.text = str(bbox[i][1])ymin.text = str(bbox[i][0])xmax.text = str(bbox[i][3])ymax.text = str(bbox[i][2])newEle.append(boundingbox)root.append(newEle)ImageID = filename.split('.')[0]# 创建elementtree对象,写入文件tree = ET.ElementTree(root)tree.write(savedir + '/'+ ImageID + ".xml")
imagedir = r'D:\test_dataset\labelimage'
saveXMLdir = r'D:\test_dataset\Annotations'if os.path.exists(saveXMLdir) is False:os.mkdir(saveXMLdir)for root, _, fnames in sorted(os.walk(imagedir)):for fname in sorted(fnames):labelpath = os.path.join(root, fname)labelimage = misc.imread(labelpath)# 得到label图上的boundingingbox和数量objectnum, bbox = getboundingbox(labelimage)# label图 命名格式为 ImgeID_classname.pnglabelfilename = labelpath.split('\\')[-1]ImageID = labelfilename.split('.')[0].split('_')[0]classname = labelfilename.split('.')[0].split('_')[1]origin_image_name = ImageID +'.jpg'# 一些图片信息foldername = 'test_dataset'path  ='\\'.join(imagedir.split('\\')[:-1]) + '\\JPEGImage\\'+ origin_image_namedatabase = 'Unknown'width = str(labelimage.shape[0])height = str(labelimage.shape[1])depth = str(labelimage.shape[2])createXMLlabel(saveXMLdir,objectnum, bbox, classname, foldername=foldername,filename=origin_image_name, path=path,database=database, width=width, height=height,depth=depth, segmented='0', pose="Unspecified",truncated='0', difficult='0')

分割数据集label转换为目标检测boundingbox相关推荐

  1. BDD 100K数据集label转换为yolo训练格式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 BDD 100K数据集label转换为yolo训练格式 前言 数据集介绍: 代码如下: 补充说明: 总结 前言 因为最近要做车辆,行人 ...

  2. 干货|使用合成数据集来做目标检测

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Sergey Nikolenko 来源丨AI公园 编辑丨极市平 ...

  3. 使用合成数据集来做目标检测:目标检测的介绍

    作者:Sergey Nikolenko 编译:ronghuaiyang 来源:AI公园 导读 本文讨论使用生成数据集来做目标检测的一些基础概念. 今天,我们开始一系列专门讨论一个特定的机器学习问题,这 ...

  4. 准确度判断 语义分割_Mask R-CNN(目标检测语义分割)测试

    Mask R-CNN(目标检测语义分割)测试 Mask R-CNN(目标检测,语义分割)测试 Kaiming He的大作Mask R-CNN(https://arxiv.org/pdf/1703.06 ...

  5. VPGNet数据集解析且将分割标签转化为目标检测标签

    VPGNet交通标志数据集 VPGNet是一个包含了四个场景(晴天,夜间,阴雨等)下的交通路况数据集,其主要是针对地面标志(箭头线,人行道)的任务,该数据集一共包括以下17类地面标注 {0:'back ...

  6. 基于MMRotate训练自定义数据集 做旋转目标检测 2022-3-30

    本文目录 简述 1.MMrotate下载 2.环境安装 3.自定义数据集制作 3.1 roLabelImg 打标签 3.2 生成DOTA数据集格式的标签 3.3 数据集裁剪(split) 4.修改配置 ...

  7. voc2007数据集_【目标检测数据集】PASCAL VOC制作

    [VOC2007+2012] 数据集地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/ PASCAL VOC为图像识别和分类提供了一 ...

  8. 【推荐】本周值得关注的将开源论文,包含分类、分割、人脸、目标检测、ReID等...

    以下总结的是本周新出的作者声称"将开源"的论文,包含显著目标检测.遥感影像分类.人脸识别.基于视频的人员重识别.跨分辨率人员重识别.医学图像分割.transformer 在视频目标 ...

  9. 开源数据集汇总 | 小目标检测、图像分类、图像识别

    编辑丨极市平台 宠物图像数据集 数据集下载地址:http://m6z.cn/5TAgdC 一个包含 37 个类别的宠物数据集,每个类别大约有 200 张图像.这些图像在比例.姿势和照明方面有很大的变化 ...

最新文章

  1. 参数服务器训练基本理论
  2. Express.js 3.0 发布,Node.js 的高性能封装
  3. 【Java基础】四种Java引用类型
  4. Java泛型详解-史上讲解最详细的,没有之一
  5. 记一次错误的伪静态配置文件
  6. hdu 5131 (2014广州现场赛 E题)
  7. 006 CSS三种引入方式
  8. Rails安全导读【完】
  9. pymysql(part4)--mysql存储图片信息
  10. 【NOI2009】诗人小G【决策单调性dp】
  11. 普元连接mysql_普元EOS 案例 - 还有一行代码的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. matlab小波分析常用函数
  13. 文件上传之二利用frame实现无页面刷新的文件上传
  14. hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
  15. iPad 读不到 USB,在 Mac 上如何进行 USB 格式化?
  16. 工欲善其事必先利其器——开发篇
  17. Wonderware Intouch 2014R2 SP1 安装教程
  18. Snake活动轮廓模型Matlab实现
  19. zabbix 批量生成聚合图形
  20. 随机数生成器python_python安全开发军规之四:使用安全的随机数生成器

热门文章

  1. 人机交互及界面设计序言
  2. oracle oats 工具讲解,Oracle 21c 新特性:Object Activity Tracking System 对象活动跟踪系统...
  3. 数字音频总线A2B开发详解二十:ADAU1701做的功放板的音效(26个例程)(第一部分)
  4. thinkpad卡在logo界面_win10系统开机卡在开机Thinkpad LoGo画面的恢复教程
  5. win10虚拟内存怎么设置最好_win10系统如何设置虚拟内存,看这里!
  6. 制作黑苹果安装U盘(Clover+OC+PE)三引导
  7. 谁说 C/C++ 没有好的包管理器?这里来一沓!C/C++学习者建议收藏
  8. 阿里云学生机使用nginx搭建点播服务器
  9. sharepoint显示不正常_正常的吸气和呼吸、异常的呼气丨胸部HRCT表现
  10. 新品发布 | 极海半导体工业级互联型APM32F107/F105系列MCU,拓展通信外设助力产品应用创新