OpenCVで提供されているユーティリティを使用して訓練したOpenCVの車両を検出するために、MIT cars datasetからトレーニングされたHaarカスケード分類器を使用しています。デバッグモードでコンパイルするとうまく動作しますが、リリースモードでコンパイルすると、カスケードは検出をまったく行いません。下のテストイメージで次のコードを実行すると、デバッグモードでは検出されますが、リリースモードでは何も検出されません(この動作はデータシーケンス内のすべてのイメージに適用されます)。リリース/デバッグモード時にHaarカスケードを使用した結果が異なります
これがなぜ発生するのか、さらに重要なことは、リリースモードで実行しているときに検出を行うためにできることを提案できますか?:
コード
cv::Mat testImage = cv::imread("testImage.png",0);
cv::equalizeHist(testImage, testImage);
cv::CascadeClassifier vehicleCascade;
vehicleCascade.load("cars3.xml");
// Detect vehicles
std::vector<cv::Rect> cars;
vehicleCascade.detectMultiScale(
testImage, // Input image
cars, // Output bounding boxes
1.1, // scale factor - how much image size is reduced at each scale
5, // min neighbours - how many neighbours required to maintain rect
0|CV_HAAR_SCALE_IMAGE, // Not used
cv::Size(30,30), // Min poss object size
cv::Size() // Max poss object size
);
std::cout << "Found " << cars.size() << " objects.\n";
for (int i=0; i<cars.size(); ++i)
cv::rectangle(testImage, cars.at(i), CV_RGB(255,0,0), 3);
cv::namedWindow("Haar cascade");
cv::imshow("Haar cascade", testImage);
cv::waitKey(0);
cv::imwrite("output.png", testImage);
TestImage
イメージとカスケードファイルは正常にロードされますが、実際のコードでは完全なディレクトリパスが使用されます。私が知る限り、どちらのモードでもエラーはなく、唯一の違いはdetectMultiScaleが返すオブジェクトの数です。 – Chris
Ok:/ pngについての部分が関係していないので、最初のコメントを削除しました。 –
これは、多くの場合、UBを持ち、特定の動作(コードまたはライブラリのいずれか)に依存しているか、または異なる特別に生成されたコードに依存していることの兆候です(リリースモードでレジスタに滞留することによる浮動小数点精度など)。あなたがここで行うことができる最も良いことは、関係するすべての計算を両方のモードで段階的に比較し、どこから逸脱し始めるのかを把握することです。 – PlasmaHH