文章来源https://www.cnblogs.com/dengshunge/p/10841108.html略加修改和补充。

介绍两种LMDB格式数据集的生成,一种是自己的数据集,一种是下载widerface开源人脸数据集。

如果你用的是caffeSSD或者caffe,最好直接阅读提供的README文件,其中包含了LMDB文件的创建。

对于分类任务而言,往往是图片+标签,对于检测任务而言,往往是图片+xml文件,且数据集的存放往往是pascal voc格式来存储的。

将自己的数据集转换成LMDB格式

制作LMDB格式数据,基于create_imagenet.sh脚本文件

想要制作LMDB数据源, caffe提供了一个脚本程序,步骤如下:

  1. 建立一个项目根目录,此处叫face_detect,该文件夹常包含:图片和网络配置文件。

  2. 创建一个脚本文件,暂且命名face_lmdb.sh(代码见下方)
    1. 这里注意,我们要做这个数据源caffe已经给你写好制作脚本了, 的face_lmdb.sh是按照caffe给的那个脚本改过来的

    2. 但是你要问了,caffe给的那个脚本在哪里叫什么???(我没找到)

  3. 在face_lmdb.sh中定义三个路径,即EXAMPLES,DATA,TOOLS,其中前二者表示项目根目录,后者表示要用的caffe文件中的caffe/build/tools路径

  4. 在项目文件夹内创建两个文件夹train和val,并将其路径赋给TRAIN_DATA_ROOT和VAL_DATA_ROOT

  5. 在face_detect/train/下创建两个标签文件夹0和1,0就是存储标签是0的图片,1就是存储标签是1的图片

  6. 在face_detect/val/下直接将带检测的图片全部放入即可。如图

  7. 回到face_lmdb.sh脚本文件,添加对图片resize的代码,见下方代码(已标注)

  8. (需要编程功底,可百度)用python或者C++把图片名字、路径和标签打印到txt文件中,并放入项目根目录face_detect/下,注意val的图片对应的txt内容也要追加对应标签

    1. val.txt文件内容一览
    2. train.txt文件内容一览
  9. 运行该脚本后,将生成两个文件夹,一个是face_train_lmdb,另一个是face_val_lmdb,该名称的设置在代码中已标注。

  10. 命令行回到项目根目录~/face_detect, 运行脚本

    sh face_lmdb.sh

上述10个步骤后将成功转换成lmdb格式,对应sh脚本如下:

#!/usr/bin/env sh
# Create the face_48 lmdb inputs
# N.B. set the path to the face_48 train + val data dirs# 项目路径所在根目录
EXAMPLE=/home/tyd/下载/face_detect
# 数据路径所在根目录
DATA=/home/tyd/下载/face_detect
# caffe工具包所在目录
TOOLS=/home/tyd/caffe/build/tools# 训练集(图片)所在目录
TRAIN_DATA_ROOT=/home/tyd/下载/face_detect/train/
# 测试集(图片)所在目录
VAL_DATA_ROOT=/home/tyd/下载/face_detect/val/# Set RESIZE=true to resize the images to 60 x 60. Leave as false if images have
# already been resized using another tool.
# 图像统一处理Resize
RESIZE=true
if $RESIZE; thenRESIZE_HEIGHT=227RESIZE_WIDTH=227
elseRESIZE_HEIGHT=0RESIZE_WIDTH=0
fiif [ ! -d "$TRAIN_DATA_ROOT" ]; thenecho "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"echo "Set the TRAIN_DATA_ROOT variable in create_face_48.sh to the path" \"where the face_48 training data is stored."exit 1
fiif [ ! -d "$VAL_DATA_ROOT" ]; thenecho "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"echo "Set the VAL_DATA_ROOT variable in create_face_48.sh to the path" \"where the face_48 validation data is stored."exit 1
fi# 显示
echo "Creating train lmdb..."# 此处将根据上述变量TRAIN_DATA_ROOT和DATA和EXAMPLE代入下方
# 该目录即生成文件夹face_train_lmdb
GLOG_logtostderr=1 $TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$TRAIN_DATA_ROOT \$DATA/train.txt \$EXAMPLE/face_train_lmdbecho "Creating val lmdb..."# 与上同理
GLOG_logtostderr=1 $TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$VAL_DATA_ROOT \$DATA/val.txt \$EXAMPLE/face_val_lmdbecho "Done."
Status API Training Shop Blog About

结果

图片中:

face_train_lmdb和face_val_lmdb是脚本文件face_lmdb.sh最终生成的

model是什么???

train和val是你自己建立的数据库即存放图片数据的地方

alexnet_trainval.prototxt是什么?

deploy_full_conv.prototxt是什么?

face_lmdb.sh是创建lmdb数据集的脚本文件,是你自己写的

solver.prototxt 是超参数配置文件,也是你自己写的

train.prototxt 是训练网络配置文件,也是你自己写的

train.sh是用来训练网络的脚本文件,也是你自己写的

train.txt和val.txt是你用python或者C++写的图像路径和标签信息

另一种方法

对于分类任务

  1. 确保手中有收集好的数据集,放在train_data,test_data两个文件夹中

  2. 上述两个文件夹均由各类的子目录构成,子目录内存放图片实体。
  3. 利用python或者C++编写程序,跑出图片路径,生成train.txt和test.txt,格式:绝对路径 标签
    1. /home/sherlock/Documents/Data/test/data/person/aaa.jpg 0

  4. 复制/caffe/examples/imagenet/create_imagenet.sh文件到你的项目根目录下,这个文件就是创建LMDB格式数据集的脚本

  5. 修改上述脚本(下方代码)

  6. 执行脚本,其中-shuffle表示打乱顺序

sherlock@Y50-70:~/Desktop/convertLMDB$ ./create_imagenet.sh -shuffle

上文脚本代码如下:

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e# 生成的LMDB文件存放的位置
EXAMPLE=/home/sherlock/Desktop/convertLMDB# train.txt和test.txt文件放置的位置
DATA=/home/sherlock/Desktop/convertLMDB# caffe/build/tools的位置
TOOLS=/home/sherlock/caffe/build/tools# 训练集和测试集的位置,记得,最后的 '/' 不要漏了
TRAIN_DATA_ROOT=/home/sherlock/Desktop/convertLMDB/Data/train_data/
VAL_DATA_ROOT=/home/sherlock/Desktop/convertLMDB/Data/test_data/# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
# 如果需要给该输入图片的大小,将RESIZE设置成true,并图片的高度和宽度
RESIZE=true
if $RESIZE; thenRESIZE_HEIGHT=30RESIZE_WIDTH=120
elseRESIZE_HEIGHT=0RESIZE_WIDTH=0
fiif [ ! -d "$TRAIN_DATA_ROOT" ]; thenecho "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \"where the ImageNet training data is stored."exit 1
fiif [ ! -d "$VAL_DATA_ROOT" ]; thenecho "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \"where the ImageNet validation data is stored."exit 1
fiecho "Creating train lmdb..."# $EXAMPLE/ilsvrc12_train_lmdb 中 ilsvrc12_train_lmdb 为LMDB的命名,可以按需更改
# $DATA/train.txt \ 这个txt与自己生成train.txt名字相对应,不然得更改
# $DATA/test.txt \ 同上
# $EXAMPLE/ilsvrc12_val_lmdb 同上
GLOG_logtostderr=1 $TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$TRAIN_DATA_ROOT \$DATA/train.txt \$EXAMPLE/ilsvrc12_train_lmdbecho "Creating test lmdb..."GLOG_logtostderr=1 $TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$VAL_DATA_ROOT \$DATA/test.txt \$EXAMPLE/ilsvrc12_val_lmdbecho "Done."

对于检测任务

本次使用的是github上的Tiny-DSOD版本的caffe,看一下Tiny-DSOD/data文件夹,可以清楚看到需要准备的东西。

  1. 同样的需要数据集,把图片下载下来,检测任务的数据集,一般少不了标注信息,即同时附带着annotation/a.xml文件,如果没有的话,可以自行制作voc格式数据集(制作时需转换成xml文件,自己跑代码写)

    1. 图片文件
    2. 标签文件,一个图片对应一个标签,标签文件包含了该图像包含的具体信息,比如几个人几个狗,按照pascal voc格式的xml文件
  2. 生成train.txt和test.txt
    1. tran.txt和test.txt的格式:每一行由2个部分组成,左边是图片的地址,右边是对应图片的xml地址,两者用空格相连
    2. 上述地址是一个相对地址,之后会与"create_data.sh"中的“data_root_dir”结合,生成绝对地址。
  3. 生成labelmap.prototxt和test_name_size.txt
    1. labelmap.prototxt的格式

      1. 如下图所示,是有多个item组成的,label为0的item是背景,接下来就是你自己标注的label,label的编号最好连续,而且每个label对应的Name需要和xml里面的name一致。
    2. test_name_size.txt的格式
      1. 由3列组成,第一列是图片的名称,第二、三列分别是图片的高和宽。注意,这里图片的名称没有后缀名。这个文件不知道有什么用,下面函数调用中,并没有引入这个文件。
    3. 运行上述sh文件,生成LMDB

cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
# caffe的路径
root_dir="/home/dengshunge/Tiny-DSOD-master"cd $root_dirredo=1
# 数据的根目录,与txt的文件结合
data_root_dir="/home/dengshunge/Desktop/data"
# trainval.txt和test.txt的路径
txtFileDir="/home/dengshunge/Desktop/LMDB"
# LMDB存储位置
lmdbFile="/home/dengshunge/Desktop/LMDB/lmdb"
# LMDB存储位置的软连接
lmdbLink="/home/dengshunge/Desktop/LMDB/lmdbLink"
# mapfile位置
mapfile="/home/dengshunge/Desktop/LMDB/labelmap.prototxt"
# 任务类型
anno_type="detection"
# 格式
db="lmdb"
# 图片尺寸,若width,height=0,0,说明按原始图片输入尺寸,否则resize到(width,height)
min_dim=0
max_dim=0
width=300
height=300extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
thenextra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
dopython3 $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $txtFileDir/$subset.txt $lmdbFile/$subset"_"$db $lmdbLink
done

修改Tiny-DSOD/scripts/create_annoset.py,针对开头的部分的,其余内容不变。

import argparse
import os
import shutil
import subprocess
import sys# 改成你的caffe路径
caffe_root = "/home/dengshunge/Tiny-DSOD-master"# sys.path.append(caffe_root)
sys.path.insert(0,caffe_root+'/python')from caffe.proto import caffe_pb2
from google.protobuf import text_format

数据集转换成LMDB格式相关推荐

  1. SSD学习系列(二)LMDB概念以及将VOC数据集转换成LMDB格式

    LMDB概念 接上一篇,将SSDa caffen框架代码编译通过后y,接下来就可以利用其脚本将标注好的VOC格式数据集转换成LMDB格式,以便开始SSD模型训练. LMDB是Lightning Mem ...

  2. INRIA数据集转换成VOC格式

    背景 下面的代码是将INRIA数据集转换成VOC格式.图片是614张. 其中,使用OinginImage文件夹里的Train中Pos和Annotations作为训练,利用Test里的Pos作为测试. ...

  3. TT100K数据集转换成coco格式,并重新划分

    TT100K数据集转换成coco格式,并重新划分 统计每个类别 import os import jsonos.makedirs('annotations',exist_ok=True) #存放数据的 ...

  4. DAGM2007数据集转换成VOC格式

    DAGM2007数据集-to-缺陷数据集VOC格式 DAGM2007数据集下载 数据集简单介绍 转换代码 转换结果 DAGM2007数据集下载 链接: DAGM2007. 下载后把每一类的压缩包解压放 ...

  5. Caltech 数据集转换成VOC格式

    注意本人用pycharm 运行环境是python2.7.14 如果是python3 可能会存在错误 1. Seq文件转化成JEPG图像文件() 运行seq2jpg.py文件,输入.seq文件夹,输出到 ...

  6. 【caffe-windows】 caffe-master 之图片转换成lmdb or leveldb

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签 ...

  7. 图像数据集保存为lmdb格式 python

    通过lmdb对图像进行保存(编解码) LMDB 是一个小型数据库,具有一些出色的特性: 有序的图界面(键总是按字典顺序排序). 读取器不阻塞写入器,写入器不阻塞读取器.每个环境都支持一个并发写入. 读 ...

  8. python读取lmdb文件_python将图片转成lmdb格式

    about 本文参考了 在开始前... 先说说几处坑: 虽然安装了caffe,但是 import lmdb 出现error.StackOverflow上的同学们讨论说,要装一个lmdb 2 于是开始装 ...

  9. 获取minist数据并转换成lmdb

    caffe本身是没有数据集的,但在data目录下有获取数据的一些脚本.MNIST,一个经典的手写数字库,包含60000个训练样本和10000个测试样本,每个样本为28*28大小的黑白图片,手写数字为0 ...

最新文章

  1. [译]怎样用VisualStudio查看非托管代码
  2. DELL R710 服务器内存排错
  3. 12月2日,微软副总裁Scott Guthrie为你讲述Silverlight的未来
  4. golang reflect
  5. 切换器黑屏_机房的KVM切换器是什么,故障如何解决?
  6. github的基础使用
  7. js模板引擎——art Template
  8. python中带附件发送电子邮件_python发送带附件邮件
  9. python sqlite3写入内存_Python SQLite内存缓存
  10. 学技术不可盲目崇洋媚外,时刻记得要自主创新,勿忘国耻
  11. Go database/sql 教程
  12. origin如何绘制双y轴曲线_Origin系列:绘制双Y轴图
  13. 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践
  14. 微信小程序微信授权登录
  15. Docker创建镜像Nuget失败
  16. Unity RPG 黑暗之光 问题记录 上 (1-63 地形场景 角色选择 行走 相机跟随、旋转、缩放 任务系统 面板栏 背包系统 状态系统)
  17. 测量电流传感器的放大倍数
  18. vue实现 修改密码
  19. 产业智能化时代,百度有了倚天剑,也有了屠龙刀
  20. 电脑文件管理,教你批量给全部文件夹名称随机命名

热门文章

  1. BS EN ISO 4589塑料-用氧指数法测定燃烧行为-第2部分:室温测试
  2. 用 50 行代码写个听小说的爬虫
  3. 【软件工程】需求分析
  4. STM32学习笔记(二)——常用接口
  5. 【软件分析】软件分析、设计与建模迭代式详解
  6. windows下修改文件创建时间
  7. 2021物联网开发学习——基于小熊派IoT开发板Bear-Pi-IOT、E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link
  8. 工程项目管理软件有哪些
  9. 【论文阅读】Don‘t be so sure! Boosting ASR Decoding via Confidence Relaxation
  10. matlab 2016b vs2010,在Matlab2010b中调用 Microsoft Visual C++ 2010