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  执行。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部