【目标检测】Visdrone数据集和CARPK数据集预处理

之前的博文【目标检测】YOLOv5跑通VisDrone数据集对Visdrone数据集简介过,这里不作复述,本文主要对Visdrone数据集和CARPK数据集进行目标提取和过滤。

需求描述

本文需要将Visdrone数据集中有关车和人的数据集进行提取和合并,车标记为类别0,人标记为类别1,并转换成YOLO支持的txt格式。

Visdrone数据集

Visdrone数据集转换成YOLO的txt格式

首先对原始数据集做一个格式转换,下面这段代码延用官方提供的转换脚本。

from utils.general import download, os, Pathdef visdrone2yolo(dir):from PIL import Imagefrom tqdm import tqdmdef convert_box(size, box):# Convert VisDrone box to YOLO xywh boxdw = 1. / size[0]dh = 1. / size[1]return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh(dir / 'labels').mkdir(parents=True, exist_ok=True)  # make labels directorypbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')for f in pbar:img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).sizelines = []with open(f, 'r') as file:  # read annotation.txtfor row in [x.split(',') for x in file.read().strip().splitlines()]:if row[4] == '0':  # VisDrone 'ignored regions' class 0continuecls = int(row[5]) - 1  # 类别号-1box = convert_box(img_size, tuple(map(int, row[:4])))lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:fl.writelines(lines)  # write label.txtdir = Path(r'E:\Dataset\VisDrone')  # datasets文件夹下Visdrone2019文件夹目录
# Convert
for d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':visdrone2yolo(dir / d)  # convert VisDrone annotations to YOLO labels

标签可视化

对txt标签进行可视化,查看过滤之前的效果。

import os
import numpy as np
import cv2# 修改输入图片文件夹
img_folder = "image"
img_list = os.listdir(img_folder)
img_list.sort()
# 修改输入标签文件夹
label_folder = "labels2"
label_list = os.listdir(label_folder)
label_list.sort()
# 输出图片文件夹位置
path = os.getcwd()
output_folder = path + '/' + str("output")
os.mkdir(output_folder)# 坐标转换
def xywh2xyxy(x, w1, h1, img):label, x, y, w, h = x# print("原图宽高:\nw1={}\nh1={}".format(w1, h1))# 边界框反归一化x_t = x * w1y_t = y * h1w_t = w * w1h_t = h * h1# print("反归一化后输出:\n第一个:{}\t第二个:{}\t第三个:{}\t第四个:{}\t\n\n".format(x_t, y_t, w_t, h_t))# 计算坐标top_left_x = x_t - w_t / 2top_left_y = y_t - h_t / 2bottom_right_x = x_t + w_t / 2bottom_right_y = y_t + h_t / 2# print('标签:{}'.format(labels[int(label)]))# print("左上x坐标:{}".format(top_left_x))# print("左上y坐标:{}".format(top_left_y))# print("右下x坐标:{}".format(bottom_right_x))# print("右下y坐标:{}".format(bottom_right_y))# 绘制矩形框# cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)), colormap[1], 2)# (可选)给不同目标绘制不同的颜色框if int(label) == 0:cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)), (0, 255, 0), 2)elif int(label) == 1:cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)), (255, 0, 0), 2)else:cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)), (0, 0, 0), 2)return imgif __name__ == '__main__':for i in range(len(img_list)):image_path = img_folder + "/" + img_list[i]label_path = label_folder + "/" + label_list[i]# 读取图像文件img = cv2.imread(str(image_path))h, w = img.shape[:2]# 读取 labelswith open(label_path, 'r') as f:lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)# 绘制每一个目标for x in lb:# 反归一化并得到左上和右下坐标,画出矩形框img = xywh2xyxy(x, w, h, img)"""# 直接查看生成结果图cv2.imshow('show', img)cv2.waitKey(0)"""cv2.imwrite(output_folder + '/' + '{}.png'.format(image_path.split('/')[-1][:-4]), img)

可视化效果如图所示:
注:该数据集对人的姿态还进行区分,行走状态的人划分为pedestrian,其它姿态(比如躺下或坐下)标记为people。

在这里插入图片描述

过滤标签

具体过滤规则:

  • 合并car、van、truck、bus为car(0)
  • 合并pedestrian,people为person(1)
  • 舍弃其它类别
import os
import numpy as np
from tqdm import tqdm# Visdrone类别
# names: ['pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor' ]# 修改输入标签文件夹
label_folder = "labels"
label_list = os.listdir(label_folder)# 标签输出文件夹
label_output = "labels2"# class_set
car_set = [3, 4, 5, 8]
person_set = [0, 1]if __name__ == '__main__':for label_file in tqdm(os.listdir(label_folder)):# 读取 labelswith open(os.path.join(label_folder, label_file), 'r') as f:lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)# 写入 labelswith open(os.path.join(label_output, label_file), 'a') as f:for obj in lb:# 若是行人,修改类别为1if int(obj[0]) in person_set:obj[0] = 1f.write(('%g ' * 5).rstrip() % tuple(obj) + '\n')# 若是车辆,修改类别为0elif int(obj[0]) in car_set:obj[0] = 0f.write(('%g ' * 5).rstrip() % tuple(obj) + '\n')

过滤之后的效果如图所示:

在这里插入图片描述

CARPK数据集

CARPK数据集是无人机在40米高空拍摄的汽车数据集,里面仅包含汽车单一目标。

下载地址:https://github.com/zstar1003/Dataset

原始label格式:

1019 521 1129 571 1
1013 583 1120 634 1

对应含义为: xmin, ymin, xmax, ymax,cls

处理脚本:

import os
import numpy as np
from tqdm import tqdm# 修改输入标签文件夹
# label_folder = r"E:\Dataset\CARPK_devkit\data\Annotations"
label_folder = r"annotations"
label_list = os.listdir(label_folder)# 标签输出文件夹
label_output = r"labels"# 图像宽高
img_width = 1280
img_height = 720if __name__ == '__main__':for label_file in tqdm(os.listdir(label_folder)):# 读取 labelswith open(os.path.join(label_folder, label_file), 'r') as f:lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=int)for obj in lb:class_index = obj[4]xmin, ymin, xmax, ymax = obj[0], obj[1], obj[2], obj[3]# 将box信息转换到yolo格式xcenter = xmin + (xmax - xmin) / 2ycenter = ymin + (ymax - ymin) / 2w = xmax - xminh = ymax - ymin# 绝对坐标转相对坐标,保存6位小数xcenter = round(xcenter / img_width, 6)ycenter = round(ycenter / img_height, 6)w = round(w / img_width, 6)h = round(h / img_height, 6)info = [str(i) for i in [class_index, xcenter, ycenter, w, h]]# 写入 labelswith open(os.path.join(label_output, label_file), 'a') as f:# 若文件不为空,添加换行if os.path.getsize(os.path.join(label_output, label_file)):f.write("\n" + " ".join(info))else:f.write(" ".join(info))

可视化验证转换效果:

在这里插入图片描述

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

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

相关文章

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示:在设置代理之前,请确保您已经安装了 浏览器。 🔧 设置代理的详细步骤如下: 打开 浏览器,输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…

Android原生项目集成uniMPSDK(Uniapp)遇到的报错总结

uni小程s序SDK 集成到Android原生项目:老项目中用到的库较多,会出现几种冲突问题,总结如下: 报错1: Execution failed for task :app:processDebugManifest. > Manifest merger failed with multiple errors, see logs Andro…

初识HTML超文本标记语言

文章目录 前端简介引入前端三剑客什么是HTML?超文本传输协议前戏HTTP超文本传输协议1.什么是HTTP协议2.四大特性3.数据格式4.响应状态码 基于HTTP协议搭建HTMLHTML简介 前端简介 引入 前端:与用户直接打交道的操作界面都可以称之为前端(那些炫酷的页面)…

【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

题目内容 原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len len 。 问最少可以拆分成多少个连续子数组&#xff0…

计算机视觉注意力机制小盘一波 (学习笔记)

将注意力的阶段大改分成了4个阶段 1.将深度神经网络与注意力机制相结合,代表性方法为RAM ⒉.明确预测判别性输入特征,代表性方法为STN 3.隐性且自适应地预测潜在的关键特征,代表方法为SENet 4.自注意力机制 通道注意力 在深度神经网络中…

TypeScript - 枚举 - 数字枚举

什么是枚举 枚举就是有固定的元素的一个对象。 对象的元素可以直接列举出来。 什么是数字枚举 数字枚举,就是我们通俗意义上的枚举类型。 定义的元素是与数字一一对应的。 特点 默认从0开始,步长为1 递增 可以指定值,后面的以步长为1&#xf…

Android问题笔记四十一:JNI NewStringUTF错误的几种解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

【游戏开发】【心法】游戏设计心法系列1-以玩法为核心去设计游戏

游戏的本质 游戏的魔法在于寻找隐藏事物之间的联系。 游戏的魅力在于随着玩家逐渐发现并了解游戏世界的方方面面,他会得到一种丰富而深厚的体验。 挑战,竞争和互动是游戏玩法的三大要素。 规则,过程,目标则是游戏内容的要素。 如…

学生成绩管理系统(c语言)

目录 题目需求 程序编写 定义学生结构体: 选择菜单: 文件读入结构体变量: 结构体变量写入文件: 输入检查: 输入记录: 打印记录: 修改记录: 删除记录: 查找信息: 最终代码: 调试: 软件准备: 测试数据: 直接复制测试数据版本: 输入,打印输出…

合并两个有序链表(C++)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出&#xff1…

取Dataset子集(pytorch)

取Dataset子集--pytorch 1. why2. how3. example 1. why 我们在调试深度学习代码时,常常会遇到数据集太大,导致调试浪费时间的情况,这种情况下,将数据集中的一个子集拿出来用于调试代码,调试成功在用完整的数据集运行…

从InnoDB索引的数据结构,去理解索引

从InnoDB索引的数据结构,去理解索引 1、InnoDB 中的 BTree1.1、BTree 的组成1.2、BTree中的数据页 2、聚簇索引2.1、聚簇索引的特点2.2、聚簇索引的结构示例2.3、聚簇索引的优缺点 3、非聚簇索引3.1、非聚簇索引结构示例3.2、关于回表3.3、聚簇索引和非聚簇索引的区…

快速排序算法

快速排序一:给定一个数组,进行排序,要求排序完成之后,小于数组最后一个元素的数据全部在它的左边,大于它的全部在它的右边,左右两边内部不要求有序,比如原数组是[5, 6, 3, 1, 2, 3]排序完之后:[…

数据特征工程 | 基于PCA算法(Python)

随着数据量的不断增加和数据维度的不断扩展,如何进行高效的数据降维处理成为了一个热门话题。在数据分析领域,PCA算法作为一种常用的数据降维方法,可以对多个特征进行降维,提高计算效率和降低存储空间需求。本文以波士顿房价数据集为例,探讨如何利用PCA算法对房屋价格进行…

基本微信小程序的外卖点餐订餐平台

项目介绍 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间&#xf…

css四种导入方式

1 行内样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1 style"color: blue">我是标题</h1> </body> </htm…

【java爬虫】爬虫获取某交易所公司半年报全量数据

上一篇文章介绍了使用selenium获取某交易所公司半年报的方法&#xff0c;页面中公开展示的数据一共有2222条&#xff0c;本文就将所有数据分享出来。 这是上一篇文章 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 首先是建表sql语句 use finance_db;/* 半…

批量去除影视剧中的片头片尾

1. 下载ffmpeg并配置环境变量 ffmpeg下载地址 Windows下配置ffmpeg环境变量 2. 运行脚本 Git下载地址 Windows系统下如何运行.sh脚本文件 在Windows上面可以安装git&#xff0c;然后使用Git Bash运行此脚本。 视频目录一定要用英文双引号括起来。 ./cut.sh "视频目录&q…