caffe训练分类模型教程

article/2025/9/2 16:16:14

caffe训练分类模型教程

 

1.已有图像存放在train和val下,book和not-book(两类)的图片数量相同

在caffe/data下新建一個myself文件夾,并新建两个文件夹分别命名为train和val

 

批量重命名图片

 

# -*- coding:utf8 -*-

 

import os

 

class BatchRename():

'''

批量重命名文件夹中的图片文件

 

'''

def __init__(self):

self.path = '/home/lab305/caffe/data/myself/train/not-book'

 

def rename(self):

filelist = os.listdir(self.path)

total_num = len(filelist)

i = 0

for item in filelist:

if item.endswith('.jpg'):

src = os.path.join(os.path.abspath(self.path), item)

dst = os.path.join(os.path.abspath(self.path), 'notbook_' + str(i) + '.jpg')

try:

os.rename(src, dst)

#print ('converting %s to %s ...' ,% (src, dst))

i = i + 1

except:

continue

#print ('total %d to rename & converted %d jpgs', % (total_num, i))

 

if __name__ == '__main__':

demo = BatchRename()

demo.rename()

 

执行上述文件

#python test.py

 

将所有图片都命名好。

 

 

2.生成txt文件,在data/myself下新建文件test.sh,并写入下面的内容,有些路径和名称需要自己更改。生成train和val的txt文件(里面包括了图片的名称和类别)

 

#!/usr/bin/env sh

DATA=data/myself

 

echo "Create train.txt..."

rm -rf $DATA/train.txt

 

find $DATA/train -name book*.jpg| cut -d '/' -f 5 | sed "s/$/ 0/">>$DATA/train.txt

find $DATA/train -name notbook*.jpg| cut -d '/' -f 5 | sed "s/$/ 1/">>$DATA/train.txt

 

echo "Create val.txt..."

rm -rf $DATA/val.txt

 

find $DATA/val -name book*.jpg| cut -d '/' -f 5 | sed "s/$/ 0/">>$DATA/val.txt

find $DATA/val -name notbook*.jpg| cut -d '/' -f 5 | sed "s/$/ 1/">>$DATA/val.txt

 

 

echo "All done"

 

执行sh文件

#sudo sh data/myself/test.sh

 

生成train.txt和val.txt

如下:

 

3.转换成lmdb格式

首先,在examples下面创建一个myself的文件夹,来存放配置文件和脚本文件。然后编写一个脚本,create_imagenet.sh,并修改高亮部分

 

 

 

#############################################################################

#!/usr/bin/env sh

# Create the imagenet lmdb inputs

# N.B. set the path to the imagenet train + val data dirs

set -e

 

EXAMPLE=examples/myself

DATA=data/myself

TOOLS=build/tools

 

TRAIN_DATA_ROOT=/home/lab305/caffe/data/myself/train/

VAL_DATA_ROOT=/home/lab305/caffe/data/myself/val/

 

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have

# already been resized using another tool.

RESIZE=true

if $RESIZE; then

RESIZE_HEIGHT=256

RESIZE_WIDTH=256

else

RESIZE_HEIGHT=0

RESIZE_WIDTH=0

fi

 

if [ ! -d "$TRAIN_DATA_ROOT" ]; then

echo "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

fi

 

if [ ! -d "$VAL_DATA_ROOT" ]; then

echo "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

fi

 

echo "Creating train lmdb..."

rm -rf $EXAMPLE/myself_train_lmdb

GLOG_logtostderr=1 $TOOLS/convert_imageset \

--resize_height=$RESIZE_HEIGHT \

--resize_width=$RESIZE_WIDTH \

--shuffle \

$TRAIN_DATA_ROOT \

$DATA/train.txt \

$EXAMPLE/myself_train_lmdb

 

echo "Creating val lmdb..."

rm -rf $EXAMPLE/myself_val_lmdb

GLOG_logtostderr=1 $TOOLS/convert_imageset \

--resize_height=$RESIZE_HEIGHT \

--resize_width=$RESIZE_WIDTH \

--shuffle \

$VAL_DATA_ROOT \

$DATA/val.txt \

$EXAMPLE/myself_val_lmdb

 

echo "Done."

###############################################################################

 

执行sh文件

sudo sh examples/myself/create_imagenet.sh

 

随后生成了myself_train_lmdb和myself_val_lmdb。如下图:

 

4.计算均值。图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作,as the same ,我们先创建一个脚本文件:

 

#sudo vi examples/myself/make_myself_mean.sh

 

将下面的内容写入sh文件中(同样,要修改高亮部分)

 

#!/usr/bin/env sh

 

EXAMPLE=examples/myself

DATA=data/myself

TOOLS=build/tools

 

rm -rf $DATA/myself_mean.binaryproto

 

$TOOLS/compute_image_mean $EXAMPLE/myself_train_lmdb \

$DATA/myself_mean.binaryproto

 

echo "Done."

 

执行sh文件

#sudo sh examples/myself/make_myself_mean.sh

 

生成了myself_mean_binaryproto文件

如下:

 

5.创建模型并编写配置文件

我们用caffe自带的caffenet模型进行实验,位置在models/bvlc_reference_caffenet/文件夹下,将需要的两个配置文件,复制到myself文件夹中。

 

#sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myself/

#sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myself/

 

打开solver.prototxt进行修改

#sudo vi examples/myself/solver.prototxt

 

我的修改如下,大家可根据需要自己设置参数:(高亮处为修改部分,我用的GPU,500个iter还是很快的)

 

net: "examples/myself/train_val.prototxt"

test_iter: 10

test_interval: 100

base_lr: 0.001

lr_policy: "step"

gamma: 0.1

stepsize: 100

display: 20

max_iter: 500

momentum: 0.9

weight_decay: 0.0005

snapshot: 50

snapshot_prefix: "examples/myself/caffenet_train"

solver_mode: GPU

 

 

同样,train_val.prototxt也要修改一些路径,因为这里我训练的是两类,所以要把最后一层的num_output改为2,同时把deploy.prototxt做同样的修改,否则测试会出错

 

name: "CaffeNet"

layer {

name: "data"

type: "Data"

top: "data"

top: "label"

include {

phase: TRAIN

}

transform_param {

mirror: true

crop_size: 227

mean_file: "data/myself/myself_mean.binaryproto"

}

# mean pixel / channel-wise mean instead of mean image

# transform_param {

# crop_size: 227

# mean_value: 104

# mean_value: 117

# mean_value: 123

# mirror: true

# }

data_param {

source: "examples/myself/myself_train_lmdb"

batch_size: 256

backend: LMDB

}

}

layer {

name: "data"

type: "Data"

top: "data"

top: "label"

include {

phase: TEST

}

transform_param {

mirror: false

crop_size: 227

mean_file: "data/myself/myself_mean.binaryproto"

}

# mean pixel / channel-wise mean instead of mean image

# transform_param {

# crop_size: 227

# mean_value: 104

# mean_value: 117

# mean_value: 123

# mirror: false

# }

data_param {

source: "examples/myself/myself_val_lmdb"

batch_size: 50

backend: LMDB

}

}

 

layer {

name: "fc8"

type: "InnerProduct"

bottom: "fc7"

top: "fc8"

param {

lr_mult: 1

decay_mult: 1

}

param {

lr_mult: 2

decay_mult: 0

}

inner_product_param {

num_output: 2

weight_filler {

type: "gaussian"

std: 0.01

}

bias_filler {

type: "constant"

value: 0

}

}

}

。。。。。。。。//中间还有很多层layer我并没有修改。

 

 

 

6.训练和测试

 

#sudo build/tools/caffe train -solver examples/myself/solver.prototxt

 

训练的时间和精度与设备和参数都相关,可以通过调整提高。我的是GPU模式,所以运行时间很短,训练结果如下:

 solver里面有一个参数是snapshot,这个参数表示的意思是在训练过程中,多少个iter会生成一个model,产生的模型如下

 

 

训练的精度有0.996 loss也比较小,基本上可以满足我自己的训练要求了。。

 

测试,这里需要准备四个文件,第一个是deploy.prototxt(记得修改最后一个fc为自己的分类类别数),训练好的caffemodel如上,生成的mean均值文件,以及labelmap文件,我这里命名为mobilenet.txt了,里面的内容如下(可以根据自己的需求进行更改):

0 ‘not-book’

1 ‘book’

 

测试的代码:

#coding=utf-8

 

import os

import caffe

import numpy as np

root='/home/lab305/TextBoxes_plusplus-master/' #根目录

deploy=root + 'data/book/deploy.prototxt' #deploy文件

caffe_model=root + 'data/book/caffenet_train_iter_4000.caffemodel' #训练好的 caffemodel

 

 

import os

dir = root+'demo_images/book/'

filelist=[]

filenames = os.listdir(dir)

for fn in filenames:

fullfilename = os.path.join(dir,fn)

filelist.append(fullfilename)

 

mean_file=root+'data/book/mean.binaryproto'

 

def Test(img):

 

net = caffe.Net(deploy,caffe_model,caffe.TEST) #加载model和network

 

#图片预处理设置

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图片的shape格式(1,3,28,28)

transformer.set_transpose('data', (2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)

transformer.set_mean('data', np.array([104,117,123])) #减去均值,前面训练模型时没有减均值,这儿就不用

transformer.set_raw_scale('data', 255) # 缩放到【0,255】之间

transformer.set_channel_swap('data', (2,1,0)) #交换通道,将图片由RGB变为BGR

 

im=caffe.io.load_image(img) #加载图片

net.blobs['data'].data[...] = transformer.preprocess('data',im) #执行上面设置的图片预处理操作,并将图片载入到blob中

 

print(img) #打印图片名字

#执行测试

out = net.forward()

 

labels = np.loadtxt(labels_filename, str, delimiter='\t') #读取类别名称文件

prob= net.blobs['prob'].data[0].flatten() #取出最后一层(prob)属于某个类别的概率值,并打印,'prob'为最后一层的名称

print (prob) #打印测试的置信度

print(prob.shape) #打印prob的规模

order=prob.argsort()[1] #将概率值排序,取出最大值所在的序号 ,9指的是分为0-9十类

#argsort()函数是从小到大排列

print(order) #打印最大的置信度的编号

print ('the class is:',labels[order]) #将该序号转换成对应的类别名称,并打印

f=file(root + "data/book/output.txt","a+")

f.writelines(img+' '+labels[order]+'\n')

 

labels_filename = root +'data/text/mobilenet.txt' #类别名称文件,将数字标签转换回类别名称

 

for i in range(0, len(filelist)):

print("len:" + str(len(filelist)))

img= filelist[i]

Test(img)

 

参考博客:

https://blog.csdn.net/m984789463/article/details/74637172


http://chatgpt.dhexx.cn/article/aht7s4Mw.shtml

相关文章

金融风控实战——模型融合

过采样方法使用条件 (1)负样本可以代表样本空间 (2)数据是足够干净的(样本、特征没有噪声) 过拟合 (1)增多数据 (2)特征筛选 (3)调参…

【推荐算法】ctr预估模型总结(LR、FM、FFM、NFM、AFM、WDL、DCN、DeepFM、FwFM、FLEN)

文章目录 前言LRPOLY2FM(Factorization Machine)FFM(Field-aware Factorization Machine)AFM(Attention Factorization Machine)NFM(Neural Factorization Machine)WDL(w…

概率图模型 —— 串连 NB、LR、MEM、HMM、CRF

概率图模型(PGM),作为机器学习的重要分支,能串连起很多传统模型,比如 NB、LR、MEM、HMM、CRF、DBN 等。本篇文章,从串连多个模型的角度,来谈谈 PGM,顺便把这些模型回顾下。 1 Why PG…

基于GBDT+LR模型的深度学习推荐算法

GBDTLR算法最早是由Facebook在2014年提出的一个推荐算法,该算法分两部分构成,第一部分是GBDT,另一部分是LR.下面先介绍GBDT算法,然后介绍如何将GBDT和LR算法融合 1.1 GBDT算法 GBDT的全称是 Gradient Boosting Decision Tree&am…

Logistic逻辑回归模型(LR)基础

逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,更是计算广告学的核心。本文主要详述逻辑回归模型的基础&#x…

模型压缩一-知识蒸馏

一、知识蒸馏简介 知识蒸馏是模型压缩方法中的一个大类,是一种基于“教师-学生网络(teacher-student-network)思想”的训练方法, 其主要思想是拟合教师模型(teacher-model)的泛化性等(如输出概率…

推荐系统之GBDT+LR

前言 前面讲过的FM与FFM模型虽然增强了模型的交叉能力,但是不管怎样都只能做二阶的交叉,如果想要继续加大特征交叉的维度,那就会出大计算爆炸的情况。所以Facebook提出了梯度提升树(GBDT)逻辑回归(LR&…

使用Keras进行单模型多标签分类

原文:https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-keras/ 作者:Adrian Rosebrock 时间:2018年5月7日 源码:https://pan.baidu.com/s/1x7waggprAHQDjalkA-ctvg (wa61) 译者&…

LR模型常见问题小议

 LR模型常见问题小议 标签: LR机器学习 2016-01-10 23:33 671人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习(10) 作者同类文章 X 版权声明:本文为博主原创文章&…

信用评分卡(A卡) 基于LR模型的数据处理及建模过程

数据来自:魔镜杯风控算法大赛(拍拍贷)。有关数据的具体描述可以看比赛页面。 0. 数据集的关键字段及描述: Master:每一行代表一个样本(一笔成功成交借款),每个样本包含200多个各类…

机器分类---LR分类+模型评估

文章目录 数据集ROC曲线与AUC理论知识曲线理解实例计算 代码 更详细的数据集介绍(有图形分析,应该比较好理解) https://blog.csdn.net/weixin_42567027/article/details/107416002 数据集 数据集有三个类别,每个类别有50个样本。…

python机器学习算法(赵志勇)学习笔记( Logistic Regression,LR模型)

Logistic Regression(逻辑回归) 分类算法是典型的监督学习,分类算法通过对训练样本的学习,得到从样本特征到样本的标签之间的映射关系,也被称为假设函数,之后可利用该假设函数对新数据进行分类。 通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数,Log…

推荐系统实战中LR模型训练(二)

背景: 上一篇推荐系统实战中LR模型训练(一) 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分,即将文本数据数值化为稀疏矩阵的形式。 文本数据: 稀疏矩阵: 实现过程: 文本数据格…

机器学习 | LR逻辑回归模型

逻辑回归(Logistic Regression,简称LR)名为“回归”却是用来分类工作、在线性数据上表现优异的分类器。 视频教程:第07讲:逻辑回归是线性分类器的佼佼者 LR是数据挖掘领域常用的一种分类模型,常用于解决二分类问题,例如垃圾邮件判定、经济预测、疾病诊断(通过年龄、性…

推荐系统实战中LR模型训练(一)

背景: 在“批量导入数据到Redis” 中已经介绍了将得到的itema item1:score1,item2:score2…批量导入到Redis数据库中。本文的工作是运用机器学习LR技术,抽取相应的特征,进行点击率的估计。 点击率(Click-Through-Rate, CTR&#…

Prometheus TSDB存储原理

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 Prometheus 包含一个存储在本地磁盘的时间序列数据库,同时也支持与远程…

数据库必知必会:TiDB(8)TiDB 数据库 SQL 执行流程

数据库必知必会:TiDB(8)TiDB 数据库 SQL 执行流程 数据库 SQL 执行流程DML语句读流程概述SQL的Parse与CompileSQL的Execute DML语句写流程概述执行 DDL语句流程概要执行 知识点回顾 数据库 SQL 执行流程 在TiDB中三个重要组件: …

时不我待,TSDB崛起正当时

近期有小伙伴问Jesse,为什么你们要在现在这个时点做TSDB,这是个好时点吗?我认为这是个挺好的问题,因为再强的个人也比不上一个团队,再牛的团队也需要顺势而为。我们其实一直在深度思考“Why Now”的问题,因…

时间序列数据库TSDB排名

DB-Engines 中时序列数据库排名 我们先来看一下DB-Engines中关于时序列数据库的排名,这是当前(2016年2月的)排名情况: 下面,我们就按照这个排名的顺序,简单介绍一下这些时序列数据库中的一些。下面要介绍的…

TiDB Server

目录 TiDB Server架构 Online DDL GC 缓存管理 热点小表缓存 例题 TiDB Server架构 Protocol Layer:负责处理客户端的连接 Parse,Compile:负责SQL语句的解析与编译,并生成执行计划 Executor,DistSQL&#xff0…