'2018/09'에 해당되는 글 1건

  1. 2018.09.03 OpenCV 3.4.2 Jpeg 라이브러리 성능 확인 2

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
: