爲了確保arm網站上面不做大的修改,我這邊將文檔保存在如下的路徑,可以自行取閱:
https://download.csdn.net/download/putiancaijunyu/10892970
注意幾點:
Setup and download libraries
這個階段下載protobuf.git的時候,會找不到v3.5.0這邊branch,建議切換到3.6.x上。
git clone https://github.com/google/protobuf.git
執行完成這個命令之後,切換branch
git checkout 3.6.x
Build the Compute Library
如果提示沒有安裝aarch64-linux-gnu-g++命令,那就是電腦沒有安裝toolchain,可以考慮執行:
sudo apt-get install g++-aarch64-linux-gnu
Build the Google protobuf library
請注意將branch切換到3.6.x,不然後邊編譯armnn的時候會出錯。
如果出現如下錯誤:
root@JunyuSS3:/home/admin1/armnn-onnx/protobuf# ./autogen.sh
+ mkdir -p third_party/googletest/m4
+ autoreconf -f -i -Wall,no-obsolete
./autogen.sh: 37: ./autogen.sh: autoreconf: not found
這是因爲沒有安裝automake工具。可以考慮執行如下命令:
sudo apt-get install autoconf automake libtool
Generate the ONNX protobuf source files
在這邊步驟中,主要需要切換onnx.git的commit Id,不然在編譯armnn的時候會出現如下的問題:
如果出現如下的錯誤:
[ 74%] Building CXX object CMakeFiles/armnnOnnxParser.dir/src/armnnOnnxParser/OnnxParser.cpp.o
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp: In function ‘armnn::TensorInfo armnnOnnxParser::{anonymous}::ToTensorInfo(const onnx::ValueInfoProto&)’:
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:217:101: error: invalid conversion from ‘google::protobuf::int32 {aka int}’ to ‘onnx::TensorProto::DataType {aka onnx::TensorProto_DataType}’ [-fpermissive]
onnx::TensorProto::DataType_Name(info.type().tensor_type().elem_type()) %
^
In file included from /home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.hpp:11:0,
from /home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:5:
/home/admin1/armnn-onnx/onnx/onnx/onnx.pb.h:1787:38: note: initializing argument 1 of ‘static const string& onnx::TensorProto::DataType_Name(onnx::TensorProto::DataType)’
static inline const ::std::string& DataType_Name(DataType value) {
^
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp: In member function ‘void armnnOnnxParser::OnnxParser::SetupInfo(const google::protobuf::RepeatedPtrField<onnx::ValueInfoProto>*)’:
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:640:85: error: invalid conversion from ‘google::protobuf::int32 {aka int}’ to ‘onnx::TensorProto::DataType {aka onnx::TensorProto_DataType}’ [-fpermissive]
m_TensorsInfo[tensor.name()].m_dtype = tensor.type().tensor_type().elem_type();
^
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp: In member function ‘void armnnOnnxParser::OnnxParser::ParseConstant(const onnx::NodeProto&)’:
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:853:78: error: invalid conversion from ‘google::protobuf::int32 {aka int}’ to ‘onnx::TensorProto::DataType {aka onnx::TensorProto_DataType}’ [-fpermissive]
CHECK_VALID_DATATYPE(node.name(), onnxTensor.name(), onnxTensor.data_type(), onnx::TensorProto::FLOAT);
^
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:48:35: note: in definition of macro ‘CHECK_VALID_DATATYPE’
CheckValidDataType({__VA_ARGS__}, ACTUAL, #__VA_ARGS__, NODE, TENSOR, CHECK_LOCATION())
^
/home/admin1/armnn-onnx/armnn/src/armnnOnnxParser/OnnxParser.cpp:24:6: note: initializing argument 2 of ‘void armnnOnnxParser::{anonymous}::CheckValidDataType(std::initializer_list<onnx::TensorProto_DataType>, onnx::TensorProto::DataType, const char*, std::__cxx11::string, std::__cxx11::string, const armnn::CheckLocation&)’
void CheckValidDataType(std::initializer_list<onnx::TensorProto::DataType> validInputTypes,
^
CMakeFiles/armnnOnnxParser.dir/build.make:62: recipe for target 'CMakeFiles/armnnOnnxParser.dir/src/armnnOnnxParser/OnnxParser.cpp.o' failed
make[2]: *** [CMakeFiles/armnnOnnxParser.dir/src/armnnOnnxParser/OnnxParser.cpp.o] Error 1
CMakeFiles/Makefile2:68: recipe for target 'CMakeFiles/armnnOnnxParser.dir/all' failed
make[1]: *** [CMakeFiles/armnnOnnxParser.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
原因是onnx後面將elem_type的類型從DateType變成int32。
https://github.com/ARM-software/armnn/issues/113,這個給出了一個修改意見,建設將onnx的版本更新到0a4d5abdf4939ab0842a5eadcc16a3bf0738f901
使用的命令可以是:
cd onnx;
git checkout 0a4d5abdf4939ab0842a5eadcc16a3bf0738f901
然後在重新編譯onnx