Caffe安装编译好后,总要跑点什么吧,Caffe的examples目录下有几个实例,先试一下cifar10
下载
下载cifar10数据集
./data/cifar10/get_cifar10.sh
下载完成后,在data/cifar10目录下会有一些.bin的数据集文件
jimmy@jimmy-MS-7B53:~/AI/caffe/data/cifar10$ ls -l
total 180084
-rw-r--r-- 1 jimmy jimmy 61 6月 5 2009 batches.meta.txt
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 data_batch_1.bin
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 data_batch_2.bin
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 data_batch_3.bin
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 data_batch_4.bin
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 data_batch_5.bin
-rwxrwxr-x 1 jimmy jimmy 506 8月 21 16:23 get_cifar10.sh
-rw-r--r-- 1 jimmy jimmy 88 6月 5 2009 readme.html
-rw-r--r-- 1 jimmy jimmy 30730000 6月 5 2009 test_batch.bin
jimmy@jimmy-MS-7B53:~/AI/caffe/data/cifar10$
该目录下的batches.meta.txt文件写明了cifar10支持的类别
jimmy@jimmy-MS-7B53:~/AI/caffe/data/cifar10$ cat batches.meta.txt
airplane
automobile
bird
cat
deer
dog
frog
horse
ship
truck
LMDB
caffe默认用的是LMDB数据集,所以还需要讲bin文件转换成lmdb文件
简单介绍一下LMDB的优点:
1.它是一个数据库文件,将大量单个文件平铺起来,所以程序只要打开一个文件即可,不需要反复打开,关闭大量小文件
2.不需要单独的数据库程序管理
3.它用内存映射实现,提示了性能
caffe的example中提供了转换脚本
./examples/cifar10/create_cifar10.sh
jimmy@jimmy-MS-7B53:~/AI/caffe/examples/cifar10$ ls -l *_lmdb
cifar10_test_lmdb:
total 40256
-rw-rw-r-- 1 jimmy jimmy 41218048 8月 22 15:07 data.mdb
-rw-rw-r-- 1 jimmy jimmy 8192 8月 22 15:13 lock.mdb
cifar10_train_lmdb:
total 201208
-rw-rw-r-- 1 jimmy jimmy 206032896 8月 22 15:07 data.mdb
-rw-rw-r-- 1 jimmy jimmy 8192 8月 22 15:13 lock.mdb
训练
caffe里面有./examples/cifar10/train_quick.sh,该脚本文件调用了examples/cifar10/cifar10_quick_solver.prototxt,可以在这个文件中修改训练的相关配置,比如CPU还是GPU
训练完成后会生成两个h5的模型文件
jimmy@jimmy-MS-7B53:~/AI/caffe$ ls -l examples/cifar10/*.h5
-rw-rw-r-- 1 jimmy jimmy 600032 8月 24 13:23 examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5
-rw-rw-r-- 1 jimmy jimmy 590064 8月 24 13:23 examples/cifar10/cifar10_quick_iter_5000.solverstate.h5
验证
同样caffe提供了验证接口,我用的是python接口,所以在安装、编译caffe环境时需要make pycaffe,另外caffe不支持python3.6的版本(其它版本没试过),所以最好直接用python2.7的版本。最好不要同时安装多个版本,虽然能够切换版本,但是编译caffe的时候会有一些兼容性错误,没必要在这个上面浪费时间。
直接使用examples/images/目录下的图片做识别
python python/classify.py --model_def examples/cifar10/cifar10_quick.prototxt --pretrained_model examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5 --center_only examples/images/cat.jpg foo
Classifying 1 inputs.
Done in 0.01 s.
Saving results into foo
结果输出到了foo.npy,这个文件时一个二进制文件,我要的是直接输出结果,所以在classify.py中增加了一些调试信息
# Classify.
start = time.time()
predictions = classifier.predict(inputs, not args.center_only)
print("Done in %.2f s." % (time.time() - start))
# predictions
print("Predictions : %s" % predictions)
labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
top_k = predictions.flatten().argsort()[-1:-10:-1]
print("top_k : %s" % top_k)
for i in np.arange(top_k.size):
print top_k[i], labels[top_k[i]]
# Save
print("Saving results into %s" % args.output_file)
np.save(args.output_file, predictions)
这样就能直接输出结果了,图片明明是猫,结果第一是狗,第二才是猫,准确率太差了
Classifying 1 inputs.
Done in 0.01 s.
Predictions : [[1.5983205e-02 2.6724942e-04 1.1164860e-02 4.0146208e-01 1.8660864e-02
5.0617838e-01 1.7000468e-02 3.7125179e-03 1.4827041e-02 1.0743420e-02]]
top_k : [5 3 4 6 0 8 2 9 7]
5 dog
3 cat
4 deer
6 frog
0 airplane
8 ship
2 bird
9 truck
7 horse
Saving results into foo