目标检测数据库 PASCAL 格式的 Ground Truth 的解析函数
最近在做一个目标检测算法,训练时用到了 bootstrap 策略,于是我将PASCAL的 Ground Truth 格式的读取函数从 Matlab 改写为 C++。PASCAL 的标注格式为:
# PASCAL Annotation Version 1.00
Image filename : "对应图片路径"
Image size (X x Y x C) : 宽 x 高 x 3
Database : "数据库名称"
Objects with ground truth : 1 { "PASperson" }
# Note that there might be other objects in the image
# for which ground truth data has not been provided.
# Top left pixel co-ordinates : (0, 0)
# Details for object 1 ("PASperson")
# Center point -- not available in other PASCAL databases -- refers
# to person head center
Original label for object 1 "PASperson" : "UprightPerson"
Center point on object 1 "PASperson" (X, Y) : (257, 187)
Bounding box for object 1 "PASperson" (Xmin, Ymin) - (Xmax, Ymax) : (195, 154) - (297, 468)
我写的函数如下:
#include "stdio.h"
#include "string.h"
#include "stdlib.h" // object bounding rect
struct GtRect {
int x_min; int y_min;
int x_max; int y_max;
}; // ground truth of one image
struct GtRecord {
char* image_name;
GtRect* objs;
int obj_num; int height;
int width; int channels;
}; // return true if c is in char set s
int _is_chars(char c, const char* s, int n)
{
for (int i = ; i != n; ++i) {
if (s[i] == c) {
return ;
}
}
return ;
} void _trim_l(char* inout, const char* s)
{
int len = strlen(inout);
int s_len = strlen(s);
int i = ;
for (;i != len; ++i) {
if (!_is_chars(inout[i], s, s_len)) {
break;
}
}
int d = i;
int new_len = len - d;
for (i = ; i != new_len; ++i) {
inout[i] = inout[i + d];
}
inout[new_len] = '\0';
} void _trim_r(char* inout, const char* s)
{
int len = strlen(inout);
int s_len = strlen(s);
int i = len - ;
for (;i != -; --i) {
if (!_is_chars(inout[i], s, s_len)) {
break;
}
}
inout[i + ] = '\0';
} inline void _trim_lr(char* inout, const char* s)
{
_trim_l(inout, s);
_trim_r(inout, s);
} // read ground truth (pascal format)
//************************************
// Name: gt_pascal_read
// Returns: GtRecord
// const char * path : groundtruth file path
//************************************
GtRecord gt_pascal_read(const char* path)
{
GtRecord ret = {, , , , , };
FILE* f;
fopen_s(&f, path, "r");
int obj_num = ;
int len = ;
GtRect rct;
while (fgets(BUF1, , f) != ) {
int match_type = _match_attr(BUF1);
switch (match_type) {
case :
// read image filename
sscanf_s(BUF1, _GT_ATTR[], BUF2, );
_trim_lr(BUF2, "\n\" ");
len = strlen(BUF2);
ret.image_name = (char*)malloc(len + );
memcpy(ret.image_name, BUF2, len + );
break;
case :
// read image size, channel
sscanf_s(BUF1, _GT_ATTR[], &ret.width, &ret.height,
&ret.channels);
break;
case :
// ignore database name
break;
case :
sscanf_s(BUF1, _GT_ATTR[], &rct.x_min,
&rct.y_min, &rct.x_max, &rct.y_max);
OBJ_BUF[obj_num++] = rct;
break;
case :
// ignore polygon
case :
// ignore pixel map
case :
// ignore label
break;
}
}
fclose(f);
ret.obj_num = obj_num;
if (obj_num > ) {
ret.objs = (GtRect*)malloc(sizeof(GtRect) * obj_num);
memcpy(ret.objs, OBJ_BUF, obj_num * sizeof(GtRect));
}
return ret;
} // release pascal ground truth
//************************************
// Name: gt_pascal_release
// Returns: void
// GtRecord * r
//************************************
void gt_pascal_release(GtRecord* r)
{
free(r->image_name);
free(r->objs);
r->image_name = ;
r->objs = ;
r->width = ;
r->height = ;
r->channels = ;
r->obj_num = ;
}
gt_pascal_read 函数忽略了 groundtruth 文件中的一些属性,例如数据库名称等,如果要加回,可以在函数的几个空的 case 中添加即可。PASCAL 官方提供了几个有用的 Matlab 脚本用于读取和生成这样的 groundtruth 文件,在算法开发的过程中要多利用这样的工具。
目标检测数据库 PASCAL 格式的 Ground Truth 的解析函数的更多相关文章
- 目标检测模型的性能评估--MAP(Mean Average Precision)
目标检测模型中性能评估的几个重要参数有精确度,精确度和召回率.本文中我们将讨论一个常用的度量指标:均值平均精度,即MAP. 在二元分类中,精确度和召回率是一个简单直观的统计量,但是在目标检测中有所不同 ...
- [炼丹术]YOLOv5目标检测学习总结
Yolov5目标检测训练模型学习总结 一.YOLOv5介绍 YOLOv5是一系列在 COCO 数据集上预训练的对象检测架构和模型,代表Ultralytics 对未来视觉 AI 方法的开源研究,结合了在 ...
- 【计算机视觉】目标检测中的指标衡量Recall与Precision
[计算机视觉]目标检测中的指标衡量Recall与Precision 标签(空格分隔): [图像处理] 说明:目标检测性能指标Recall与Precision的理解. Recall与Precision ...
- 目标检测之YOLO V1
前面介绍的R-CNN系的目标检测采用的思路是:首先在图像上提取一系列的候选区域,然后将候选区域输入到网络中修正候选区域的边框以定位目标,对候选区域进行分类以识别.虽然,在Faster R-CNN中利用 ...
- paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
一.创建项目 (1)进入到https://aistudio.baidu.com/aistudio/projectoverview/public (2)创建项目 点击添加数据集:找到这两个 然后创建即可 ...
- 深度学习与CV教程(13) | 目标检测 (SSD,YOLO系列)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- zz目标检测
deep learning分类 目标检测-HyperNet-论文笔记 06-06 基础DL模型-Deformable Convolutional Networks-论文笔记 06-05 基础DL模型- ...
- (转) 技术揭秘:海康威视PASCAL VOC2012目标检测权威评测夺冠之道
技术揭秘:海康威视PASCAL VOC2012目标检测权威评测夺冠之道 原创 2016-09-21 钟巧勇 深度学习大讲堂 点击上方“深度学习大讲堂”可订阅哦!深度学习大讲堂是高质量原创内容平台,邀请 ...
- 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练
将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...
随机推荐
- Linux搭建Samba共享服务器
实验要求: Samba文件共享服务配置与访问,配置访问用户以及相应权限. Tips:创建共享目录/test和/share,并且分别在/test下创建文件tf1(只读)tf2(读写) 在/share ...
- leetcode 78子集
采用回溯法:对于例子图解执行过程如下,其中向上的分支为向下递归,向下的分支为第二次递归,因此已经push了对应的下标的值,则从根到右边连起来的路径即为组合 由于整个过程类似于二叉树的中序遍历,因此代码 ...
- WPF Prism Request Navigate activation error
其他测试项目时没有问题,但是有些项目有时候导航一直报错误! Referring the StockTraderRI, I created a popup region in my shell infB ...
- Linux_RHEL7_YUM
目录 目录 前言 RPM rpm常用指令 YUM yum常用指令RHEL7 最后 前言 yum:yellow dog updater modifier(黄狗包管理器),是RHEL默认的基于RPM包的软 ...
- fixture详细介绍-作为参数传入,error和failed区别
前言 fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手! fixture简介 fixture的目的是提供一个固定基线,在该基线上测 ...
- js移动端滑动效果
移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...
- Python学习之数据库初识
9 数据库 9.1 数据库的初识 数据库是可以独立运行的,并且可以对数据的增删改查提供高效便捷方式的工具. 数据库解决的问题: 解决了操作文件的效率和便捷问题 解决了多个服务同时使用数据时 ...
- 点云ICP注册
原文链接 背景 两个点云要注册在一块,一般分两个步骤:先做一个大致的对齐,也就是所谓的初始注册,一般可以通过一些可靠的点对来计算得到(如图3所示):然后在初始注册的基础上进行精细注册,提升注册的精度( ...
- [ASP.NET] 解决点击控件下载文件没有响应的问题
下载文件的方法是使用http响应输出流来实现的,使用到了response.write() 导致下载文件时点击控件出错,没有响应,也获取不了文件 是因为在母版页使用了updatepanel,因此回传时发 ...
- c语言1作业07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9932 我在这个课程的目 ...