利用opencv图像处理库制作【图像-关键点json标签】的数据集生成器

背景:关于读取json文件的方法

1. 数据

数据目录
– /keypoints_pose/

  • –/train_img/
  • –/train_label_pose/
  • –/val_img/
  • –/val_label_pose/

如图所示

2. 数据集结果展示:(图像,坐标)


3. 代码实现

dataset_json_by_cv2.py

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/5/24 15:32
# @Author  : Hyan Tan
# @File    : dataset_json_by_cv2.py.py
import os
from abc import abstractmethod, ABCMeta
import numpy as np
import pandas as pd
import jsonimport cv2
from torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms
from transformation import RandomAdd, ImageResize, RandomCrop, RandomFlip, RandomRotate, Distort# ---人像-人体关键点数据集生成器---
class KeyPointsPose(Dataset):def __init__(self, root_dir=r'E:/Datasets/keypoints_pose/', image_set='train', transforms=None):"""初始化数据集:param root_dir: 数据目录(.csv和images的根目录):param image_set: train训练,val验证,test测试:param transforms(callable,optional):图像变换-可选标签数据文件格式为json_file: 标签json文件(内容:图像相对地址-category类型-标签coordination坐标)"""super(KeyPointsPose, self).__init__()self._imgset = image_setself._image_paths = []self._labels = []self._root_dir = root_dirself._transform = transformsself.__getFileList()  # 图地址列表和标签列表def __getFileList(self):img_path = os.path.join(self._root_dir, self._imgset + '_img')  # 图像目录label_path = os.path.join(self._root_dir, self._imgset + '_label_pose')  # 标签目录self._image_paths = os.listdir(img_path)for img_ in self._image_paths:pose_name = img_.replace('.png', '_keypoints.json').replace('.jpg', '_keypoints.json')  # 标签名和图像对应,后缀不同。with open(os.path.join(label_path, pose_name), 'r') as f:pose_label = json.load(f)try:pose_data = pose_label['people'][0]['pose_keypoints']except IndexError:pose_data = [0 for i in range(54)]  # 数据读取失败时,创建18组0,0,0pose_data = np.array(pose_data)pose_data = pose_data.reshape((-1, 3))self._labels.append(pose_data)def __getitem__(self, idx):label = self._labels[idx]image = cv2.imread(os.path.join(self._root_dir + self._imgset + '_img', self._image_paths[idx]),cv2.IMREAD_COLOR)imgSize = image.shape  # cv2读取的是图像数组类型  BGR  H W Cif self._transform:image = self._transform(image)afterSize = image.shape# bi = np.array(afterSize[0:2]) / np.array(imgSize[0:2])# 坐标(x,y)代表的是w,h。图像是h,w,c的格式,所以此处反着来bi = np.array((afterSize[1], afterSize[0])) / np.array((imgSize[1], imgSize[0]))label[:, 0:2] = label[:, 0:2] * bi  # 图像伸缩变换,坐标同步伸缩image = image.astype(np.float32)return image, labeldef __len__(self):return len(self._image_paths)def showImageAndCoor(img, coords):point_size = 1point_color = (0, 0, 255)  # BGRthickness = 4  # 0 、4、8img = cv2.cvtColor(img.astype(np.uint8), cv2.COLOR_BGR2RGB)  # numpy数组和cv2的mat的转换cv2.namedWindow("image")for coor in coords:if coor[2] == -1:  # 略去不存在的点passelse:cv2.circle(img, (int(coor[0]), int(coor[1])), point_size, point_color, thickness)  # 展示图像是正常的cv2.imwrite('1.png', img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])cv2.imshow("image", img)cv2.waitKey(1500)train_transform = transforms.Compose([ImageResize(size=256),
])
val_transform = train_transform
test_transform = transforms.Compose([ImageResize(size=288),RandomCrop(in_size=288, out_size=256),  # 随机裁剪,测试可用,验证也不可用RandomFlip(),  # 随机翻转RandomRotate(),  # 随机旋转Distort()  # 歪曲
])if __name__ == "__main__":kpp = KeyPointsPose(root_dir=r"E:/Datasets/keypoints_pose/", image_set='train', transforms=train_transform)train_loader = DataLoader(kpp, batch_size=4, shuffle=False, drop_last=True)# content = Content(root_dir=r"E:/Datasets/keypoints_pose/", image_set='train', strategy='json', outsize=256)# train_loader = content.get_dataLoader()for i_batch, data in enumerate(train_loader):img, label = dataimg, label = img.numpy(), label.numpy()print(img.shape, label.shape)showImageAndCoor(img[0], label[0])

tranformation.py:

# -*- coding: utf-8 -*-
# @Time    : 2022/5/16 11:38
# @Author  : Hyan Tan
# @File    : transformation.py
import cv2
import random
import osclass RandomAdd:def __init__(self, add_path=""):self.imgs = []for files in os.walk(add_path):for file_name in files[2]:self.imgs.append(cv2.imread(os.path.join(add_path, file_name)))def __call__(self, image):if random.random() < 0.2:idx = random.randrange(len(self.imgs))select_img = self.imgs[idx]h, w, _ = select_img.shapeif h < image.shape[0] // 2 and w < image.shape[1] // 2:begin_x = random.randrange(image.shape[1] - w)begin_y = random.randrange(image.shape[0] - h)image[begin_y:begin_y + h, begin_x:begin_x + w, :] = select_imgreturn imageclass ImageResize:def __init__(self, size=256):self._size = sizedef __call__(self, image):image = cv2.resize(image, (self._size, self._size))return imageclass RandomCrop:def __init__(self, in_size=256, out_size=224):self._in_size = in_sizeself._out_size = out_sizedef __call__(self, image):dis = self._in_size - self._out_sizecol_start = random.randint(0, dis)row_start = random.randint(0, dis)image = image[row_start:(row_start + self._out_size), col_start:(col_start + self._out_size)]return imageclass RandomFlip:def __call__(self, image):if random.random() < 0.5:image = image[:, ::-1, :]return imageclass RandomRotate:def rotateImg(self, image, angle):rows, cols, _ = image.shapeM = cv2.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), angle, 1)image = cv2.warpAffine(image, M, (cols, rows))return imagedef __call__(self, image):if random.randrange(2):if random.randrange(2):image = self.rotateImg(image, 5)else:image = self.rotateImg(image, -5)return imageclass Distort:def _convert(self, image, alpha=1, beta=0):tmp = image.astype(float) * alpha + betatmp[tmp < 0] = 0tmp[tmp > 255] = 255image[:] = tmpdef __call__(self, image):if random.randrange(2):# brightness distortionif random.randrange(2):self._convert(image, beta=random.uniform(-32, 32))# contrast distortionif random.randrange(2):self._convert(image, alpha=random.uniform(0.5, 1.5))image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# saturation distortionif random.randrange(2):self._convert(image[:, :, 1], alpha=random.uniform(0.5, 1.5))# hue distortionif random.randrange(2):tmp = image[:, :, 0].astype(int) + random.randint(-18, 18)tmp %= 180image[:, :, 0] = tmpimage = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)else:# brightness distortionif random.randrange(2):self._convert(image, beta=random.uniform(-32, 32))image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# saturation distortionif random.randrange(2):self._convert(image[:, :, 1], alpha=random.uniform(0.5, 1.5))# hue distortionif random.randrange(2):tmp = image[:, :, 0].astype(int) + random.randint(-18, 18)tmp %= 180image[:, :, 0] = tmpimage = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)# contrast distortionif random.randrange(2):self._convert(image, alpha=random.uniform(0.5, 1.5))return image

4.注意事项:

  1. cv2读图的数据结构为(h,w,c)=(高,宽,通道),坐标组是(宽x, 高y)。统一伸缩时注意对应。
  2. 本文输出数据集为了显示并没有对图像数组进行归一化或标准化操作,用的时候需要加上归一化。
  3. 本文数据集为:图像-人体关键点json标签,读取csv文件用pandas.read_csv,读取json文件直接用openjson.load(f)方法。

【图像-关键点json标签】的数据集生成器相关推荐

  1. labelme标记图像时JSON标签复制

    我这次的项目收集到的数据集是固定摄像头在不同时候拍摄的照片,场景变化不大,主要检测物也变化不大,除了刮风和植被生长会影响标记轮廓.几百张图片手工标记会有很多重复工作,而且图片像素也没有发生改变,那我们 ...

  2. json标签批量转为xml标签(VOC数据集制作)

    github链接,里面有我最近写的一些标签的转换脚本 这是一份将json格式的数据集标签转为xml类型标签的脚本,供大家参考 先说下我的应用场景:天池街景识别提供的json文件,用于制作VOC格式数据 ...

  3. Json格式的数据集标签转化为有效的txt格式(data_coco)

    Json格式的数据集标签转化为有效的txt格式(data_coco) 学习前言 分析json格式标签 转化为有效的txt格式 实现效果 学习前言 在参加许多目标检测比赛时,为了能够获得合理的评价结果, ...

  4. YOLOV5的Json格式的数据集标签转化成txt格式

    应用背景 思路分析 转化成txt 实现效果 总结 1.应用背景 当你要做某个目标检测的项目时,你获得的数据集可能是VOC格式的,也可能是Json格式的.但是用YOLOV5做目标检测的时候存储标签数据的 ...

  5. 钢铁表面缺陷检测图像数据集(1800张图像,voc标签)

    <annotation>     <folder>rs</folder>     <filename>0.jpg</filename>    ...

  6. 输电线路防外力破坏图像数据集(1500张图像,VOC标签,5类目标)

    检测目标:1)烟火:2)吊车:3)塔吊:4)导线异物:5)施工机械: 下载地址(3个包,每个不一样):输电线路防外力破坏图像数据集1(500张图像,VOC标签): 输电线路防外力破坏图像数据集2(50 ...

  7. 将多个文件夹或单文件夹内的xml文件转换为一个json标签(imagenet VID等视频目标检测数据集)简单易改,有注释

    文章目录 多文件夹xml文件转json 单文件夹xml文件转json 该代码主要针对视频目标检测yolov项目需要训练基础的yolox检测器所写(需要VID的json标签文件),鉴于网上没有公开的代码 ...

  8. 输电线路无人机配电网巡检图像数据集(80G大小数据,几w张图像,无标签)

    下载地址:输电线路无人机配电网巡检图像数据集(80G大小数据,几w张图像,无标签,网盘下载链接)

  9. 文本生成图像工作简述2--常用数据集分析与汇总

    文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像.用户可以输入他们喜欢的任何文字提示--比如,"一只可爱的柯基犬住在一个用寿司做的房子里"--然后,人工智能就像施了魔法一 ...

最新文章

  1. 西南大学网络教育学院计算机答案,西南大学网络与继续教育学院课程《数字信号处理》2018年春季大作业机考 答案.doc...
  2. 【TensorFlow】——Windows10、pycharm、Python3.6.4中安装CPU和GPU两种版本的TensorFlow
  3. poj3186 Treats for the Cows(区间)
  4. “3D几何与视觉技术”全球在线研讨会第二期
  5. html----学习笔记
  6. corosycnpacemaker的高可用web集群
  7. Dynamics 365 Document Management
  8. 树莓派python通过websockets使用调用Leapmtion
  9. 树莓派编译安装完整版本ROS
  10. 以太坊nonce详解
  11. SSD NVMe核心之PRP算法
  12. python输出输入法_python 怎么转化输入法
  13. 以CS1237为例来看ADC芯片两个基本指标
  14. 【时间之外】面向监狱的编程?该学学网络安全法了(1)
  15. 风变编程,让小白也能轻松学会!
  16. socket接口技术和相关函数(socket,bind,listen,accept)
  17. 级联选择器el-cascader处理复杂数据(四层、五层数据),回显部门以及部门下的人员
  18. Python入门基础教程(非常详细),手把手教学
  19. 关于平滑滤波,中值滤波,KNN滤波的图像处理(附matlab代码)
  20. 揭秘Gamefi今年火爆的5大原因

热门文章

  1. python敲七游戏代码_敲七游戏 (C语言代码)
  2. Vue 项目打包为 exe 可安装程序
  3. 如果你想要“一百种”方法玩转天猫双11,这里是一份完整版指南
  4. 基于DOM的骨架屏自动生成方案
  5. STM32 ST-LINK 下载错误解决方法
  6. 联想小新,蓝牙突然不能用了解决办法!
  7. 诺基亚手机运行linux,诺基亚专业相机安装包泄露:非诺基亚手机也可运行
  8. 1018. 最低通行费
  9. 矿大计算机转专业,矿大转专业真的容易吗
  10. 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)