caffe专题三 为图像加标签,转换为可执行文件.lmdb格式

2023-10-20 00:48

本文主要是介绍caffe专题三 为图像加标签,转换为可执行文件.lmdb格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:https://blog.csdn.net/u010417185/article/details/52119863

caffe对于训练数据格式,支持:lmdb、h5py……,其中lmdb数据格式常用于单标签数据,像分类等,经常使用lmdb的数据格式。对于回归等问题,或者多标签数据,一般使用h5py数据的格式。当然好像还有其它格式的数据可用,本文就主要针对lmdb数据格式的制作方法,进行简单讲解。

以一个简单的例子来介绍一下如何生成自己的图像集。主要分为两步:

(1)生成标签文件列表,即生成 .txt 文件
(2)将 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件

lmdb数据

lmdb用于单标签数据。为了简单起见,我后面通过一个性别分类作为例子,进行相关数据制作讲解。

1、数据准备

首先我们要准备好训练数据,然后新建一个名为train的文件夹和一个val的文件夹:

train文件存放训练数据,val文件存放验证数据。然后我们在train文件下面,把训练数据猫、狗图片各放在一个文件夹下面:



同样的我们在val文件下面也创建文件夹:



两个文件也是分别存我们用于验证的图片数据猫与狗图像文件。我们在test_cat下面存放了都是猫的图片,然后在test_dog下面存放的都是验证数据的狗图片。

将train 与 val 文件夹放到一个文件夹内,本文中放到了Data_Test文件夹内。



2、标签文件.txt文件制作.

接着我们需要制作一个train.txt、val.txt文件,这两个文件分别包含了我们上面的训练数据的图片路径,以及其对应的标签,如下所示。







我们把猫图片标号为1,狗图片标记为0。标签数据文件txt的生成可以通过如下代码,通过扫描路径猫、狗下面的图片,得到标签文件train.txt和val.txt:


需要注意的是路径与标签之间是一个空格标签最好从0开始。

<pre class="python" name="code">#coding:utf-8
'''
Created on Jul 29, 2016@author: sgg
'''"<span style=""font-family:Arial;font-size:18px;"">"
"<span style=""font-size:18px;"">"
"<span style=""font-size:18px;"">" 
import osdef IsSubString(SubStrList,Str):flag=Truefor substr in SubStrList:if not(substr in Str):flag=Falsereturn flag#扫面文件
def GetFileList(FindPath,FlagStr=[]):FileList=[]FileNames=os.listdir(FindPath)if len(FileNames)>0:for fn in FileNames:if len(FlagStr)>0:if IsSubString(FlagStr,fn):fullfilename=os.path.join(FindPath,fn)FileList.append(fullfilename)else:fullfilename=os.path.join(FindPath,fn)FileList.append(fullfilename)if len(FileList)>0:FileList.sort()return FileListtrain_txt=open('train.txt','w')
#制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
imgfile=GetFileList('train/train_cat')#将数据集放在与.py文件相同目录下
for img in imgfile:str1=img+' '+'1'+'\n'        #用空格代替转义字符 \t train_txt.writelines(str1)imgfile=GetFileList('train/train_dog')
for img in imgfile:str2=img+' '+'0'+'\n'train_txt.writelines(str2)
train_txt.close()#测试集文件列表
test_txt=open('val.txt','w')
#制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
imgfile=GetFileList('val/test_cat')#将数据集放在与.py文件相同目录下
for img in imgfile:str3=img+' '+'1'+'\n'test_txt.writelines(str3)imgfile=GetFileList('val/test_dog')
for img in imgfile:str4=img+' '+'0'+'\n'test_txt.writelines(str4)
test_txt.close()print("成功生成文件列表")
将上述代码保存为.py的Python文件,运行该Python代码生成 txt 文件。

:本文中生成txt文件时,Data_Test文件夹与生成文件列表的代码.py文件位于同一个目录下。

3、生成lmdb数据

接着我们的目的就是要通过上面的四个文件(两个txt文件列表、train与val两个图库),把图片的数据和其对应的标签打包起来,打包成lmdb数据格式:

在caffe-master创建My_Files文件夹,然后将caffe-master下的imagenet文件夹的create_imagenet.sh复制到该文件夹下进行修改,进行训练和测试路径的设置,运行该sh.

注意:这里是对.sh文件进行修改,在终端打开该文件后进行修改并保存。这里为了排版所以代码类型选择了Python代码类型。



<pre class="python" name="code">#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -eEXAMPLE=My_Files/Build_lmdb      #生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
DATA=My_Files/Data_Test             #python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
TOOLS=build/tools              #caffe的工具库,不用更改TRAIN_DATA_ROOT=<span style="font-size:14px;">/home/sgg/workspace/caffe_learn/scr/Data_Test/</span>     #待处理的训练数据
VAL_DATA_ROOT=<span style="font-size:14px;">/home/sgg/workspace/caffe_learn/scr/Data_Test/</span>      #待处理的验证数据# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true  #是否需要对图片进行resize
if $RESIZE; thenRESIZE_HEIGHT=256RESIZE_WIDTH=256
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..."rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb    #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误GLOG_logtostderr=1 $TOOLS/convert_imageset \--resize_height=$RESIZE_HEIGHT \--resize_width=$RESIZE_WIDTH \--shuffle \$TRAIN_DATA_ROOT \$DATA/train.txt \$EXAMPLE/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/val_lmdbecho "Done."

这里对程序中所涉及的几个路径做简单说明:

先通过几张图了解一下每个文件夹所包含的内容与位置:


1、训练与测试图像库,即 train 与 val 文件夹所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/workspace/caffe_learn/scr/Data_Test

2、生成的txt文件,即 train.txt 与 test.txt 文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Data_Test

3、生成lmdb的.sh文件,即 进行修改后的create_imagenet.sh文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb

4、生成后的lmdb格式文件,即 生成的train_lmdb与val_lmdb文件夹所在位置,其位置与生成文件create_imagenet.sh位于同一目录下,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb

正式介绍文件中的几个路径值

1、EXAMPLE

EXAMPLE 表示生成模型训练数据文件夹,即create_imagenet.sh所在文件夹

本文设为EXAMPLE=My_Files/Build_lmdb     ,其中My_Files文件夹位于caffe-master文件夹下

2、DATA

DATA 表示python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹

本文设为 DATA=My_Files/Data_Test            

注:1)本文开始为了测试DATA 值的设定,在该目录下直接拷贝了eclipse工作空间下的Data_Test文件,所以这里要注意这里是含有Data_Test文件夹的。

(2)该DATA路径直接写为 My_Files/Data_Test   ,不用将其变为 /home/sgg/Downloads/caffe-master/My_Files/Data_Test ,写成这样是错误的。具体原因尚不明确。

3、TOOLS

TOOLS  表示caffe的工具库,为  TOOLS=build/tools   不用更改

4、TRAIN_DATA_ROOT

TRAIN_DATA_ROOT 表示待处理的训练数据,即 train 训练图像库所在位置。

注:

(1)这里需要写具体地址,这就是为什么看地址时需要通过文件的属性进行查看具体地址,写的地址为属性中所显示的地址。

像本文train 训练图像库所在位置为  /home/sgg/workspace/caffe_learn/scr/Data_Test/train/   ,我们经常在终端定位时写的比较简单,在终端定位时的地址为: /workspace/caffe_learn/scr/Data_Test/train/   ,会直接省略 /home/sgg ,但如果在程序中省略的话是出错误的,所以这里的地址要是完整地址。

(2)由于我们在生成txt 文件时路径中包含了 “train” 与" val ",所以在 .sh 文件中写路径时去掉了train,将其路径定义为  /home/sgg/workspace/caffe_learn/scr/Data_Test/  ,TRAIN_DATA_ROOT所设定的值与 txt 文件中路径两者合起来是图像的整体路径。

5、VAL_DATA_ROOT

VAL_DATA_ROOT 表示待处理的验证数据,即 val 训练图像库所在位置,其要求与TRAIN_DATA_ROOT 相同。


4、验证生成的lmdb数据

通过运行上面的脚本,我们将得到文件夹train_lmdb\val_lmdb:

方法一:

我们打开train_lmdb文件夹

并查看一下文件data.mdb数据的大小,如果这个数据包好了我们所有的训练图片数据,查一下这个文件的大小是否符合预期大小,如果文件的大小才几k而已,那么就代表你没有打包成功,估计是因为路径设置错误。

方法二:

通过代码将lmdb中的图像信息显示出来,即通过Python代码,将lmdb中的图像在重塑出来,同时也可以观察到图像的信息。具体代码如下:

#coding:utf-8
'''
Created on Aug 9, 2016@author: sgg
'''
#加载必要的库
import matplotlib.pyplot as plt
import sys
from caffe.proto import caffe_pb2
import lmdb
import numpy# 编写一个函数,将二进制的均值转换为python的均值
def read_lmdb(path,visualize = False):env = lmdb.open(path,readonly=True)x=[]y=[]with env.begin() as txn:cursor = txn.cursor()for key,value in cursor:print 'key:',keydatum = caffe_pb2.Datum()#datum类型#转换维datumdatum.ParseFromString(value)    #转换成numpy#flat_x=numpy.fromstring(datum.dta,dtype=numpy.uint8)flat_x=numpy.array(bytearray(datum.data))#reshape大小img_data = flat_x.reshape(datum.channels,datum.height,datum.width)#读取datum数据print img_data.shapex.append(img_data)y.append(datum.label)if visualize:img_data=img_data.transpose([1,2,0])img_data = img_data[:,:,::-1]plt.imshow(img_data)plt.show()print datum.label#调用read_lmdb
read_lmdb("/home/sgg/Downloads/caffe-master/examples/sgg_datas/train_lmdb",True) 

在生成过程中遇到了如下问题:


1、如果文件夹下含有lmdb格式的文件,那么生成时会出现错误,所以在生成之前需要对create_imagenet.sh 所在文件夹进行检查,删除之前的 lmdb 文件。代码中添加了代码,来辅助完成此检查:

[python]  view plain copy
  1. rm -rf $EXAMPLE/train_lmdb  
  2. rm -rf $EXAMPLE/val_lmdb    #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误  


2、在生成lmdb过程中,出现 can not find or open  …//.......jpg 这个错误时 这个错误中会给出相应的图像路径:

首先,查看路径是否正确,若路径不正确,则需要更改相应的图像路径。再运行,看问题是否解决。

若问题还没有解决,则检查train.txt中,路径和标签之间是否只有一个空格!

在一些程序中,在对图像加标签时,标签与路径之间的空格使用转义字符 “  \t  ”来生成,可是在生成txt中,路径与标签之间的距离往往多于一个空格,所以在生成标签文档时,程序中用空格代替转义字符 \t  。如下方程序所示:

[python]  view plain copy
  1. str1=img+' '+'1'+'\n'  


3、在生成lmdb过程中,出现路径错误


将文件中的路径换成绝对路径,在尝试。





这篇关于caffe专题三 为图像加标签,转换为可执行文件.lmdb格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243505

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig