IT TIP

OpenCV의 Python 또는 C ++ 코딩간에 성능이 다른가요?

itqueen 2020. 12. 6. 22:30
반응형

OpenCV의 Python 또는 C ++ 코딩간에 성능이 다른가요?


조금씩 opencv를 시작하려고하지만 먼저 OpenCV의 어떤 API가 더 유용한 지 결정해야합니다. Python 구현은 더 짧지 만 네이티브 C ++ 구현에 비해 실행 시간이 더 조밀하고 느릴 것이라고 예상합니다. 이 두 관점의 성능과 코딩 차이에 대해 언급 할 수있는 사람이 있습니까?


이전 답변에서 언급했듯이 Python은 C ++ 또는 C에 비해 느립니다. Python은 단순성, 이식성 및 또한 사용자가 프로그래밍 문제가 아닌 알고리즘에 대해서만 걱정할 필요가있는 창의성을 위해 구축되었습니다.

그러나 여기 OpenCV에는 다른 것이 있습니다. Python-OpenCV는 원래 C / C ++ 코드를 둘러싼 래퍼입니다. 일반적으로 두 언어의 최상의 기능인 C / C ++의 성능과 Python의 단순성 을 결합하는 데 사용됩니다 .

따라서 Python에서 OpenCV의 함수를 호출 할 때 실제로 실행되는 것은 기본 C / C ++ 소스입니다. 그래서 성능에서 많은 차이가있을 수 없습니다. (나는 성능 저하가 있음을 <1 %, 위치를 기억하지 선가 기억한다. OpenCV의 쇼 A의 몇 가지 기본적인 기능을 거친 추정 최악 의 벌금을 <4%. 예 penalty = [maximum time taken in Python - minimum time taken in C++]/minimum time taken in C++) .

코드에 네이티브 파이썬 코드가 많을 때 문제가 발생합니다. 예를 들어 OpenCV에서 사용할 수없는 자체 함수를 만드는 경우 상황이 악화됩니다. 이러한 코드는 기본적으로 Python에서 실행되므로 성능이 상당히 저하됩니다.

그러나 새로운 OpenCV-Python 인터페이스는 Numpy를 완벽하게 지원합니다. Numpy는 Python의 과학 컴퓨팅을위한 패키지입니다. 또한 네이티브 C 코드를 둘러싼 래퍼입니다. 이미지 처리에 매우 적합한 다양한 매트릭스 작업을 지원하는 고도로 최적화 된 라이브러리입니다. 따라서 OpenCV 함수와 Numpy 함수를 모두 올바르게 결합 할 수 있다면 매우 빠른 코드를 얻을 수 있습니다.

기억해야 할 것은 항상 Python에서 루프와 반복을 피하는 것입니다. 대신 Numpy (및 OpenCV)에서 사용할 수있는 배열 조작 기능을 사용하십시오. 을 사용하여 두 개의 numpy 배열을 추가하는 C = A+B것은 이중 루프를 사용하는 것보다 훨씬 빠릅니다.

예를 들어 다음 기사를 확인할 수 있습니다.

  1. Python에서 빠른 배열 조작
  2. OpenCV-Python 인터페이스, cv 및 cv2의 성능 비교

openCV에 대한 모든 Google 결과는 동일합니다. 파이썬은 약간 느려질 것입니다. 그러나 그것에 대한 프로파일 링을 한 번도 본 적이 없습니다. 그래서 나는 몇 가지를하기로 결정했고 다음을 발견했습니다.

Python은 사소한 프로그램에서도 opencv를 사용하는 C ++보다 훨씬 느립니다.

제가 생각할 수있는 가장 간단한 예는 웹캠의 출력을 화면에 표시하고 초당 프레임 수를 표시하는 것입니다. 파이썬으로 50FPS (인텔 원자에서)를 달성했습니다. C ++로 25 % 증가한 65FPS를 얻었습니다. 두 경우 모두 CPU 사용량은 단일 코어를 사용했으며 내가 아는 한 CPU 성능에 의해 제한되었습니다. 또한이 테스트 사례는 내가 과거에 한 프로젝트에서 다른 프로젝트로 포팅 한 프로젝트에서 본 것과 일치합니다.

이 차이는 어디에서 오는 것일까 요? 파이썬에서 모든 openCV 함수는 이미지 행렬의 새 복사본을 반환합니다. 이미지를 캡처하거나 크기를 조정할 때마다 C ++에서 기존 메모리를 재사용 할 수 있습니다. 파이썬에서는 할 수 없습니다. 다른 사람들이 말했듯이 openCV의 기본 코드는 C ++이기 때문에 이번에 메모리 할당에 소요 된 시간이 큰 차이라고 생각합니다.

파이썬을 창 밖으로 버리기 전에 : 파이썬은 개발 속도가 훨씬 빠르며, 하드웨어 제약 조건에 부딪히지 않거나 개발 속도가 성능보다 더 중요하다면 파이썬을 사용하십시오. openCV로 한 많은 애플리케이션에서 저는 파이썬으로 시작했고 나중에 컴퓨터 비전 구성 요소 만 C ++로 변환했습니다 (예 : 파이썬의 ctype 모듈을 사용하고 CV 코드를 공유 라이브러리로 컴파일).

Python 코드 :

import cv2
import time

FPS_SMOOTHING = 0.9

cap = cv2.VideoCapture(2)
fps = 0.0
prev = time.time()
while True:
    now = time.time()
    fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING))
    prev = now

    print("fps: {:.1f}".format(fps))

    got, frame = cap.read()
    if got:
        cv2.imshow("asdf", frame)
    if (cv2.waitKey(2) == 27):
        break

C ++ 코드 :

#include <opencv2/opencv.hpp>
#include <stdint.h>

using namespace std;
using namespace cv;

#define FPS_SMOOTHING 0.9

int main(int argc, char** argv){
    VideoCapture cap(2);
    Mat frame;

    float fps = 0.0;
    double prev = clock(); 
    while (true){
        double now = (clock()/(double)CLOCKS_PER_SEC);
        fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING));
        prev = now;

        printf("fps: %.1f\n", fps);

        if (cap.isOpened()){
            cap.read(frame);
        }
        imshow("asdf", frame);
        if (waitKey(2) == 27){
            break;
        }
    }
}

가능한 벤치 마크 제한 :

  • 카메라 프레임 속도
  • 타이머 측정 정밀도
  • 인쇄 형식화에 소요 된 시간

You're right, Python is almost always significantly slower than C++ as it requires an interpreter, which C++ does not. However, that does require C++ to be strongly-typed, which leaves a much smaller margin for error. Some people prefer to be made to code strictly, whereas others enjoy Python's inherent leniency.

If you want a full discourse on Python coding styles vs. C++ coding styles, this is not the best place, try finding an article.

EDIT: Because Python is an interpreted language, while C++ is compiled down to machine code, generally speaking, you can obtain performance advantages using C++. However, with regard to using OpenCV, the core OpenCV libraries are already compiled down to machine code, so the Python wrapper around the OpenCV library is executing compiled code. In other words, when it comes to executing computationally expensive OpenCV algorithms from Python, you're not going to see much of a performance hit since they've already been compiled for the specific architecture you're working with.


The answer from sdfgeoff is missing the fact that you can reuse arrays in Python. Preallocate them and pass them in, and they will get used. So:

    image = numpy.zeros(shape=(height, width, 3), dtype=numpy.uint8)
    #....
    retval, _ = cv.VideoCapture.read(image)

참고URL : https://stackoverflow.com/questions/13432800/does-performance-differ-between-python-or-c-coding-of-opencv

반응형