实验内容来源于实验楼:https://www.shiyanlou.com/courses/820
需要注意的是:由于实验楼中的环境是已经搭建好的,因此报告中,不讲关于环境搭建的细节,自己是实现时需要搭建环境。如opencv和caffe。
卷积神经网络的基本概念:
首先,介绍了卷积神经网络的基本概念,讲的比较简单,详细的还是看cs321n中的内容。
实验的主要内容
本次实验使用的框架为caffe1.0.0。使用caffe搭建一个AlphaNet,结构如图。
image.png将输入数据进行格式转换
caffe支持多种格式的数据输入,在本次实验中,将数据处理成lmdb的格式。为了节约时间,使用16*16的图片。将数据转换成lmdb格式,通过以下命令实现。
convert_imageset --check_size --gray -shuffle ./ train.txt train
convert_imageset --check_size --gray -shuffle ./ validate.txt validate
convert_imageset --check_size --gray -shuffle ./ test.txt test
convert_imageset是caffe中的一个脚本。
这三条命令的第一个参数--check_size检查每一张图片的尺寸是否相同。第二个参数--gray将图片转换为单通道灰度图片。第三个参数-shuffle将所有图片的顺序打乱。第三个参数./指明图片文件所在的父目录,由于这里的train.txt等文件中已经包含了前缀pic,所以这里的父目录就是当前目录./。第四个参数指明图片列表文件。第五个参数指明最后生成的lmdb数据库文件夹的位置。
数据预处理
为了使得数据0中心分布,使用caffe中的compute_image_mean来计算均值。保存成binaryproto后缀名的文件中。
compute_image_mean train train.binaryproto
编写网络文件和训练参数文件
根据特定的语法,编写prototxt为后缀的文件,来表示网络和训练参数
训练过程
创建一个snapshot文件来储存最后的结果。
mkdir snapshot
通过下列命令训练
caffe train -solver solver.prototxt
进行图片分类
对网络的文件进行改动,去掉一个数据层,将test和train参数去掉。去掉Accuracy和SoftmaxWithLoss层,添加一个softmax层进行预测。
也使用平均值文件对数据进行预处理。编写python脚本来将原来生产的binaryproto文件转换成npy格式的。
最后编写python脚本来实现分类。
# encoding=utf-8
import sys
sys.path.append('/opt/caffe/python') # 先将pycaffe 路径加入环境变量中
import caffe, cv2, numpy as np
class Classfier: # 将模型封装入一个分类器类中
def __init__(self, deploy, model, mu):
self.net = caffe.Net(deploy, model, caffe.TEST) # 初始化网络结构及其中的参数
self.mu = mu
def classify(self, img):
img = (img - self.mu) * 0.00390625 # 减去均值后再进行缩放
self.net.blobs['data'].data[...] = img # 将图片数据送入data层的blobs
out = self.net.forward()['prob'] # 执行前向计算,并得到最后prob层的输出结果
return out
def main():
mean_file = 'train.npy'
mean = np.load(mean_file) # 加载均值文件
classifier = Classfier('deploy.prototxt', 'snapshot/alpha_iter_10000.caffemodel', mean) # 创建我们的分类器
with open('test.txt') as f: # 读取测试集中的图片
l = f.readlines()
for i in l:
print i
name, label = i.split(' ')
img = cv2.imread(name) # 读取图片
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
prob = classifier.classify(img) # 使用分类器分类,得到概率
print prob # 输出概率值
print chr(np.argmax(prob) + 65) # 输出概率最大值对应的英文字母
if np.argmax(prob) == int(label):
cv2.imshow('img', img) # 输出原始图片
cv2.waitKey() # 等待按键
if __name__ == '__main__':
main()
实验心得
在使用caffe的过程中,各种layer可以直接使用,不需要使用,在写他的代码。询问学长发现,如果想实现特别的供能还是需要修改底层的代码。这个教程中最后运行时,使用的pytho中的api,而Learning to Track at 100FPS with Deep Regression Networks中使用的是C++,接下来还要进一步学习以下caffe的C++的用法。另外,虽然实现了网络,但是网络中的细节问题,还需要继续学习以下。
网友评论