저는 기본 이미지 내에 약 35 개의 하위 이미지 또는 패턴을 찾으려고하는 CUDA 프로그램을 작성하고 있습니다. 각 하위 이미지 (패턴)는 기본 이미지의 작은 영역 (예 : 10x10 픽셀 창)에만 존재할 수 있습니다. 하위 이미지의 크기는 1000에서 10000 픽셀까지 다양합니다. 기본 이미지는 640x480 픽셀입니다.여러 개의 작은 컨볼 루션 : 이미지 처리
전 컨볼 루션 결과는 그 일치하는 것으로 간주되는 것보다, 임계치보다 작은 상기베이스 화상의 서브 섹션면, 서브 영상을 컨벌루션함으로써 이것을한다. 하위 이미지 당 약 100 편의 컨볼 루션을 수행해야합니다 (허용 가능한 위치의 10x10 창만 확인하기 때문에).
첫 번째 질문 : 이것이 구현되었으며 오픈 소스에서 사용할 수 있습니까?
두 번째 질문 : 더 나은 구현 전략은 무엇입니까?
- 거친 나뭇결 각 CUDA 스레드가 기본 이미지 내에서 서브 이미지의 완전 컨볼 루션을 수행합니다. 각 하위 이미지 및 위치에 대해 하나의 CUDA 스레드가 있습니다.
- 미세 그레인 :베이스 이미지의 적절한 픽셀만큼 부 화상 그래서 CUDA 실 배수 화소 각각 CUDA 스레드 회선의 하나 개의 구성 요소 (픽셀)를 계산한다. 그런 다음 syncblock()을 사용하여 이러한 배수를 더합니다.
업데이트 : 나는 두 가지 접근 방식을 TRID. 가장 좋은 방법은 더 큰 하위 이미지를 더 작은 하위 이미지로 나누는 방법 중 하나의 변형이라고 생각합니다. 이제 모든 하위 이미지는 거의 같은 크기입니다 (예 : 1024 픽셀). 그런 다음 각 CUDA 스레드는 단일 위치에 대해 전체 컨볼 루션을 수행합니다. 끝나면 모든 결과를 호스트에 보내고 주인은 중간 조각을 다시 조립할 책임이 있습니다 (작은 조각으로 분할 된 하위 이미지의 경우). 이점은 모든 CUDA 스레드가 동일한 양의 작업을 수행한다는 것입니다. 이것은 서브 이미지의 크기가 다양하기 때문에 문제가되는 두 번째 방식보다 두 배 빠르다.
당신이 확인 했 여기에 좋은 백서를 찾을 수 있을까? – kangshiyin
'convolutionSeparable'과'convolutionTexture' 샘플을 보셨습니까? 왜 컨볼 루션을 수행하기 위해 FFT를 사용하지 않는지 ('convolutionFFT2D' 예제 참조)? 행렬이 FFT에 비해 너무 작습니까? 이 경우 CUDA에서 작은 행렬의 FFT를 빠르게 계산하는 방법이 중요 할 수 있습니다. 마지막으로 동적 병렬 처리를 고려하고 있습니까? 후자의 두 가지 경우, [CUDA를 사용하여 여러 개의 작은 행렬을 조합하는 최선의 방법]에 대한 내 대답을 살펴보십시오 (http://stackoverflow.com/questions/17955403/best-approach-for-convolution-of-multiple- 작은 매트릭스 - 사용 - cuda). – JackOLantern
OpenCV는 이러한 기능을 제공하지만 OpenCV는 CUDA로 구현 되었습니까? 나는 이미 시리얼 C 코드를 가지고 있으며, 그것은 사소한 것이다. 그러나 나는 속도를위한 CUDA 구현을 원한다. –