From a1d881b273c978dd19620b96d9f6eda98c41f6ee Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Senior=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Tue, 8 May 2018 10:13:06 +0900 Subject: [PATCH] Introduce 'caffekit' (#154) This commit introduces 'caffekit' which will include various tools for supporting caffe. Currently, 'caffekit' supports only 'run' command which loads .prototxt and .caffemodel and runs one inference. Signed-off-by: Jonghyun Park --- contrib/caffekit/CMakeLists.txt | 11 +++++++ contrib/caffekit/src/caffekit.cpp | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 contrib/caffekit/CMakeLists.txt create mode 100644 contrib/caffekit/src/caffekit.cpp diff --git a/contrib/caffekit/CMakeLists.txt b/contrib/caffekit/CMakeLists.txt new file mode 100644 index 0000000..bf7a887 --- /dev/null +++ b/contrib/caffekit/CMakeLists.txt @@ -0,0 +1,11 @@ +nncc_find_package(Caffe QUIET) + +if(NOT Caffe_FOUND) + return() +endif(NOT Caffe_FOUND) + +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(caffekit ${SOURCES}) +target_link_libraries(caffekit nncc_foundation) +target_link_libraries(caffekit caffe) diff --git a/contrib/caffekit/src/caffekit.cpp b/contrib/caffekit/src/caffekit.cpp new file mode 100644 index 0000000..3ff0b95 --- /dev/null +++ b/contrib/caffekit/src/caffekit.cpp @@ -0,0 +1,67 @@ +struct Command +{ + virtual ~Command() = default; + + virtual int run(int argc, char **argv) const = 0; +}; + +#include + +#include + +class RunCommand final : public Command +{ +public: + int run(int argc, char **argv) const override; +}; + +int RunCommand::run(int argc, char **argv) const +{ + // USAGE: HEADER run [.prototxt] [.caffemodel] + caffe::Net net(argv[0], caffe::TEST); + + net.CopyTrainedLayersFrom(argv[1]); + net.Forward(); + + std::cout << "# of outputs: " << net.num_outputs() << std::endl; + + return 0; +} + +#include + +#include +#include +#include + +int main(int argc, char **argv) +{ + std::map> commands; + + commands["run"] = nncc::foundation::make_unique(); + + if (argc < 2) + { + std::cerr << "ERROR: COMMAND is not provided" << std::endl; + std::cerr << std::endl; + std::cerr << "USAGE: " << argv[0] << " [COMMAND] ..." << std::endl; + return 255; + } + + // USAGE: HEADER [command] ... + if (commands.find(argv[1]) == commands.end()) + { + std::cerr << "ERROR: '" << argv[1] << "' is not a valid command" << std::endl; + std::cerr << std::endl; + std::cerr << "USAGE: " << argv[0] << " [COMMAND] ..." << std::endl; + std::cerr << std::endl; + std::cerr << "SUPPORTED COMMANDS:" << std::endl; + for (auto it = commands.begin(); it != commands.end(); ++it) + { + std::cerr << " " << it->first << std::endl; + } + return 255; + } + + return commands.at(argv[1])->run(argc - 2, argv + 2); +} -- 2.7.4