caffe对船的分类过程
使用AlexNet,caffe下实现船的分类过程
1、准备数据集
在caffe/data目录下建立两个数据集train(训练集)和val(验证集),创建文件列表filelist.sh 和给定分类类别(1到n)。
filelist.sh ------------------------------创建文件列表,包含标签
# /usr/bin/env sh
DATA=data/boat2class
#training data
DATA1=data/boat2class/jun_500_train
DATA2=data/boat2class/ming_500_train
echo "Create train2.txt..."
rm -rf $DATA/train2.txt
find $DATA1 -name *.jpg | cut -d '/' -f3-4 | sed "s/$/ 1/">>$DATA/train2.txt
find $DATA2 -name *.jpg | cut -d '/' -f3-4 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train2.txt
rm -rf $DATA/tmp.txt
echo "Done.."
#validation data
DATA3=data/boat2class/jun_100_val
DATA4=data/boat2class/ming_100_val
echo "Create val2.txt..."
rm -rf $DATA/val2.txt
find $DATA3 -name *.jpg | cut -d '/' -f3-4 | sed "s/$/ 1/">>$DATA/val2.txt
find $DATA4 -name *.jpg | cut -d '/' -f3-4 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/val2.txt
rm -rf $DATA/tmp.txt
echo "Done.."
2、转换为lmdb代码
代码中需要修改MY,数据集的路径,保存的路径
保存为文件create_lmdb.sh-------------------
#!/usr/bin/env sh
MY=data/boat2class
echo "Create train lmdb.."
rm -rf $MY/img_train2_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/xxx/caffe/data/train2/ \
$MY/train2.txt \
$MY/img_train2_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test2_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/xxx/caffe/data/val2/ \
$MY/test2.txt \
$MY/img_test2_lmdb
echo "All Done.."
3、均值计算
转到caffe/tool目录,找到compute_image_mean.py
build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
python compute_image_mean.py ~/caffe/data/boat2class/mean.binaryproto mean.npy
4、设置网络结构
拷贝合适的网络结构如AlexNet,GoogleNet,ResNet,Inception或其他。
需要train_val.prototxt(网络的每一层的配置参数)和solver.prototxt(运行整个网络的参数设置)
solver.prototxt文件内容如下:
net: "examples/boat2class/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.0001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter:5000
momentum: 0.9
weight_decay: 0.005
snapshot: 1000
snapshot_prefix: "examples/boat2class/model/boat_train"
solver_mode: GPU
5、运行网络
新建文件run_train.sh,运行脚本
#!/usr/bin/env sh
TOOLS=./build/tools
LOG=examples/boat2class/LOG/log-'data +%Y-%m-%d-%H-%S'.log
$TOOLS/caffe train \
--solver=examples/boat2class/solver.prototxt -gpu all 2>&1 | tee $LOG
6.测试网络
新建文件夹testtxt,包含如下文件:
convert_mean.py ------------------转换mean.binaryproto 为 mean.npy
#!/usr/bin/env python
import numpy as np
import sys,caffe
if len(sys.argv)!=3:
print "Usage: python convert_mean.py mean.binaryproto mean.npy"
sys.exit()
blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )
deploy.prototxt---------------------------网络分类的测试网络
caffemodel------------------------caffe训练后的model
boat.txt ------------------------------分类标签定义
0 jun
1 ming
myclassify.py ----------------------------网络分类脚本,将图片分为军舰和民船,并将图片存储到不同的目录
#coding=utf-8
#作用:可以用来批处理图片进行分类
import sys,os
import caffe
import numpy as np
import shutil
#设置当前目录
root = '/home/chenrong/caffe/'
sys.path.insert(0, root + 'python')
os.chdir(root)
deploy=root + 'examples/boat2class/testtxt/deploy.prototxt'
caffe_model=root + 'examples/boat2class/testtxt/boat_train_iter_1000.caffemodel'
mean_file=root + 'examples/boat2class/testtxt/mean.npy'
labels_filename=root+'examples/boat2class/testtxt/boats.txt' #sysset_words.txt的路径
jun_path=root+'data/boat2class/jun/'
ming_path=root+'data/boat2class/ming/'
#预读待分类的图片
dir=root+'data/boat2class/test'
source=dir+'/'
filelist=[]
filenames=os.listdir(dir) #返回指定目录下的所有文件和目录名
for fn in filenames:
fullfilename=os.path.join(dir,fn) #os.path.join--拼接路径
filelist.append(fullfilename) #filelist里存储每个图片的路径
net=caffe.Net(deploy,caffe_model,caffe.TEST) #加载model和network
#图片预处理设置
transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape}) #设定图片的格式(1,3,28,28)
transformer.set_transpose('data',(2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
transformer.set_mean('data',np.load(mean_file).mean(1).mean(1)) #减去均值
transformer.set_raw_scale('data',255) #缩放到[0,255]之间
transformer.set_channel_swap('data',(2,1,0)) #交换通道,将图片由RGB变成BGR
#加载图片
for i in range(0,len(filelist)):
img=filelist[i] #获取当前图片的路径
print filenames[i] #打印当前图片的名称
im=caffe.io.load_image(img) #加载图片
net.blobs['data'].data[...]=transformer.preprocess('data',im) #执行上面的预处理操作,并将图片载入到blob中
#执行测试
out=net.forward()
labels=np.loadtxt(labels_filename,str,delimiter='/t') #读取类别名称文件
prob=net.blobs['prob'].data[0].flatten() #取出最后一层(prob)属于某个类标的概率值,'prob'为最后一层的名称
#print prob
index1=prob.argsort()[-1] #获取最大概率值对应的index
aa = labels[index1]
if '0' in aa:
shutil.copyfile(source+filenames[i],jun_path+filenames[i])
else:
shutil.copyfile(source+filenames[i],ming_path+filenames[i])
print labels[index1],'--',prob[index1] #输出label--prob
完成实验
注意:文中的.sh文件需要先赋予权限 chmod +x 文件名.sh,然后 ./文件名.sh 执行。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
