質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

0回答

1191閲覧

OpenCV のDNNモジュールでエラー

kokawa2003

総合スコア217

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2019/06/28 02:35

編集2019/06/28 02:42

opencvでDNNを使って機械学習の結果で画像を変換するコードを書きましたが実行時ログにエラーが出てます。
(が、しかしAPPは高速に動作はしている)
そのエラーは
[ INFO:0] global C:\Users\oakoa\work\opencv\modules\core\src\ocl.cpp (454) cv::ocl::OpenCLBinaryCacheConfigurator::prepareCacheDirectoryForContext Preparing OpenCL cache configuration for context: NVIDIA_Corporation--GeForce_GTX_1050_Ti--430_86
OpenCL program build log: dnn/dummy
Status -11: CL_BUILD_PROGRAM_FAILURE
-cl-no-subgroup-ifp
Error in processing command line: Don't understand command line argument "-cl-no-subgroup-ifp"!
のようなものです。
エラーと主張する以上対処したいと思いますがどうすべきかわかりません。
これからするとOpenCLがGPU動作してないかのようですがソースは高速に問題なく動作します。
ソースを載せます。
*.t7を読み込んで画像を変換ってのをGPUを使って動画でするものです。

cpp

1bool convMat(cv::Mat& in, cv::Mat& out, cv::dnn::Net net) { 2 3 cv::Mat image = in; 4 5 //cv::Scalar sc = cv::Scalar(103.939, 116.779, 123.680); 6 cv::Scalar sc = cv::Scalar(0, 0, 0); 7 cv::Mat inputBlob = cv::dnn::blobFromImage(image, 1, cv::Size(image.cols, image.rows), sc, false, false); //Convert Mat to batch of images 8 net.setInput(inputBlob); 9 cv::Mat styledMat = net.forward(); 10 // convert tensor blob to mat images 11 std::vector<cv::Mat> outImg; 12 cv::dnn::imagesFromBlob(styledMat, outImg); 13 cv::Mat styledImgOut; 14 outImg[0].convertTo(styledImgOut, 0); 15 16 //std::cout << "Channels :" << outImg[0].channels() << std::endl; 17 //std::cout << "Depth :" << styledImgOut.depth() << std::endl; 18 //std::cout << "Res :" << outImg[0].cols << "x" << outImg[0].rows << std::endl; 19 20 //styledImgOut = styledImgOut + sc; 21 styledImgOut = styledImgOut ; 22 23 out = styledImgOut; 24 25 return true; 26} 27 28bool chgmode(std::string firstpath, cv::dnn::Net & net) { 29 net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV); 30 net.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL); 31 net = cv::dnn::readNetFromTorch(firstpath); 32 std::vector< cv::String > layers; 33 34 layers = net.getLayerNames(); 35 for (std::vector<cv::String>::iterator it = layers.begin(); it != layers.end(); ++it) 36 { 37 std::cout << "-> " << *it << std::endl; 38 } 39 40 if (net.empty()) 41 { 42 std::cout << "Failed to load network" << std::endl; 43 return false; 44 } 45 net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV); 46 net.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL); 47 48 return true; 49} 50 51int main(int argc, char* argv[]) 52{ 53 HANDLE hFind; 54 WIN32_FIND_DATAA fd; 55 ZeroMemory(&fd, sizeof(fd)); 56 char *chpath=argv[1]; 57 char findpath[1024]; 58 sprintf_s(findpath,1024, "%s\*.t7", chpath); 59 hFind = FindFirstFileA(findpath, &fd); 60 // 検索失敗 61 if (hFind == INVALID_HANDLE_VALUE) { 62 std::cout << "ファイル一覧を取得できませんでした" << std::endl; 63 exit(1); // エラー終了 64 } 65 66 std::vector<std::string> fileList; 67 // ファイル名をリストに格納するためのループ 68 do { 69 // フォルダは除く 70 if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 71 && !(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) 72 { 73 //ファイル名をリストに格納 74 char* file = fd.cFileName; 75 std::string str = file; 76 fileList.push_back(str); 77 } 78 } while (FindNextFileA(hFind, &fd)); //次のファイルを探索 79 80 // hFindのクローズ 81 FindClose(hFind); 82 83 int pos = 0; 84 std::string firstpath = std::string(chpath) + "\" + fileList[pos]; 85 86 87 88 // OpenCLがこのシステムで使えるかチェック 89 if (!cv::ocl::haveOpenCL()) { 90 std::cout << "OpenCL not available on this system" << std::endl; 91 return -1; 92 } 93 // コンテクストの宣言 94 cv::ocl::Context context; 95 if (!context.create(cv::ocl::Device::TYPE_GPU)) { 96 std::cout << "Context creation failed" << std::endl; 97 return -1; 98 } 99 100 // デバイスの列挙 101 std::cout << context.ndevices() << " GPU device(s) detected" << std::endl; 102 for (size_t i = 0; i < context.ndevices(); i++) { 103 cv::ocl::Device device = context.device(i); 104 std::cout << "-- Device " << i << " ---" << std::endl; 105 std::cout << " Name: " << device.name() << std::endl; 106 std::cout << " Availability: " << device.available() << std::endl; 107 std::cout << " Image Support: " << device.imageSupport() << std::endl; 108 std::cout << " OpenCL C version: " << device.OpenCL_C_Version() << std::endl; 109 } 110 111 // 列挙はしたが,結局デバイス0番を用いる 112 cv::ocl::Device(context.device(0)); 113 114 std::cout << "loading net" << std::endl; 115 116 117 118 cv::dnn::Net net; 119 chgmode(firstpath, net); 120 121 cv::VideoCapture cap("C:\Users\oakoa\Videos\ke.mp4");//デバイスのオープン. 122 if (!cap.isOpened())//カメラデバイスが正常にオープンしたか確認. 123 { 124 //読み込みに失敗したときの処理 125 return -1; 126 } 127 128 cv::Mat frame; //取得したフレーム 129 while (cap.read(frame))//無限ループ 130 { 131 double d = 0.25 * 0.5; 132 cv::resize(frame, frame, cv::Size(0, 0), d, d); 133 // 134 //取得したフレーム画像に対して,クレースケール変換や2値化などの処理を書き込む. 135 // 136 cv::Mat styledImgOut; 137 convMat(frame, styledImgOut, net); 138 139 cv::resize(styledImgOut, styledImgOut, cv::Size(0, 0), 1/d*0.5, 1/d*0.5); 140 cv::imshow("win", styledImgOut);//画像を表示. 141 const int key = cv::waitKey(1); 142 if (key == 'q'/*113*/)//qボタンが押されたとき 143 { 144 break;//whileループから抜ける. 145 } 146 else if (key == 's'/*115*/)//sが押されたとき 147 { 148 //フレーム画像を保存する. 149 cv::imwrite("img.png", frame); 150 } 151 else if (key == 'n') { 152 pos++; 153 int sz = fileList.size(); 154 if (pos >= sz) { 155 pos = 0; 156 } 157 std::cout << pos << ":" << sz << fileList[pos] << std::endl; 158 std::string firstpath = std::string(chpath) + "\" + fileList[pos]; 159 chgmode(firstpath, net); 160 } 161 } 162 cv::destroyAllWindows(); 163 164 165 166 167}

どうもこの処理のchgmodeでエラーなのですがどうすればいいいのかわかりますでしょうか?

あと書き忘れましたが
OPENCV_OPENCL_DEVICE=NVIDIA:GPU:1050
OPENCV_DNN_OPENCL_ALLOW_ALL_DEVICES=1
の環境変数を仕込んでいます

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問