From 3914c17b0de0a2eeb3e551158c17d7a7b507d6f2 Mon Sep 17 00:00:00 2001 From: Wu Zhiwen Date: Mon, 29 Oct 2018 14:32:09 +0800 Subject: [PATCH] dnn/Vulkan: Refine error handle mechanism Fallback to OPENCV backend and CPU target if catch exception from vkcom backend. Signed-off-by: Wu Zhiwen --- modules/dnn/src/dnn.cpp | 24 +++++++++++++++++++++--- modules/dnn/src/vkcom/src/common.hpp | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/modules/dnn/src/dnn.cpp b/modules/dnn/src/dnn.cpp index bec49f4e70..cda864980f 100644 --- a/modules/dnn/src/dnn.cpp +++ b/modules/dnn/src/dnn.cpp @@ -1412,8 +1412,17 @@ struct Net::Impl } ld.skip = false; - ld.backendNodes[DNN_BACKEND_VKCOM] = - layer->initVkCom(ld.inputBlobsWrappers); + + try + { + ld.backendNodes[DNN_BACKEND_VKCOM] = + layer->initVkCom(ld.inputBlobsWrappers); + } + catch (const cv::Exception& e) + { + CV_LOG_ERROR(NULL, "initVkCom failed, fallback to CPU implementation. " << e.what()); + ld.backendNodes[DNN_BACKEND_VKCOM] = Ptr(); + } } #endif } @@ -2318,7 +2327,16 @@ struct Net::Impl } else if (preferableBackend == DNN_BACKEND_VKCOM) { - forwardVkCom(ld.outputBlobsWrappers, node); + try + { + forwardVkCom(ld.outputBlobsWrappers, node); + } + catch (const cv::Exception& e) + { + CV_LOG_ERROR(NULL, "forwardVkCom failed, fallback to CPU implementation. " << e.what()); + it->second = Ptr(); + forwardLayer(ld); + } } else { diff --git a/modules/dnn/src/vkcom/src/common.hpp b/modules/dnn/src/vkcom/src/common.hpp index 5465a1a83a..c976f87f7e 100644 --- a/modules/dnn/src/vkcom/src/common.hpp +++ b/modules/dnn/src/vkcom/src/common.hpp @@ -42,7 +42,8 @@ enum ShapeIdx { \ if (f != VK_SUCCESS) \ { \ - CV_LOG_WARNING(NULL, "Vulkan check failed"); \ + CV_LOG_ERROR(NULL, "Vulkan check failed, result = " << f); \ + CV_Error(Error::StsError, "Vulkan check failed"); \ } \ }