NOTEBOOK

Caffe on Aarch64

1-环境搭建

环境搭建参考链接:caffe-installation

Step1:安装依赖包

dnf install

编译安装caffe之前,需要通过dnf install来安装一些软件依赖包,如下:

//编译caffe所需的prerequisites
dnf install leveldb-devel snappy-devel opencv.aarch64 boost-devel hdf5-devel gflags-devel glog-devel lmdb-devel openblas.aarch64
//环境搭建中需要的基础软件包
dnf install git wget tar gcc-g++ unzip automake libtool autoconf

从源码编译安装protobuf

protobuf在GitHub上有开源仓库,这里选择从源码编译安装3.9.x版本的protobuf,编译参考链接,具体步骤如下:

//从github上克隆仓库并切换到3.9.x分支,从而进行编译
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git checkout 3.9.x
./autogen.sh
./configure --prefix=/home/caffe/file/protobuf-install
make-j16
make install -j16
//添加环境变量到~/.bashrc
export PROTOBUF="/home/caffe/file/protobuf-install"
export PATH="$PROTOBUF/bin:PATH"
export LD_LIBRARY_PATH="$PROTOBUF/lib:LD_LIBRARY_PATH"

通过 protoc --version命令来查看protobuf版本号,以此确认是否安装成功。

1719976691441

Step2:编译caffe

caffe在GitHub上有开源仓库,这里直接选择在master上进行编译即可,具体步骤如下:

git clone https://github.com/BVLC/caffe.git
cd caffe
cp Makefile.config.example Makefile.config

编译caffe之前需要根据实际情况来修改Makefile.config文件来进行适配,具体修改如下:

为了将OpenCV4.x适配caffe,需要对caffe的源码做出如下修改:

//工作路径为caffe仓库的根目录
sed -i 's/CV_LOAD_IMAGE_COLOR/cv::IMREAD_COLOR/g' src/caffe/layers/window_data_layer.cpp
sed -i 's/CV_LOAD_IMAGE_COLOR/cv::IMREAD_COLOR/g' src/caffe/util/io.cpp
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::ImreadModes::IMREAD_GRAYSCALE/g' src/caffe/util/io.cpp
sed -i 's/CV_LOAD_IMAGE_COLOR/cv::IMREAD_COLOR/g' src/caffe/test/test_io.cpp
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::ImreadModes::IMREAD_GRAYSCALE/g' src/caffe/test/test_io.cpp

至此,对于caffe的适配已经完成,接下来进行编译:

//编译
make all -j16
make test -j16
make runtest -j16
//添加环境变量到~/.bashrc
export CAFFE="/home/caffe/file/caffe"
export PATH="$CAFFE/build/tools:$PATH"

通过 caffe --version命令来查看caffe版本号,以此确认是否安装成功。

1719978648183

注:以上内容中使用的的路径,需要根据实际环境进行修改,不可以直接复制使用!

2-问题解决

protobuf的版本选择

编译caffe需要用到protobuf,通过 dnf install protobuf-devel可以获得3.19版本。如果使用3.19版本的protobuf,在后续编译caffe时会出现下图报错。报错原因:https://github.com/onnx/onnx/issues/2678,故而需要安装3.6~3.10版本的protobuf。

1719975540919

BLAS的选择

caffe官网中提到BLAS可以从ALTAS、Intel MKL和OpenBLAS中三选一,选择好之后只需要在Makefile.config文件中指出即可。这里选用OpenBLAS的原因是其可以直接通过dnf install来安装,方便。

OpenCV的版本选择

caffe官网中提到的OpenCV适配版本是2.4~3.0,通过 dnf install opencv.aarch64安装的是4.x版本。采用4.x的OpenCV,在后续的caffe编译中会出现如下图报错。所以需要把caffe源码中的 CV_LOAD_IMAGE_GRAYSCALECV_LOAD_IMAGE_COLOR替换为 cv::ImreadModes::IMREAD_GRAYSCALEcv::IMREAD_COLOR

1719979529451

INCLUDE、LIBRARY和LIBRARIES的修改

因为采用的BLAS和OpenCV不是官方默认的选择,protobuf是从源码编译安装而非通过dnf install,所以在编译的时候会出现找不到文件等错误,需要在Makefile.config文件中添加INCLUDE路径。比如下图所示error,可以使用 find / -name cblas.h找一下cblas.h文件的位置,然后把路径加入到INCLUDE里面,其他类似情况也是同理。

1719980345851

另外,还需要把protobuf的动态链接库添加到LIBRARY里面,否则会出现如下报错。

1719980731586

为了解决下图所示问题,需要添加LIBRARIES变量。

1719980886558

3-用例运行

caffe的interface一共有四个,如下图所示,这里采用time。caffe的GitHub官方维护了一个Model Zoo,其中包含许多model,每个model会提供deploy.prototxt或train_val.prototxt,两个文件都可以用来进行benchmark,但是后者需要将数据集下载到本地,前者所使用的数据是caffe随机初始化的输入数据。

注:在不同的model中,deploy.prototxt和train_val.prototxt两类文件的命名可能不同,后文中deploy.prototxt统一代指使用非实际数据集的文件,train_val.prototxt统一代指使用实际数据集的文件。

1719989324321

典型用例

情景1:如果一个model自带deploy.prototxt,那么可以直接 caffe time -model deploy.prototxt来进行benchmark;

情景2:如果没有deploy.prototxt,但是数据集的下载比较方便,那么可以先下载数据集到本地,然后再用 caffe time -model train_val.prototxt来进行benchmark;

情境3:但如果数据集的下载比较麻烦或者数据集比较大,那么可以通过修改train_val.prototxt来获得deploy.prototxt然后再进行benchmark,做法可以参考链接

所以接下来通过三个模型来说明以上三种情境的具体处理方式。

VGG_CNN_S

VGG_CNN_S自带deploy.prototxt,所以可以通过 caffe time -model deploy.prototxt来直接进行测试,具体操作为:

caffe time -model VGG_CNN_S_deploy.prototxt

1719996348274

The All Convolutional Net

The All Convolutional Net没有deploy.prototxt,但是可以方便地下载数据集,所以可以先下载数据集,然后再用train_val.prototxt来进行测试,具体操作为:

git clone https://github.com/mateuszbuda/ALL-CNN.git
cd ALL-CNN
//下载cifar-10_train_lmdb.zip并解压(model的github上有数据集的下载地址)
caffe time -model ALL_CNN_C_train_val.prototxt

1719998212676

Deep Hand: How to Train a CNN on 1 Million Hand Images When Your Data Is Continuous and Weakly Labelled

Deep Hand没有deploy.prototxt,并且数据集的下载并不是十分方便,所以需要将train_val.prototxt修改为deploy.prototxt,然后再进行测试,具体的操作如下:

step1-添加input:把input放在 name: "GoogleNet"的下面。shape包含4个dim,第一个表示对待识别样本进行数据增广的数量,一般设置为5,可以自行定义;第二个表示处理的图像的通道数,RGB图像为3、灰度图为1;第三个和第四个是图像的长度和宽度,即crop_size的值,参考链接

input: "data"
input_shape {
  dim: 10
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer:可以全局先后搜索 TESTTRAIN,然后把对应的layer删除。

step3-删除type为 SoftmaxWithLoss的layer。

至此,已经得到了可以用于测试的deploy.prototxt。

caffe time -model submit-net_deploy.prototxt

1720000387834

其他用例

在Model Zoo中,目前可以跑通50个用例,下面将分别说明用例运行的方法。

finetune_flickr_style

在caffe/models/finetune_flickr_style路径下,自带deploy.prototxt。

caffe time -model models/finetune_flickr_style/deploy.prototxt

1720059347798

bvlc_googlenet

在caffe/models/bvlc_googlenet路径下,自带deploy.prototxt。

caffe time -model models/bvlc_googlenet/deploy.prototxt

1720059490439

NIN-Imagenet

deploy.prototxt

caffe time -model my_models/NIN-Imagenet/deploy.protxt

1720059613254

NIN-CIFAR10

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置参考NIN-Imagenet。

input: "data"
input_shape {
  dim: 10
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/NIN-CIFAR10/deploy.prototxt

1720059679597

VGG_CNN_S

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_S/VGG_CNN_S_deploy.prototxt

1720060541108

VGG_CNN_M

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_M/VGG_CNN_M_deploy.prototxt

1720060645171

VGG_CNN_M_2048

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_M_2048/VGG_CNN_M_2048_deploy.prototxt

1720060742656

VGG_CNN_M_1024

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_M_1024/VGG_CNN_M_1024_deploy.prototxt

1720060780276

VGG_CNN_M_128

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_M_128/deploy.prototxt

1720060810053

VGG_CNN_F

自带deploy.prototxt文件。

caffe time -model my_models/VGG_CNN_F/deploy.prototxt

1720060863335

VGG_ILSVRC_16

自带deploy.prototxt文件。

caffe time -model my_models/VGG_ILSVRC_16_layers_deploy.prototxt

1720060911596

VGG_ILSVRC_19

自带deploy.prototxt文件。

caffe time -model my_models/VGG_ILSVRC_19_layers_deploy.prototxt

1720060972751

places205CNN

自带deploy.prototxt文件。

caffe time -model my_models/placesCNN/places205CNN_deploy.prototxt

1720061006094

places205CNN_FC7

自带deploy.prototxt文件。

caffe time -model my_models/placesCNN/places205CNN_deploy_FC7.prototxt

1720061131688

hybridCNN

自带deploy.prototxt文件。

caffe time -model my_models/hybridCNN/hybridCNN_deploy.prototxt

1720061153927

hybridCNN_FC7

自带deploy.prototxt文件。

caffe time -model my_models/hybridCNN/hybridCNN_deploy_FC7.prototxt

1720061212014

googlenet_places205

自带deploy.prototxt文件。

caffe time -model my_models/googlenet_places205/deploy_places205.protxt

1720061283765

ImageNet

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,224,224。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/ImageNet/deploy.prototxt

1720061589993

Places

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,224,224。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/Places/deploy.prototxt

1720061798148

oxford102

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,227,227。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 227
  dim: 227
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/oxford102/deploy.prototxt

1720061992648

GoogleNet_SOS

自带deploy.prototxt文件。

caffe time -model my_models/GoogleNet_SOS/deploy.prototxt

1720062450713

AlexNet_SalObjSub

自带deploy.prototxt文件。

caffe time -model my_models/AlexNet_SalObjSub/deploy.prototxt

1720062498545

VGG16_SalObjSub

自带deploy.prototxt文件。

caffe time -model my_models/VGG16_SalObjSub/deploy.prototxt

1720062540467

Places_CNDS_model

自带deploy.prototxt文件。

caffe time -model my_models/Places_CNDS_model/deploy.prototxt

1720062592500

deploy_age

自带deploy.prototxt文件。

caffe time -model my_models/deploy_age.prototxt

1720062653266

deploy_gender

自带deploy.prototxt文件。

caffe time -model my_models/deploy_gender.prototxt

1720062706834

GoogLeNet_cars

自带deploy.prototxt文件。

caffe time -model my_models/GoogLeNet_cars/deploy.prototxt

1720062732074

VGG_ILSVRC_16_layers_fc_reduced

自带deploy.prototxt文件。

caffe time -model my_models/VGG_ILSVRC_16_layers_fc_reduced/deploy.prototxt

1720062781687

hed_pretrained_bsds

自带deploy.prototxt文件。

caffe time -model my_models/hed_pretrained_bsds/deploy.prototxt

1720062895441

Emotion_Classification_CNN

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,224,224。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/Emotion_Classification_CNN/deploy.prototxt

1720063094966

vanillaCNN

自带deploy.prototxt文件。

caffe time -model my_models/vanillaCNN/deploy.prototxt

1720063285543

Pascal_VOC

自带deploy.prototxt文件。

caffe time -model my_models/Pascal_VOC/deploy.prototxt

1720063342217

SqueezeNet

自带deploy.prototxt文件。

caffe time -model my_models/SqueezeNet/SqueezeNet_v1.1/deploy.prototxt

1720063402543

GoogleNet_cub

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,226,226。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 226
  dim: 226
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/MixDCNN/GoogleNet_cub_2011_4.prototxt

1720063452265

GoogleNet_birdsnap

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,226,226。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 226
  dim: 226
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/MixDCNN/GoogleNet_birdsnap_6.prototxt

1720063626173

GoogleNet_clef_flower

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,226,226。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 226
  dim: 226
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SOFTMAX_LOSS的layer。

caffe time -model my_models/MixDCNN/GoogleNet_clef_flower_4.prototxt

1720063796115

VGGdeploy

自带deploy.prototxt文件。

caffe time -model my_models/CNN_Object_Proposal/VGGdeploy.prototxt

1720063971070

Googledeploy

自带deploy.prototxt文件。

caffe time -model my_models/CNN_Object_Proposal/Googledeploy.prototxt

1720064044769

1miohands-modelzoo-v2

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,224,224。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SoftmaxWithLoss的layer。

caffe time -model my_models/1miohands-modelzoo-v2/deploy.prototxt

1720064107370

InceptionBN-21K-for-Caffe

自带deploy.prototxt文件。

caffe time -model my_models/InceptionBN-21K-for-Caffe/deploy.prototxt

1720064372051

AlexNet_cvgj

自带deploy.prototxt文件。

caffe time -model my_models/cnn-models-master/AlexNet_cvgj/deploy.prototxt

1720064429264

VGG19_cvgj

自带deploy.prototxt文件。

caffe time -model my_models/cnn-models-master/VGG19_cvgj/deploy.prototxt

1720064487261

ResNet10_cvgj

自带deploy.prototxt文件。

caffe time -model my_models/cnn-models-master/ResNet_preact/ResNet10_cvgj/deploy.prototxt

1720064523628

ResNet50_cvgj

自带deploy.prototxt文件。

caffe time -model my_models/cnn-models-master/ResNet_preact/ResNet50_cvgj/deploy.prototxt

1720064559302

3DMM_CNN

自带deploy.prototxt文件。

caffe time -model my_models/3DMM_CNN/deploy_network.prototxt

1720064717585

cascadedfcn_step1

自带deploy.prototxt文件。

caffe time -model my_models/Cascaded-FCN/models/cascadedfcn/step1/step1_deploy.prototxt

1720064596125

cascadedfcn_step2

自带deploy.prototxt文件。

caffe time -model my_models/Cascaded-FCN/models/cascadedfcn/step2/step2_deploy.prototxt

1720064695035

ALL_CNN_C_train_val

自带train_val.prototxt数据集,下载好数据集后,用train_val.prototxt来测试。

caffe time -model ALL_CNN_C_train_val.prototxt

1720064993621

channel_pruning_VGG-16_3C4x

自带train_val.prototxt,需要修改得到deploy.prototxt。

step1-添加input:dim的设置为5,3,224,224。

input: "data"
input_shape {
  dim: 5
  dim: 3
  dim: 224
  dim: 224
}

step2-删除带有 TESTTRAIN的layer。

step3-删除type为 SoftmaxWithLossAccuracy的ler。

caffe time -model /home/caffe/file/caffe/my_models/channel_pruning_VGG-16_3C4x/deploy.prototxt

1720065100526

basic_16to66

自带deploy.prototxt文件。

caffe time -model my_models/Using-Ranking-CNN-for-Age-Estimation/basic_16to66/deploy_basic.prototxt

1720065166608

4-附件

50个models的deploy文件

caffe在aarch64(鲲鹏920)上的自动化构建脚本