From 3c7f6e4d5c16cc154c41270e28d3960552d8cb46 Mon Sep 17 00:00:00 2001 From: dongshuilong Date: Tue, 31 Aug 2021 12:52:17 +0000 Subject: [PATCH 01/21] add cpp whole_chain test --- deploy/cpp/CMakeLists.txt | 6 +- deploy/cpp/external-cmake/auto-log.cmake | 12 +++ deploy/cpp/include/cls.h | 2 +- deploy/cpp/include/cls_config.h | 10 ++- deploy/cpp/src/cls.cpp | 30 +++++--- deploy/cpp/src/main.cpp | 19 ++++- deploy/cpp/tools/build.sh | 4 +- deploy/cpp/tools/config.txt | 5 +- tests/{ => config}/DarkNet53.txt | 0 tests/{ => config}/HRNet_W18_C.txt | 0 tests/{ => config}/LeViT_128S.txt | 0 tests/{ => config}/MobileNetV1.txt | 0 tests/{ => config}/MobileNetV2.txt | 0 tests/{ => config}/MobileNetV3_large_x1_0.txt | 0 tests/{ => config}/ResNeXt101_vd_64x4d.txt | 0 tests/{ => config}/ResNet50_vd.txt | 7 ++ tests/{ => config}/ShuffleNetV2_x1_0.txt | 0 ...winTransformer_tiny_patch4_window7_224.txt | 0 tests/config/cpp_config.txt | 19 +++++ tests/cpp_config.txt | 24 ++++++ tests/prepare.sh | 62 +++++++++++++++- tests/test.sh | 74 ++++++++++++++++++- 22 files changed, 250 insertions(+), 24 deletions(-) create mode 100644 deploy/cpp/external-cmake/auto-log.cmake rename tests/{ => config}/DarkNet53.txt (100%) rename tests/{ => config}/HRNet_W18_C.txt (100%) rename tests/{ => config}/LeViT_128S.txt (100%) rename tests/{ => config}/MobileNetV1.txt (100%) rename tests/{ => config}/MobileNetV2.txt (100%) rename tests/{ => config}/MobileNetV3_large_x1_0.txt (100%) rename tests/{ => config}/ResNeXt101_vd_64x4d.txt (100%) rename tests/{ => config}/ResNet50_vd.txt (92%) rename tests/{ => config}/ShuffleNetV2_x1_0.txt (100%) rename tests/{ => config}/SwinTransformer_tiny_patch4_window7_224.txt (100%) create mode 100755 tests/config/cpp_config.txt create mode 100755 tests/cpp_config.txt diff --git a/deploy/cpp/CMakeLists.txt b/deploy/cpp/CMakeLists.txt index 4f148869f..4b11eec62 100755 --- a/deploy/cpp/CMakeLists.txt +++ b/deploy/cpp/CMakeLists.txt @@ -1,4 +1,5 @@ project(clas_system CXX C) +cmake_minimum_required(VERSION 3.14) option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." ON) option(WITH_GPU "Compile demo with GPU/CPU, default use CPU." OFF) @@ -13,7 +14,6 @@ SET(TENSORRT_DIR "" CACHE PATH "Compile demo with TensorRT") set(DEMO_NAME "clas_system") - macro(safe_set_static_flag) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE @@ -198,6 +198,10 @@ endif() set(DEPS ${DEPS} ${OpenCV_LIBS}) +include(FetchContent) +include(external-cmake/auto-log.cmake) +include_directories(${FETCHCONTENT_BASE_DIR}/extern_autolog-src) + AUX_SOURCE_DIRECTORY(./src SRCS) add_executable(${DEMO_NAME} ${SRCS}) diff --git a/deploy/cpp/external-cmake/auto-log.cmake b/deploy/cpp/external-cmake/auto-log.cmake new file mode 100644 index 000000000..9be9c2fb3 --- /dev/null +++ b/deploy/cpp/external-cmake/auto-log.cmake @@ -0,0 +1,12 @@ +find_package(Git REQUIRED) +include(FetchContent) + +set(FETCHCONTENT_BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}/third-party") + +FetchContent_Declare( + extern_Autolog + PREFIX autolog + GIT_REPOSITORY https://github.com/LDOUBLEV/AutoLog.git + GIT_TAG main +) +FetchContent_MakeAvailable(extern_Autolog) diff --git a/deploy/cpp/include/cls.h b/deploy/cpp/include/cls.h index 3cc5dcc16..600cffbf1 100644 --- a/deploy/cpp/include/cls.h +++ b/deploy/cpp/include/cls.h @@ -61,7 +61,7 @@ public: void LoadModel(const std::string &model_path, const std::string ¶ms_path); // Run predictor - double Run(cv::Mat &img); + double Run(cv::Mat &img, std::vector *times); private: std::shared_ptr predictor_; diff --git a/deploy/cpp/include/cls_config.h b/deploy/cpp/include/cls_config.h index 7377573c3..d74bb7b4d 100644 --- a/deploy/cpp/include/cls_config.h +++ b/deploy/cpp/include/cls_config.h @@ -1,4 +1,4 @@ -// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -36,8 +36,7 @@ public: this->gpu_mem = stoi(config_map_["gpu_mem"]); - this->cpu_math_library_num_threads = - stoi(config_map_["cpu_math_library_num_threads"]); + this->cpu_threads = stoi(config_map_["cpu_threads"]); this->use_mkldnn = bool(stoi(config_map_["use_mkldnn"])); @@ -51,6 +50,8 @@ public: this->resize_short_size = stoi(config_map_["resize_short_size"]); this->crop_size = stoi(config_map_["crop_size"]); + + this->benchmark = bool(stoi(config_map_["benchmark"])); } bool use_gpu = false; @@ -59,12 +60,13 @@ public: int gpu_mem = 4000; - int cpu_math_library_num_threads = 1; + int cpu_threads = 1; bool use_mkldnn = false; bool use_tensorrt = false; bool use_fp16 = false; + bool benchmark = false; std::string cls_model_path; diff --git a/deploy/cpp/src/cls.cpp b/deploy/cpp/src/cls.cpp index d0fa21f7d..7a141639d 100644 --- a/deploy/cpp/src/cls.cpp +++ b/deploy/cpp/src/cls.cpp @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include #include namespace PaddleClas { @@ -53,11 +52,12 @@ void Classifier::LoadModel(const std::string &model_path, this->predictor_ = CreatePredictor(config); } -double Classifier::Run(cv::Mat &img) { +double Classifier::Run(cv::Mat &img, std::vector *times) { cv::Mat srcimg; cv::Mat resize_img; img.copyTo(srcimg); + auto preprocess_start = std::chrono::steady_clock::now(); this->resize_op_.Run(img, resize_img, this->resize_short_size_); this->crop_op_.Run(resize_img, this->crop_size_); @@ -70,7 +70,9 @@ double Classifier::Run(cv::Mat &img) { auto input_names = this->predictor_->GetInputNames(); auto input_t = this->predictor_->GetInputHandle(input_names[0]); input_t->Reshape({1, 3, resize_img.rows, resize_img.cols}); - auto start = std::chrono::system_clock::now(); + auto preprocess_end = std::chrono::system_clock::now(); + + auto infer_start = std::chrono::system_clock::now(); input_t->CopyFromCpu(input.data()); this->predictor_->Run(); @@ -83,21 +85,29 @@ double Classifier::Run(cv::Mat &img) { out_data.resize(out_num); output_t->CopyToCpu(out_data.data()); - auto end = std::chrono::system_clock::now(); - auto duration = - std::chrono::duration_cast(end - start); - double cost_time = double(duration.count()) * - std::chrono::microseconds::period::num / - std::chrono::microseconds::period::den; + auto infer_end = std::chrono::system_clock::now(); + auto postprocess_start = std::chrono::system_clock::now(); int maxPosition = max_element(out_data.begin(), out_data.end()) - out_data.begin(); + auto postprocess_end = std::chrono::system_clock::now(); + + // std::chrono::duration preprocess_diff = preprocess_end - + // preprocess_start; + // times->push_back(double(preprocess_diff.count() * 1000)); + std::chrono::duration inference_diff = infer_end - infer_start; + double inference_cost_time = double(inference_diff.count() * 1000); + times->push_back(inference_cost_time); + std::chrono::duration postprocess_diff = + postprocess_end - postprocess_start; + times->push_back(double(postprocess_diff.count() * 1000)); + std::cout << "result: " << std::endl; std::cout << "\tclass id: " << maxPosition << std::endl; std::cout << std::fixed << std::setprecision(10) << "\tscore: " << double(out_data[maxPosition]) << std::endl; - return cost_time; + return inference_cost_time; } } // namespace PaddleClas diff --git a/deploy/cpp/src/main.cpp b/deploy/cpp/src/main.cpp index 0dda50819..4fc191b3c 100644 --- a/deploy/cpp/src/main.cpp +++ b/deploy/cpp/src/main.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -61,11 +62,12 @@ int main(int argc, char **argv) { Classifier classifier(config.cls_model_path, config.cls_params_path, config.use_gpu, config.gpu_id, config.gpu_mem, - config.cpu_math_library_num_threads, config.use_mkldnn, + config.cpu_threads, config.use_mkldnn, config.use_tensorrt, config.use_fp16, config.resize_short_size, config.crop_size); double elapsed_time = 0.0; + std::vector cls_times; int warmup_iter = img_files_list.size() > 5 ? 5 : 0; for (int idx = 0; idx < img_files_list.size(); ++idx) { std::string img_path = img_files_list[idx]; @@ -78,7 +80,7 @@ int main(int argc, char **argv) { cv::cvtColor(srcimg, srcimg, cv::COLOR_BGR2RGB); - double run_time = classifier.Run(srcimg); + double run_time = classifier.Run(srcimg, &cls_times); if (idx >= warmup_iter) { elapsed_time += run_time; std::cout << "Current image path: " << img_path << std::endl; @@ -90,5 +92,16 @@ int main(int argc, char **argv) { } } + std::string presion = "fp32"; + + if (config.use_fp16) + presion = "fp16"; + if (config.benchmark) { + AutoLogger autolog("Classification", config.use_gpu, config.use_tensorrt, + config.use_mkldnn, config.cpu_threads, 1, + "1, 3, 224, 224", presion, cls_times, + img_files_list.size()); + autolog.report(); + } return 0; } diff --git a/deploy/cpp/tools/build.sh b/deploy/cpp/tools/build.sh index ad6a727f0..0a3aa044c 100755 --- a/deploy/cpp/tools/build.sh +++ b/deploy/cpp/tools/build.sh @@ -1,5 +1,5 @@ -OPENCV_DIR=/PaddleClas/opencv-3.4.7/opencv3/ -LIB_DIR=/PaddleClas/fluid_inference/ +OPENCV_DIR=/work/project/project/cpp_infer/opencv-3.4.7/opencv3 +LIB_DIR=/work/project/project/cpp_infer/paddle_inference/ CUDA_LIB_DIR=/usr/local/cuda/lib64 CUDNN_LIB_DIR=/usr/lib/x86_64-linux-gnu/ diff --git a/deploy/cpp/tools/config.txt b/deploy/cpp/tools/config.txt index b0becad61..0d915a91a 100755 --- a/deploy/cpp/tools/config.txt +++ b/deploy/cpp/tools/config.txt @@ -2,7 +2,7 @@ use_gpu 0 gpu_id 0 gpu_mem 4000 -cpu_math_library_num_threads 10 +cpu_threads 10 use_mkldnn 1 use_tensorrt 0 use_fp16 0 @@ -12,3 +12,6 @@ cls_model_path /PaddleClas/inference/cls_infer.pdmodel cls_params_path /PaddleClas/inference/cls_infer.pdiparams resize_short_size 256 crop_size 224 + +# for log env info +benchmark 0 diff --git a/tests/DarkNet53.txt b/tests/config/DarkNet53.txt similarity index 100% rename from tests/DarkNet53.txt rename to tests/config/DarkNet53.txt diff --git a/tests/HRNet_W18_C.txt b/tests/config/HRNet_W18_C.txt similarity index 100% rename from tests/HRNet_W18_C.txt rename to tests/config/HRNet_W18_C.txt diff --git a/tests/LeViT_128S.txt b/tests/config/LeViT_128S.txt similarity index 100% rename from tests/LeViT_128S.txt rename to tests/config/LeViT_128S.txt diff --git a/tests/MobileNetV1.txt b/tests/config/MobileNetV1.txt similarity index 100% rename from tests/MobileNetV1.txt rename to tests/config/MobileNetV1.txt diff --git a/tests/MobileNetV2.txt b/tests/config/MobileNetV2.txt similarity index 100% rename from tests/MobileNetV2.txt rename to tests/config/MobileNetV2.txt diff --git a/tests/MobileNetV3_large_x1_0.txt b/tests/config/MobileNetV3_large_x1_0.txt similarity index 100% rename from tests/MobileNetV3_large_x1_0.txt rename to tests/config/MobileNetV3_large_x1_0.txt diff --git a/tests/ResNeXt101_vd_64x4d.txt b/tests/config/ResNeXt101_vd_64x4d.txt similarity index 100% rename from tests/ResNeXt101_vd_64x4d.txt rename to tests/config/ResNeXt101_vd_64x4d.txt diff --git a/tests/ResNet50_vd.txt b/tests/config/ResNet50_vd.txt similarity index 92% rename from tests/ResNet50_vd.txt rename to tests/config/ResNet50_vd.txt index da02c8894..425d0c8ea 100644 --- a/tests/ResNet50_vd.txt +++ b/tests/config/ResNet50_vd.txt @@ -49,3 +49,10 @@ inference:python/predict_cls.py -c configs/inference_cls.yaml -o Global.save_log_path:null -o Global.benchmark:True null:null +null:null +===========================cpp_infer_params=========================== +use_gpu:0|1 +cpu_threads:1|6 +use_mkldnn:0|1 +use_tensorrt:0|1 +use_fp16:0|1 diff --git a/tests/ShuffleNetV2_x1_0.txt b/tests/config/ShuffleNetV2_x1_0.txt similarity index 100% rename from tests/ShuffleNetV2_x1_0.txt rename to tests/config/ShuffleNetV2_x1_0.txt diff --git a/tests/SwinTransformer_tiny_patch4_window7_224.txt b/tests/config/SwinTransformer_tiny_patch4_window7_224.txt similarity index 100% rename from tests/SwinTransformer_tiny_patch4_window7_224.txt rename to tests/config/SwinTransformer_tiny_patch4_window7_224.txt diff --git a/tests/config/cpp_config.txt b/tests/config/cpp_config.txt new file mode 100755 index 000000000..046a5c08e --- /dev/null +++ b/tests/config/cpp_config.txt @@ -0,0 +1,19 @@ +# model load config +gpu_id 0 +gpu_mem 2000 + +# whole chain test will add following config +# use_gpu 0 +# cpu_threads 10 +# use_mkldnn 1 +# use_tensorrt 0 +# use_fp16 0 + +# cls config +cls_model_path inference/inference.pdmodel +cls_params_path inference/inference.pdiparams +resize_short_size 256 +crop_size 224 + +# for log env info +benchmark 1 diff --git a/tests/cpp_config.txt b/tests/cpp_config.txt new file mode 100755 index 000000000..5331cce0a --- /dev/null +++ b/tests/cpp_config.txt @@ -0,0 +1,24 @@ +# model load config +gpu_id 0 +gpu_mem 2000 + +# whole chain test will add following config +# use_gpu 0 +# cpu_threads 10 +# use_mkldnn 1 +# use_tensorrt 0 +# use_fp16 0 + +# cls config +cls_model_path inference/inference.pdmodel +cls_params_path inference/inference.pdiparams +resize_short_size 256 +crop_size 224 + +# for log env info +benchmark 1 +eval "$cpp_use_gpu_key $use_gpu" +eval "$cpp_use_gpu_key" "$use_gpu" +${cpp_use_gpu_key} ${use_gpu} +1 2 +1 2 diff --git a/tests/prepare.sh b/tests/prepare.sh index 55e1f2c7f..35782fd01 100644 --- a/tests/prepare.sh +++ b/tests/prepare.sh @@ -33,7 +33,7 @@ if [ ${MODE} = "lite_train_infer" ] || [ ${MODE} = "whole_infer" ];then mv train.txt train_list.txt mv val.txt val_list.txt cd ../../ -elif [ ${MODE} = "infer" ];then +elif [ ${MODE} = "infer" ] || [ ${MODE} = "cpp_infer" ];then # download data cd dataset rm -rf ILSVRC2012 @@ -58,3 +58,63 @@ elif [ ${MODE} = "whole_train_infer" ];then mv val.txt val_list.txt cd ../../ fi + +if [ ${MODE} = "cpp_infer" ];then + cd deploy/cpp + echo "################### build opencv ###################" + rm -rf 3.4.7.tar.gz opencv-3.4.7/ + wget https://github.com/opencv/opencv/archive/3.4.7.tar.gz + tar -xf 3.4.7.tar.gz + install_path=$(pwd)/opencv-3.4.7/opencv3 + cd opencv-3.4.7/ + + rm -rf build + mkdir build + cd build + cmake .. \ + -DCMAKE_INSTALL_PREFIX=${install_path} \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DWITH_IPP=OFF \ + -DBUILD_IPP_IW=OFF \ + -DWITH_LAPACK=OFF \ + -DWITH_EIGEN=OFF \ + -DCMAKE_INSTALL_LIBDIR=lib64 \ + -DWITH_ZLIB=ON \ + -DBUILD_ZLIB=ON \ + -DWITH_JPEG=ON \ + -DBUILD_JPEG=ON \ + -DWITH_PNG=ON \ + -DBUILD_PNG=ON \ + -DWITH_TIFF=ON \ + -DBUILD_TIFF=ON + make -j + make install + cd ../../ + echo "################### build opencv finished ###################" + + echo "################### build PaddleClas demo ####################" + OPENCV_DIR=$(pwd)/opencv-3.4.7/opencv3/ + LIB_DIR=$(pwd)/Paddle/build/paddle_inference_install_dir/ + CUDA_LIB_DIR=$(dirname `find /usr -name libcudart.so`) + CUDNN_LIB_DIR=$(dirname `find /usr -name libcudnn.so`) + + BUILD_DIR=build + rm -rf ${BUILD_DIR} + mkdir ${BUILD_DIR} + cd ${BUILD_DIR} + cmake .. \ + -DPADDLE_LIB=${LIB_DIR} \ + -DWITH_MKL=ON \ + -DDEMO_NAME=clas_system \ + -DWITH_GPU=OFF \ + -DWITH_STATIC_LIB=OFF \ + -DWITH_TENSORRT=OFF \ + -DTENSORRT_DIR=${TENSORRT_DIR} \ + -DOPENCV_DIR=${OPENCV_DIR} \ + -DCUDNN_LIB=${CUDNN_LIB_DIR} \ + -DCUDA_LIB=${CUDA_LIB_DIR} \ + + make -j + echo "################### build PaddleClas demo finished ###################" +fi diff --git a/tests/test.sh b/tests/test.sh index c717f77de..25b854f06 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -1,6 +1,6 @@ #!/bin/bash FILENAME=$1 -# MODE be one of ['lite_train_infer' 'whole_infer' 'whole_train_infer', 'infer'] +# MODE be one of ['lite_train_infer' 'whole_infer' 'whole_train_infer', 'infer', 'cpp_infer'] MODE=$2 dataline=$(cat ${FILENAME}) @@ -145,10 +145,78 @@ benchmark_value=$(func_parser_value "${lines[49]}") infer_key1=$(func_parser_key "${lines[50]}") infer_value1=$(func_parser_value "${lines[50]}") +if [ ${MODE} = "cpp_infer" ]; then + cpp_use_gpu_key=$(func_parser_key "${lines[53]}") + cpp_use_gpu_list=$(func_parser_value "${lines[53]}") + cpp_cpu_threads_key=$(func_parser_key "${lines[54]}") + cpp_cpu_threads_list=$(func_parser_value "${lines[54]}") + cpp_use_mkldnn_key=$(func_parser_key "${lines[55]}") + cpp_use_mkldnn_list=$(func_parser_value "${lines[55]}") + cpp_use_tensorrt_key=$(func_parser_key "${lines[56]}") + cpp_use_tensorrt_list=$(func_parser_value "${lines[56]}") + cpp_use_fp16_key=$(func_parser_key "${lines[57]}") + cpp_use_fp16_list=$(func_parser_value "${lines[57]}") +fi + LOG_PATH="./tests/output" mkdir -p ${LOG_PATH} status_log="${LOG_PATH}/results.log" +function func_cpp_inference(){ + IFS='|' + _script=$1 + _log_path=$2 + _img_dir=$3 + # inference + for use_gpu in ${cpp_use_gpu_list[*]}; do + if [ ${use_gpu} = "0" ] || [ ${use_gpu} = "cpu" ]; then + for use_mkldnn in ${cpp_use_mkldnn_list[*]}; do + if [ ${use_mkldnn} = "0" ] && [ ${_flag_quant} = "True" ]; then + continue + fi + for threads in ${cpp_cpu_threads_list[*]}; do + _save_log_path="${_log_path}/cpp_infer_cpu_usemkldnn_${use_mkldnn}_threads_${threads}.log" + set_infer_data=$(func_set_params "${cpp_image_dir_key}" "${_img_dir}") + cp ../tests/config/cpp_config.txt cpp_config.txt + echo "${cpp_use_gpu_key} ${use_gpu}" >> cpp_config.txt + echo "${cpp_cpu_threads_key} ${threads}" >> cpp_config.txt + echo "${cpp_use_mkldnn_key} ${use_mkldnn}" >> cpp_config.txt + echo "${cpp_use_tensorrt_key} 0" >> cpp_config.txt + command="${_script} cpp_config.txt ${_img_dir} > ${_save_log_path} 2>&1 " + eval $command + last_status=${PIPESTATUS[0]} + eval "cat ${_save_log_path}" + status_check $last_status "${command}" "${status_log}" + done + done + elif [ ${use_gpu} = "1" ] || [ ${use_gpu} = "gpu" ]; then + for use_trt in ${cpp_use_tensorrt_list[*]}; do + for precision in ${cpp_use_fp16_list[*]}; do + if [[ ${precision} =~ "fp16" || ${precision} =~ "int8" ]] && [ ${use_trt} = "False" ]; then + continue + fi + if [[ ${use_trt} = "False" || ${precision} =~ "int8" ]] && [ ${_flag_quant} = "True" ]; then + continue + fi + _save_log_path="${_log_path}/cpp_infer_gpu_usetrt_${use_trt}_precision_${precision}_batchsize_${batch_size}.log" + cp ../tests/config/cpp_config.txt cpp_config.txt + echo "${cpp_use_gpu_key} ${use_gpu}" >> cpp_config.txt + echo "${cpp_cpu_threads_key} ${threads}" >> cpp_config.txt + echo "${cpp_use_mkldnn_key} ${use_mkldnn}" >> cpp_config.txt + echo "${cpp_use_tensorrt_key} ${precision}" >> cpp_config.txt + command="${_script} cpp_config.txt ${_img_dir} > ${_save_log_path} 2>&1 " + eval $command + last_status=${PIPESTATUS[0]} + eval "cat ${_save_log_path}" + status_check $last_status "${command}" "${status_log}" + + done + done + else + echo "Does not support hardware other than CPU and GPU Currently!" + fi + done +} function func_inference(){ IFS='|' @@ -247,6 +315,10 @@ if [ ${MODE} = "infer" ]; then Count=$(($Count + 1)) done cd .. +elif [ ${MODE} = "cpp_infer" ]; then + cd deploy + func_cpp_inference "./cpp/build/clas_system" "../${LOG_PATH}" "${infer_img_dir}" + cd .. else IFS="|" From f575ffbc22ca26002b617bc968f32993d6c3cb91 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Mon, 6 Sep 2021 15:09:54 +0800 Subject: [PATCH 02/21] Add files via upload --- docs/images/ml_illustration.jpg | Bin 0 -> 121629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/ml_illustration.jpg diff --git a/docs/images/ml_illustration.jpg b/docs/images/ml_illustration.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69dced96bcbc9f40ac08684301d20691ea07e93d GIT binary patch literal 121629 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 literal 0 HcmV?d00001 diff --git a/docs/images/ml_pipeline.jpg b/docs/images/ml_pipeline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cac6508924dcbe964244727c56239eb064c30ba1 GIT binary patch literal 70299 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 literal 0 HcmV?d00001 diff --git a/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md b/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md new file mode 100644 index 000000000..6c94c87f4 --- /dev/null +++ b/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md @@ -0,0 +1,26 @@ +# Metric Learning + +## 简介 + 在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是Metric Learning所要研究的课题。 + + Metric learning全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。 +![example](../images/ml_illustration.jpg) + + +## 应用 + Metric Learning技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等. 随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于Deep Metric Learning(DML). + + 一般来说, DML包含三个部分: 特征提取网络来map embedding, 一个采样策略来将一个mini-batch里的样本组合成很多个sub-set, 最后loss function在每个sub-set上计算loss. 如下图所示: + ![image](../images/ml_pipeline.jpg) + + +## 算法 + Metric Learning主要有如下两种学习范式: +### 1. Classification based: + 这是一类基于分类标签的Metric Learning方法。这类方法通过将每个样本分类到正确的类别中,来学习有效的特征表示,学习过程中需要每个样本的显式标签参与Loss计算。常见的算法有[L2-Softmax](https://arxiv.org/abs/1703.09507), [Large-margin Softmax](https://arxiv.org/abs/1612.02295), [Angular Softmax](https://arxiv.org/pdf/1704.08063.pdf), [NormFace](https://arxiv.org/abs/1704.06369), [AM-Softmax](https://arxiv.org/abs/1801.05599), [CosFace](https://arxiv.org/abs/1801.09414), [ArcFace](https://arxiv.org/abs/1801.07698)等。 + 这类方法也被称作是proxy-based, 因为其本质上优化的是样本和一堆proxies之间的相似度。 +### 2. Pairwise based: + 这是一类基于样本对的学习范式。他以样本对作为输入,通过直接学习样本对之间的相似度来得到有效的特征表示,常见的算法包括:[Contrastive loss](http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf), [Triplet loss](https://arxiv.org/abs/1503.03832), [Lifted-Structure loss](https://arxiv.org/abs/1511.06452), [N-pair loss](https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf), [Multi-Similarity loss](https://arxiv.org/pdf/1904.06627.pdf)等 + +2020年发表的[CircleLoss](https://arxiv.org/abs/2002.10857),从一个全新的视角统一了两种学习范式,让研究人员和从业者对Metric Learning问题有了更进一步的思考。 + From 678619042b79135e37d3a7510e5077a7b9736cab Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Tue, 7 Sep 2021 19:51:09 +0800 Subject: [PATCH 13/21] Update metric_learning.md --- docs/zh_CN_tmp/algorithm_introduction/metric_learning.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md b/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md index 6c94c87f4..789d4940b 100644 --- a/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md +++ b/docs/zh_CN_tmp/algorithm_introduction/metric_learning.md @@ -4,14 +4,14 @@ 在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是Metric Learning所要研究的课题。 Metric learning全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。 -![example](../images/ml_illustration.jpg) +![example](../../images/ml_illustration.jpg) ## 应用 Metric Learning技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等. 随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于Deep Metric Learning(DML). 一般来说, DML包含三个部分: 特征提取网络来map embedding, 一个采样策略来将一个mini-batch里的样本组合成很多个sub-set, 最后loss function在每个sub-set上计算loss. 如下图所示: - ![image](../images/ml_pipeline.jpg) + ![image](../../images/ml_pipeline.jpg) ## 算法 From 44c3234424425aaf9a8eeac6ed0fa6d1f6fdb2a3 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Wed, 8 Sep 2021 10:46:18 +0800 Subject: [PATCH 14/21] Update README.md --- deploy/paddleserving/README.md | 170 +++++++++++---------------------- 1 file changed, 55 insertions(+), 115 deletions(-) diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md index de7965bac..e0ae75669 100644 --- a/deploy/paddleserving/README.md +++ b/deploy/paddleserving/README.md @@ -1,10 +1,10 @@ -# OCR Pipeline WebService +# PaddleClas Pipeline WebService (English|[简体中文](./README_CN.md)) -PaddleOCR provides two service deployment methods: +PaddleClas provides two service deployment methods: - Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please refer to the [tutorial](../../deploy/hubserving/readme_en.md) -- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please follow this tutorial. +- Based on **PaddleServing**: Code path is "`./deploy/paddleserving`". Please follow this tutorial. # Service deployment based on PaddleServing @@ -27,11 +27,10 @@ The introduction and tutorial of Paddle Serving service deployment framework ref ## Environmental preparation -PaddleOCR operating environment and Paddle Serving operating environment are needed. - -1. Please prepare PaddleOCR operating environment reference [link](../../doc/doc_ch/installation.md). - Download the corresponding paddle whl package according to the environment, it is recommended to install version 2.0.1. +PaddleClas operating environment and PaddleServing operating environment are needed. +1. Please prepare PaddleClas operating environment reference [link](../../docs/zh_CN/tutorials/install.md). + Download the corresponding paddle whl package according to the environment, it is recommended to install version 2.1.0. 2. The steps of PaddleServing operating environment prepare are as follows: @@ -65,71 +64,80 @@ PaddleOCR operating environment and Paddle Serving operating environment are nee ## Model conversion When using PaddleServing for service deployment, you need to convert the saved inference model into a serving model that is easy to deploy. -Firstly, download the [inference model](https://github.com/PaddlePaddle/PaddleOCR#pp-ocr-20-series-model-listupdate-on-dec-15) of PPOCR +Firstly, download the inference model of ResNet50_vd +``` +# Download and unzip the ResNet50_vd model +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_vd_infer.tar && tar xf ResNet50_vd_infer.tar ``` -# Download and unzip the OCR text detection model -wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar && tar xf ch_ppocr_mobile_v2.0_det_infer.tar -# Download and unzip the OCR text recognition model -wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar -``` Then, you can use installed paddle_serving_client tool to convert inference model to mobile model. ``` -# Detection model conversion -python3 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_det_infer/ \ - --model_filename inference.pdmodel \ - --params_filename inference.pdiparams \ - --serving_server ./ppocr_det_mobile_2.0_serving/ \ - --serving_client ./ppocr_det_mobile_2.0_client/ - -# Recognition model conversion -python3 -m paddle_serving_client.convert --dirname ./ch_ppocr_mobile_v2.0_rec_infer/ \ - --model_filename inference.pdmodel \ - --params_filename inference.pdiparams \ - --serving_server ./ppocr_rec_mobile_2.0_serving/ \ - --serving_client ./ppocr_rec_mobile_2.0_client/ - +# ResNet50_vd model conversion +python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ + --model_filename inference.pdmodel \ + --params_filename inference.pdiparams \ + --serving_server ./ResNet50_vd_serving/ \ + --serving_client ./ResNet50_vd_client/ ``` -After the detection model is converted, there will be additional folders of `ppocr_det_mobile_2.0_serving` and `ppocr_det_mobile_2.0_client` in the current folder, with the following format: +After the ResNet50_vd inference model is converted, there will be additional folders of `ResNet50_vd_serving` and `ResNet50_vd_client` in the current folder, with the following format: ``` -|- ppocr_det_mobile_2.0_serving/ - |- __model__ - |- __params__ - |- serving_server_conf.prototxt - |- serving_server_conf.stream.prototxt - -|- ppocr_det_mobile_2.0_client - |- serving_client_conf.prototxt - |- serving_client_conf.stream.prototxt +|- ResNet50_vd_client/ + |- __model__ + |- __params__ + |- serving_server_conf.prototxt + |- serving_server_conf.stream.prototxt +|- ResNet50_vd_client + |- serving_client_conf.prototxt + |- serving_client_conf.stream.prototxt +``` + +Once you have the deploy model file, you need to change the alias name in serving_server_conf.prototxt: Change 'alias_name' in 'feed_var' to 'image', change 'alias_name' in 'fetch_var' to 'prediction', +The modified serving_server_conf.prototxt file is as follows: +``` +feed_var { + name: "inputs" + alias_name: "image" + is_lod_tensor: false + feed_type: 1 + shape: 3 + shape: 224 + shape: 224 +} +fetch_var { + name: "save_infer_model/scale_0.tmp_1" + alias_name: "prediction" + is_lod_tensor: true + fetch_type: 1 + shape: -1 +} ``` -The recognition model is the same. ## Paddle Serving pipeline deployment -1. Download the PaddleOCR code, if you have already downloaded it, you can skip this step. +1. Download the PaddleClas code, if you have already downloaded it, you can skip this step. ``` - git clone https://github.com/PaddlePaddle/PaddleOCR + git clone https://github.com/PaddlePaddle/PaddleClas # Enter the working directory - cd PaddleOCR/deploy/pdserver/ + cd PaddleClas/deploy/paddleserving/ ``` - The pdserver directory contains the code to start the pipeline service and send prediction requests, including: + The paddleserving directory contains the code to start the pipeline service and send prediction requests, including: ``` __init__.py - config.yml # Start the service configuration file - ocr_reader.py # OCR model pre-processing and post-processing code implementation - pipeline_http_client.py # Script to send pipeline prediction request - web_service.py # Start the script of the pipeline server + config.yml # configuration file of starting the service + pipeline_http_client.py # script to send pipeline prediction request by http + pipeline_rpc_client.py # script to send pipeline prediction request by rpc + resnet50_web_service.py # start the script of the pipeline server ``` 2. Run the following command to start the service. ``` # Start the service and save the running log in log.txt - python3 web_service.py &>log.txt & + python3 resnet50_web_service.py &>log.txt & ``` After the service is successfully started, a log similar to the following will be printed in log.txt ![](./imgs/start_server.png) @@ -156,74 +164,6 @@ The recognition model is the same. The predicted performance data will be automatically written into the `PipelineServingLogs/pipeline.tracer` file. - Tested on 200 real pictures, and limited the detection long side to 960. The average QPS on T4 GPU can reach around 23: - - ``` - - 2021-05-13 03:42:36,895 ==================== TRACER ====================== - 2021-05-13 03:42:36,975 Op(rec): - 2021-05-13 03:42:36,976 in[14.472382882882883 ms] - 2021-05-13 03:42:36,976 prep[9.556855855855856 ms] - 2021-05-13 03:42:36,976 midp[59.921905405405404 ms] - 2021-05-13 03:42:36,976 postp[15.345945945945946 ms] - 2021-05-13 03:42:36,976 out[1.9921216216216215 ms] - 2021-05-13 03:42:36,976 idle[0.16254943864471572] - 2021-05-13 03:42:36,976 Op(det): - 2021-05-13 03:42:36,976 in[315.4468035714286 ms] - 2021-05-13 03:42:36,976 prep[69.5980625 ms] - 2021-05-13 03:42:36,976 midp[18.989535714285715 ms] - 2021-05-13 03:42:36,976 postp[18.857803571428573 ms] - 2021-05-13 03:42:36,977 out[3.1337544642857145 ms] - 2021-05-13 03:42:36,977 idle[0.7477961159203756] - 2021-05-13 03:42:36,977 DAGExecutor: - 2021-05-13 03:42:36,977 Query count[224] - 2021-05-13 03:42:36,977 QPS[22.4 q/s] - 2021-05-13 03:42:36,977 Succ[0.9910714285714286] - 2021-05-13 03:42:36,977 Error req[169, 170] - 2021-05-13 03:42:36,977 Latency: - 2021-05-13 03:42:36,977 ave[535.1678348214285 ms] - 2021-05-13 03:42:36,977 .50[172.651 ms] - 2021-05-13 03:42:36,977 .60[187.904 ms] - 2021-05-13 03:42:36,977 .70[245.675 ms] - 2021-05-13 03:42:36,977 .80[526.684 ms] - 2021-05-13 03:42:36,977 .90[854.596 ms] - 2021-05-13 03:42:36,977 .95[1722.728 ms] - 2021-05-13 03:42:36,977 .99[3990.292 ms] - 2021-05-13 03:42:36,978 Channel (server worker num[10]): - 2021-05-13 03:42:36,978 chl0(In: ['@DAGExecutor'], Out: ['det']) size[0/0] - 2021-05-13 03:42:36,979 chl1(In: ['det'], Out: ['rec']) size[6/0] - 2021-05-13 03:42:36,979 chl2(In: ['rec'], Out: ['@DAGExecutor']) size[0/0] - ``` - -## WINDOWS Users - -Windows does not support Pipeline Serving, if we want to lauch paddle serving on Windows, we should use Web Service, for more infomation please refer to [Paddle Serving for Windows Users](https://github.com/PaddlePaddle/Serving/blob/develop/doc/WINDOWS_TUTORIAL.md) - - -**WINDOWS user can only use version 0.5.0 CPU Mode** - -**Prepare Stage:** - -``` -pip3 install paddle-serving-server==0.5.0 -pip3 install paddle-serving-app==0.3.1 -``` - -1. Start Server - -``` -cd win -python3 ocr_web_server.py gpu(for gpu user) -or -python3 ocr_web_server.py cpu(for cpu user) -``` - -2. Client Send Requests - -``` -python3 ocr_web_client.py -``` - ## FAQ **Q1**: No result return after sending the request. From a2d78994b6870e0979a7a97307c741d18e5d9dbc Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Wed, 8 Sep 2021 10:50:19 +0800 Subject: [PATCH 15/21] Update README.md --- deploy/paddleserving/README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md index e0ae75669..8244b2597 100644 --- a/deploy/paddleserving/README.md +++ b/deploy/paddleserving/README.md @@ -93,7 +93,7 @@ After the ResNet50_vd inference model is converted, there will be additional fol |- serving_client_conf.stream.prototxt ``` -Once you have the deploy model file, you need to change the alias name in serving_server_conf.prototxt: Change 'alias_name' in 'feed_var' to 'image', change 'alias_name' in 'fetch_var' to 'prediction', +Once you have the model file for deployment, you need to change the alias name in `serving_server_conf.prototxt`: Change `alias_name` in `feed_var` to `image`, change `alias_name` in `fetch_var` to `prediction`, The modified serving_server_conf.prototxt file is as follows: ``` feed_var { @@ -149,15 +149,12 @@ fetch_var { After successfully running, the predicted result of the model will be printed in the cmd window. An example of the result is: ![](./imgs/results.png) - Adjust the number of concurrency in config.yml to get the largest QPS. Generally, the number of concurrent detection and recognition is 2:1 + Adjust the number of concurrency in config.yml to get the largest QPS. ``` - det: + op: concurrency: 8 ... - rec: - concurrency: 4 - ... ``` Multiple service requests can be sent at the same time if necessary. From 6b813ec6481ad0a52a67d9b4c645bb7b0ed9a373 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Wed, 8 Sep 2021 10:52:14 +0800 Subject: [PATCH 16/21] Update README_CN.md --- deploy/paddleserving/README_CN.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md index 786a07664..447a043d6 100644 --- a/deploy/paddleserving/README_CN.md +++ b/deploy/paddleserving/README_CN.md @@ -119,9 +119,9 @@ fetch_var { git clone https://github.com/PaddlePaddle/PaddleClas # 进入到工作目录 - cd PaddleOCR/deploy/paddleserving/ + cd PaddleClas/deploy/paddleserving/ ``` - pdserver目录包含启动pipeline服务和发送预测请求的代码,包括: + paddleserving目录包含启动pipeline服务和发送预测请求的代码,包括: ``` __init__.py config.yml # 启动服务的配置文件 From 0149730be5bd5f9fd793c2a9e186d7f2a4252335 Mon Sep 17 00:00:00 2001 From: stephon Date: Thu, 9 Sep 2021 06:53:14 +0000 Subject: [PATCH 17/21] fix some problems in *.md; remove unused import in *.py --- deploy/paddleserving/pipeline_http_client.py | 2 -- deploy/paddleserving/pipeline_rpc_client.py | 5 ---- docs/zh_CN/metric_learning.md | 26 -------------------- 3 files changed, 33 deletions(-) delete mode 100644 docs/zh_CN/metric_learning.md diff --git a/deploy/paddleserving/pipeline_http_client.py b/deploy/paddleserving/pipeline_http_client.py index bc3fab252..49b3ce006 100644 --- a/deploy/paddleserving/pipeline_http_client.py +++ b/deploy/paddleserving/pipeline_http_client.py @@ -1,7 +1,5 @@ -import numpy as np import requests import json -import cv2 import base64 import os diff --git a/deploy/paddleserving/pipeline_rpc_client.py b/deploy/paddleserving/pipeline_rpc_client.py index 62de9ea99..75bcae0dd 100644 --- a/deploy/paddleserving/pipeline_rpc_client.py +++ b/deploy/paddleserving/pipeline_rpc_client.py @@ -15,12 +15,7 @@ try: from paddle_serving_server_gpu.pipeline import PipelineClient except ImportError: from paddle_serving_server.pipeline import PipelineClient -import numpy as np -import requests -import json -import cv2 import base64 -import os client = PipelineClient() client.connect(['127.0.0.1:9993']) diff --git a/docs/zh_CN/metric_learning.md b/docs/zh_CN/metric_learning.md deleted file mode 100644 index 6c94c87f4..000000000 --- a/docs/zh_CN/metric_learning.md +++ /dev/null @@ -1,26 +0,0 @@ -# Metric Learning - -## 简介 - 在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是Metric Learning所要研究的课题。 - - Metric learning全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。 -![example](../images/ml_illustration.jpg) - - -## 应用 - Metric Learning技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等. 随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于Deep Metric Learning(DML). - - 一般来说, DML包含三个部分: 特征提取网络来map embedding, 一个采样策略来将一个mini-batch里的样本组合成很多个sub-set, 最后loss function在每个sub-set上计算loss. 如下图所示: - ![image](../images/ml_pipeline.jpg) - - -## 算法 - Metric Learning主要有如下两种学习范式: -### 1. Classification based: - 这是一类基于分类标签的Metric Learning方法。这类方法通过将每个样本分类到正确的类别中,来学习有效的特征表示,学习过程中需要每个样本的显式标签参与Loss计算。常见的算法有[L2-Softmax](https://arxiv.org/abs/1703.09507), [Large-margin Softmax](https://arxiv.org/abs/1612.02295), [Angular Softmax](https://arxiv.org/pdf/1704.08063.pdf), [NormFace](https://arxiv.org/abs/1704.06369), [AM-Softmax](https://arxiv.org/abs/1801.05599), [CosFace](https://arxiv.org/abs/1801.09414), [ArcFace](https://arxiv.org/abs/1801.07698)等。 - 这类方法也被称作是proxy-based, 因为其本质上优化的是样本和一堆proxies之间的相似度。 -### 2. Pairwise based: - 这是一类基于样本对的学习范式。他以样本对作为输入,通过直接学习样本对之间的相似度来得到有效的特征表示,常见的算法包括:[Contrastive loss](http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf), [Triplet loss](https://arxiv.org/abs/1503.03832), [Lifted-Structure loss](https://arxiv.org/abs/1511.06452), [N-pair loss](https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf), [Multi-Similarity loss](https://arxiv.org/pdf/1904.06627.pdf)等 - -2020年发表的[CircleLoss](https://arxiv.org/abs/2002.10857),从一个全新的视角统一了两种学习范式,让研究人员和从业者对Metric Learning问题有了更进一步的思考。 - From b4b5dafa05635b41f73241b65cbca118970458d9 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Thu, 9 Sep 2021 14:56:16 +0800 Subject: [PATCH 18/21] Update README.md --- deploy/paddleserving/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md index 8244b2597..d9e6a5ac2 100644 --- a/deploy/paddleserving/README.md +++ b/deploy/paddleserving/README.md @@ -8,7 +8,7 @@ PaddleClas provides two service deployment methods: # Service deployment based on PaddleServing -This document will introduce how to use the [PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README.md) to deploy the PPOCR dynamic graph model as a pipeline online service. +This document will introduce how to use the [PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README.md) to deploy the PaddleClas graph model as a pipeline online service. Some Key Features of Paddle Serving: - Integrate with Paddle training pipeline seamlessly, most paddle models can be deployed with one line command. From 6d71e22f17ffead4fa80af8a65de6cf76f5eda49 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Thu, 9 Sep 2021 14:56:39 +0800 Subject: [PATCH 19/21] Update README_CN.md --- deploy/paddleserving/README_CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md index 447a043d6..52016e80a 100644 --- a/deploy/paddleserving/README_CN.md +++ b/deploy/paddleserving/README_CN.md @@ -29,7 +29,7 @@ PaddleClas提供2种服务部署方式: 需要准备PaddleClas的运行环境和PaddleServing的运行环境。 -- 准备PaddleClas的[运行环境](../../docs/zh_CN/tutorials/install.md), 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 +- 准备PaddleClas的[运行环境](../../docs/zh_CN/tutorials/install.md), 根据环境下载对应的paddle whl包,推荐安装2.1.0版本 - 准备PaddleServing的运行环境,步骤如下 From 1c9b4a670b5605c5758e956002c290e27f30bcea Mon Sep 17 00:00:00 2001 From: stephon Date: Thu, 9 Sep 2021 08:44:03 +0000 Subject: [PATCH 20/21] rename resnet50_web_service.py > classification_web_service.py --- deploy/paddleserving/README.md | 4 ++-- deploy/paddleserving/README_CN.md | 6 +++--- ...esnet50_web_service.py => classification_web_service.py} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename deploy/paddleserving/{resnet50_web_service.py => classification_web_service.py} (100%) diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md index 8244b2597..75eb3e35b 100644 --- a/deploy/paddleserving/README.md +++ b/deploy/paddleserving/README.md @@ -8,7 +8,7 @@ PaddleClas provides two service deployment methods: # Service deployment based on PaddleServing -This document will introduce how to use the [PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README.md) to deploy the PPOCR dynamic graph model as a pipeline online service. +This document will introduce how to use the [PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README.md) to deploy the ResNet50_vd model as a pipeline online service. Some Key Features of Paddle Serving: - Integrate with Paddle training pipeline seamlessly, most paddle models can be deployed with one line command. @@ -137,7 +137,7 @@ fetch_var { 2. Run the following command to start the service. ``` # Start the service and save the running log in log.txt - python3 resnet50_web_service.py &>log.txt & + python3 classification_web_service.py &>log.txt & ``` After the service is successfully started, a log similar to the following will be printed in log.txt ![](./imgs/start_server.png) diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md index 447a043d6..3394ae5b5 100644 --- a/deploy/paddleserving/README_CN.md +++ b/deploy/paddleserving/README_CN.md @@ -29,7 +29,7 @@ PaddleClas提供2种服务部署方式: 需要准备PaddleClas的运行环境和PaddleServing的运行环境。 -- 准备PaddleClas的[运行环境](../../docs/zh_CN/tutorials/install.md), 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 +- 准备PaddleClas的[运行环境](../../docs/zh_CN/tutorials/install.md), 根据环境下载对应的paddle whl包,推荐安装2.1.0版本 - 准备PaddleServing的运行环境,步骤如下 @@ -77,7 +77,7 @@ python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ --serving_server ./ResNet50_vd_serving/ \ --serving_client ./ResNet50_vd_client/ ``` -检测模型转换完成后,会在当前文件夹多出`ResNet50_vd_serving` 和`ResNet50_vd_client`的文件夹,具备如下格式: +ResNet50_vd推理模型转换完成后,会在当前文件夹多出`ResNet50_vd_serving` 和`ResNet50_vd_client`的文件夹,具备如下格式: ``` |- ResNet50_vd_client/ |- __model__ @@ -133,7 +133,7 @@ fetch_var { 2. 启动服务可运行如下命令: ``` # 启动服务,运行日志保存在log.txt - python3 resnet50_web_service.py &>log.txt & + python3 classification_web_service.py &>log.txt & ``` 成功启动服务后,log.txt中会打印类似如下日志 ![](./imgs/start_server.png) diff --git a/deploy/paddleserving/resnet50_web_service.py b/deploy/paddleserving/classification_web_service.py similarity index 100% rename from deploy/paddleserving/resnet50_web_service.py rename to deploy/paddleserving/classification_web_service.py From 7f5efeac24d5fea3a60a3325c1f6836a9a517bc1 Mon Sep 17 00:00:00 2001 From: dongshuilong Date: Fri, 10 Sep 2021 11:01:01 +0800 Subject: [PATCH 21/21] fix quick_start_recognition docs --- .../tutorials/quick_start_recognition_en.md | 40 ++++++++------- .../tutorials/quick_start_recognition.md | 50 +++++++++++-------- requirements.txt | 2 +- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/docs/en/tutorials/quick_start_recognition_en.md b/docs/en/tutorials/quick_start_recognition_en.md index cd14d2bb7..4d82cd2af 100644 --- a/docs/en/tutorials/quick_start_recognition_en.md +++ b/docs/en/tutorials/quick_start_recognition_en.md @@ -90,13 +90,13 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/infere cd .. # Download the demo data and unzip it -wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_en_v1.0.tar && tar -xf recognition_demo_data_en_v1.0.tar +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_en_v1.1.tar && tar -xf recognition_demo_data_en_v1.1.tar ``` -Once unpacked, the `recognition_demo_data_v1.0` folder should have the following file structure. +Once unpacked, the `recognition_demo_data_v1.1` folder should have the following file structure. ``` -├── recognition_demo_data_v1.0 +├── recognition_demo_data_v1.1 │ ├── gallery_cartoon │ ├── gallery_logo │ ├── gallery_product @@ -126,13 +126,21 @@ The `models` folder should have the following file structure. ### 2.2 Product Recognition and Retrieval -Take the product recognition demo as an example to show the recognition and retrieval process (if you wish to try other scenarios of recognition and retrieval, replace the corresponding configuration file after downloading and unzipping the corresponding demo data and model to complete the prediction)。 +Take the product recognition demo as an example to show the recognition and retrieval process (if you wish to try other scenarios of recognition and retrieval, replace the corresponding configuration file after downloading and unzipping the corresponding demo data and model to complete the prediction). +**Note:** `faiss` is used as search library. The installation method is as follows: + +``` +pip install faiss-cpu==1.7.1post2 +``` + +If error happens when using `import faiss`, please uninstall `faiss` and reinstall it, especially on `Windows`. + #### 2.2.1 Single Image Recognition -Run the following command to identify and retrieve the image `./recognition_demo_data_v1.0/test_product/daoxiangcunjinzhubing_6.jpg` for recognition and retrieval +Run the following command to identify and retrieve the image `./recognition_demo_data_v1.1/test_product/daoxiangcunjinzhubing_6.jpg` for recognition and retrieval ```shell # use the following command to predict using GPU. @@ -141,8 +149,6 @@ python3.7 python/predict_system.py -c configs/inference_product.yaml python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.use_gpu=False ``` -**Note:** Program lib used to build index is compliled on our machine, if error occured because of the environment, you can refer to [vector search tutorial](../../../deploy/vector_search/README.md) to rebuild the lib. - The image to be retrieved is shown below. @@ -175,7 +181,7 @@ If you want to predict the images in the folder, you can directly modify the `Gl ```shell # using the following command to predict using GPU, you can append `-o Global.use_gpu=False` to predict using CPU. -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/" ``` @@ -195,16 +201,16 @@ The results on the screen are shown as following. All the visualization results are also saved in folder `output`. -Furthermore, the recognition inference model path can be changed by modifying the `Global.rec_inference_model_dir` field, and the path of the index to the index databass can be changed by modifying the `IndexProcess.index_path` field. +Furthermore, the recognition inference model path can be changed by modifying the `Global.rec_inference_model_dir` field, and the path of the index to the index databass can be changed by modifying the `IndexProcess.index_dir` field. ## 3. Recognize Images of Unknown Category -To recognize the image `./recognition_demo_data_v1.0/test_product/anmuxi.jpg`, run the command as follows: +To recognize the image `./recognition_demo_data_v1.1/test_product/anmuxi.jpg`, run the command as follows: ```shell -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/anmuxi.jpg" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/anmuxi.jpg" ``` The image to be retrieved is shown below. @@ -225,14 +231,14 @@ When the index database cannot cover the scenes we actually recognise, i.e. when First, you need to copy the images which are similar with the image to retrieval to the original images for the index database. The command is as follows. ```shell -cp -r ../docs/images/recognition/product_demo/gallery/anmuxi ./recognition_demo_data_v1.0/gallery_product/gallery/ +cp -r ../docs/images/recognition/product_demo/gallery/anmuxi ./recognition_demo_data_/gallery_product/gallery/ ``` Then you need to create a new label file which records the image path and label information. Use the following command to create a new file based on the original one. ```shell # copy the file -cp recognition_demo_data_v1.0/gallery_product/data_file.txt recognition_demo_data_v1.0/gallery_product/data_file_update.txt +cp recognition_demo_data_v1.1/gallery_product/data_file.txt recognition_demo_data_v1.1/gallery_product/data_file_update.txt ``` Then add some new lines into the new label file, which is shown as follows. @@ -255,20 +261,20 @@ Each line can be splited into two fields. The first field denotes the relative i Use the following command to build the index to accelerate the retrieval process after recognition. ```shell -python3.7 python/build_gallery.py -c configs/build_product.yaml -o IndexProcess.data_file="./recognition_demo_data_v1.0/gallery_product/data_file_update.txt" -o IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update" +python3.7 python/build_gallery.py -c configs/build_product.yaml -o IndexProcess.data_file="./recognition_demo_data_v1.1/gallery_product/data_file_update.txt" -o IndexProcess.index_dir="./recognition_demo_data_v1.1/gallery_product/index_update" ``` -Finally, the new index information is stored in the folder`./recognition_demo_data_v1.0/gallery_product/index_update`. Use the new index database for the above index. +Finally, the new index information is stored in the folder`./recognition_demo_data_v1.1/gallery_product/index_update`. Use the new index database for the above index. ### 3.2 Recognize the Unknown Category Images -To recognize the image `./recognition_demo_data_v1.0/test_product/anmuxi.jpg`, run the command as follows. +To recognize the image `./recognition_demo_data_v1.1/test_product/anmuxi.jpg`, run the command as follows. ```shell # using the following command to predict using GPU, you can append `-o Global.use_gpu=False` to predict using CPU. -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/anmuxi.jpg" -o IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/anmuxi.jpg" -o IndexProcess.index_dir="./recognition_demo_data_v1.1/gallery_product/index_update" ``` The output is as follows: diff --git a/docs/zh_CN/tutorials/quick_start_recognition.md b/docs/zh_CN/tutorials/quick_start_recognition.md index 2e2fab831..19b8fed91 100644 --- a/docs/zh_CN/tutorials/quick_start_recognition.md +++ b/docs/zh_CN/tutorials/quick_start_recognition.md @@ -46,8 +46,8 @@ 本章节demo数据下载地址如下: [数据下载链接](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.1.tar)。 - **注意** + 1. windows 环境下如果没有安装wget,可以按照下面的步骤安装wget与tar命令,也可以在,下载模型时将链接复制到浏览器中下载,并解压放置在相应目录下;linux或者macOS用户可以右键点击,然后复制下载链接,即可通过`wget`命令下载。 2. 如果macOS环境下没有安装`wget`命令,可以运行下面的命令进行安装。 @@ -74,8 +74,8 @@ cd .. wget {数据下载链接地址} && tar -xf {压缩包的名称} ``` - + ### 2.1 下载、解压inference 模型与demo数据 以商品识别为例,下载demo数据集以及通用检测、识别模型,命令如下。 @@ -90,13 +90,13 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/infere cd ../ # 下载demo数据并解压 -wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.0.tar && tar -xf recognition_demo_data_v1.0.tar +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.1.tar && tar -xf recognition_demo_data_v1.1.tar ``` -解压完毕后,`recognition_demo_data_v1.0`文件夹下应有如下文件结构: +解压完毕后,`recognition_demo_data_v1.1`文件夹下应有如下文件结构: ``` -├── recognition_demo_data_v1.0 +├── recognition_demo_data_v1.1 │ ├── gallery_cartoon │ ├── gallery_logo │ ├── gallery_product @@ -129,11 +129,19 @@ wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognit 以商品识别demo为例,展示识别与检索过程(如果希望尝试其他方向的识别与检索效果,在下载解压好对应的demo数据与模型之后,替换对应的配置文件即可完成预测)。 +注意,此部分使用了`faiss`作为检索库,安装方法如下: + +```python +pip install faiss-cpu==1.7.1post2 +``` + +若使用时,不能正常引用,则`uninstall` 之后,重新`install`,尤其是windows下。 + #### 2.2.1 识别单张图像 -运行下面的命令,对图像`./recognition_demo_data_v1.0/test_product/daoxiangcunjinzhubing_6.jpg`进行识别与检索 +运行下面的命令,对图像`./recognition_demo_data_v1.1/test_product/daoxiangcunjinzhubing_6.jpg`进行识别与检索 ```shell # 使用下面的命令使用GPU进行预测 @@ -142,8 +150,6 @@ python3.7 python/predict_system.py -c configs/inference_product.yaml python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.use_gpu=False ``` -注意:这里使用了默认编译生成的库文件进行特征索引,如果与您的环境不兼容,导致程序报错,可以参考[向量检索教程](../../../deploy/vector_search/README.md)重新编译库文件。 - 待检索图像如下所示。

@@ -173,7 +179,7 @@ python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.u ```shell # 使用下面的命令使用GPU进行预测,如果希望使用CPU预测,可以在命令后面添加-o Global.use_gpu=False -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/" ``` 终端中会输出该文件夹内所有图像的识别结果,如下所示。 @@ -193,17 +199,17 @@ python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.i 所有图像的识别结果可视化图像也保存在`output`文件夹内。 -更多地,可以通过修改`Global.rec_inference_model_dir`字段来更改识别inference模型的路径,通过修改`IndexProcess.index_path`字段来更改索引库索引的路径。 - +更多地,可以通过修改`Global.rec_inference_model_dir`字段来更改识别inference模型的路径,通过修改`IndexProcess.index_dir`字段来更改索引库索引的路径。 + ## 3. 未知类别的图像识别体验 -对图像`./recognition_demo_data_v1.0/test_product/anmuxi.jpg`进行识别,命令如下 +对图像`./recognition_demo_data_v1.1/test_product/anmuxi.jpg`进行识别,命令如下 ```shell # 使用下面的命令使用GPU进行预测,如果希望使用CPU预测,可以在命令后面添加-o Global.use_gpu=False -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/anmuxi.jpg" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/anmuxi.jpg" ``` 待检索图像如下所示。 @@ -222,20 +228,20 @@ python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.i ### 3.1 准备新的数据与标签 -首先需要将与待检索图像相似的图像列表拷贝到索引库原始图像的文件夹(`./recognition_demo_data_v1.0/gallery_product/gallery`)中,运行下面的命令拷贝相似图像。 +首先需要将与待检索图像相似的图像列表拷贝到索引库原始图像的文件夹(`./recognition_demo_data_v1.1/gallery_product/gallery`)中,运行下面的命令拷贝相似图像。 ```shell -cp -r ../docs/images/recognition/product_demo/gallery/anmuxi ./recognition_demo_data_v1.0/gallery_product/gallery/ +cp -r ../docs/images/recognition/product_demo/gallery/anmuxi ./recognition_demo_data_v1.1/gallery_product/gallery/ ``` -然后需要编辑记录了图像路径和标签信息的文本文件(`./recognition_demo_data_v1.0/gallery_product/data_file_update.txt`),这里基于原始标签文件,新建一个文件。命令如下。 +然后需要编辑记录了图像路径和标签信息的文本文件(`./recognition_demo_data_v1.1/gallery_product/data_file_update.txt`),这里基于原始标签文件,新建一个文件。命令如下。 ```shell # 复制文件 -cp recognition_demo_data_v1.0/gallery_product/data_file.txt recognition_demo_data_v1.0/gallery_product/data_file_update.txt +cp recognition_demo_data_v1.1/gallery_product/data_file.txt recognition_demo_data_v1.1/gallery_product/data_file_update.txt ``` -然后在文件`recognition_demo_data_v1.0/gallery_product/data_file_update.txt`中添加以下的信息, +然后在文件`recognition_demo_data_v1.1/gallery_product/data_file_update.txt`中添加以下的信息, ``` gallery/anmuxi/001.jpg 安慕希酸奶 @@ -255,20 +261,20 @@ gallery/anmuxi/006.jpg 安慕希酸奶 使用下面的命令构建index索引,加速识别后的检索过程。 ```shell -python3.7 python/build_gallery.py -c configs/build_product.yaml -o IndexProcess.data_file="./recognition_demo_data_v1.0/gallery_product/data_file_update.txt" -o IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update" +python3.7 python/build_gallery.py -c configs/build_product.yaml -o IndexProcess.data_file="./recognition_demo_data_v1.1/gallery_product/data_file_update.txt" -o IndexProcess.index_dir="./recognition_demo_data_v1.1/gallery_product/index_update" ``` -最终新的索引信息保存在文件夹`./recognition_demo_data_v1.0/gallery_product/index_update`中。 - +最终新的索引信息保存在文件夹`./recognition_demo_data_v1.1/gallery_product/index_update`中。 + ### 3.3 基于新的索引库的图像识别 使用新的索引库,对上述图像进行识别,运行命令如下。 ```shell # 使用下面的命令使用GPU进行预测,如果希望使用CPU预测,可以在命令后面添加-o Global.use_gpu=False -python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.0/test_product/anmuxi.jpg" -o IndexProcess.index_path="./recognition_demo_data_v1.0/gallery_product/index_update" +python3.7 python/predict_system.py -c configs/inference_product.yaml -o Global.infer_imgs="./recognition_demo_data_v1.1/test_product/anmuxi.jpg" -o IndexProcess.index_dir="./recognition_demo_data_v1.1/gallery_product/index_update" ``` 输出结果如下。 diff --git a/requirements.txt b/requirements.txt index db2e5a08c..0dd675319 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,4 @@ visualdl >= 2.0.0b scipy scikit-learn==0.23.2 gast==0.3.3 -faiss-cpu==1.7.1 +faiss-cpu==1.7.1.post2

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 literal 0 HcmV?d00001 From c539dc334cdf402fb2f92b28df3c8e0976a216a7 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Mon, 6 Sep 2021 15:10:25 +0800 Subject: [PATCH 03/21] Add files via upload --- docs/images/ml_pipeline.jpg | Bin 0 -> 70299 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/ml_pipeline.jpg diff --git a/docs/images/ml_pipeline.jpg b/docs/images/ml_pipeline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cac6508924dcbe964244727c56239eb064c30ba1 GIT binary patch literal 70299 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 literal 0 HcmV?d00001 From b3fe99767f201c0ca12b017812cfca567fa7eb31 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Mon, 6 Sep 2021 15:12:02 +0800 Subject: [PATCH 04/21] Create metric_learning.md --- docs/zh_CN/metric_learning.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/zh_CN/metric_learning.md diff --git a/docs/zh_CN/metric_learning.md b/docs/zh_CN/metric_learning.md new file mode 100644 index 000000000..6c94c87f4 --- /dev/null +++ b/docs/zh_CN/metric_learning.md @@ -0,0 +1,26 @@ +# Metric Learning + +## 简介 + 在机器学习中,我们经常会遇到度量数据间距离的问题。一般来说,对于可度量的数据,我们可以直接通过欧式距离(Euclidean Distance),向量内积(Inner Product)或者是余弦相似度(Cosine Similarity)来进行计算。但对于非结构化数据来说,我们却很难进行这样的操作,如计算一段视频和一首音乐的匹配程度。由于数据格式的不同,我们难以直接进行上述的向量运算,但先验知识告诉我们ED(laugh_video, laugh_music) < ED(laugh_video, blue_music), 如何去有效得表征这种”距离”关系呢? 这就是Metric Learning所要研究的课题。 + + Metric learning全称是 Distance Metric Learning,它是通过机器学习的形式,根据训练数据,自动构造出一种基于特定任务的度量函数。Metric Learning的目标是学习一个变换函数(线性非线性均可)L,将数据点从原始的向量空间映射到一个新的向量空间,在新的向量空间里相似点的距离更近,非相似点的距离更远,使得度量更符合任务的要求,如下图所示。 Deep Metric Learning,就是用深度神经网络来拟合这个变换函数。 +![example](../images/ml_illustration.jpg) + + +## 应用 + Metric Learning技术在生活实际中应用广泛,如我们耳熟能详的人脸识别(Face Recognition)、行人重识别(Person ReID)、图像检索(Image Retrieval)、细粒度分类(Fine-gained classification)等. 随着深度学习在工业实践中越来越广泛的应用,目前大家研究的方向基本都偏向于Deep Metric Learning(DML). + + 一般来说, DML包含三个部分: 特征提取网络来map embedding, 一个采样策略来将一个mini-batch里的样本组合成很多个sub-set, 最后loss function在每个sub-set上计算loss. 如下图所示: + ![image](../images/ml_pipeline.jpg) + + +## 算法 + Metric Learning主要有如下两种学习范式: +### 1. Classification based: + 这是一类基于分类标签的Metric Learning方法。这类方法通过将每个样本分类到正确的类别中,来学习有效的特征表示,学习过程中需要每个样本的显式标签参与Loss计算。常见的算法有[L2-Softmax](https://arxiv.org/abs/1703.09507), [Large-margin Softmax](https://arxiv.org/abs/1612.02295), [Angular Softmax](https://arxiv.org/pdf/1704.08063.pdf), [NormFace](https://arxiv.org/abs/1704.06369), [AM-Softmax](https://arxiv.org/abs/1801.05599), [CosFace](https://arxiv.org/abs/1801.09414), [ArcFace](https://arxiv.org/abs/1801.07698)等。 + 这类方法也被称作是proxy-based, 因为其本质上优化的是样本和一堆proxies之间的相似度。 +### 2. Pairwise based: + 这是一类基于样本对的学习范式。他以样本对作为输入,通过直接学习样本对之间的相似度来得到有效的特征表示,常见的算法包括:[Contrastive loss](http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf), [Triplet loss](https://arxiv.org/abs/1503.03832), [Lifted-Structure loss](https://arxiv.org/abs/1511.06452), [N-pair loss](https://papers.nips.cc/paper/2016/file/6b180037abbebea991d8b1232f8a8ca9-Paper.pdf), [Multi-Similarity loss](https://arxiv.org/pdf/1904.06627.pdf)等 + +2020年发表的[CircleLoss](https://arxiv.org/abs/2002.10857),从一个全新的视角统一了两种学习范式,让研究人员和从业者对Metric Learning问题有了更进一步的思考。 + From 0bdce1d483cb5371215eda52d2b2c55bfec06651 Mon Sep 17 00:00:00 2001 From: dongshuilong Date: Mon, 6 Sep 2021 08:43:07 +0000 Subject: [PATCH 05/21] fix cpp_infer bugs --- deploy/cpp/src/cls.cpp | 8 ++++---- tests/config/cpp_config.txt | 4 ++-- tests/cpp_config.txt | 24 ------------------------ tests/test.sh | 4 +++- 4 files changed, 9 insertions(+), 31 deletions(-) delete mode 100755 tests/cpp_config.txt diff --git a/deploy/cpp/src/cls.cpp b/deploy/cpp/src/cls.cpp index 7a141639d..6ce09e762 100644 --- a/deploy/cpp/src/cls.cpp +++ b/deploy/cpp/src/cls.cpp @@ -57,7 +57,7 @@ double Classifier::Run(cv::Mat &img, std::vector *times) { cv::Mat resize_img; img.copyTo(srcimg); - auto preprocess_start = std::chrono::steady_clock::now(); + auto preprocess_start = std::chrono::system_clock::now(); this->resize_op_.Run(img, resize_img, this->resize_short_size_); this->crop_op_.Run(resize_img, this->crop_size_); @@ -92,9 +92,9 @@ double Classifier::Run(cv::Mat &img, std::vector *times) { max_element(out_data.begin(), out_data.end()) - out_data.begin(); auto postprocess_end = std::chrono::system_clock::now(); - // std::chrono::duration preprocess_diff = preprocess_end - - // preprocess_start; - // times->push_back(double(preprocess_diff.count() * 1000)); + std::chrono::duration preprocess_diff = + preprocess_end - preprocess_start; + times->push_back(double(preprocess_diff.count() * 1000)); std::chrono::duration inference_diff = infer_end - infer_start; double inference_cost_time = double(inference_diff.count() * 1000); times->push_back(inference_cost_time); diff --git a/tests/config/cpp_config.txt b/tests/config/cpp_config.txt index 046a5c08e..2f1286447 100755 --- a/tests/config/cpp_config.txt +++ b/tests/config/cpp_config.txt @@ -10,8 +10,8 @@ gpu_mem 2000 # use_fp16 0 # cls config -cls_model_path inference/inference.pdmodel -cls_params_path inference/inference.pdiparams +cls_model_path ../inference/inference.pdmodel +cls_params_path ../inference/inference.pdiparams resize_short_size 256 crop_size 224 diff --git a/tests/cpp_config.txt b/tests/cpp_config.txt deleted file mode 100755 index 5331cce0a..000000000 --- a/tests/cpp_config.txt +++ /dev/null @@ -1,24 +0,0 @@ -# model load config -gpu_id 0 -gpu_mem 2000 - -# whole chain test will add following config -# use_gpu 0 -# cpu_threads 10 -# use_mkldnn 1 -# use_tensorrt 0 -# use_fp16 0 - -# cls config -cls_model_path inference/inference.pdmodel -cls_params_path inference/inference.pdiparams -resize_short_size 256 -crop_size 224 - -# for log env info -benchmark 1 -eval "$cpp_use_gpu_key $use_gpu" -eval "$cpp_use_gpu_key" "$use_gpu" -${cpp_use_gpu_key} ${use_gpu} -1 2 -1 2 diff --git a/tests/test.sh b/tests/test.sh index 25b854f06..9c0d8236c 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -182,6 +182,7 @@ function func_cpp_inference(){ echo "${cpp_cpu_threads_key} ${threads}" >> cpp_config.txt echo "${cpp_use_mkldnn_key} ${use_mkldnn}" >> cpp_config.txt echo "${cpp_use_tensorrt_key} 0" >> cpp_config.txt + echo "${cpp_use_fp16_key} 0" >> cpp_config.txt command="${_script} cpp_config.txt ${_img_dir} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]} @@ -203,7 +204,8 @@ function func_cpp_inference(){ echo "${cpp_use_gpu_key} ${use_gpu}" >> cpp_config.txt echo "${cpp_cpu_threads_key} ${threads}" >> cpp_config.txt echo "${cpp_use_mkldnn_key} ${use_mkldnn}" >> cpp_config.txt - echo "${cpp_use_tensorrt_key} ${precision}" >> cpp_config.txt + echo "${cpp_use_tensorrt_key} ${use_trt}" >> cpp_config.txt + echo "${cpp_use_fp16_key} ${precision}" >> cpp_config.txt command="${_script} cpp_config.txt ${_img_dir} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]} From 3243fd8baa336c0ab1a2bafd151c078465eb7e3e Mon Sep 17 00:00:00 2001 From: stephon Date: Fri, 3 Sep 2021 07:13:51 +0000 Subject: [PATCH 06/21] rm origin file; and add resnet5_vd paddleserving examples --- deploy/paddleserving/README.md | 19 + deploy/paddleserving/README_CN.md | 147 +++ deploy/paddleserving/__init__.py | 0 deploy/paddleserving/config.yml | 33 + deploy/paddleserving/cpu_utilization.py | 4 + deploy/paddleserving/daisy.jpg | Bin 0 -> 39696 bytes deploy/paddleserving/image_http_client.py | 46 - deploy/paddleserving/image_service_cpu.py | 60 -- deploy/paddleserving/image_service_gpu.py | 62 -- deploy/paddleserving/imagenet.label | 1000 ++++++++++++++++++ deploy/paddleserving/pipeline_http_client.py | 19 + deploy/paddleserving/pipeline_rpc_client.py | 38 + deploy/paddleserving/resnet50_web_service.py | 73 ++ deploy/paddleserving/utils.py | 84 -- 14 files changed, 1333 insertions(+), 252 deletions(-) create mode 100644 deploy/paddleserving/README.md create mode 100644 deploy/paddleserving/README_CN.md create mode 100644 deploy/paddleserving/__init__.py create mode 100644 deploy/paddleserving/config.yml create mode 100644 deploy/paddleserving/cpu_utilization.py create mode 100644 deploy/paddleserving/daisy.jpg delete mode 100644 deploy/paddleserving/image_http_client.py delete mode 100644 deploy/paddleserving/image_service_cpu.py delete mode 100644 deploy/paddleserving/image_service_gpu.py create mode 100644 deploy/paddleserving/imagenet.label create mode 100644 deploy/paddleserving/pipeline_http_client.py create mode 100644 deploy/paddleserving/pipeline_rpc_client.py create mode 100644 deploy/paddleserving/resnet50_web_service.py delete mode 100644 deploy/paddleserving/utils.py diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md new file mode 100644 index 000000000..d0fa99e6d --- /dev/null +++ b/deploy/paddleserving/README.md @@ -0,0 +1,19 @@ +# Imagenet Pipeline WebService + +This document will takes Imagenet service as an example to introduce how to use Pipeline WebService. + +## Get model +``` +sh get_model.sh +``` + +## Start server + +``` +python resnet50_web_service.py &>log.txt & +``` + +## RPC test +``` +python pipeline_rpc_client.py +``` diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md new file mode 100644 index 000000000..5e2b0104a --- /dev/null +++ b/deploy/paddleserving/README_CN.md @@ -0,0 +1,147 @@ +# PaddleClas 服务化部署 + +([English](./README.md)|简体中文) + +PaddleClas提供2种服务部署方式: +- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../../deploy/hubserving/readme.md); +- 基于PaddleServing的部署:代码路径为"`./deploy/paddleserving`",按照本教程使用。 + +# 基于PaddleServing的服务部署 + +本文档以经典的ResNet50_vd模型为例,介绍如何使用[PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README_CN.md)工具部署PaddleClas +动态图模型的pipeline在线服务。 + +相比较于hubserving部署,PaddleServing具备以下优点: +- 支持客户端和服务端之间高并发和高效通信 +- 支持 工业级的服务能力 例如模型管理,在线加载,在线A/B测试等 +- 支持 多种编程语言 开发客户端,例如C++, Python和Java + +更多有关PaddleServing服务化部署框架介绍和使用教程参考[文档](https://github.com/PaddlePaddle/Serving/blob/develop/README_CN.md)。 + +## 目录 +- [环境准备](#环境准备) +- [模型转换](#模型转换) +- [Paddle Serving pipeline部署](#部署) +- [FAQ](#FAQ) + + +## 环境准备 + +需要准备PaddleClas的运行环境和Paddle Serving的运行环境。 + +- 准备PaddleOCR的运行环境[链接](../../doc/doc_ch/installation.md) + 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 + +- 准备PaddleServing的运行环境,步骤如下 + +1. 安装serving,用于启动服务 + ``` + pip3 install paddle-serving-server==0.6.1 # for CPU + pip3 install paddle-serving-server-gpu==0.6.1 # for GPU + # 其他GPU环境需要确认环境再选择执行如下命令 + pip3 install paddle-serving-server-gpu==0.6.1.post101 # GPU with CUDA10.1 + TensorRT6 + pip3 install paddle-serving-server-gpu==0.6.1.post11 # GPU with CUDA11 + TensorRT7 + ``` + +2. 安装client,用于向服务发送请求 + 在[下载链接](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md)中找到对应python版本的client安装包,这里推荐python3.7版本: + + ``` + wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.0.0-cp37-none-any.whl + pip3 install paddle_serving_client-0.0.0-cp37-none-any.whl + ``` + +3. 安装serving-app + ``` + pip3 install paddle-serving-app==0.6.1 + ``` + **Note:** 如果要安装最新版本的PaddleServing参考[链接](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md)。 + + +## 模型转换 + +使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。 + +首先,下载ResNet50_vd的[inference模型](https://github.com/PaddlePaddle/PaddleOCR#pp-ocr-20-series-model-listupdate-on-dec-15) +``` +# 下载并解压ResNet50_vd模型 +wget "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_vd_infer.tar" && tar xf ResNet50_vd_infer.tar +``` + +接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。 + +``` +# 转换ResNet50_vd模型 +python3 -m paddle_serving_client.convert --dirname ./inference/ \ + --model_filename inference.pdmodel \ \ + --params_filename inference.pdiparams \ \ + --serving_server ./ResNet50_vd_serving/ \ + --serving_client ./ResNet50_vd_client/ +``` +检测模型转换完成后,会在当前文件夹多出`ResNet50_vd_serving` 和`ResNet50_vd_client`的文件夹,具备如下格式: +``` +|- ResNet50_vd_client/ + |- __model__ + |- __params__ + |- serving_server_conf.prototxt + |- serving_server_conf.stream.prototxt + +|- ResNet50_vd_client + |- serving_client_conf.prototxt + |- serving_client_conf.stream.prototxt + +``` + + +## Paddle Serving pipeline部署 + +1. 下载PaddleClas代码,若已下载可跳过此步骤 + ``` + git clone https://github.com/PaddlePaddle/PaddleClas + + # 进入到工作目录 + cd PaddleOCR/deploy/paddleserving/ + ``` + pdserver目录包含启动pipeline服务和发送预测请求的代码,包括: + ``` + __init__.py + config.yml # 启动服务的配置文件 + pipeline_http_client.py # http方式发送pipeline预测请求的脚本 + pipeline_rpc_client.py # rpc方式发送pipeline预测请求的脚本 + resnet50_web_service.py # 启动pipeline服务端的脚本 + ``` + +2. 启动服务可运行如下命令: + ``` + # 启动服务,运行日志保存在log.txt + python3 resnet50_web_service.py &>log.txt & + ``` + 成功启动服务后,log.txt中会打印类似如下日志 + ![](./imgs/start_server.png) + +3. 发送服务请求: + ``` + python3 pipeline_http_client.py + ``` + 成功运行后,模型预测的结果会打印在cmd窗口中,结果示例为: + ![](./imgs/results.png) + + 调整 config.yml 中的并发个数获得最大的QPS, 一般检测和识别的并发数为2:1 + ``` + op: + #并发数,is_thread_op=True时,为线程并发;否则为进程并发 + concurrency: 8 + ... + 有需要的话可以同时发送多个服务请求 + + 预测性能数据会被自动写入 `PipelineServingLogs/pipeline.tracer` 文件中。 + + +## FAQ +**Q1**: 发送请求后没有结果返回或者提示输出解码报错 + +**A1**: 启动服务和发送请求时不要设置代理,可以在启动服务前和发送请求前关闭代理,关闭代理的命令是: +``` +unset https_proxy +unset http_proxy +``` diff --git a/deploy/paddleserving/__init__.py b/deploy/paddleserving/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/deploy/paddleserving/config.yml b/deploy/paddleserving/config.yml new file mode 100644 index 000000000..104504f41 --- /dev/null +++ b/deploy/paddleserving/config.yml @@ -0,0 +1,33 @@ +#worker_num, 最大并发数。当build_dag_each_worker=True时, 框架会创建worker_num个进程,每个进程内构建grpcSever和DAG +##当build_dag_each_worker=False时,框架会设置主线程grpc线程池的max_workers=worker_num +worker_num: 1 + +#http端口, rpc_port和http_port不允许同时为空。当rpc_port可用且http_port为空时,不自动生成http_port +http_port: 18080 +rpc_port: 9993 + +dag: + #op资源类型, True, 为线程模型;False,为进程模型 + is_thread_op: False +op: + imagenet: + #并发数,is_thread_op=True时,为线程并发;否则为进程并发 + concurrency: 1 + + #当op配置没有server_endpoints时,从local_service_conf读取本地服务配置 + local_service_conf: + + #uci模型路径 + model_config: ResNet50_vd/ppcls_model/ + + #计算硬件类型: 空缺时由devices决定(CPU/GPU),0=cpu, 1=gpu, 2=tensorRT, 3=arm cpu, 4=kunlun xpu + device_type: 1 + + #计算硬件ID,当devices为""或不写时为CPU预测;当devices为"0", "0,1,2"时为GPU预测,表示使用的GPU卡 + devices: "0" # "0,1" + + #client类型,包括brpc, grpc和local_predictor.local_predictor不启动Serving服务,进程内预测 + client_type: local_predictor + + #Fetch结果列表,以client_config中fetch_var的alias_name为准 + fetch_list: ["prediction"] diff --git a/deploy/paddleserving/cpu_utilization.py b/deploy/paddleserving/cpu_utilization.py new file mode 100644 index 000000000..984c72370 --- /dev/null +++ b/deploy/paddleserving/cpu_utilization.py @@ -0,0 +1,4 @@ +import psutil +cpu_utilization=psutil.cpu_percent(1,False) +print('CPU_UTILIZATION:', cpu_utilization) + diff --git a/deploy/paddleserving/daisy.jpg b/deploy/paddleserving/daisy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7edeca63e5f32e68550ef720d81f59df58a8eabc GIT binary patch literal 39696 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 W##>Ru&v$Q>Ac6~0A8IH*&;Qw&gu-k9 literal 0 HcmV?d00001 diff --git a/deploy/paddleserving/image_http_client.py b/deploy/paddleserving/image_http_client.py deleted file mode 100644 index 4e33c4a7e..000000000 --- a/deploy/paddleserving/image_http_client.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import requests -import base64 -import json -import sys -import numpy as np - -py_version = sys.version_info[0] - - -def predict(image_path, server): - - with open(image_path, "rb") as f: - image = base64.b64encode(f.read()).decode("utf-8") - req = json.dumps({"feed": [{"image": image}], "fetch": ["prediction"]}) - r = requests.post( - server, data=req, headers={"Content-Type": "application/json"}) - try: - pred = r.json()["result"]["prediction"][0] - cls_id = np.argmax(pred) - score = pred[cls_id] - pred = {"cls_id": cls_id, "score": score} - return pred - except ValueError: - print(r.text) - return r - - -if __name__ == "__main__": - server = "http://127.0.0.1:{}/image/prediction".format(sys.argv[1]) - image_file = sys.argv[2] - res = predict(image_file, server) - print("res:", res) diff --git a/deploy/paddleserving/image_service_cpu.py b/deploy/paddleserving/image_service_cpu.py deleted file mode 100644 index 92f67d322..000000000 --- a/deploy/paddleserving/image_service_cpu.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import base64 -from paddle_serving_server.web_service import WebService -import utils - - -class ImageService(WebService): - def __init__(self, name): - super(ImageService, self).__init__(name=name) - self.operators = self.create_operators() - - def create_operators(self): - size = 224 - img_mean = [0.485, 0.456, 0.406] - img_std = [0.229, 0.224, 0.225] - img_scale = 1.0 / 255.0 - decode_op = utils.DecodeImage() - resize_op = utils.ResizeImage(resize_short=256) - crop_op = utils.CropImage(size=(size, size)) - normalize_op = utils.NormalizeImage( - scale=img_scale, mean=img_mean, std=img_std) - totensor_op = utils.ToTensor() - return [decode_op, resize_op, crop_op, normalize_op, totensor_op] - - def _process_image(self, data, ops): - for op in ops: - data = op(data) - return data - - def preprocess(self, feed={}, fetch=[]): - feed_batch = [] - for ins in feed: - if "image" not in ins: - raise ("feed data error!") - sample = base64.b64decode(ins["image"]) - img = self._process_image(sample, self.operators) - feed_batch.append({"image": img}) - return feed_batch, fetch - - -image_service = ImageService(name="image") -image_service.load_model_config(sys.argv[1]) -image_service.prepare_server( - workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu") -image_service.run_server() -image_service.run_flask() diff --git a/deploy/paddleserving/image_service_gpu.py b/deploy/paddleserving/image_service_gpu.py deleted file mode 100644 index df61cdd60..000000000 --- a/deploy/paddleserving/image_service_gpu.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import base64 -from paddle_serving_server_gpu.web_service import WebService - -import utils - - -class ImageService(WebService): - def __init__(self, name): - super(ImageService, self).__init__(name=name) - self.operators = self.create_operators() - - def create_operators(self): - size = 224 - img_mean = [0.485, 0.456, 0.406] - img_std = [0.229, 0.224, 0.225] - img_scale = 1.0 / 255.0 - decode_op = utils.DecodeImage() - resize_op = utils.ResizeImage(resize_short=256) - crop_op = utils.CropImage(size=(size, size)) - normalize_op = utils.NormalizeImage( - scale=img_scale, mean=img_mean, std=img_std) - totensor_op = utils.ToTensor() - return [decode_op, resize_op, crop_op, normalize_op, totensor_op] - - def _process_image(self, data, ops): - for op in ops: - data = op(data) - return data - - def preprocess(self, feed={}, fetch=[]): - feed_batch = [] - for ins in feed: - if "image" not in ins: - raise ("feed data error!") - sample = base64.b64decode(ins["image"]) - img = self._process_image(sample, self.operators) - feed_batch.append({"image": img}) - return feed_batch, fetch - - -image_service = ImageService(name="image") -image_service.load_model_config(sys.argv[1]) -image_service.set_gpus("0") -image_service.prepare_server( - workdir=sys.argv[2], port=int(sys.argv[3]), device="gpu") -image_service.run_server() -image_service.run_flask() diff --git a/deploy/paddleserving/imagenet.label b/deploy/paddleserving/imagenet.label new file mode 100644 index 000000000..d71467351 --- /dev/null +++ b/deploy/paddleserving/imagenet.label @@ -0,0 +1,1000 @@ +tench, Tinca tinca, +goldfish, Carassius auratus, +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias, +tiger shark, Galeocerdo cuvieri, +hammerhead, hammerhead shark, +electric ray, crampfish, numbfish, torpedo, +stingray, +cock, +hen, +ostrich, Struthio camelus, +brambling, Fringilla montifringilla, +goldfinch, Carduelis carduelis, +house finch, linnet, Carpodacus mexicanus, +junco, snowbird, +indigo bunting, indigo finch, indigo bird, Passerina cyanea, +robin, American robin, Turdus migratorius, +bulbul, +jay, +magpie, +chickadee, +water ouzel, dipper, +kite, +bald eagle, American eagle, Haliaeetus leucocephalus, +vulture, +great grey owl, great gray owl, Strix nebulosa, +European fire salamander, Salamandra salamandra, +common newt, Triturus vulgaris, +eft, +spotted salamander, Ambystoma maculatum, +axolotl, mud puppy, Ambystoma mexicanum, +bullfrog, Rana catesbeiana, +tree frog, tree-frog, +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui, +loggerhead, loggerhead turtle, Caretta caretta, +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea, +mud turtle, +terrapin, +box turtle, box tortoise, +banded gecko, +common iguana, iguana, Iguana iguana, +American chameleon, anole, Anolis carolinensis, +whiptail, whiptail lizard, +agama, +frilled lizard, Chlamydosaurus kingi, +alligator lizard, +Gila monster, Heloderma suspectum, +green lizard, Lacerta viridis, +African chameleon, Chamaeleo chamaeleon, +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis, +African crocodile, Nile crocodile, Crocodylus niloticus, +American alligator, Alligator mississipiensis, +triceratops, +thunder snake, worm snake, Carphophis amoenus, +ringneck snake, ring-necked snake, ring snake, +hognose snake, puff adder, sand viper, +green snake, grass snake, +king snake, kingsnake, +garter snake, grass snake, +water snake, +vine snake, +night snake, Hypsiglena torquata, +boa constrictor, Constrictor constrictor, +rock python, rock snake, Python sebae, +Indian cobra, Naja naja, +green mamba, +sea snake, +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus, +diamondback, diamondback rattlesnake, Crotalus adamanteus, +sidewinder, horned rattlesnake, Crotalus cerastes, +trilobite, +harvestman, daddy longlegs, Phalangium opilio, +scorpion, +black and gold garden spider, Argiope aurantia, +barn spider, Araneus cavaticus, +garden spider, Aranea diademata, +black widow, Latrodectus mactans, +tarantula, +wolf spider, hunting spider, +tick, +centipede, +black grouse, +ptarmigan, +ruffed grouse, partridge, Bonasa umbellus, +prairie chicken, prairie grouse, prairie fowl, +peacock, +quail, +partridge, +African grey, African gray, Psittacus erithacus, +macaw, +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita, +lorikeet, +coucal, +bee eater, +hornbill, +hummingbird, +jacamar, +toucan, +drake, +red-breasted merganser, Mergus serrator, +goose, +black swan, Cygnus atratus, +tusker, +echidna, spiny anteater, anteater, +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus, +wallaby, brush kangaroo, +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus, +wombat, +jellyfish, +sea anemone, anemone, +brain coral, +flatworm, platyhelminth, +nematode, nematode worm, roundworm, +conch, +snail, +slug, +sea slug, nudibranch, +chiton, coat-of-mail shell, sea cradle, polyplacophore, +chambered nautilus, pearly nautilus, nautilus, +Dungeness crab, Cancer magister, +rock crab, Cancer irroratus, +fiddler crab, +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica, +American lobster, Northern lobster, Maine lobster, Homarus americanus, +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish, +crayfish, crawfish, crawdad, crawdaddy, +hermit crab, +isopod, +white stork, Ciconia ciconia, +black stork, Ciconia nigra, +spoonbill, +flamingo, +little blue heron, Egretta caerulea, +American egret, great white heron, Egretta albus, +bittern, +crane, +limpkin, Aramus pictus, +European gallinule, Porphyrio porphyrio, +American coot, marsh hen, mud hen, water hen, Fulica americana, +bustard, +ruddy turnstone, Arenaria interpres, +red-backed sandpiper, dunlin, Erolia alpina, +redshank, Tringa totanus, +dowitcher, +oystercatcher, oyster catcher, +pelican, +king penguin, Aptenodytes patagonica, +albatross, mollymawk, +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus, +killer whale, killer, orca, grampus, sea wolf, Orcinus orca, +dugong, Dugong dugon, +sea lion, +Chihuahua, +Japanese spaniel, +Maltese dog, Maltese terrier, Maltese, +Pekinese, Pekingese, Peke, +Shih-Tzu, +Blenheim spaniel, +papillon, +toy terrier, +Rhodesian ridgeback, +Afghan hound, Afghan, +basset, basset hound, +beagle, +bloodhound, sleuthhound, +bluetick, +black-and-tan coonhound, +Walker hound, Walker foxhound, +English foxhound, +redbone, +borzoi, Russian wolfhound, +Irish wolfhound, +Italian greyhound, +whippet, +Ibizan hound, Ibizan Podenco, +Norwegian elkhound, elkhound, +otterhound, otter hound, +Saluki, gazelle hound, +Scottish deerhound, deerhound, +Weimaraner, +Staffordshire bullterrier, Staffordshire bull terrier, +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier, +Bedlington terrier, +Border terrier, +Kerry blue terrier, +Irish terrier, +Norfolk terrier, +Norwich terrier, +Yorkshire terrier, +wire-haired fox terrier, +Lakeland terrier, +Sealyham terrier, Sealyham, +Airedale, Airedale terrier, +cairn, cairn terrier, +Australian terrier, +Dandie Dinmont, Dandie Dinmont terrier, +Boston bull, Boston terrier, +miniature schnauzer, +giant schnauzer, +standard schnauzer, +Scotch terrier, Scottish terrier, Scottie, +Tibetan terrier, chrysanthemum dog, +silky terrier, Sydney silky, +soft-coated wheaten terrier, +West Highland white terrier, +Lhasa, Lhasa apso, +flat-coated retriever, +curly-coated retriever, +golden retriever, +Labrador retriever, +Chesapeake Bay retriever, +German short-haired pointer, +vizsla, Hungarian pointer, +English setter, +Irish setter, red setter, +Gordon setter, +Brittany spaniel, +clumber, clumber spaniel, +English springer, English springer spaniel, +Welsh springer spaniel, +cocker spaniel, English cocker spaniel, cocker, +Sussex spaniel, +Irish water spaniel, +kuvasz, +schipperke, +groenendael, +malinois, +briard, +kelpie, +komondor, +Old English sheepdog, bobtail, +Shetland sheepdog, Shetland sheep dog, Shetland, +collie, +Border collie, +Bouvier des Flandres, Bouviers des Flandres, +Rottweiler, +German shepherd, German shepherd dog, German police dog, alsatian, +Doberman, Doberman pinscher, +miniature pinscher, +Greater Swiss Mountain dog, +Bernese mountain dog, +Appenzeller, +EntleBucher, +boxer, +bull mastiff, +Tibetan mastiff, +French bulldog, +Great Dane, +Saint Bernard, St Bernard, +Eskimo dog, husky, +malamute, malemute, Alaskan malamute, +Siberian husky, +dalmatian, coach dog, carriage dog, +affenpinscher, monkey pinscher, monkey dog, +basenji, +pug, pug-dog, +Leonberg, +Newfoundland, Newfoundland dog, +Great Pyrenees, +Samoyed, Samoyede, +Pomeranian, +chow, chow chow, +keeshond, +Brabancon griffon, +Pembroke, Pembroke Welsh corgi, +Cardigan, Cardigan Welsh corgi, +toy poodle, +miniature poodle, +standard poodle, +Mexican hairless, +timber wolf, grey wolf, gray wolf, Canis lupus, +white wolf, Arctic wolf, Canis lupus tundrarum, +red wolf, maned wolf, Canis rufus, Canis niger, +coyote, prairie wolf, brush wolf, Canis latrans, +dingo, warrigal, warragal, Canis dingo, +dhole, Cuon alpinus, +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus, +hyena, hyaena, +red fox, Vulpes vulpes, +kit fox, Vulpes macrotis, +Arctic fox, white fox, Alopex lagopus, +grey fox, gray fox, Urocyon cinereoargenteus, +tabby, tabby cat, +tiger cat, +Persian cat, +Siamese cat, Siamese, +Egyptian cat, +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor, +lynx, catamount, +leopard, Panthera pardus, +snow leopard, ounce, Panthera uncia, +jaguar, panther, Panthera onca, Felis onca, +lion, king of beasts, Panthera leo, +tiger, Panthera tigris, +cheetah, chetah, Acinonyx jubatus, +brown bear, bruin, Ursus arctos, +American black bear, black bear, Ursus americanus, Euarctos americanus, +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus, +sloth bear, Melursus ursinus, Ursus ursinus, +mongoose, +meerkat, mierkat, +tiger beetle, +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle, +ground beetle, carabid beetle, +long-horned beetle, longicorn, longicorn beetle, +leaf beetle, chrysomelid, +dung beetle, +rhinoceros beetle, +weevil, +fly, +bee, +ant, emmet, pismire, +grasshopper, hopper, +cricket, +walking stick, walkingstick, stick insect, +cockroach, roach, +mantis, mantid, +cicada, cicala, +leafhopper, +lacewing, lacewing fly, +"dragonfly, darning needle, devils darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", +damselfly, +admiral, +ringlet, ringlet butterfly, +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus, +cabbage butterfly, +sulphur butterfly, sulfur butterfly, +lycaenid, lycaenid butterfly, +starfish, sea star, +sea urchin, +sea cucumber, holothurian, +wood rabbit, cottontail, cottontail rabbit, +hare, +Angora, Angora rabbit, +hamster, +porcupine, hedgehog, +fox squirrel, eastern fox squirrel, Sciurus niger, +marmot, +beaver, +guinea pig, Cavia cobaya, +sorrel, +zebra, +hog, pig, grunter, squealer, Sus scrofa, +wild boar, boar, Sus scrofa, +warthog, +hippopotamus, hippo, river horse, Hippopotamus amphibius, +ox, +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis, +bison, +ram, tup, +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis, +ibex, Capra ibex, +hartebeest, +impala, Aepyceros melampus, +gazelle, +Arabian camel, dromedary, Camelus dromedarius, +llama, +weasel, +mink, +polecat, fitch, foulmart, foumart, Mustela putorius, +black-footed ferret, ferret, Mustela nigripes, +otter, +skunk, polecat, wood pussy, +badger, +armadillo, +three-toed sloth, ai, Bradypus tridactylus, +orangutan, orang, orangutang, Pongo pygmaeus, +gorilla, Gorilla gorilla, +chimpanzee, chimp, Pan troglodytes, +gibbon, Hylobates lar, +siamang, Hylobates syndactylus, Symphalangus syndactylus, +guenon, guenon monkey, +patas, hussar monkey, Erythrocebus patas, +baboon, +macaque, +langur, +colobus, colobus monkey, +proboscis monkey, Nasalis larvatus, +marmoset, +capuchin, ringtail, Cebus capucinus, +howler monkey, howler, +titi, titi monkey, +spider monkey, Ateles geoffroyi, +squirrel monkey, Saimiri sciureus, +Madagascar cat, ring-tailed lemur, Lemur catta, +indri, indris, Indri indri, Indri brevicaudatus, +Indian elephant, Elephas maximus, +African elephant, Loxodonta africana, +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens, +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca, +barracouta, snoek, +eel, +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch, +rock beauty, Holocanthus tricolor, +anemone fish, +sturgeon, +gar, garfish, garpike, billfish, Lepisosteus osseus, +lionfish, +puffer, pufferfish, blowfish, globefish, +abacus, +abaya, +"academic gown, academic robe, judges robe", +accordion, piano accordion, squeeze box, +acoustic guitar, +aircraft carrier, carrier, flattop, attack aircraft carrier, +airliner, +airship, dirigible, +altar, +ambulance, +amphibian, amphibious vehicle, +analog clock, +apiary, bee house, +apron, +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin, +assault rifle, assault gun, +backpack, back pack, knapsack, packsack, rucksack, haversack, +bakery, bakeshop, bakehouse, +balance beam, beam, +balloon, +ballpoint, ballpoint pen, ballpen, Biro, +Band Aid, +banjo, +bannister, banister, balustrade, balusters, handrail, +barbell, +barber chair, +barbershop, +barn, +barometer, +barrel, cask, +barrow, garden cart, lawn cart, wheelbarrow, +baseball, +basketball, +bassinet, +bassoon, +bathing cap, swimming cap, +bath towel, +bathtub, bathing tub, bath, tub, +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon, +beacon, lighthouse, beacon light, pharos, +beaker, +bearskin, busby, shako, +beer bottle, +beer glass, +bell cote, bell cot, +bib, +bicycle-built-for-two, tandem bicycle, tandem, +bikini, two-piece, +binder, ring-binder, +binoculars, field glasses, opera glasses, +birdhouse, +boathouse, +bobsled, bobsleigh, bob, +bolo tie, bolo, bola tie, bola, +bonnet, poke bonnet, +bookcase, +bookshop, bookstore, bookstall, +bottlecap, +bow, +bow tie, bow-tie, bowtie, +brass, memorial tablet, plaque, +brassiere, bra, bandeau, +breakwater, groin, groyne, mole, bulwark, seawall, jetty, +breastplate, aegis, egis, +broom, +bucket, pail, +buckle, +bulletproof vest, +bullet train, bullet, +butcher shop, meat market, +cab, hack, taxi, taxicab, +caldron, cauldron, +candle, taper, wax light, +cannon, +canoe, +can opener, tin opener, +cardigan, +car mirror, +carousel, carrousel, merry-go-round, roundabout, whirligig, +"carpenters kit, tool kit", +carton, +car wheel, +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM, +cassette, +cassette player, +castle, +catamaran, +CD player, +cello, violoncello, +cellular telephone, cellular phone, cellphone, cell, mobile phone, +chain, +chainlink fence, +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour, +chain saw, chainsaw, +chest, +chiffonier, commode, +chime, bell, gong, +china cabinet, china closet, +Christmas stocking, +church, church building, +cinema, movie theater, movie theatre, movie house, picture palace, +cleaver, meat cleaver, chopper, +cliff dwelling, +cloak, +clog, geta, patten, sabot, +cocktail shaker, +coffee mug, +coffeepot, +coil, spiral, volute, whorl, helix, +combination lock, +computer keyboard, keypad, +confectionery, confectionary, candy store, +container ship, containership, container vessel, +convertible, +corkscrew, bottle screw, +cornet, horn, trumpet, trump, +cowboy boot, +cowboy hat, ten-gallon hat, +cradle, +crane, +crash helmet, +crate, +crib, cot, +Crock Pot, +croquet ball, +crutch, +cuirass, +dam, dike, dyke, +desk, +desktop computer, +dial telephone, dial phone, +diaper, nappy, napkin, +digital clock, +digital watch, +dining table, board, +dishrag, dishcloth, +dishwasher, dish washer, dishwashing machine, +disk brake, disc brake, +dock, dockage, docking facility, +dogsled, dog sled, dog sleigh, +dome, +doormat, welcome mat, +drilling platform, offshore rig, +drum, membranophone, tympan, +drumstick, +dumbbell, +Dutch oven, +electric fan, blower, +electric guitar, +electric locomotive, +entertainment center, +envelope, +espresso maker, +face powder, +feather boa, boa, +file, file cabinet, filing cabinet, +fireboat, +fire engine, fire truck, +fire screen, fireguard, +flagpole, flagstaff, +flute, transverse flute, +folding chair, +football helmet, +forklift, +fountain, +fountain pen, +four-poster, +freight car, +French horn, horn, +frying pan, frypan, skillet, +fur coat, +garbage truck, dustcart, +gasmask, respirator, gas helmet, +gas pump, gasoline pump, petrol pump, island dispenser, +goblet, +go-kart, +golf ball, +golfcart, golf cart, +gondola, +gong, tam-tam, +gown, +grand piano, grand, +greenhouse, nursery, glasshouse, +grille, radiator grille, +grocery store, grocery, food market, market, +guillotine, +hair slide, +hair spray, +half track, +hammer, +hamper, +hand blower, blow dryer, blow drier, hair dryer, hair drier, +hand-held computer, hand-held microcomputer, +handkerchief, hankie, hanky, hankey, +hard disc, hard disk, fixed disk, +harmonica, mouth organ, harp, mouth harp, +harp, +harvester, reaper, +hatchet, +holster, +home theater, home theatre, +honeycomb, +hook, claw, +hoopskirt, crinoline, +horizontal bar, high bar, +horse cart, horse-cart, +hourglass, +iPod, +iron, smoothing iron, +"jack-o-lantern", +jean, blue jean, denim, +jeep, landrover, +jersey, T-shirt, tee shirt, +jigsaw puzzle, +jinrikisha, ricksha, rickshaw, +joystick, +kimono, +knee pad, +knot, +lab coat, laboratory coat, +ladle, +lampshade, lamp shade, +laptop, laptop computer, +lawn mower, mower, +lens cap, lens cover, +letter opener, paper knife, paperknife, +library, +lifeboat, +lighter, light, igniter, ignitor, +limousine, limo, +liner, ocean liner, +lipstick, lip rouge, +Loafer, +lotion, +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system, +"loupe, jewelers loupe", +lumbermill, sawmill, +magnetic compass, +mailbag, postbag, +mailbox, letter box, +maillot, +maillot, tank suit, +manhole cover, +maraca, +marimba, xylophone, +mask, +matchstick, +maypole, +maze, labyrinth, +measuring cup, +medicine chest, medicine cabinet, +megalith, megalithic structure, +microphone, mike, +microwave, microwave oven, +military uniform, +milk can, +minibus, +miniskirt, mini, +minivan, +missile, +mitten, +mixing bowl, +mobile home, manufactured home, +Model T, +modem, +monastery, +monitor, +moped, +mortar, +mortarboard, +mosque, +mosquito net, +motor scooter, scooter, +mountain bike, all-terrain bike, off-roader, +mountain tent, +mouse, computer mouse, +mousetrap, +moving van, +muzzle, +nail, +neck brace, +necklace, +nipple, +notebook, notebook computer, +obelisk, +oboe, hautboy, hautbois, +ocarina, sweet potato, +odometer, hodometer, mileometer, milometer, +oil filter, +organ, pipe organ, +oscilloscope, scope, cathode-ray oscilloscope, CRO, +overskirt, +oxcart, +oxygen mask, +packet, +paddle, boat paddle, +paddlewheel, paddle wheel, +padlock, +paintbrush, +"pajama, pyjama, pjs, jammies", +palace, +panpipe, pandean pipe, syrinx, +paper towel, +parachute, chute, +parallel bars, bars, +park bench, +parking meter, +passenger car, coach, carriage, +patio, terrace, +pay-phone, pay-station, +pedestal, plinth, footstall, +pencil box, pencil case, +pencil sharpener, +perfume, essence, +Petri dish, +photocopier, +pick, plectrum, plectron, +pickelhaube, +picket fence, paling, +pickup, pickup truck, +pier, +piggy bank, penny bank, +pill bottle, +pillow, +ping-pong ball, +pinwheel, +pirate, pirate ship, +pitcher, ewer, +"plane, carpenters plane, woodworking plane", +planetarium, +plastic bag, +plate rack, +plow, plough, +"plunger, plumbers helper", +Polaroid camera, Polaroid Land camera, +pole, +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria, +poncho, +pool table, billiard table, snooker table, +pop bottle, soda bottle, +pot, flowerpot, +"potters wheel", +power drill, +prayer rug, prayer mat, +printer, +prison, prison house, +projectile, missile, +projector, +puck, hockey puck, +punching bag, punch bag, punching ball, punchball, +purse, +quill, quill pen, +quilt, comforter, comfort, puff, +racer, race car, racing car, +racket, racquet, +radiator, +radio, wireless, +radio telescope, radio reflector, +rain barrel, +recreational vehicle, RV, R.V., +reel, +reflex camera, +refrigerator, icebox, +remote control, remote, +restaurant, eating house, eating place, eatery, +revolver, six-gun, six-shooter, +rifle, +rocking chair, rocker, +rotisserie, +rubber eraser, rubber, pencil eraser, +rugby ball, +rule, ruler, +running shoe, +safe, +safety pin, +saltshaker, salt shaker, +sandal, +sarong, +sax, saxophone, +scabbard, +scale, weighing machine, +school bus, +schooner, +scoreboard, +screen, CRT screen, +screw, +screwdriver, +seat belt, seatbelt, +sewing machine, +shield, buckler, +shoe shop, shoe-shop, shoe store, +shoji, +shopping basket, +shopping cart, +shovel, +shower cap, +shower curtain, +ski, +ski mask, +sleeping bag, +slide rule, slipstick, +sliding door, +slot, one-armed bandit, +snorkel, +snowmobile, +snowplow, snowplough, +soap dispenser, +soccer ball, +sock, +solar dish, solar collector, solar furnace, +sombrero, +soup bowl, +space bar, +space heater, +space shuttle, +spatula, +speedboat, +"spider web, spiders web", +spindle, +sports car, sport car, +spotlight, spot, +stage, +steam locomotive, +steel arch bridge, +steel drum, +stethoscope, +stole, +stone wall, +stopwatch, stop watch, +stove, +strainer, +streetcar, tram, tramcar, trolley, trolley car, +stretcher, +studio couch, day bed, +stupa, tope, +submarine, pigboat, sub, U-boat, +suit, suit of clothes, +sundial, +sunglass, +sunglasses, dark glasses, shades, +sunscreen, sunblock, sun blocker, +suspension bridge, +swab, swob, mop, +sweatshirt, +swimming trunks, bathing trunks, +swing, +switch, electric switch, electrical switch, +syringe, +table lamp, +tank, army tank, armored combat vehicle, armoured combat vehicle, +tape player, +teapot, +teddy, teddy bear, +television, television system, +tennis ball, +thatch, thatched roof, +theater curtain, theatre curtain, +thimble, +thresher, thrasher, threshing machine, +throne, +tile roof, +toaster, +tobacco shop, tobacconist shop, tobacconist, +toilet seat, +torch, +totem pole, +tow truck, tow car, wrecker, +toyshop, +tractor, +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi, +tray, +trench coat, +tricycle, trike, velocipede, +trimaran, +tripod, +triumphal arch, +trolleybus, trolley coach, trackless trolley, +trombone, +tub, vat, +turnstile, +typewriter keyboard, +umbrella, +unicycle, monocycle, +upright, upright piano, +vacuum, vacuum cleaner, +vase, +vault, +velvet, +vending machine, +vestment, +viaduct, +violin, fiddle, +volleyball, +waffle iron, +wall clock, +wallet, billfold, notecase, pocketbook, +wardrobe, closet, press, +warplane, military plane, +washbasin, handbasin, washbowl, lavabo, wash-hand basin, +washer, automatic washer, washing machine, +water bottle, +water jug, +water tower, +whiskey jug, +whistle, +wig, +window screen, +window shade, +Windsor tie, +wine bottle, +wing, +wok, +wooden spoon, +wool, woolen, woollen, +worm fence, snake fence, snake-rail fence, Virginia fence, +wreck, +yawl, +yurt, +web site, website, internet site, site, +comic book, +crossword puzzle, crossword, +street sign, +traffic light, traffic signal, stoplight, +book jacket, dust cover, dust jacket, dust wrapper, +menu, +plate, +guacamole, +consomme, +hot pot, hotpot, +trifle, +ice cream, icecream, +ice lolly, lolly, lollipop, popsicle, +French loaf, +bagel, beigel, +pretzel, +cheeseburger, +hotdog, hot dog, red hot, +mashed potato, +head cabbage, +broccoli, +cauliflower, +zucchini, courgette, +spaghetti squash, +acorn squash, +butternut squash, +cucumber, cuke, +artichoke, globe artichoke, +bell pepper, +cardoon, +mushroom, +Granny Smith, +strawberry, +orange, +lemon, +fig, +pineapple, ananas, +banana, +jackfruit, jak, jack, +custard apple, +pomegranate, +hay, +carbonara, +chocolate sauce, chocolate syrup, +dough, +meat loaf, meatloaf, +pizza, pizza pie, +potpie, +burrito, +red wine, +espresso, +cup, +eggnog, +alp, +bubble, +cliff, drop, drop-off, +coral reef, +geyser, +lakeside, lakeshore, +promontory, headland, head, foreland, +sandbar, sand bar, +seashore, coast, seacoast, sea-coast, +valley, vale, +volcano, +ballplayer, baseball player, +groom, bridegroom, +scuba diver, +rapeseed, +daisy, +"yellow ladys slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", +corn, +acorn, +hip, rose hip, rosehip, +buckeye, horse chestnut, conker, +coral fungus, +agaric, +gyromitra, +stinkhorn, carrion fungus, +earthstar, +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa, +bolete, +ear, spike, capitulum, +toilet tissue, toilet paper, bathroom tissue diff --git a/deploy/paddleserving/pipeline_http_client.py b/deploy/paddleserving/pipeline_http_client.py new file mode 100644 index 000000000..bc3fab252 --- /dev/null +++ b/deploy/paddleserving/pipeline_http_client.py @@ -0,0 +1,19 @@ +import numpy as np +import requests +import json +import cv2 +import base64 +import os + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + +if __name__ == "__main__": + url = "http://127.0.0.1:18080/imagenet/prediction" + with open(os.path.join(".", "daisy.jpg"), 'rb') as file: + image_data1 = file.read() + image = cv2_to_base64(image_data1) + data = {"key": ["image"], "value": [image]} + for i in range(100): + r = requests.post(url=url, data=json.dumps(data)) + print(r.json()) diff --git a/deploy/paddleserving/pipeline_rpc_client.py b/deploy/paddleserving/pipeline_rpc_client.py new file mode 100644 index 000000000..62de9ea99 --- /dev/null +++ b/deploy/paddleserving/pipeline_rpc_client.py @@ -0,0 +1,38 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +try: + from paddle_serving_server_gpu.pipeline import PipelineClient +except ImportError: + from paddle_serving_server.pipeline import PipelineClient +import numpy as np +import requests +import json +import cv2 +import base64 +import os + +client = PipelineClient() +client.connect(['127.0.0.1:9993']) + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + +if __name__ == "__main__": + with open("daisy.jpg", 'rb') as file: + image_data = file.read() + image = cv2_to_base64(image_data) + + for i in range(1): + ret = client.predict(feed_dict={"image": image}, fetch=["label", "prob"]) + print(ret) diff --git a/deploy/paddleserving/resnet50_web_service.py b/deploy/paddleserving/resnet50_web_service.py new file mode 100644 index 000000000..6c353eb10 --- /dev/null +++ b/deploy/paddleserving/resnet50_web_service.py @@ -0,0 +1,73 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import sys +from paddle_serving_app.reader import Sequential, URL2Image, Resize, CenterCrop, RGB2BGR, Transpose, Div, Normalize, Base64ToImage +try: + from paddle_serving_server_gpu.web_service import WebService, Op +except ImportError: + from paddle_serving_server.web_service import WebService, Op +import logging +import numpy as np +import base64, cv2 + +class ImagenetOp(Op): + def init_op(self): + self.seq = Sequential([ + Resize(256), CenterCrop(224), RGB2BGR(), Transpose((2, 0, 1)), + Div(255), Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], + True) + ]) + self.label_dict = {} + label_idx = 0 + with open("imagenet.label") as fin: + for line in fin: + self.label_dict[label_idx] = line.strip() + label_idx += 1 + + def preprocess(self, input_dicts, data_id, log_id): + (_, input_dict), = input_dicts.items() + batch_size = len(input_dict.keys()) + imgs = [] + for key in input_dict.keys(): + data = base64.b64decode(input_dict[key].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img = self.seq(im) + imgs.append(img[np.newaxis, :].copy()) + input_imgs = np.concatenate(imgs, axis=0) + return {"image": input_imgs}, False, None, "" + + def postprocess(self, input_dicts, fetch_dict, log_id): + score_list = fetch_dict["prediction"] + result = {"label": [], "prob": []} + for score in score_list: + score = score.tolist() + max_score = max(score) + result["label"].append(self.label_dict[score.index(max_score)] + .strip().replace(",", "")) + result["prob"].append(max_score) + result["label"] = str(result["label"]) + result["prob"] = str(result["prob"]) + return result, None, "" + + +class ImageService(WebService): + def get_pipeline_response(self, read_op): + image_op = ImagenetOp(name="imagenet", input_ops=[read_op]) + return image_op + + +uci_service = ImageService(name="imagenet") +uci_service.prepare_pipeline_config("config.yml") +uci_service.run_service() diff --git a/deploy/paddleserving/utils.py b/deploy/paddleserving/utils.py deleted file mode 100644 index 6c4a75e1a..000000000 --- a/deploy/paddleserving/utils.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import cv2 -import numpy as np - - -class DecodeImage(object): - def __init__(self, to_rgb=True): - self.to_rgb = to_rgb - - def __call__(self, img): - data = np.frombuffer(img, dtype='uint8') - img = cv2.imdecode(data, 1) - if self.to_rgb: - assert img.shape[2] == 3, 'invalid shape of image[%s]' % ( - img.shape) - img = img[:, :, ::-1] - - return img - - -class ResizeImage(object): - def __init__(self, resize_short=None): - self.resize_short = resize_short - - def __call__(self, img): - img_h, img_w = img.shape[:2] - percent = float(self.resize_short) / min(img_w, img_h) - w = int(round(img_w * percent)) - h = int(round(img_h * percent)) - return cv2.resize(img, (w, h)) - - -class CropImage(object): - def __init__(self, size): - if type(size) is int: - self.size = (size, size) - else: - self.size = size - - def __call__(self, img): - w, h = self.size - img_h, img_w = img.shape[:2] - w_start = (img_w - w) // 2 - h_start = (img_h - h) // 2 - - w_end = w_start + w - h_end = h_start + h - return img[h_start:h_end, w_start:w_end, :] - - -class NormalizeImage(object): - def __init__(self, scale=None, mean=None, std=None): - self.scale = np.float32(scale if scale is not None else 1.0 / 255.0) - mean = mean if mean is not None else [0.485, 0.456, 0.406] - std = std if std is not None else [0.229, 0.224, 0.225] - - shape = (1, 1, 3) - self.mean = np.array(mean).reshape(shape).astype('float32') - self.std = np.array(std).reshape(shape).astype('float32') - - def __call__(self, img): - return (img.astype('float32') * self.scale - self.mean) / self.std - - -class ToTensor(object): - def __init__(self): - pass - - def __call__(self, img): - img = img.transpose((2, 0, 1)) - return img From 17c292f733871ade9372a95ceebf161106e471b7 Mon Sep 17 00:00:00 2001 From: gaotingquan Date: Thu, 2 Sep 2021 04:58:10 +0000 Subject: [PATCH 07/21] fix: do not need explicitly call postprocess --- deploy/hubserving/clas/module.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deploy/hubserving/clas/module.py b/deploy/hubserving/clas/module.py index dd8bf5df6..98ec1d901 100644 --- a/deploy/hubserving/clas/module.py +++ b/deploy/hubserving/clas/module.py @@ -76,8 +76,7 @@ class ClasSystem(nn.Layer): starttime = time.time() outputs = self.cls_predictor.predict(inputs) elapse = time.time() - starttime - preds = self.cls_predictor.postprocess(outputs) - return {"prediction": preds, "elapse": elapse} + return {"prediction": outputs, "elapse": elapse} @serving def serving_method(self, images, revert_params): From 9d164ba8fc3f7bc23de6fc8d5f31e6dea7e30053 Mon Sep 17 00:00:00 2001 From: stephon Date: Fri, 3 Sep 2021 07:13:51 +0000 Subject: [PATCH 08/21] rm origin file; and add resnet5_vd paddleserving examples --- deploy/paddleserving/README.md | 19 + deploy/paddleserving/README_CN.md | 168 +++ deploy/paddleserving/__init__.py | 0 deploy/paddleserving/config.yml | 33 + deploy/paddleserving/cpu_utilization.py | 4 + deploy/paddleserving/daisy.jpg | Bin 0 -> 39696 bytes deploy/paddleserving/image_http_client.py | 46 - deploy/paddleserving/image_service_cpu.py | 60 -- deploy/paddleserving/image_service_gpu.py | 62 -- deploy/paddleserving/imagenet.label | 1000 ++++++++++++++++++ deploy/paddleserving/pipeline_http_client.py | 19 + deploy/paddleserving/pipeline_rpc_client.py | 38 + deploy/paddleserving/resnet50_web_service.py | 73 ++ deploy/paddleserving/utils.py | 84 -- 14 files changed, 1354 insertions(+), 252 deletions(-) create mode 100644 deploy/paddleserving/README.md create mode 100644 deploy/paddleserving/README_CN.md create mode 100644 deploy/paddleserving/__init__.py create mode 100644 deploy/paddleserving/config.yml create mode 100644 deploy/paddleserving/cpu_utilization.py create mode 100644 deploy/paddleserving/daisy.jpg delete mode 100644 deploy/paddleserving/image_http_client.py delete mode 100644 deploy/paddleserving/image_service_cpu.py delete mode 100644 deploy/paddleserving/image_service_gpu.py create mode 100644 deploy/paddleserving/imagenet.label create mode 100644 deploy/paddleserving/pipeline_http_client.py create mode 100644 deploy/paddleserving/pipeline_rpc_client.py create mode 100644 deploy/paddleserving/resnet50_web_service.py delete mode 100644 deploy/paddleserving/utils.py diff --git a/deploy/paddleserving/README.md b/deploy/paddleserving/README.md new file mode 100644 index 000000000..d0fa99e6d --- /dev/null +++ b/deploy/paddleserving/README.md @@ -0,0 +1,19 @@ +# Imagenet Pipeline WebService + +This document will takes Imagenet service as an example to introduce how to use Pipeline WebService. + +## Get model +``` +sh get_model.sh +``` + +## Start server + +``` +python resnet50_web_service.py &>log.txt & +``` + +## RPC test +``` +python pipeline_rpc_client.py +``` diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md new file mode 100644 index 000000000..be50514ca --- /dev/null +++ b/deploy/paddleserving/README_CN.md @@ -0,0 +1,168 @@ +# PaddleClas 服务化部署 + +([English](./README.md)|简体中文) + +PaddleClas提供2种服务部署方式: +- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../../deploy/hubserving/readme.md); +- 基于PaddleServing的部署:代码路径为"`./deploy/paddleserving`",按照本教程使用。 + +# 基于PaddleServing的服务部署 + +本文档以经典的ResNet50_vd模型为例,介绍如何使用[PaddleServing](https://github.com/PaddlePaddle/Serving/blob/develop/README_CN.md)工具部署PaddleClas +动态图模型的pipeline在线服务。 + +相比较于hubserving部署,PaddleServing具备以下优点: +- 支持客户端和服务端之间高并发和高效通信 +- 支持 工业级的服务能力 例如模型管理,在线加载,在线A/B测试等 +- 支持 多种编程语言 开发客户端,例如C++, Python和Java + +更多有关PaddleServing服务化部署框架介绍和使用教程参考[文档](https://github.com/PaddlePaddle/Serving/blob/develop/README_CN.md)。 + +## 目录 +- [环境准备](#环境准备) +- [模型转换](#模型转换) +- [Paddle Serving pipeline部署](#部署) +- [FAQ](#FAQ) + + +## 环境准备 + +需要准备PaddleClas的运行环境和PaddleServing的运行环境。 + +- 准备PaddleClas的运行环境[链接](../../doc/doc_ch/installation.md) + 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 + +- 准备PaddleServing的运行环境,步骤如下 + +1. 安装serving,用于启动服务 + ``` + pip3 install paddle-serving-server==0.6.1 # for CPU + pip3 install paddle-serving-server-gpu==0.6.1 # for GPU + # 其他GPU环境需要确认环境再选择执行如下命令 + pip3 install paddle-serving-server-gpu==0.6.1.post101 # GPU with CUDA10.1 + TensorRT6 + pip3 install paddle-serving-server-gpu==0.6.1.post11 # GPU with CUDA11 + TensorRT7 + ``` + +2. 安装client,用于向服务发送请求 + 在[下载链接](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md)中找到对应python版本的client安装包,这里推荐python3.7版本: + + ``` + wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.0.0-cp37-none-any.whl + pip3 install paddle_serving_client-0.0.0-cp37-none-any.whl + ``` + +3. 安装serving-app + ``` + pip3 install paddle-serving-app==0.6.1 + ``` + **Note:** 如果要安装最新版本的PaddleServing参考[链接](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md)。 + + +## 模型转换 + +使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。 + +首先,下载ResNet50_vd的inference模型 +``` +# 下载并解压ResNet50_vd模型 +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_vd_infer.tar && tar xf ResNet50_vd_infer.tar +``` + +接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。 + +``` +# 转换ResNet50_vd模型 +python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ + --model_filename inference.pdmodel \ + --params_filename inference.pdiparams \ + --serving_server ./ResNet50_vd_serving/ \ + --serving_client ./ResNet50_vd_client/ +``` +检测模型转换完成后,会在当前文件夹多出`ResNet50_vd_serving` 和`ResNet50_vd_client`的文件夹,具备如下格式: +``` +|- ResNet50_vd_client/ + |- __model__ + |- __params__ + |- serving_server_conf.prototxt + |- serving_server_conf.stream.prototxt + +|- ResNet50_vd_client + |- serving_client_conf.prototxt + |- serving_client_conf.stream.prototxt + +``` +得到模型文件之后,需要修改serving_server_conf.prototxt中的alias名字: 将`feed_var`中的`alias_name`改为`image`, 将`fetch_var`中的`alias_name`改为`prediction`, +修改后的serving_server_conf.prototxt内容如下: +``` +feed_var { + name: "inputs" + alias_name: "image" + is_lod_tensor: false + feed_type: 1 + shape: 3 + shape: 224 + shape: 224 +} +fetch_var { + name: "save_infer_model/scale_0.tmp_1" + alias_name: "prediction" + is_lod_tensor: true + fetch_type: 1 + shape: -1 +} +``` + + +## Paddle Serving pipeline部署 + +1. 下载PaddleClas代码,若已下载可跳过此步骤 + ``` + git clone https://github.com/PaddlePaddle/PaddleClas + + # 进入到工作目录 + cd PaddleOCR/deploy/paddleserving/ + ``` + pdserver目录包含启动pipeline服务和发送预测请求的代码,包括: + ``` + __init__.py + config.yml # 启动服务的配置文件 + pipeline_http_client.py # http方式发送pipeline预测请求的脚本 + pipeline_rpc_client.py # rpc方式发送pipeline预测请求的脚本 + resnet50_web_service.py # 启动pipeline服务端的脚本 + ``` + +2. 启动服务可运行如下命令: + ``` + # 启动服务,运行日志保存在log.txt + python3 resnet50_web_service.py &>log.txt & + ``` + 成功启动服务后,log.txt中会打印类似如下日志 + ![](./imgs/start_server.png) + +3. 发送服务请求: + ``` + python3 pipeline_http_client.py + ``` + 成功运行后,模型预测的结果会打印在cmd窗口中,结果示例为: + ![](./imgs/results.png) + + 调整 config.yml 中的并发个数可以获得最大的QPS + ``` + op: + #并发数,is_thread_op=True时,为线程并发;否则为进程并发 + concurrency: 8 + ... + ``` + 有需要的话可以同时发送多个服务请求 + + 预测性能数据会被自动写入 `PipelineServingLogs/pipeline.tracer` 文件中。 + + +## FAQ +**Q1**: 发送请求后没有结果返回或者提示输出解码报错 + +**A1**: 启动服务和发送请求时不要设置代理,可以在启动服务前和发送请求前关闭代理,关闭代理的命令是: +``` +unset https_proxy +unset http_proxy +``` diff --git a/deploy/paddleserving/__init__.py b/deploy/paddleserving/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/deploy/paddleserving/config.yml b/deploy/paddleserving/config.yml new file mode 100644 index 000000000..d9f464dd0 --- /dev/null +++ b/deploy/paddleserving/config.yml @@ -0,0 +1,33 @@ +#worker_num, 最大并发数。当build_dag_each_worker=True时, 框架会创建worker_num个进程,每个进程内构建grpcSever和DAG +##当build_dag_each_worker=False时,框架会设置主线程grpc线程池的max_workers=worker_num +worker_num: 1 + +#http端口, rpc_port和http_port不允许同时为空。当rpc_port可用且http_port为空时,不自动生成http_port +http_port: 18080 +rpc_port: 9993 + +dag: + #op资源类型, True, 为线程模型;False,为进程模型 + is_thread_op: False +op: + imagenet: + #并发数,is_thread_op=True时,为线程并发;否则为进程并发 + concurrency: 1 + + #当op配置没有server_endpoints时,从local_service_conf读取本地服务配置 + local_service_conf: + + #uci模型路径 + model_config: ResNet50_vd_serving + + #计算硬件类型: 空缺时由devices决定(CPU/GPU),0=cpu, 1=gpu, 2=tensorRT, 3=arm cpu, 4=kunlun xpu + device_type: 1 + + #计算硬件ID,当devices为""或不写时为CPU预测;当devices为"0", "0,1,2"时为GPU预测,表示使用的GPU卡 + devices: "0" # "0,1" + + #client类型,包括brpc, grpc和local_predictor.local_predictor不启动Serving服务,进程内预测 + client_type: local_predictor + + #Fetch结果列表,以client_config中fetch_var的alias_name为准 + fetch_list: ["prediction"] diff --git a/deploy/paddleserving/cpu_utilization.py b/deploy/paddleserving/cpu_utilization.py new file mode 100644 index 000000000..984c72370 --- /dev/null +++ b/deploy/paddleserving/cpu_utilization.py @@ -0,0 +1,4 @@ +import psutil +cpu_utilization=psutil.cpu_percent(1,False) +print('CPU_UTILIZATION:', cpu_utilization) + diff --git a/deploy/paddleserving/daisy.jpg b/deploy/paddleserving/daisy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7edeca63e5f32e68550ef720d81f59df58a8eabc GIT binary patch literal 39696 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 W##>Ru&v$Q>Ac6~0A8IH*&;Qw&gu-k9 literal 0 HcmV?d00001 diff --git a/deploy/paddleserving/image_http_client.py b/deploy/paddleserving/image_http_client.py deleted file mode 100644 index 4e33c4a7e..000000000 --- a/deploy/paddleserving/image_http_client.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import requests -import base64 -import json -import sys -import numpy as np - -py_version = sys.version_info[0] - - -def predict(image_path, server): - - with open(image_path, "rb") as f: - image = base64.b64encode(f.read()).decode("utf-8") - req = json.dumps({"feed": [{"image": image}], "fetch": ["prediction"]}) - r = requests.post( - server, data=req, headers={"Content-Type": "application/json"}) - try: - pred = r.json()["result"]["prediction"][0] - cls_id = np.argmax(pred) - score = pred[cls_id] - pred = {"cls_id": cls_id, "score": score} - return pred - except ValueError: - print(r.text) - return r - - -if __name__ == "__main__": - server = "http://127.0.0.1:{}/image/prediction".format(sys.argv[1]) - image_file = sys.argv[2] - res = predict(image_file, server) - print("res:", res) diff --git a/deploy/paddleserving/image_service_cpu.py b/deploy/paddleserving/image_service_cpu.py deleted file mode 100644 index 92f67d322..000000000 --- a/deploy/paddleserving/image_service_cpu.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import base64 -from paddle_serving_server.web_service import WebService -import utils - - -class ImageService(WebService): - def __init__(self, name): - super(ImageService, self).__init__(name=name) - self.operators = self.create_operators() - - def create_operators(self): - size = 224 - img_mean = [0.485, 0.456, 0.406] - img_std = [0.229, 0.224, 0.225] - img_scale = 1.0 / 255.0 - decode_op = utils.DecodeImage() - resize_op = utils.ResizeImage(resize_short=256) - crop_op = utils.CropImage(size=(size, size)) - normalize_op = utils.NormalizeImage( - scale=img_scale, mean=img_mean, std=img_std) - totensor_op = utils.ToTensor() - return [decode_op, resize_op, crop_op, normalize_op, totensor_op] - - def _process_image(self, data, ops): - for op in ops: - data = op(data) - return data - - def preprocess(self, feed={}, fetch=[]): - feed_batch = [] - for ins in feed: - if "image" not in ins: - raise ("feed data error!") - sample = base64.b64decode(ins["image"]) - img = self._process_image(sample, self.operators) - feed_batch.append({"image": img}) - return feed_batch, fetch - - -image_service = ImageService(name="image") -image_service.load_model_config(sys.argv[1]) -image_service.prepare_server( - workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu") -image_service.run_server() -image_service.run_flask() diff --git a/deploy/paddleserving/image_service_gpu.py b/deploy/paddleserving/image_service_gpu.py deleted file mode 100644 index df61cdd60..000000000 --- a/deploy/paddleserving/image_service_gpu.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import base64 -from paddle_serving_server_gpu.web_service import WebService - -import utils - - -class ImageService(WebService): - def __init__(self, name): - super(ImageService, self).__init__(name=name) - self.operators = self.create_operators() - - def create_operators(self): - size = 224 - img_mean = [0.485, 0.456, 0.406] - img_std = [0.229, 0.224, 0.225] - img_scale = 1.0 / 255.0 - decode_op = utils.DecodeImage() - resize_op = utils.ResizeImage(resize_short=256) - crop_op = utils.CropImage(size=(size, size)) - normalize_op = utils.NormalizeImage( - scale=img_scale, mean=img_mean, std=img_std) - totensor_op = utils.ToTensor() - return [decode_op, resize_op, crop_op, normalize_op, totensor_op] - - def _process_image(self, data, ops): - for op in ops: - data = op(data) - return data - - def preprocess(self, feed={}, fetch=[]): - feed_batch = [] - for ins in feed: - if "image" not in ins: - raise ("feed data error!") - sample = base64.b64decode(ins["image"]) - img = self._process_image(sample, self.operators) - feed_batch.append({"image": img}) - return feed_batch, fetch - - -image_service = ImageService(name="image") -image_service.load_model_config(sys.argv[1]) -image_service.set_gpus("0") -image_service.prepare_server( - workdir=sys.argv[2], port=int(sys.argv[3]), device="gpu") -image_service.run_server() -image_service.run_flask() diff --git a/deploy/paddleserving/imagenet.label b/deploy/paddleserving/imagenet.label new file mode 100644 index 000000000..d71467351 --- /dev/null +++ b/deploy/paddleserving/imagenet.label @@ -0,0 +1,1000 @@ +tench, Tinca tinca, +goldfish, Carassius auratus, +great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias, +tiger shark, Galeocerdo cuvieri, +hammerhead, hammerhead shark, +electric ray, crampfish, numbfish, torpedo, +stingray, +cock, +hen, +ostrich, Struthio camelus, +brambling, Fringilla montifringilla, +goldfinch, Carduelis carduelis, +house finch, linnet, Carpodacus mexicanus, +junco, snowbird, +indigo bunting, indigo finch, indigo bird, Passerina cyanea, +robin, American robin, Turdus migratorius, +bulbul, +jay, +magpie, +chickadee, +water ouzel, dipper, +kite, +bald eagle, American eagle, Haliaeetus leucocephalus, +vulture, +great grey owl, great gray owl, Strix nebulosa, +European fire salamander, Salamandra salamandra, +common newt, Triturus vulgaris, +eft, +spotted salamander, Ambystoma maculatum, +axolotl, mud puppy, Ambystoma mexicanum, +bullfrog, Rana catesbeiana, +tree frog, tree-frog, +tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui, +loggerhead, loggerhead turtle, Caretta caretta, +leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea, +mud turtle, +terrapin, +box turtle, box tortoise, +banded gecko, +common iguana, iguana, Iguana iguana, +American chameleon, anole, Anolis carolinensis, +whiptail, whiptail lizard, +agama, +frilled lizard, Chlamydosaurus kingi, +alligator lizard, +Gila monster, Heloderma suspectum, +green lizard, Lacerta viridis, +African chameleon, Chamaeleo chamaeleon, +Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis, +African crocodile, Nile crocodile, Crocodylus niloticus, +American alligator, Alligator mississipiensis, +triceratops, +thunder snake, worm snake, Carphophis amoenus, +ringneck snake, ring-necked snake, ring snake, +hognose snake, puff adder, sand viper, +green snake, grass snake, +king snake, kingsnake, +garter snake, grass snake, +water snake, +vine snake, +night snake, Hypsiglena torquata, +boa constrictor, Constrictor constrictor, +rock python, rock snake, Python sebae, +Indian cobra, Naja naja, +green mamba, +sea snake, +horned viper, cerastes, sand viper, horned asp, Cerastes cornutus, +diamondback, diamondback rattlesnake, Crotalus adamanteus, +sidewinder, horned rattlesnake, Crotalus cerastes, +trilobite, +harvestman, daddy longlegs, Phalangium opilio, +scorpion, +black and gold garden spider, Argiope aurantia, +barn spider, Araneus cavaticus, +garden spider, Aranea diademata, +black widow, Latrodectus mactans, +tarantula, +wolf spider, hunting spider, +tick, +centipede, +black grouse, +ptarmigan, +ruffed grouse, partridge, Bonasa umbellus, +prairie chicken, prairie grouse, prairie fowl, +peacock, +quail, +partridge, +African grey, African gray, Psittacus erithacus, +macaw, +sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita, +lorikeet, +coucal, +bee eater, +hornbill, +hummingbird, +jacamar, +toucan, +drake, +red-breasted merganser, Mergus serrator, +goose, +black swan, Cygnus atratus, +tusker, +echidna, spiny anteater, anteater, +platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus, +wallaby, brush kangaroo, +koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus, +wombat, +jellyfish, +sea anemone, anemone, +brain coral, +flatworm, platyhelminth, +nematode, nematode worm, roundworm, +conch, +snail, +slug, +sea slug, nudibranch, +chiton, coat-of-mail shell, sea cradle, polyplacophore, +chambered nautilus, pearly nautilus, nautilus, +Dungeness crab, Cancer magister, +rock crab, Cancer irroratus, +fiddler crab, +king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica, +American lobster, Northern lobster, Maine lobster, Homarus americanus, +spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish, +crayfish, crawfish, crawdad, crawdaddy, +hermit crab, +isopod, +white stork, Ciconia ciconia, +black stork, Ciconia nigra, +spoonbill, +flamingo, +little blue heron, Egretta caerulea, +American egret, great white heron, Egretta albus, +bittern, +crane, +limpkin, Aramus pictus, +European gallinule, Porphyrio porphyrio, +American coot, marsh hen, mud hen, water hen, Fulica americana, +bustard, +ruddy turnstone, Arenaria interpres, +red-backed sandpiper, dunlin, Erolia alpina, +redshank, Tringa totanus, +dowitcher, +oystercatcher, oyster catcher, +pelican, +king penguin, Aptenodytes patagonica, +albatross, mollymawk, +grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus, +killer whale, killer, orca, grampus, sea wolf, Orcinus orca, +dugong, Dugong dugon, +sea lion, +Chihuahua, +Japanese spaniel, +Maltese dog, Maltese terrier, Maltese, +Pekinese, Pekingese, Peke, +Shih-Tzu, +Blenheim spaniel, +papillon, +toy terrier, +Rhodesian ridgeback, +Afghan hound, Afghan, +basset, basset hound, +beagle, +bloodhound, sleuthhound, +bluetick, +black-and-tan coonhound, +Walker hound, Walker foxhound, +English foxhound, +redbone, +borzoi, Russian wolfhound, +Irish wolfhound, +Italian greyhound, +whippet, +Ibizan hound, Ibizan Podenco, +Norwegian elkhound, elkhound, +otterhound, otter hound, +Saluki, gazelle hound, +Scottish deerhound, deerhound, +Weimaraner, +Staffordshire bullterrier, Staffordshire bull terrier, +American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier, +Bedlington terrier, +Border terrier, +Kerry blue terrier, +Irish terrier, +Norfolk terrier, +Norwich terrier, +Yorkshire terrier, +wire-haired fox terrier, +Lakeland terrier, +Sealyham terrier, Sealyham, +Airedale, Airedale terrier, +cairn, cairn terrier, +Australian terrier, +Dandie Dinmont, Dandie Dinmont terrier, +Boston bull, Boston terrier, +miniature schnauzer, +giant schnauzer, +standard schnauzer, +Scotch terrier, Scottish terrier, Scottie, +Tibetan terrier, chrysanthemum dog, +silky terrier, Sydney silky, +soft-coated wheaten terrier, +West Highland white terrier, +Lhasa, Lhasa apso, +flat-coated retriever, +curly-coated retriever, +golden retriever, +Labrador retriever, +Chesapeake Bay retriever, +German short-haired pointer, +vizsla, Hungarian pointer, +English setter, +Irish setter, red setter, +Gordon setter, +Brittany spaniel, +clumber, clumber spaniel, +English springer, English springer spaniel, +Welsh springer spaniel, +cocker spaniel, English cocker spaniel, cocker, +Sussex spaniel, +Irish water spaniel, +kuvasz, +schipperke, +groenendael, +malinois, +briard, +kelpie, +komondor, +Old English sheepdog, bobtail, +Shetland sheepdog, Shetland sheep dog, Shetland, +collie, +Border collie, +Bouvier des Flandres, Bouviers des Flandres, +Rottweiler, +German shepherd, German shepherd dog, German police dog, alsatian, +Doberman, Doberman pinscher, +miniature pinscher, +Greater Swiss Mountain dog, +Bernese mountain dog, +Appenzeller, +EntleBucher, +boxer, +bull mastiff, +Tibetan mastiff, +French bulldog, +Great Dane, +Saint Bernard, St Bernard, +Eskimo dog, husky, +malamute, malemute, Alaskan malamute, +Siberian husky, +dalmatian, coach dog, carriage dog, +affenpinscher, monkey pinscher, monkey dog, +basenji, +pug, pug-dog, +Leonberg, +Newfoundland, Newfoundland dog, +Great Pyrenees, +Samoyed, Samoyede, +Pomeranian, +chow, chow chow, +keeshond, +Brabancon griffon, +Pembroke, Pembroke Welsh corgi, +Cardigan, Cardigan Welsh corgi, +toy poodle, +miniature poodle, +standard poodle, +Mexican hairless, +timber wolf, grey wolf, gray wolf, Canis lupus, +white wolf, Arctic wolf, Canis lupus tundrarum, +red wolf, maned wolf, Canis rufus, Canis niger, +coyote, prairie wolf, brush wolf, Canis latrans, +dingo, warrigal, warragal, Canis dingo, +dhole, Cuon alpinus, +African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus, +hyena, hyaena, +red fox, Vulpes vulpes, +kit fox, Vulpes macrotis, +Arctic fox, white fox, Alopex lagopus, +grey fox, gray fox, Urocyon cinereoargenteus, +tabby, tabby cat, +tiger cat, +Persian cat, +Siamese cat, Siamese, +Egyptian cat, +cougar, puma, catamount, mountain lion, painter, panther, Felis concolor, +lynx, catamount, +leopard, Panthera pardus, +snow leopard, ounce, Panthera uncia, +jaguar, panther, Panthera onca, Felis onca, +lion, king of beasts, Panthera leo, +tiger, Panthera tigris, +cheetah, chetah, Acinonyx jubatus, +brown bear, bruin, Ursus arctos, +American black bear, black bear, Ursus americanus, Euarctos americanus, +ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus, +sloth bear, Melursus ursinus, Ursus ursinus, +mongoose, +meerkat, mierkat, +tiger beetle, +ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle, +ground beetle, carabid beetle, +long-horned beetle, longicorn, longicorn beetle, +leaf beetle, chrysomelid, +dung beetle, +rhinoceros beetle, +weevil, +fly, +bee, +ant, emmet, pismire, +grasshopper, hopper, +cricket, +walking stick, walkingstick, stick insect, +cockroach, roach, +mantis, mantid, +cicada, cicala, +leafhopper, +lacewing, lacewing fly, +"dragonfly, darning needle, devils darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", +damselfly, +admiral, +ringlet, ringlet butterfly, +monarch, monarch butterfly, milkweed butterfly, Danaus plexippus, +cabbage butterfly, +sulphur butterfly, sulfur butterfly, +lycaenid, lycaenid butterfly, +starfish, sea star, +sea urchin, +sea cucumber, holothurian, +wood rabbit, cottontail, cottontail rabbit, +hare, +Angora, Angora rabbit, +hamster, +porcupine, hedgehog, +fox squirrel, eastern fox squirrel, Sciurus niger, +marmot, +beaver, +guinea pig, Cavia cobaya, +sorrel, +zebra, +hog, pig, grunter, squealer, Sus scrofa, +wild boar, boar, Sus scrofa, +warthog, +hippopotamus, hippo, river horse, Hippopotamus amphibius, +ox, +water buffalo, water ox, Asiatic buffalo, Bubalus bubalis, +bison, +ram, tup, +bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis, +ibex, Capra ibex, +hartebeest, +impala, Aepyceros melampus, +gazelle, +Arabian camel, dromedary, Camelus dromedarius, +llama, +weasel, +mink, +polecat, fitch, foulmart, foumart, Mustela putorius, +black-footed ferret, ferret, Mustela nigripes, +otter, +skunk, polecat, wood pussy, +badger, +armadillo, +three-toed sloth, ai, Bradypus tridactylus, +orangutan, orang, orangutang, Pongo pygmaeus, +gorilla, Gorilla gorilla, +chimpanzee, chimp, Pan troglodytes, +gibbon, Hylobates lar, +siamang, Hylobates syndactylus, Symphalangus syndactylus, +guenon, guenon monkey, +patas, hussar monkey, Erythrocebus patas, +baboon, +macaque, +langur, +colobus, colobus monkey, +proboscis monkey, Nasalis larvatus, +marmoset, +capuchin, ringtail, Cebus capucinus, +howler monkey, howler, +titi, titi monkey, +spider monkey, Ateles geoffroyi, +squirrel monkey, Saimiri sciureus, +Madagascar cat, ring-tailed lemur, Lemur catta, +indri, indris, Indri indri, Indri brevicaudatus, +Indian elephant, Elephas maximus, +African elephant, Loxodonta africana, +lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens, +giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca, +barracouta, snoek, +eel, +coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch, +rock beauty, Holocanthus tricolor, +anemone fish, +sturgeon, +gar, garfish, garpike, billfish, Lepisosteus osseus, +lionfish, +puffer, pufferfish, blowfish, globefish, +abacus, +abaya, +"academic gown, academic robe, judges robe", +accordion, piano accordion, squeeze box, +acoustic guitar, +aircraft carrier, carrier, flattop, attack aircraft carrier, +airliner, +airship, dirigible, +altar, +ambulance, +amphibian, amphibious vehicle, +analog clock, +apiary, bee house, +apron, +ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin, +assault rifle, assault gun, +backpack, back pack, knapsack, packsack, rucksack, haversack, +bakery, bakeshop, bakehouse, +balance beam, beam, +balloon, +ballpoint, ballpoint pen, ballpen, Biro, +Band Aid, +banjo, +bannister, banister, balustrade, balusters, handrail, +barbell, +barber chair, +barbershop, +barn, +barometer, +barrel, cask, +barrow, garden cart, lawn cart, wheelbarrow, +baseball, +basketball, +bassinet, +bassoon, +bathing cap, swimming cap, +bath towel, +bathtub, bathing tub, bath, tub, +beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon, +beacon, lighthouse, beacon light, pharos, +beaker, +bearskin, busby, shako, +beer bottle, +beer glass, +bell cote, bell cot, +bib, +bicycle-built-for-two, tandem bicycle, tandem, +bikini, two-piece, +binder, ring-binder, +binoculars, field glasses, opera glasses, +birdhouse, +boathouse, +bobsled, bobsleigh, bob, +bolo tie, bolo, bola tie, bola, +bonnet, poke bonnet, +bookcase, +bookshop, bookstore, bookstall, +bottlecap, +bow, +bow tie, bow-tie, bowtie, +brass, memorial tablet, plaque, +brassiere, bra, bandeau, +breakwater, groin, groyne, mole, bulwark, seawall, jetty, +breastplate, aegis, egis, +broom, +bucket, pail, +buckle, +bulletproof vest, +bullet train, bullet, +butcher shop, meat market, +cab, hack, taxi, taxicab, +caldron, cauldron, +candle, taper, wax light, +cannon, +canoe, +can opener, tin opener, +cardigan, +car mirror, +carousel, carrousel, merry-go-round, roundabout, whirligig, +"carpenters kit, tool kit", +carton, +car wheel, +cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM, +cassette, +cassette player, +castle, +catamaran, +CD player, +cello, violoncello, +cellular telephone, cellular phone, cellphone, cell, mobile phone, +chain, +chainlink fence, +chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour, +chain saw, chainsaw, +chest, +chiffonier, commode, +chime, bell, gong, +china cabinet, china closet, +Christmas stocking, +church, church building, +cinema, movie theater, movie theatre, movie house, picture palace, +cleaver, meat cleaver, chopper, +cliff dwelling, +cloak, +clog, geta, patten, sabot, +cocktail shaker, +coffee mug, +coffeepot, +coil, spiral, volute, whorl, helix, +combination lock, +computer keyboard, keypad, +confectionery, confectionary, candy store, +container ship, containership, container vessel, +convertible, +corkscrew, bottle screw, +cornet, horn, trumpet, trump, +cowboy boot, +cowboy hat, ten-gallon hat, +cradle, +crane, +crash helmet, +crate, +crib, cot, +Crock Pot, +croquet ball, +crutch, +cuirass, +dam, dike, dyke, +desk, +desktop computer, +dial telephone, dial phone, +diaper, nappy, napkin, +digital clock, +digital watch, +dining table, board, +dishrag, dishcloth, +dishwasher, dish washer, dishwashing machine, +disk brake, disc brake, +dock, dockage, docking facility, +dogsled, dog sled, dog sleigh, +dome, +doormat, welcome mat, +drilling platform, offshore rig, +drum, membranophone, tympan, +drumstick, +dumbbell, +Dutch oven, +electric fan, blower, +electric guitar, +electric locomotive, +entertainment center, +envelope, +espresso maker, +face powder, +feather boa, boa, +file, file cabinet, filing cabinet, +fireboat, +fire engine, fire truck, +fire screen, fireguard, +flagpole, flagstaff, +flute, transverse flute, +folding chair, +football helmet, +forklift, +fountain, +fountain pen, +four-poster, +freight car, +French horn, horn, +frying pan, frypan, skillet, +fur coat, +garbage truck, dustcart, +gasmask, respirator, gas helmet, +gas pump, gasoline pump, petrol pump, island dispenser, +goblet, +go-kart, +golf ball, +golfcart, golf cart, +gondola, +gong, tam-tam, +gown, +grand piano, grand, +greenhouse, nursery, glasshouse, +grille, radiator grille, +grocery store, grocery, food market, market, +guillotine, +hair slide, +hair spray, +half track, +hammer, +hamper, +hand blower, blow dryer, blow drier, hair dryer, hair drier, +hand-held computer, hand-held microcomputer, +handkerchief, hankie, hanky, hankey, +hard disc, hard disk, fixed disk, +harmonica, mouth organ, harp, mouth harp, +harp, +harvester, reaper, +hatchet, +holster, +home theater, home theatre, +honeycomb, +hook, claw, +hoopskirt, crinoline, +horizontal bar, high bar, +horse cart, horse-cart, +hourglass, +iPod, +iron, smoothing iron, +"jack-o-lantern", +jean, blue jean, denim, +jeep, landrover, +jersey, T-shirt, tee shirt, +jigsaw puzzle, +jinrikisha, ricksha, rickshaw, +joystick, +kimono, +knee pad, +knot, +lab coat, laboratory coat, +ladle, +lampshade, lamp shade, +laptop, laptop computer, +lawn mower, mower, +lens cap, lens cover, +letter opener, paper knife, paperknife, +library, +lifeboat, +lighter, light, igniter, ignitor, +limousine, limo, +liner, ocean liner, +lipstick, lip rouge, +Loafer, +lotion, +loudspeaker, speaker, speaker unit, loudspeaker system, speaker system, +"loupe, jewelers loupe", +lumbermill, sawmill, +magnetic compass, +mailbag, postbag, +mailbox, letter box, +maillot, +maillot, tank suit, +manhole cover, +maraca, +marimba, xylophone, +mask, +matchstick, +maypole, +maze, labyrinth, +measuring cup, +medicine chest, medicine cabinet, +megalith, megalithic structure, +microphone, mike, +microwave, microwave oven, +military uniform, +milk can, +minibus, +miniskirt, mini, +minivan, +missile, +mitten, +mixing bowl, +mobile home, manufactured home, +Model T, +modem, +monastery, +monitor, +moped, +mortar, +mortarboard, +mosque, +mosquito net, +motor scooter, scooter, +mountain bike, all-terrain bike, off-roader, +mountain tent, +mouse, computer mouse, +mousetrap, +moving van, +muzzle, +nail, +neck brace, +necklace, +nipple, +notebook, notebook computer, +obelisk, +oboe, hautboy, hautbois, +ocarina, sweet potato, +odometer, hodometer, mileometer, milometer, +oil filter, +organ, pipe organ, +oscilloscope, scope, cathode-ray oscilloscope, CRO, +overskirt, +oxcart, +oxygen mask, +packet, +paddle, boat paddle, +paddlewheel, paddle wheel, +padlock, +paintbrush, +"pajama, pyjama, pjs, jammies", +palace, +panpipe, pandean pipe, syrinx, +paper towel, +parachute, chute, +parallel bars, bars, +park bench, +parking meter, +passenger car, coach, carriage, +patio, terrace, +pay-phone, pay-station, +pedestal, plinth, footstall, +pencil box, pencil case, +pencil sharpener, +perfume, essence, +Petri dish, +photocopier, +pick, plectrum, plectron, +pickelhaube, +picket fence, paling, +pickup, pickup truck, +pier, +piggy bank, penny bank, +pill bottle, +pillow, +ping-pong ball, +pinwheel, +pirate, pirate ship, +pitcher, ewer, +"plane, carpenters plane, woodworking plane", +planetarium, +plastic bag, +plate rack, +plow, plough, +"plunger, plumbers helper", +Polaroid camera, Polaroid Land camera, +pole, +police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria, +poncho, +pool table, billiard table, snooker table, +pop bottle, soda bottle, +pot, flowerpot, +"potters wheel", +power drill, +prayer rug, prayer mat, +printer, +prison, prison house, +projectile, missile, +projector, +puck, hockey puck, +punching bag, punch bag, punching ball, punchball, +purse, +quill, quill pen, +quilt, comforter, comfort, puff, +racer, race car, racing car, +racket, racquet, +radiator, +radio, wireless, +radio telescope, radio reflector, +rain barrel, +recreational vehicle, RV, R.V., +reel, +reflex camera, +refrigerator, icebox, +remote control, remote, +restaurant, eating house, eating place, eatery, +revolver, six-gun, six-shooter, +rifle, +rocking chair, rocker, +rotisserie, +rubber eraser, rubber, pencil eraser, +rugby ball, +rule, ruler, +running shoe, +safe, +safety pin, +saltshaker, salt shaker, +sandal, +sarong, +sax, saxophone, +scabbard, +scale, weighing machine, +school bus, +schooner, +scoreboard, +screen, CRT screen, +screw, +screwdriver, +seat belt, seatbelt, +sewing machine, +shield, buckler, +shoe shop, shoe-shop, shoe store, +shoji, +shopping basket, +shopping cart, +shovel, +shower cap, +shower curtain, +ski, +ski mask, +sleeping bag, +slide rule, slipstick, +sliding door, +slot, one-armed bandit, +snorkel, +snowmobile, +snowplow, snowplough, +soap dispenser, +soccer ball, +sock, +solar dish, solar collector, solar furnace, +sombrero, +soup bowl, +space bar, +space heater, +space shuttle, +spatula, +speedboat, +"spider web, spiders web", +spindle, +sports car, sport car, +spotlight, spot, +stage, +steam locomotive, +steel arch bridge, +steel drum, +stethoscope, +stole, +stone wall, +stopwatch, stop watch, +stove, +strainer, +streetcar, tram, tramcar, trolley, trolley car, +stretcher, +studio couch, day bed, +stupa, tope, +submarine, pigboat, sub, U-boat, +suit, suit of clothes, +sundial, +sunglass, +sunglasses, dark glasses, shades, +sunscreen, sunblock, sun blocker, +suspension bridge, +swab, swob, mop, +sweatshirt, +swimming trunks, bathing trunks, +swing, +switch, electric switch, electrical switch, +syringe, +table lamp, +tank, army tank, armored combat vehicle, armoured combat vehicle, +tape player, +teapot, +teddy, teddy bear, +television, television system, +tennis ball, +thatch, thatched roof, +theater curtain, theatre curtain, +thimble, +thresher, thrasher, threshing machine, +throne, +tile roof, +toaster, +tobacco shop, tobacconist shop, tobacconist, +toilet seat, +torch, +totem pole, +tow truck, tow car, wrecker, +toyshop, +tractor, +trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi, +tray, +trench coat, +tricycle, trike, velocipede, +trimaran, +tripod, +triumphal arch, +trolleybus, trolley coach, trackless trolley, +trombone, +tub, vat, +turnstile, +typewriter keyboard, +umbrella, +unicycle, monocycle, +upright, upright piano, +vacuum, vacuum cleaner, +vase, +vault, +velvet, +vending machine, +vestment, +viaduct, +violin, fiddle, +volleyball, +waffle iron, +wall clock, +wallet, billfold, notecase, pocketbook, +wardrobe, closet, press, +warplane, military plane, +washbasin, handbasin, washbowl, lavabo, wash-hand basin, +washer, automatic washer, washing machine, +water bottle, +water jug, +water tower, +whiskey jug, +whistle, +wig, +window screen, +window shade, +Windsor tie, +wine bottle, +wing, +wok, +wooden spoon, +wool, woolen, woollen, +worm fence, snake fence, snake-rail fence, Virginia fence, +wreck, +yawl, +yurt, +web site, website, internet site, site, +comic book, +crossword puzzle, crossword, +street sign, +traffic light, traffic signal, stoplight, +book jacket, dust cover, dust jacket, dust wrapper, +menu, +plate, +guacamole, +consomme, +hot pot, hotpot, +trifle, +ice cream, icecream, +ice lolly, lolly, lollipop, popsicle, +French loaf, +bagel, beigel, +pretzel, +cheeseburger, +hotdog, hot dog, red hot, +mashed potato, +head cabbage, +broccoli, +cauliflower, +zucchini, courgette, +spaghetti squash, +acorn squash, +butternut squash, +cucumber, cuke, +artichoke, globe artichoke, +bell pepper, +cardoon, +mushroom, +Granny Smith, +strawberry, +orange, +lemon, +fig, +pineapple, ananas, +banana, +jackfruit, jak, jack, +custard apple, +pomegranate, +hay, +carbonara, +chocolate sauce, chocolate syrup, +dough, +meat loaf, meatloaf, +pizza, pizza pie, +potpie, +burrito, +red wine, +espresso, +cup, +eggnog, +alp, +bubble, +cliff, drop, drop-off, +coral reef, +geyser, +lakeside, lakeshore, +promontory, headland, head, foreland, +sandbar, sand bar, +seashore, coast, seacoast, sea-coast, +valley, vale, +volcano, +ballplayer, baseball player, +groom, bridegroom, +scuba diver, +rapeseed, +daisy, +"yellow ladys slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", +corn, +acorn, +hip, rose hip, rosehip, +buckeye, horse chestnut, conker, +coral fungus, +agaric, +gyromitra, +stinkhorn, carrion fungus, +earthstar, +hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa, +bolete, +ear, spike, capitulum, +toilet tissue, toilet paper, bathroom tissue diff --git a/deploy/paddleserving/pipeline_http_client.py b/deploy/paddleserving/pipeline_http_client.py new file mode 100644 index 000000000..bc3fab252 --- /dev/null +++ b/deploy/paddleserving/pipeline_http_client.py @@ -0,0 +1,19 @@ +import numpy as np +import requests +import json +import cv2 +import base64 +import os + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + +if __name__ == "__main__": + url = "http://127.0.0.1:18080/imagenet/prediction" + with open(os.path.join(".", "daisy.jpg"), 'rb') as file: + image_data1 = file.read() + image = cv2_to_base64(image_data1) + data = {"key": ["image"], "value": [image]} + for i in range(100): + r = requests.post(url=url, data=json.dumps(data)) + print(r.json()) diff --git a/deploy/paddleserving/pipeline_rpc_client.py b/deploy/paddleserving/pipeline_rpc_client.py new file mode 100644 index 000000000..62de9ea99 --- /dev/null +++ b/deploy/paddleserving/pipeline_rpc_client.py @@ -0,0 +1,38 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +try: + from paddle_serving_server_gpu.pipeline import PipelineClient +except ImportError: + from paddle_serving_server.pipeline import PipelineClient +import numpy as np +import requests +import json +import cv2 +import base64 +import os + +client = PipelineClient() +client.connect(['127.0.0.1:9993']) + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + +if __name__ == "__main__": + with open("daisy.jpg", 'rb') as file: + image_data = file.read() + image = cv2_to_base64(image_data) + + for i in range(1): + ret = client.predict(feed_dict={"image": image}, fetch=["label", "prob"]) + print(ret) diff --git a/deploy/paddleserving/resnet50_web_service.py b/deploy/paddleserving/resnet50_web_service.py new file mode 100644 index 000000000..6c353eb10 --- /dev/null +++ b/deploy/paddleserving/resnet50_web_service.py @@ -0,0 +1,73 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import sys +from paddle_serving_app.reader import Sequential, URL2Image, Resize, CenterCrop, RGB2BGR, Transpose, Div, Normalize, Base64ToImage +try: + from paddle_serving_server_gpu.web_service import WebService, Op +except ImportError: + from paddle_serving_server.web_service import WebService, Op +import logging +import numpy as np +import base64, cv2 + +class ImagenetOp(Op): + def init_op(self): + self.seq = Sequential([ + Resize(256), CenterCrop(224), RGB2BGR(), Transpose((2, 0, 1)), + Div(255), Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], + True) + ]) + self.label_dict = {} + label_idx = 0 + with open("imagenet.label") as fin: + for line in fin: + self.label_dict[label_idx] = line.strip() + label_idx += 1 + + def preprocess(self, input_dicts, data_id, log_id): + (_, input_dict), = input_dicts.items() + batch_size = len(input_dict.keys()) + imgs = [] + for key in input_dict.keys(): + data = base64.b64decode(input_dict[key].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img = self.seq(im) + imgs.append(img[np.newaxis, :].copy()) + input_imgs = np.concatenate(imgs, axis=0) + return {"image": input_imgs}, False, None, "" + + def postprocess(self, input_dicts, fetch_dict, log_id): + score_list = fetch_dict["prediction"] + result = {"label": [], "prob": []} + for score in score_list: + score = score.tolist() + max_score = max(score) + result["label"].append(self.label_dict[score.index(max_score)] + .strip().replace(",", "")) + result["prob"].append(max_score) + result["label"] = str(result["label"]) + result["prob"] = str(result["prob"]) + return result, None, "" + + +class ImageService(WebService): + def get_pipeline_response(self, read_op): + image_op = ImagenetOp(name="imagenet", input_ops=[read_op]) + return image_op + + +uci_service = ImageService(name="imagenet") +uci_service.prepare_pipeline_config("config.yml") +uci_service.run_service() diff --git a/deploy/paddleserving/utils.py b/deploy/paddleserving/utils.py deleted file mode 100644 index 6c4a75e1a..000000000 --- a/deploy/paddleserving/utils.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import cv2 -import numpy as np - - -class DecodeImage(object): - def __init__(self, to_rgb=True): - self.to_rgb = to_rgb - - def __call__(self, img): - data = np.frombuffer(img, dtype='uint8') - img = cv2.imdecode(data, 1) - if self.to_rgb: - assert img.shape[2] == 3, 'invalid shape of image[%s]' % ( - img.shape) - img = img[:, :, ::-1] - - return img - - -class ResizeImage(object): - def __init__(self, resize_short=None): - self.resize_short = resize_short - - def __call__(self, img): - img_h, img_w = img.shape[:2] - percent = float(self.resize_short) / min(img_w, img_h) - w = int(round(img_w * percent)) - h = int(round(img_h * percent)) - return cv2.resize(img, (w, h)) - - -class CropImage(object): - def __init__(self, size): - if type(size) is int: - self.size = (size, size) - else: - self.size = size - - def __call__(self, img): - w, h = self.size - img_h, img_w = img.shape[:2] - w_start = (img_w - w) // 2 - h_start = (img_h - h) // 2 - - w_end = w_start + w - h_end = h_start + h - return img[h_start:h_end, w_start:w_end, :] - - -class NormalizeImage(object): - def __init__(self, scale=None, mean=None, std=None): - self.scale = np.float32(scale if scale is not None else 1.0 / 255.0) - mean = mean if mean is not None else [0.485, 0.456, 0.406] - std = std if std is not None else [0.229, 0.224, 0.225] - - shape = (1, 1, 3) - self.mean = np.array(mean).reshape(shape).astype('float32') - self.std = np.array(std).reshape(shape).astype('float32') - - def __call__(self, img): - return (img.astype('float32') * self.scale - self.mean) / self.std - - -class ToTensor(object): - def __init__(self): - pass - - def __call__(self, img): - img = img.transpose((2, 0, 1)) - return img From e3e991adc34c489b3526183a7b20ce9fdaa0f192 Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Tue, 7 Sep 2021 17:37:20 +0800 Subject: [PATCH 09/21] Update README_CN.md --- deploy/paddleserving/README_CN.md | 37 ++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md index 5e2b0104a..be50514ca 100644 --- a/deploy/paddleserving/README_CN.md +++ b/deploy/paddleserving/README_CN.md @@ -27,9 +27,9 @@ PaddleClas提供2种服务部署方式: ## 环境准备 -需要准备PaddleClas的运行环境和Paddle Serving的运行环境。 +需要准备PaddleClas的运行环境和PaddleServing的运行环境。 -- 准备PaddleOCR的运行环境[链接](../../doc/doc_ch/installation.md) +- 准备PaddleClas的运行环境[链接](../../doc/doc_ch/installation.md) 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 - 准备PaddleServing的运行环境,步骤如下 @@ -62,19 +62,19 @@ PaddleClas提供2种服务部署方式: 使用PaddleServing做服务化部署时,需要将保存的inference模型转换为serving易于部署的模型。 -首先,下载ResNet50_vd的[inference模型](https://github.com/PaddlePaddle/PaddleOCR#pp-ocr-20-series-model-listupdate-on-dec-15) +首先,下载ResNet50_vd的inference模型 ``` # 下载并解压ResNet50_vd模型 -wget "https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_vd_infer.tar" && tar xf ResNet50_vd_infer.tar +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_vd_infer.tar && tar xf ResNet50_vd_infer.tar ``` 接下来,用安装的paddle_serving_client把下载的inference模型转换成易于server部署的模型格式。 ``` # 转换ResNet50_vd模型 -python3 -m paddle_serving_client.convert --dirname ./inference/ \ - --model_filename inference.pdmodel \ \ - --params_filename inference.pdiparams \ \ +python3 -m paddle_serving_client.convert --dirname ./ResNet50_vd_infer/ \ + --model_filename inference.pdmodel \ + --params_filename inference.pdiparams \ --serving_server ./ResNet50_vd_serving/ \ --serving_client ./ResNet50_vd_client/ ``` @@ -91,6 +91,26 @@ python3 -m paddle_serving_client.convert --dirname ./inference/ \ |- serving_client_conf.stream.prototxt ``` +得到模型文件之后,需要修改serving_server_conf.prototxt中的alias名字: 将`feed_var`中的`alias_name`改为`image`, 将`fetch_var`中的`alias_name`改为`prediction`, +修改后的serving_server_conf.prototxt内容如下: +``` +feed_var { + name: "inputs" + alias_name: "image" + is_lod_tensor: false + feed_type: 1 + shape: 3 + shape: 224 + shape: 224 +} +fetch_var { + name: "save_infer_model/scale_0.tmp_1" + alias_name: "prediction" + is_lod_tensor: true + fetch_type: 1 + shape: -1 +} +``` ## Paddle Serving pipeline部署 @@ -126,12 +146,13 @@ python3 -m paddle_serving_client.convert --dirname ./inference/ \ 成功运行后,模型预测的结果会打印在cmd窗口中,结果示例为: ![](./imgs/results.png) - 调整 config.yml 中的并发个数获得最大的QPS, 一般检测和识别的并发数为2:1 + 调整 config.yml 中的并发个数可以获得最大的QPS ``` op: #并发数,is_thread_op=True时,为线程并发;否则为进程并发 concurrency: 8 ... + ``` 有需要的话可以同时发送多个服务请求 预测性能数据会被自动写入 `PipelineServingLogs/pipeline.tracer` 文件中。 From 67415c97ff31c51644f6e6ea5dc1523e31a881fc Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Tue, 7 Sep 2021 19:11:10 +0800 Subject: [PATCH 10/21] Update README_CN.md --- deploy/paddleserving/README_CN.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deploy/paddleserving/README_CN.md b/deploy/paddleserving/README_CN.md index be50514ca..786a07664 100644 --- a/deploy/paddleserving/README_CN.md +++ b/deploy/paddleserving/README_CN.md @@ -29,8 +29,7 @@ PaddleClas提供2种服务部署方式: 需要准备PaddleClas的运行环境和PaddleServing的运行环境。 -- 准备PaddleClas的运行环境[链接](../../doc/doc_ch/installation.md) - 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 +- 准备PaddleClas的[运行环境](../../docs/zh_CN/tutorials/install.md), 根据环境下载对应的paddle whl包,推荐安装2.0.1版本 - 准备PaddleServing的运行环境,步骤如下 From 1d32d7e70bc02b044edb5afb374b68bc036bf64d Mon Sep 17 00:00:00 2001 From: Bin Lu Date: Tue, 7 Sep 2021 19:11:38 +0800 Subject: [PATCH 11/21] Update config.yml --- deploy/paddleserving/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/paddleserving/config.yml b/deploy/paddleserving/config.yml index 104504f41..d9f464dd0 100644 --- a/deploy/paddleserving/config.yml +++ b/deploy/paddleserving/config.yml @@ -18,7 +18,7 @@ op: local_service_conf: #uci模型路径 - model_config: ResNet50_vd/ppcls_model/ + model_config: ResNet50_vd_serving #计算硬件类型: 空缺时由devices决定(CPU/GPU),0=cpu, 1=gpu, 2=tensorRT, 3=arm cpu, 4=kunlun xpu device_type: 1 From 6ddbe6717721001663374ccb9bfa52e71ad2cb11 Mon Sep 17 00:00:00 2001 From: stephon Date: Mon, 6 Sep 2021 06:18:55 +0000 Subject: [PATCH 12/21] add metric_learning.d --- docs/images/ml_illustration.jpg | Bin 0 -> 121629 bytes docs/images/ml_pipeline.jpg | Bin 0 -> 70299 bytes .../algorithm_introduction/metric_learning.md | 26 ++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 docs/images/ml_illustration.jpg create mode 100644 docs/images/ml_pipeline.jpg create mode 100644 docs/zh_CN_tmp/algorithm_introduction/metric_learning.md diff --git a/docs/images/ml_illustration.jpg b/docs/images/ml_illustration.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69dced96bcbc9f40ac08684301d20691ea07e93d GIT binary patch literal 121629 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