自己制作目标检测数据集

这里介绍2个制作目标检测数据集的工具:labelImg和labelme。用pip list查看自己电脑是否已安装这两个库,没有的话分别用pip install labelImgpip install labelme安装。

用labelImg默认生成的标签是.xml格式的,用labelme生成的标签是.json格式。labelImg可以修改标签格式,labelImg点击Save下面的Pascal VOC可以换成YOLO格式。

使用方法

两者使用方法一样,界面都差不多。直接cmd窗口输入labelImg或者labelme即可打开工具。


首先点击Open Dir打开我们存放图片的文件夹,labelImg点击Create RectBox即可在图片上画框,如果为检测困难物体,在右上角difficult那里打勾,画框介绍点Save或者Next Image就会在存放图片的文件夹下生产对应的.xml文件,一般直接用Next Image。labelImg点击Edit->Create Rectangle即可在图上画框,labelme还可以用Create Polygons在图片上画多边形,保存后在存放图片的文件夹下生产对应的.json文件,同样也是一张图片对应一个json文件,如果要将所有json文件合并成一个,可以用下面的代码实现:

import os
import argparse
import json
from labelme import utils
import numpy as np
import glob
import PIL.Image
#from PIL import Image
class labelme2coco(object):def __init__(self, labelme_json, save_json_path="./val.json"):self.labelme_json = labelme_jsonself.save_json_path = save_json_pathself.images = []self.categories = []self.annotations = []self.label = []self.annID = 1self.height = 0self.width = 0self.save_json()def data_transfer(self):for num, json_file in enumerate(self.labelme_json):with open(json_file, "r") as fp:print(json_file)data = json.load(fp)for key in data:print(key)print(data["shapes"])self.images.append(self.image(data, num))        for shapes in data["shapes"]:                   label = shapes["label"].split("_")if label not in self.label:self.label.append(label)points = shapes["points"]              self.annotations.append(self.annotation(points, label, num))self.annID += 1# Sort all text labels so they are in the same order across data splits.self.label.sort()for label in self.label:self.categories.append(self.category(label))for annotation in self.annotations:annotation["category_id"] = self.getcatid(annotation["category_id"])def image(self, data, num):image = {}img = utils.img_b64_to_arr(data["imageData"])height, width = img.shape[:2]img = Noneimage["height"] = heightimage["width"] = widthimage["id"] = numimage["file_name"] = data["imagePath"].split("/")[-1]self.height = heightself.width = widthreturn imagedef category(self, label):category = {}category["supercategory"] = label[0]category["id"] = len(self.categories)category["name"] = label[0]return categorydef annotation(self, points, label, num):annotation = {}contour = np.array(points)x = contour[:, 0]y = contour[:, 1]area = 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))annotation["segmentation"] = [list(np.asarray(points).flatten())]annotation["iscrowd"] = 0annotation["area"] = areaannotation["image_id"] = numannotation["bbox"] = list(map(float, self.getbbox(points)))annotation["category_id"] = label[0]  # self.getcatid(label)annotation["id"] = self.annIDreturn annotationdef getcatid(self, label):for category in self.categories:if label == category["name"]:return category["id"]print("label: {} not in categories: {}.".format(label, self.categories))exit()return -1def getbbox(self, points):polygons = pointsmask = self.polygons_to_mask([self.height, self.width], polygons)return self.mask2box(mask)def mask2box(self, mask):index = np.argwhere(mask == 1)rows = index[:, 0]clos = index[:, 1]left_top_r = np.min(rows)  # yleft_top_c = np.min(clos)  # xright_bottom_r = np.max(rows)right_bottom_c = np.max(clos)return [left_top_c,left_top_r,right_bottom_c - left_top_c,right_bottom_r - left_top_r,]def polygons_to_mask(self, img_shape, polygons):mask = np.zeros(img_shape, dtype=np.uint8)mask = PIL.Image.fromarray(mask)xy = list(map(tuple, polygons))PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)mask = np.array(mask, dtype=bool)return maskdef data2coco(self):data_coco = {}data_coco["images"] = self.imagesdata_coco["categories"] = self.categoriesdata_coco["annotations"] = self.annotationsreturn data_cocodef save_json(self):print("save coco json")self.data_transfer()self.data_coco = self.data2coco()print(self.save_json_path)os.makedirs(os.path.dirname(os.path.abspath(self.save_json_path)), exist_ok=True)json.dump(self.data_coco, open(self.save_json_path, "w"), indent=4)
if __name__ == "__main__":import argparse#parser = argparse.ArgumentParser(#   description="labelme annotation to coco data json file."#)#parser.add_argument(#   "labelme_images",#    help="Directory to labelme images and annotation json files.",#    type=str,#)#parser.add_argument(#   "--output", help="Output json file path.", default="trainval.json"#)#args = parser.parse_args()#labelme_json = glob.glob(os.path.join(args.labelme_images, "*.json"))filename = os.path.join("C:/Users/user/Desktop/images", "*.json")#print(filename, "first")labelme_json = glob.glob(filename)#print("labelme_json",labelme_json)output = "C:/Users/user/Desktop/images/train.json"labelme2coco(labelme_json, output)

自己制作目标检测数据集相关推荐

  1. 制作目标检测数据集入门到精通(一)常用数据集(及下载数据网站)汇总

    目录 前言 1.目标识别知名数据集 1.1 PASCAL VOC 1.2 MS COCO 1.3 ImageNet 2 人脸识别相关 2.1 FERET人脸数据库 2.2 CMU Multi-PIE人 ...

  2. 目标检测---以制作yolov5的数据集为例,利用labelimg制作自己的深度学习目标检测数据集(正确方法)

    以制作yolov5的数据集为例,利用labelimg制作自己的深度学习目标检测数据集的正确方法 文章目录 前言 一.labelimg简单介绍 1 VOC标签格式,保存为xml文件. 2 yolo标签格 ...

  3. TensorFlow Object Detection API 技术手册(5)——制作自己的目标检测数据集

    TensorFlow Object Detection API 技术手册(5)--制作自己的目标检测数据集 (一)收集图片 (二)安装图像打标工具labelImg (三)将XML文件转化为CSV文件 ...

  4. 【yolo5】目标检测数据集制作

    目录 1.先验知识 2. VOC和COCO数据集: 2.1 VOC形式及其数据结构XML特点(好像可以使用py库中工具直接进行清洗) 2.1.1 VOC数据集的组织结构如下所示 2.1.2 XML的操 ...

  5. 史上最强!目标检测数据集标注工具网页版

    前言 相信做目标检测的大家都有过会在将会有制作自己的目标检测数据集的需求.标注数据就得有相应的工具,这里就提供了这样一个标注工具.这个标注工具有着独一无二的特点,它是基于浏览器的标注工具.这就意味着任 ...

  6. 数据集:Udacity Self-Driving 目标检测数据集

    转载自:http://blog.csdn.net/jesse_mx/article/details/72599220 前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SS ...

  7. Udacity Self-Driving 目标检测数据集简介与使用

    前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SSD框架训练过KITTI数据集,几次训练下来,结果不太理想.自己分析,原因较多,其中很重要的一条就是KITTI数据集不够 ...

  8. 100种目标检测数据集【voc格式yolo格式json格式coco格式】+YOLO系列算法源码及训练好的模型

    提示:本文介绍并分享了应用于各行业.各领域非常有用的目标检测数据集(感谢您的关注+三连,数据集持续更新中-),其中绝大部分数据集作者已应用于各种实际落地项目,数据集整体质量好,标注精确,数据的多样性充 ...

  9. 红外目标检测数据集--入门到放弃

    红外目标检测数据集: 1.SCUT FIR Pedestrain(Caltech格式) 下载地址:http://www2.scut.edu.cn/cv/download/main.htm 道路行人检测 ...

最新文章

  1. oracle hot patch david,Oracle EBS使用adpatch工具打patch过程(hotpatch mode)
  2. C语言优势大揭露,你还在等什么呢?
  3. ajax跨界表单,ajax使用jsonp解决跨域问题
  4. R堆叠柱状图各成分连线画法:突出展示组间物种丰度变化
  5. php怎么接受,如何使php://input接收到另一个php的数据
  6. 窥探日志的秘密【华为云分享】
  7. Qt4: Show an image in your widget – 在Qt里面显示图像
  8. TTL怎么计算拉电流和灌电流_预付费电表工作原理 是怎么实现断电功能
  9. VBS 实现无限弹窗整人
  10. Java 文件传输 (TCP、UDP)
  11. viewStub 延迟布局加载
  12. ps3 2.0固件升级导致wifi失败
  13. 【Python 多进制转换】——数值多进制转换bin、oct、int、hex(2进制、4进制、8进制、10进制、16进制、32进制)
  14. html文档成品,HTML成品代码
  15. Mysql:select ...for update
  16. 计算机二级两个控件之间求偶,求,全国计算机等级考试二级java历年试题及答案合集,还有上机考试真题?...
  17. NEB方法计算离子扩散路径和能垒(过渡态的计算)
  18. BIOS、UEFI、Boot Loader都是些什么
  19. 关于在neo4j中使用cypher语句实现NOT IN 的功能
  20. 通过升级cmake版本解决NDK编译报错:no member named ‘signbit‘ in the global namespace;

热门文章

  1. 服务器显示cpu温度高,服务器日志中发现cpu过热问题 | 恋香缘
  2. IPsec ISAKMP
  3. Ubuntu下OpenCV的使用示例
  4. 如何再工作总保持稳定情绪
  5. flask前后端交互
  6. php循环语句 每循环一次停顿 几秒
  7. 用友打印问题汇总【年底打印备查】
  8. 怎么搭建大数据平台,这个大数据平台方案值得学习
  9. Android L 漫游浅析
  10. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)