目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)

本文主要是介绍目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

0. 前言

1. Penn-Fudan数据集介绍

2. Penn-Fudan数据集预处理过程

3. 结果展示

4. 完整代码


0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本文以Penn-Fudan数据集预处理为例,说明用于目标检测算法训练的数据集的预处理方法及过程。

因为要给目标检测算法进行训练,需要预先提取出图像中定位及分类相关信息,过程稍微有点复杂,所以单独写作这篇博客专门介绍整个过程。

1. Penn-Fudan数据集介绍

1.1 基础概述

Penn-Fudan行人数据集(Penn-Fudan Pedestrian Detection Dataset)是一个专门用于行人检测任务的小规模图像数据集。这个数据集由宾夕法尼亚大学和复旦大学的研究者共同创建,主要用于学术研究和算法验证。

该数据集包含170张高分辨率的RGB图像,这些图片都是从视频序列中截取的,并且在每幅图像中有0到6个不等的行人目标。每个行人的位置都通过矩形框(mask)进行了精确标注,提供了边界框坐标信息,便于进行目标检测训练和测试。

Penn-Fudan数据集的文件结构如下:

PennFudanPed/
├── Annotation/       #包含每个图像的注释,包含有多少行人及行人位置等信息
│   ├── FudanPed00001.txt
│   ├── FudanPed00002.txt
│   └── ... 
├── PedMasks/       #包含每个行人的掩码图像
│   ├── FudanPed00001_mask.png
│   ├── FudanPed00002_mask.png
│   └── ...       
├── PNGImages/      # 图像文件夹
│   ├── FudanPed00001.png
│   ├── FudanPed00002.png
│   └── ...        
└── readme.txt
1.2 图像内容
  • 场景:图像采集自多种环境,如校园、街道、人行横道等,涵盖了不同光照条件、行人姿态和遮挡情况。
  • 行人数量:总计标注了345个行人的实例,每张图片中至少有一个行人,部分图片中有多个行人。
1.3 标注信息

Penn-Fudan数据集所有图像都按照PASCAL VOC格式进行标注,包括每个行人的精确边界框和像素级分割掩模。

  • 边界框(Bounding Boxes):每个行人实例都有一个矩形边界框,用于表示行人在图像中的位置。
  • 分割掩模(Segmentation Masks):除了边界框之外,还提供了每个行人实例的精细像素级分割标签,这对于训练和评估基于深度学习的语义分割模型非常有用。
1.4 应用示例
  • 模型训练与验证:该数据集常被用于微调预训练的物体检测和实例分割模型,例如Mask R-CNN,以检验其对行人检测及分割任务的适应性。
  • 算法比较:研究者使用Penn-Fudan数据集来对比不同行人检测和分割方法的效果,并以此来改进算法性能。
1.5 获取与使用
  • 资源获取:用户通常需要从官方或相关学术项目网站下载该数据集,数据集中包含了图像文件夹(如“PNGImages”)和相应的XML标注文件。
  • 数据加载:利用工具如`TorchVision`或其他计算机视觉库可以方便地加载和解析这些标注数据,进而进行模型训练和实验。

需要数据集的小伙伴可以留下邮箱。

2. Penn-Fudan数据集预处理过程

首先需要解释下PedMasks中的mask,mask是一个二维矩阵,用于标注图像中的行人:用“0”标注图像背景,用“1”标注“行人1”,“2”标注“行人2”,以此类推……

下面示意图可以更加形象地说明mask:

当然真实mask要达到像素级精度,比上面示意图密集得多。

Penn-Fudan数据集预处理过程可以分为以下几个步骤:

  1. 提取mask中的值mask_id,确认图像中有几个行人,例如上图mask_id = [1, 2];
  2. 按照mask_id把单个mask拆分成多个masks,拆分过程如下图;
  3. 确认masks中的每个行人的位置,即每个ground truth框的[x_min, y_min, x_max, y_max];

3. 结果展示

按上述过程对Penn-Fudan数据集进行预处理,结果如下:

其中绿色框代表行人的ground truth框,红色数字代表行人编号。

4. 完整代码

import os
import numpy as np
from PIL import Image
import cv2class PFdataset():def __init__(self, path):self.path = pathself.imgs = list(sorted(os.listdir(os.path.join(path, 'PNGImages'))))  #图像列表:['FudanPed00001.png', 'FudanPed00002.png'...]self.masks = list(sorted(os.listdir(os.path.join(path, 'PedMasks'))))  #Mask列表:['FudanPed00001_mask.png', 'FudanPed00002_mask.png'...]def __getitem__(self, item):img_path = os.path.join(self.path, 'PNGImages', self.imgs[item])  #输出单个图像的地址:Penn-Fudan\PNGImages\FudanPed00xxx.pngmask_path = os.path.join(self.path, 'PedMasks', self.masks[item])  #输出单个mask的地址:Penn-Fudan\PedMasks\PennPed00xxx_mask.pngimg = Image.open(img_path).convert('RGB')   #例 <PIL.Image.Image image mode=RGB size=559x536 at 0x2103A5ED790> , 可以用.show()看到图像, 可以用 numpy.array()看到图像数据mask = np.array(Image.open(mask_path))  #例  <PIL.PngImagePlugin.PngImageFile image mode=L size=530x410 at 0x214FACC83D0>mask_id = np.unique(mask) #提取mask的编码,例:编码有[0,1,2]。0代表背景,1代表人物1,2代表人物2mask_id = mask_id[1:]  #0是背景,进行切片,编码仅剩[1,2]masks = mask == mask_id[:,None,None]  #把不同对象的mask提取出来,mask_id[:,None,None]相当于array的升维gt_boxs = []  #groundtruth框的坐标值listfor i in range(len(mask_id)):box = np.where(masks[i])xmin = np.min(box[1])xmax = np.max(box[1])ymin = np.min(box[0])ymax = np.max(box[0])gt_boxs.append([xmin, ymin, xmax, ymax, mask_id[i]])#使用cv2画框并且标注序号img_cv2 = cv2.imread(img_path)for [xmin, ymin, xmax, ymax, mask_id] in gt_boxs:cv2.rectangle(img_cv2,(xmin,ymin),(xmax,ymax),(0, 255, 0), 2)text = '%s'%mask_idfont = cv2.FONT_HERSHEY_SIMPLEXfont_scale = 1color = (0, 0, 255)  # 蓝色文本thickness = 2text_size, baseline = cv2.getTextSize(text, font, font_scale, thickness)text_origin = (xmin,ymin + baseline*3)# 在矩形框上方写入文本cv2.putText(img_cv2, text, text_origin, font, font_scale, color, thickness, cv2.LINE_AA)cv2.imshow('gt_box',img_cv2)cv2.imwrite('Penn-Fudan/output/%s.jpg'%item, img_cv2)dataset = PFdataset('Penn-Fudan')
dataset[1]

这篇关于目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面