lableimg闪退_CV学习笔记(二十五):数据集标注与制作

最近在做一些数据标注的工作,虽然标注数据比较枯燥,但这也是每个做算法的工程师升级打怪的必由之路。使用一些合适的工具往往可以事半功倍,效率UP。

一:数据标注流程

a8bea0cf078ef2b111a6559e16b53dbb.png

二:数据处理的一些小代码

1:重命名

当得到这样格式命名不一致的数据的时候,重命名是最好的方法。

53bd6ceb6d912183855ae9cf7ee6c69a.png

代码:

#coding=UTF-8

'''

重命名工具

'''

import os

import sys

def rename():

path=input(r"请输入路径(例如D:\picture):")

name=input("请输入开头名:")

startNumber=input("请输入开始数:")

fileType=input("请输入后缀名(如 .jpg、.txt等等):")

print("正在生成以"+name+startNumber+fileType+"迭代的文件名")

count=0

filelist=os.listdir(path)

for files in filelist:

Olddir=os.path.join(path,files)

if os.path.isdir(Olddir):

continue

Newdir=os.path.join(path,name+str(count+int(startNumber))+fileType)

os.rename(Olddir,Newdir)

count+=1

print("一共修改了"+str(count)+"个文件")

if __name__ == '__main__':

rename()

重命名后的文件会覆盖之前的文件,记得操作之前备份原始数据(如有需要的话)

2:数据标注工具:

对于VOC数据集,使用labelimgs很方便,安装过程也很简单:

开源地址如下:https://github.com/tzutalin/labelImg

1acb5de28865cb672dd55fbc4bc9499e.png

如上图所示,框选完口罩后,点击OK会生成一个跟你文件名一致的XML文件,XML中包括有文件路径,文件名称,以及你给的标签等等信息,如下图:

70664edb210fa88c501f4671f3032a12.png

3:划分数据集

因为要符合VOC数据集格式,这里简单说一下VOC数据集格式类型。做深度学习目标检测方面的同学怎么都会接触到PASCAL VOC这个数据集。也许很少用到整个数据集,但是一般都会按照它的格式准备自己的数据集。所以这里就来记录一下PASCAL VOC的格式,包括目录构成以及各个文件夹的内容格式,方便以后自己按照VOC的标准格式制作自己的数据集。

96509af23c3c4d21771299d657ae94c7.png

但是我们一般情况下,自己制作数据集不需要Segment开头的,着重关注这三个文件夹:

Annotation文件夹存放的是xml文件,该文件是对图片的解释,每张图片都对于一个同名的xml文件。

ImageSets文件夹存放的是txt文件,这些txt将数据集的图片分成了各种集合。

JPEGImages文件夹存放的是数据集的原图片

31eb78fe429b33119066773bb835c319.png

转换代码:

import os

import random

xmlfilepath = r'D:/object_find/voc_title/VOCdevkit/VOC2007/Annotations'

saveBasePath = r"D:/object_find/voc_title/VOCdevkit/VOC2007/ImageSets/Main/"

#训练集和验证集所占的比例

trainval_percent = 0.8

train_percent = 0.8

temp_xml = os.listdir(xmlfilepath)

total_xml = []

for xml in temp_xml:

if xml.endswith(".xml"):

total_xml.append(xml)

num = len(total_xml)

list = range(num)

tv = int(num * trainval_percent)

tr = int(tv * train_percent)

trainval = random.sample(list, tv)

train = random.sample(trainval, tr)

print("train and val size", tv)

print("traub suze", tr)

#trainval,训练集测试集文件名,train,训练集,test,测试集,val验证集的文件名

ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')

ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')

ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')

fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')

for i in list:

name = total_xml[i][:-4] + '\n'

if i in trainval:

ftrainval.write(name)

if i in train:

ftrain.write(name)

else:

fval.write(name)

else:

ftest.write(name)

ftrainval.close()

ftrain.close()

fval.close()

ftest.close()

运行结果:

383e28d9c3cd7615565e911982c775c9.png

4:XML转TXT

这里要用到XML工具包来匹配一下:

代码:

import xml.etree.ElementTree as ET

from os import getcwd

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ["nomask","rightmask","wrongmask"]

def convert_annotation(year, image_id, list_file):

in_file = open('D:/object_find/voc_title/VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))

tree=ET.parse(in_file)

root = tree.getroot()

for obj in root.iter('object'):

difficult = obj.find('difficult').text

cls = obj.find('name').text

if cls not in classes or int(difficult)==1:

continue

cls_id = classes.index(cls)

xmlbox = obj.find('bndbox')

b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text))

list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

wd = getcwd()

for year, image_set in sets:

image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()

list_file = open('%s_%s.txt'%(year, image_set), 'w')

for image_id in image_ids:

list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg'%(wd, year, image_id))

convert_annotation(year, image_id, list_file)

list_file.write('\n')

list_file.close()

生成结果:

018ba36005ee1dbc4a9dd2367bcb7230.png

生成txt文件,包括:图片位置信息,目标位置,类别

2b55aae04cea447ce532dec09f7a28e8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java线程堆栈_深入JVM剖析Java的线程堆栈

在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因。在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术。在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息。我的目标是…

java文件 linux_Linux执行Java文件

最近学习shell脚本,写个简单java类让linux去执行java类没别的东西,就引了一个fastjson的jar,写了个main方法 序列化一个User对象 打印package com.lws.demo;import java.util.Date;import com.alibaba.fastjson.JSONObject;import com.lws.mo…

java 刽子手游戏_java基础(九):容器

集合的引入List (ArrayList LinkedList)Set (HashSet LinkedHashSet TreeSet )Map (HashMap LinkedHashMap TreeMap)CollectionsIterator使用泛型1.为什么使用集合而不是数组?集合和数组相似点都可以存储多个对象,对外作为一个整体存在数组的缺点长度必须…

java异常处理方式推荐做法_谈谈Java异常处理这件事儿

此文已由作者谢蕾授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。前言我们对于“异常处理”这个词并不陌生,众多框架和库在异常处理方面都提供了便利,但是对于何种处理才是最佳实践,也是众说纷纭。异常处…

java 抽象类 final_final/抽象类/interface

lesson Thirteen                          2018-05-10 02:10:43final:最终的,可以修饰类、属性、方法1.final修饰类:这个类就不能被继承,如:String类,StringBuffer类,System类1…

java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO

来源:木杉的博客 ,imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/Java传统IO是不支持中断的,所以如果代码在read/write等操作阻塞的话,是无法被中断的。这就无法和Thead的interrupt模型配合使…

java值栈_Struts2学习笔记-Value Stack(值栈)和OGNL表达式

只是本人的Struts2学习笔记,关于Value Stack(值栈)和OGNL表达式,把我知道的都说出来,希望对大家有用。一,值栈的作用记录处理当前请求的action的数据。二,小例子有两个action:Action1和Action2Action1有两个…

php 接口日志,PHP 开发 APP 接口--错误日志接口

APP 上线以后可能遇到的问题:① APP 强退② 数据加载失败③ APP 潜在问题错误日志需要记录的内容数据表 error_log 字段:idapp_id:app 类别 iddid:客户端设备号version_id:版本号version_mini:小版本号erro…

php cannot call constructor,安装ECshop普遍问题的解决方法

安装时的问题:1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解决:找到install/includes/lib_installer.php中的…

zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?

我最近玩了zblog一段时间,对于大多数第一次联系zblog的博客,他们会问zblog是否适合PHP或ASP?我们该如何选择?事实上,我真的不明白这个问题。我个人更喜欢PHP。今天我将整理出来并对PHP版本和ASP版本进行比较&#xff0…

php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...

据了解,很多中大型企事业单位的IT基础结构具有复杂、分散等特征,并且信息化程度越高,数据类型越繁杂,数据量也越庞大。许多单位不得不付出极大的人力、物力对网络进行管理。而一个单位的信息化的程度和IT部门的服务水平&#xff0…

设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置

CentOS下PPPoE拨号设置1.查看并安装拨号软件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

linux上pyenv卸载,在Ubuntu 18.04系统下安装pyenv的方法

本文介绍在Ubuntu 18.04操作系统下安装pyenv的方法,使用它可以进行Python多版本管理,目的是防止不同的Python版本因为不兼容而出现错误。安装pyenv其实非常的简单,只需要在系统终端中运行一条命令即可,以下是操作方法,…

linux防火墙作用是什么,Linux防火墙操作1

什么是防火墙防火墙可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。简单来讲 就是防止外界通过网络攻击Linux服务器的一个软件本次学习目标:防火墙的启停&#xff0…

lede 自定义linux,OpenWrt 和 LEDE 宣布正式合并

OpenWrt 和 LEDE 项目已在官网正式宣布合并,合并后的项目仍用 OpenWRT 命名。合并后的 OpenWrt 项目将按照 LEDE 制定的规范进行管理。原有的 LEDE 和 OpenWrt 项目的活跃成员将继续在合并后的 OpenWrt 上工作。LEDE 项目是 OpenWrt 的一个衍生项目,曾被…

旧衣回收小程序搭建有什么优势?

今年以来,旧衣回收行业分外火热,不断有创业者进入到市场中,其中不乏有年轻人,足以可见行业的火爆。 我国是人口大国,每个人闲置的衣物加在一起的数量难以计算,旧衣回收行业具有巨大的发展空间。 此外&…

c语言程序兔子反之问题,C语言解决兔子产子问题代码及解析

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?问题分析兔子数的规律,如下表所示:月数小兔子对数中…

c语言fork()创建线程,操作系统的创建原语是fork()还是creat()?

满意答案MythSwift2013.09.10采纳率:55% 等级:12已帮助:9461人一个进程就相当于一个主线程。fork一个进程与create一个线程的区别:fork进程:子进程复制父进程的进程环境。父进程结束不会影响子进程的运行。进程切换复制进程环境。create线…

android 最新 support,android support v7 下载-android support.v7包 官方最新版 - 河东下载站...

android support v7是一款功能非常实用的android在进行开发的过程中,必须要进行使用的一个包;这款软件作为一个功能非常全面的功能包,也是目前为止最新的功能包,是您这使用Android开发的时候,非常重要的一环&#xff1…

android aar jar制作,AndroidStudio aar、jar生成及其引用

aar生成新建项目,并在项目中新建Library module:banner,如图:在新建Module中编写完代码后,build整个工程后就会自动生成aar包,包的路径在新建Module 》 build 》outputs >aar目录下;aar引用在…