'performance'에 해당되는 글 2건

  1. 2018.09.03 OpenCV 3.4.2 Jpeg 라이브러리 성능 확인 2
  2. 2017.07.12 OpenCV 3.2 vs. OpenCV 3.3 간단 성능 비교

OpenCV 3.4.2 Jpeg library performance (compare to OpenCV 3.4.0)


OpenCV 3.4.2 버전부터 기본 JPEG 라이브러리가 libjpeg-turbo(ver 1.5.3-62)로 변경되었습니다. 그 전에는 Independent JPEG Group의 JPEG 라이브러리(v9.0b)가 사용되었었죠. libjpeg-turbo 라이브러리는 SIMD를 사용하기 때문에 Independent JPEG Group의 라이브러리보다 더 빠르게 동작한다고 알려져 있습니다. 각각의 라이브러리에 대한 자세한 설명은 홈페이지를 참고하세요.


이미 OpenCV 3.4.3 버전이 나온 시점이지만, 3.4.2의 libjpeg-turbo 라이브러리의 성능 향상이 어느 정도인지 확인해보기 위해 간단한 테스트 프로그램을 만들어보았습니다.


int main(void)
{
	Mat src[10];
	TickMeter tm;

	cout << "OpenCV version: " << CV_VERSION << endl;

	tm.start();
	for (int i = 0; i < 10; i++) {
		String filename = format("in\\test%d.jpg", i);

		src[i] = imread(filename);

		if (src[i].empty()) {
			cerr << "Image load failed!" << endl;
			return -1;
		}
	}
	tm.stop();
	cout << "JPEG load took " << tm.getTimeMilli() << "ms." << endl;

	tm.reset();
	tm.start();
	for (int i = 0; i < 10; i++) {
		String filename = format("out\\data%d.jpg", i);

		bool ret = imwrite(filename, src[i]);

		if (!ret) {
			cerr << "Image save failed!" << endl;
			return -1;
		}
	}
	tm.stop();
	cout << "JPEG save took " << tm.getTimeMilli() << "ms." << endl;

	return 0;
}

위 프로그램 소스는 ./in/ 폴더에 있는 test0.jpg ~ test9.jpg 10 장의 JPEG 영상을 불러와서 다시 ./out/ 폴더에 저장하는, 아주 간단한 소스 코드입니다. 시간 측정은 TickMeter 클래스를 사용하였구요...


위 소스 코드를 OpenCV 3.4.0 버전을 이용하여 빌드하고, 또 다시 OpenCV 3.4.2 버전을 이용하여 빌드하였습니다. OpenCV 라이브러리는 OpenCV 홈페이지에서 미리 빌드된 버전을 사용하였구요, JPEG 사진은 DSLR과 스마트폰으로 찍은 12M, 16M 사진을 사용했습니다. 측정된 시간은 아래와 같습니다.


OpenCV 3.4.2 버전을 사용했을 경우가 OpenCV 3.4.0 버전보다는 빠르긴 한데, 생각보다 훨씬 빠르지는 않네요. 위의 결과를 표로 정리하면 다음과 같습니다.


사실 이 결과는 인터넷에 나와 있는 JPEG turbo의 성능 비교와 너무 차이가 나서 뭔가 이상하다는 생각이 듭니다. 아래 링크에서는 최소 2~3배는 빨라졌는데 말이죠..

https://libjpeg-turbo.org/About/Performance

http://www.briancbecker.com/blog/2010/analysis-of-jpeg-decoding-speeds/


왜 이렇게 성능 향상이 적은지에 대해서는 더 고민을 해봐야할 것 같습니다. 뭔가 추가적인 환경 설정을 한다거나, 빌드 옵션이 뭔가 잘못되었는지는 확인을 더 해봐야겠지만, 어쨋든 기본적인 사용법으로 OpenCV 3.4.2를 사용할 때 이정도의 성능 향상이 있다... 라는 정도의 결론이네요. 뭔가 좀 아쉽네요. ^^;


Posted by kkokkal
:

아주 단순하게, 가우시안 필터와 캐니 엣지 검출에 대해서만 OpenCV 3.2 vs. OpenCV 3.3.0-rc 두 버전 간의 성능을 비교해봤습니다.


소스 코드는 매우 단순하게 레나 영상을 불러와서 가우시안 블러 & 캐니 엣지 검출을 100번 수행하도록 하였고, 그 실행 시간을 측정하여 출력했습니다.

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;
 
int main(void)
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}
	
	cout << "Running GaussianBlur & Canny on 512x512 lenna image (100 times): " << endl;

	int64 t1 = getTickCount();

	Mat blurred, dst;
	for (int i = 0; i < 100; i++) {
		GaussianBlur(src, blurred, Size(), 1.0, 1.0);
		Canny(blurred, dst, 50, 150);
		cout << ".";
	}

	int64 t2 = getTickCount();

	cout << "\nIt took " << (t2 - t1) * 1000 / getTickFrequency() << " ms." << endl;

	return 0;
}


그 결과 OpenCV 3.2 버전을 사용하여 빌드했을 때에는 결과가 아래와 같구요..


OpenCV 3.3.0-rc 버전을 사용하여 빌드했을 때에는 결과가 이렇습니다.


미세하지만 3.3.0-rc 버전이 더 빠르게 동작하는 것 같습니다. OpenCV 3.3.0-rc 버전은 220~230ms 정도 걸리는데, OpenCV 3.2 버전은 240~260ms 정도로 분포하고 있네요. 좀 더 많은 함수를 사용해서 테스트를 해보면 좋겠지만, 일단은 이 정도만..



Posted by kkokkal
: