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

caffe训练分类模型教程相关推荐

  1. 租用服务器,以及部署在pycharm专业版上的pytorch环境训练yolov5模型教程服务器环境安装库文件:

    租用服务器,以及部署在pycharm专业版上的pytorch环境训练yolov5模型教程服务器环境安装库文件: 一.租用服务器选择环境: 1. 租用服务器网站 2. 选择1.8的pytorch环境,点 ...

  2. 迁移学习训练分类模型实践第一篇

    迁移学习训练分类模型实践第一篇 前言 数据获取.预处理 构建模型 查看模型参数量和FLOPs 测试模型 前言 为了简洁,本文不包含任何训练过程,仅介绍处理数据.构建模型.使用随机初始化权重推断: 关于 ...

  3. 8_用opencv调用深度学习框架tenorflow、Pytorch、Torch、caffe训练好的模型(20190212)

    用opencv调用深度学习框架tenorflow.Pytorch.Torch.caffe训练好模型(20190212) 文章目录: https://blog.csdn.net/hust_bochu_x ...

  4. PaddlePaddle基本用法详解(二)、PaddelPaddle训练水果分类模型

    PaddlePaddle基本用法详解(二).PaddelPaddle训练分类模型 1.基本用法 2.训练水果分类模型 1.基本用法 2.训练水果分类模型 1.数据集预处理与模型定义代码: import ...

  5. 干货:如何利用机器学习实现有噪声标签样本分类模型?

    在工业生产活动中,有一类常见机器学习问题,就是如何基于有噪声样本标签训练模型,以进行故障检测和分类. 先解释下什么是有噪声样本标签,它指的是训练模型用的样本标签并非完全准确,部分样本的标签有标错的情况 ...

  6. scikit-learn工具包中分类模型predict_proba、predict、decision_function用法详解

    在使用sklearn训练完分类模型后,下一步就是要验证一下模型的预测结果,对于分类模型,sklearn中通常提供了predict_proba.predict.decision_function三种方法 ...

  7. 分类模型 第1篇:分类模型概述

    机器学习主要用于解决分类.回归和聚类问题,分类属于监督学习算法,是指根据已有的数据和标签(分类的类别)进行学习,预测未知数据的标签.分类问题的目标是预测数据的类别标签(class label),可以把 ...

  8. MaixPy K210 目标分类模型在线训练及使用教程

    MaixPy K210 目标分类模型在线训练及使用教程 相关步骤 准备数据集 在线训练 运行模型 相关步骤 本文的资料来自于MaixPy官方文档,更多详细内容可进入MaixPy官方文档进行查询. 官方 ...

  9. Caffe实践】如何利用Caffe训练ImageNet分类网络

    Caffe实践]如何利用Caffe训练ImageNet分类网络 源文章:https://github.com/BVLC/caffe/tree/master/examples/imagenet 由于要使 ...

最新文章

  1. 拿下斯坦福和剑桥双offer,00后的算法学习之路
  2. Canvas 属性,方法
  3. docker快速搭建RabbitMQ集群
  4. 微软解释 Edge 浏览器比 Chrome 更加安全的原因
  5. 数据库服务器查询格式化显示,在数据库服务器端养成设置NLS_LANG和NLS_DATE_FORMAT环境变量的习惯...
  6. uml+oopc嵌入式c语言开发精讲_嵌入式开发中更接近底层的汇编与C语言
  7. linux设置系统自动开机,Linux系统中设置开机自动运行的两种方法
  8. matlab实现层次分析法
  9. 多线程操作SQLite注意事项
  10. ensp 移动主机搜索不到AP信道_【分享】规模不同,无线AP覆盖方式有何不同?
  11. 2012 r2 万能网卡驱动_无线网卡怎么用,我来教您无线网卡怎么用的方法
  12. JavaScript经纬度和地图坐标相互转换
  13. Java+spring基于ssm的基于SSM的高校奖学金助学金管理系统
  14. 学会这几个.你就能成为bat脚本小子了...(转来看看的)
  15. aps是什么意思_轿车里面的APS是什么意思 ?
  16. 360度全方位解析死链接
  17. PMP——项目组织结构
  18. 单卡3090可得专属ChatGPT:使用LoRA+ChatGLM
  19. 请更换备份电池 pos机_免费邮寄低费率POS机安全吗?为什么那么多免费POS机?请看视频...
  20. sdisk硬盘加密软件

热门文章

  1. zz[读书笔记]《Interpretable Machine Learning》
  2. 新玺配资:三大指数联袂上攻 量能变化非常关键
  3. matlab和c 对比,matlab与c的对比研究
  4. 你还戴着有色眼镜看戴尔科技集团吗?
  5. 键盘按键模拟程序示例
  6. 解决单反出片发灰难题 教你让照片变得通透
  7. 读取飞腾套片X100内部温度和chipID
  8. 【传递正能量】2014年感动我的十大微视频
  9. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据
  10. 中职初始计算机键盘公开课教案,中职职高计算机班《WORD表格》公开课表格式教案.doc...