Je dois appliquer un filtre de convolution sur chaque ligne de nombreuses images. Le classique est de 360 images de 1024x1024 pixels. Dans mon cas d'utilisation, il s'agit de 720 images 560x600 pixels.Méthode la plus rapide pour calculer la convolution
Le problème est que mon code est beaucoup plus lent que ce qui est annoncé dans les articles.
J'ai implémenté la convolution naïve, et cela prend 2m 30s. Je suis ensuite passé à FFT en utilisant fftw. J'ai utilisé complexe complexe 2, en filtrant deux lignes dans chaque transformée. J'ai maintenant environ 20 ans.
Le fait est que les articles annoncent autour de 10s et même moins pour la condition classique. J'aimerais donc demander aux experts s'il existe un moyen plus rapide de calculer la convolution.
Les recettes numériques suggèrent d'éviter le tri effectué dans le dft et d'adapter la fonction de filtrage du domaine fréquentiel en conséquence. Mais il n'y a pas d'exemple de code comment cela pourrait être fait.
Peut-être que je perds du temps à copier des données. Avec une vraie transformation réelle de 2, je n'aurais pas à copier les données dans les valeurs du complexe. Mais je dois pad avec 0 de toute façon.
EDIT: voir ma propre réponse ci-dessous pour les commentaires sur les progrès et de plus amples informations sur la résolution de ce problème.
Question (reformulation précise):
Je cherche un algorithme ou un morceau de code pour appliquer une convolution très rapide à une fonction discrète non périodique (512 à 2048 valeurs). Apparemment, la transformée de Fourier à temps discret est la voie à suivre. Cependant, je voudrais éviter la copie de données et la conversion au complexe, et éviter le réordonnancement de papillon.
Qu'est-ce que le langage de programmation utilisez-vous? Quels articles publiés? –
C ou C++. L'article est "Reconstruction rapide d'image de CT de faisceau conique utilisant le matériel de GPU", Guorui Yan, Jie Tian, Shouping Zhu, Yakang Dai et Chenghu Qin, Journal de la Science et de la Technologie Rayons X 16 (2008) 225, IOS Press [http: //www.3dmed.net/paper/YanGR_XRay_Fast%20cone-beam%20CT%20image%20reconstruction%20using%20GPU%20hardware.pdf]. Le temps annoncé est 5.9s pour 360 images de 1024x1024 en 512^3 volume sur un 8800GTX (8MP) et j'utilise un 280GTX (30MP). – chmike
Vous voulez dire que vous appliquez un noyau qui est 1D sur une image 2D? Quelle est la taille du noyau? – Royi