兵马逐浪去,将象入海流。炮声震心动,惊起卧龙游。
我的博客园主页 --------- 我的知乎主页 --------- 我的github主页 --------- 我的csdn主页 --------- 我的新浪微博

caffe训练自己的图片(分类)

https://blog.csdn.net/legalhighhigh/article/details/82284126

这个基本上按照大神的笔记来的。

学习参考
大神不仅提供了训练图片,还有详细的训练过程,包括转换源码,非常感谢。

总的来说用caffe来训练分类,可以分为几个步骤。

  • 下载图片,生成.txt,这个txt用于转换图片格式的参数用到了
  • 把训练图片转换成lmdb格式
  • 计算图片均值
  • 修改网络参数和网络的图片路径等
  • 训练网络

大分为以上5个步骤。其实最开始三个环节都可以归类位准备数据环节。

###下载图片及生成清单###
图片来源于大神提供:
图片下载地址
这里写图片描述
分为训练和测试两个文件,训练大约400个,测试100个。
每个里面都是五个分类,标签是3,4,5,6,7。
下载后将图片放在caffe的data文件夹里。

大神谢了一个脚本实现了txtx参数的生成,在评论里有大神说用python比较方便,这里提供了两种方法:
首先,在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件。

# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.sh
  • 1
  • 2

编辑此文件,写入以下代码:

#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f3-5 | sed "s/$/ $i/">>$MY/train.txt
done
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f3-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

或者编写一个py文件create_filelist.py

# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.py
  • 1
  • 2

编辑内容如下:

# -*- coding: utf-8 -*-
import os
data_path='data/re/'
my='examples/myfile/'
classes=[3,4,5,6,7]
def gen_txt(phase):
f=open(my+phase+'.txt','w')
for c in classes:
folder=str(c)
images=os.listdir(data_path+phase+'/')
for img in images:
f.write(phase+'/'+img+' '+folder+'\n')
gen_txt('train')
gen_txt('test')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

接着在caffe根目录下执行即可。

# sudo sh examples/myfile/create_filelist.sh
#或者
# sudo python examples/myfile/create_filelist.py
  • 1
  • 2
  • 3

成功的话,就会在examples/myfile/ 文件夹下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单。
这里写图片描述

###转换成lmdb格式###
使用convert_imagese来转换格式,

# sudo vi examples/myfile/create_lmdb.sh
  • 1

编写脚本内容如下:

#!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/xxx/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/xxx/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

因为图片大小不一,因此需要统一转换成256*256大小。运行成功后,会在 examples/myfile下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。

这里写图片描述

###计算均值###
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的文件compute_image_mean.cpp,可以直接使用

# sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
  • 1

compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,会在 examples/myfile/ 下面生成一个mean.binaryproto的均值文件。

###修改训练参数及网络###
模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到myfile文件夹内

# sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
# sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
  • 1
  • 2

我们常用到的就是这两个文件,一个是训练参数,一个是网络参数
修改其中的solver.prototxt

# sudo vi examples/myfile/solver.prototxt
  • 1

这里写图片描述
主要是修改路径和训练参数,迭代两次,每次50,即可把测试用的100张照片完全覆盖

然后修改网络参数,也是修改路径

name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_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: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_test_lmdb"
batch_size: 50
backend: LMDB
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

训练和测试两个地方的参数。

网友提到需要不需要把分类的1000个改成5,目前来看,我没改好像也可。
###训练和测试###
一个命令行即可搞定

# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
  • 1

这里写图片描述
使用GPU大概几分钟就 能出结果。

欢迎关注我的公号,可以加好友详聊:

posted @   leoking01  阅读(71)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
#back-to-top { background-color: #00CD00; bottom: 0; box-shadow: 0 0 6px #00CD00; color: #444444; padding: 10px 10px; position: fixed; right: 50px; cursor: pointer; }
点击右上角即可分享
微信分享提示