项目文件结构

因为目录太多又太杂,而且数据格式对路径有要求,先把文件目录放出来。(博主目录结构并不规范)

1、根目录下的models为克隆下来的项目。2、pedestrian_data目录下的路径以及文件夹名称必须相同,是VOC2012数据格式要求。3、project中data是视频数据,images是测试的图片数据、test_images为测试图片数据集,pedestrian_train文件夹为训练目录。

使用公开数据制作训练数据集

数据下载

视频数据下载:http://www.robots.ox.ac.uk/ActiveVision/Research/Projects/2009 bbenfold_headpose/Datasets/TownCentreXVID.avi

标注数据下载:http://www.robots.ox.ac.uk/ActiveVision/Research/Projects/2009 bbenfold_headpose/Datasets/TownCentre-groundtruth.top

官网http://www.robots.ox.ac.uk/ActiveVision/index.html

使用OpenCV生成图片数据

import cv2 as cv
import os def video2ims(src, train_path="images", test_path="test_images", factor=2):
os.mkdir(train_path)
os.mkdir(test_path)
frame = 0
cap = cv.VideoCapture(src)
counts = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
print("number of frames : %d"%counts)
while True:
ret, im = cap.read()
if ret is True:
if frame < 3600: # 前3600帧作为训练数据
path = train_path
else:
path = test_path
im = cv.resize(im, (w//factor, h//factor)) # 压缩分辨率
cv.imwrite(os.path.join(path, str(frame)+".jpg"), im)
frame += 1
else:
break
cap.release() if __name__ == "__main__":
video2ims("Your TownCentreXVID.avi path")

把生成的图片拷贝到./pedestrian_data/OC2012/JPEGImages 目录下,图片大小为960*540。

制作Pasacal VOC2012数据集格式

利用标注信息文件TownCentre-groundtruth.top生成对应xml文件(注意文件路径)

import os
import pandas as pd if __name__ == '__main__': GT = pd.read_csv('D:/Study/dl/Pedestrian_Detection/TownCentre-groundtruth.top', header=None)
indent = lambda x, y: ''.join([' ' for _ in range(y)]) + x factor = 2
train_size = 3600 os.mkdir('xmls')
name = 'pedestrian'
width, height = 1920 // factor, 1080 // factor for frame_number in range(train_size): Frame = GT.loc[GT[1] == frame_number]
x1 = list(Frame[8])
y1 = list(Frame[11])
x2 = list(Frame[10])
y2 = list(Frame[9])
points = [[(round(x1_), round(y1_)), (round(x2_), round(y2_))] for x1_, y1_, x2_, y2_ in zip(x1, y1, x2, y2)] with open(os.path.join('xmls', str(frame_number) + '.xml'), 'w') as file:
file.write('<annotation>\n')
file.write(indent('<folder>voc2012</folder>\n', 1))
file.write(indent('<filename>' + str(frame_number) + '.jpg' + '</filename>\n', 1))
file.write(indent('<path>D:/Study/dl/Pedestrian_Detection/pedestrian_data/VOC2012/JPEGImages/' + str(frame_number) + '.jpg' + '</path>\n', 1))
file.write(indent('<size>\n', 1))
file.write(indent('<width>' + str(width) + '</width>\n', 2))
file.write(indent('<height>' + str(height) + '</height>\n', 2))
file.write(indent('<depth>3</depth>\n', 2))
file.write(indent('</size>\n', 1)) for point in points: top_left = point[0]
bottom_right = point[1] if top_left[0] > bottom_right[0]:
xmax, xmin = top_left[0] // factor, bottom_right[0] // factor
else:
xmin, xmax = top_left[0] // factor, bottom_right[0] // factor if top_left[1] > bottom_right[1]:
ymax, ymin = top_left[1] // factor, bottom_right[1] // factor
else:
ymin, ymax = top_left[1] // factor, bottom_right[1] // factor file.write(indent('<object>\n', 1))
file.write(indent('<name>' + name + '</name>\n', 2))
file.write(indent('<pose>Unspecified</pose>\n', 2))
file.write(indent('<truncated>' + str(0) + '</truncated>\n', 2))
file.write(indent('<difficult>' + str(0) + '</difficult>\n', 2))
file.write(indent('<bndbox>\n', 2))
file.write(indent('<xmin>' + str(xmin) + '</xmin>\n', 3))
file.write(indent('<ymin>' + str(ymin) + '</ymin>\n', 3))
file.write(indent('<xmax>' + str(xmax) + '</xmax>\n', 3))
file.write(indent('<ymax>' + str(ymax) + '</ymax>\n', 3))
file.write(indent('</bndbox>\n', 2))
file.write(indent('</object>\n', 1)) file.write('</annotation>\n') print('File:', frame_number, end='\r')

生成的xml文件全部复制到 ./pedestrian_data/OC2012/Annotations 目录下。

xml文件中标注的信息有:图片名称,目标,大小,通道数,目标所在位置,样本难易。

生成图片描述文件

用txt文件对图片进行描述,生成代码如下:

import os

def generate_classes_text():
print("start to generate classes text...") m_text = open("D:/Study/dl/Pedestrian_Detection/pedestrian_data/trainval.txt", 'w')
for i in range():
m_text.write(str(i) + " 1 \n")
m_text.close() if __name__ == '__main__':
generate_classes_text()

生成的文件为:

第一列为图片编号,对应JPEGImages目录下的图片;第二列为1,表示存在行人数据。

这一份txt拷贝成两份,改名为pedestrian_train.txt和pedestrian_val.txt,放在./pedestrian_data/VOC2012/ImageSets/Main目录下。如果下一步生成record中报错,说缺少文件aeroplane_train.txt可以把这两个文件名中的pedestrian改成aeroplane。(理论上应该不会错,但我的时候就给我报错!)

这样Pasacal VOC2012数据格式就准备完成了,目录结构是这样的:

生成 TF record

生成label_map.pbtxt文件,在txt中直接输入如下内容,并把后缀改成pbtxt即可。然后把label_map.pbtxt放在目录./Pedestrian_Detection/project/pedestrian_train/data下。

item {
id: 1
name: 'pedestrian'
}

在命令行窗口下的(dl) D:\Study\dl\Pedestrian_Detection\models\research>执行:

python object_detection/dataset_tools/create_pascal_tf_record.py --label_map_path=D:\Study\dl\Pedestrian_Detection\project\pedestrian_train\data\label_map.pbtxt --data_dir=D:\Study\dl\Pedestrian_Detection\pedestrian_data --year=VOC2012 --set=train --output_path=D:\Study\dl\Pedestrian_Detection\pascal_train.record

python object_detection/dataset_tools/create_pascal_tf_record.py --label_map_path=D:\Study\dl\Pedestrian_Detection\project\pedestrian_train\data\label_map.pbtxt --data_dir=D:\Study\dl\Pedestrian_Detection\pedestrian_data --year=VOC2012 --set=val --output_path=D:\Study\dl\Pedestrian_Detection\pascal_val.record

生成两份record文件。pascal_train.recordpascal_val.record 

然后把这两份文件copy到目录:/Pedestrian_Detection/project/pedestrian_train/data下。这两个文件大小都为574M,千万要检查,不要把生成失败的record文件放入目录中。(这个错在后面训练的时候搞了我一下午!!!)

数据集准备完毕,record也准备完毕,下一篇将进行模型训练。

【Demo 1】基于object_detection API的行人检测 2:数据制作的更多相关文章

  1. 【Demo 1】基于object_detection API的行人检测 1:环境与依赖

    环境 系统环境: win10.python3.6.tensorflow1.14.0.OpenCV3.8 IDE: Pycharm 2019.1.3.JupyterNotebook 依赖 安装objec ...

  2. 【Demo 1】基于object_detection API的行人检测 3:模型训练并在OpenCV调用模型

    训练准备 模型选择 选择ssd_mobilenet_v2_coco模型,下载地址(https://github.com/tensorflow/models/blob/master/research/o ...

  3. OpenCV中基于HOG特征的行人检测

    目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图).HOG特征是用于目标检测的特征描述子,它通过计算和统计图像 ...

  4. opencv+树莓PI的基于HOG特征的行人检测

    树莓PI远程控制摄像头请参考前文:http://www.cnblogs.com/yuliyang/p/3561209.html 参考:http://answers.opencv.org/questio ...

  5. paper 87:行人检测资源(下)代码数据【转载,以后使用】

    这是行人检测相关资源的第二部分:源码和数据集.考虑到实际应用的实时性要求,源码主要是C/C++的.源码和数据集的网址,经过测试都可访问,并注明了这些网址最后更新的日期,供学习和研究进行参考.(欢迎补充 ...

  6. 行人检测(Pedestrian Detection)资源

    一.论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the stat ...

  7. 目标检测之行人检测(Pedestrian Detection)---行人检测之简介0

    一.论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the stat ...

  8. 【计算机视觉】行人检测(Pedestrian Detection)资源

    一.论文 综述类的文章 [1]P.Dollar, C. Wojek,B. Schiele, et al. Pedestrian detection: an evaluation of the stat ...

  9. 基于图形检测API(shape detection API)的人脸检测

    原文:https://paul.kinlan.me/face-detection/ 在 Google 开发者峰会中,谷歌成员 Miguel Casas-Sanchez 跟我说:"嘿 Paul ...

随机推荐

  1. java多线程之多生产者-多消费者

    多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死. public class Product { private MyStack myStack; pu ...

  2. 最全java多线程学习总结1--线程基础

      <java 核心技术>这本书真的不错,知识点很全面,翻译质量也还不错,本系列博文是对该书中并发章节的一个总结. 什么是线程   官方解释:线程是操作系统能够进行运算调度的最小单位,包含 ...

  3. 给 Windows 的终端配置代理

    初衷 由于项目开发使用go,所以经常要用到go get,但是吧,terminal下根本没办法下载啊,经常下载三个小时包,写代码一个小时 迫于无奈,只好找个方式可以在terminal下使用ss cmd下 ...

  4. 【JVM】虚拟机初见-运行时数据区图解

    本文是听咕泡XX公开课视频整理的笔记,较书本更为总结,感谢. 计算机模型(汇编知识):数据集(数据).指令集(操作指令,+-等).控制集(分支循环) JVM运行时的数据区: 程序计数器(每个线程都有) ...

  5. PATA 1071 Speech Patterns.

    #include <bits/stdc++.h> using namespace std; bool check(char c)//检查是否为字母或数字 { if(c>='A'&am ...

  6. 使用MVVM的常见误区(1)在ViewModel中和用户交互

    缺点,不能进行单元测试 比如,用户在界面点击按钮,实现用户选择一个文件,然后对文件内容进行解析.常见错误如下 using Microsoft.Win32; namespace View和ViewMod ...

  7. C语言中const的用法总结

          const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...

  8. springboot自动装配(2)---实现一个自定义自动装配组件

    对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件 还是这张图 一.创建自己的自动配置工程, spring.f ...

  9. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案

    jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...

  10. Oracle修改字段类型报错:“ORA-01439:要更改数据类型,则要修改的列必须为空”

    在oracle修改user表字段name类型时遇到报错:“ORA-01439:要更改数据类型,则要修改的列必须为空”,是因为要修改字段的新类型和原来的类型不兼容. 如果要修改的字段数据为空时,则不会报 ...