This example compares the use of parcbpdn.ParConvBPDN with admm.cbpdn.ConvBPDN solving a convolutional sparse coding problem with a greyscale signal
$$\mathrm{argmin}_\mathbf{x} \; \frac{1}{2} \left\| \sum_m \mathbf{d}_m * \mathbf{x}_{m} - \mathbf{s} \right\|_2^2 + \lambda \sum_m \| \mathbf{x}_{m} \|_1 \;,$$
where $\mathbf{d}_{m}$ is the $m^{\text{th}}$ dictionary filter, $\mathbf{x}_{m}$ is the coefficient map corresponding to the $m^{\text{th}}$ dictionary filter, and $\mathbf{s}$ is the input image.
from __future__ import print_function
from builtins import input
from builtins import range
import pyfftw # See https://github.com/pyFFTW/pyFFTW/issues/40
import numpy as np
from sporco import util
from sporco import plot
plot.config_notebook_plotting()
import sporco.metric as sm
from sporco.admm import cbpdn
from sporco.admm import parcbpdn
Load example image.
img = util.ExampleImages().image('kodim23.png', zoom=1.0, scaled=True,
gray=True, idxexp=np.s_[160:416, 60:316])
Highpass filter example image.
npd = 16
fltlmbd = 10
sl, sh = util.tikhonov_filter(img, fltlmbd, npd)
Load dictionary and display it.
D = util.convdicts()['G:12x12x216']
plot.imview(util.tiledict(D), fgsz=(7, 7))
lmbda = 5e-2
The RelStopTol option was chosen for the two different methods to stop with similar functional values
Initialise and run standard serial CSC solver using ADMM with an equality constraint [28].
opt = cbpdn.ConvBPDN.Options({'Verbose': True, 'MaxMainIter': 200,
'RelStopTol': 5e-3, 'AuxVarObj': False,
'AutoRho': {'Enabled': False}})
b = cbpdn.ConvBPDN(D, sh, lmbda, opt=opt, dimK=0)
X = b.solve()
Itn Fnc DFid Regℓ1 r s ------------------------------------------------------ 0 8.35e+01 3.32e-02 1.67e+03 1.00e+00 0.00e+00 1 7.98e+01 2.25e-01 1.59e+03 9.98e-01 1.11e-02 2 7.71e+01 5.25e-01 1.53e+03 9.76e-01 5.28e-02 3 7.32e+01 8.79e-01 1.45e+03 8.13e-01 1.07e-01 4 6.82e+01 1.19e+00 1.34e+03 4.11e-01 1.33e-01 5 6.83e+01 1.40e+00 1.34e+03 2.73e-01 1.24e-01 6 7.02e+01 1.53e+00 1.37e+03 2.20e-01 1.05e-01 7 6.91e+01 1.62e+00 1.35e+03 1.92e-01 9.30e-02 8 6.56e+01 1.72e+00 1.28e+03 1.75e-01 8.33e-02 9 6.15e+01 1.83e+00 1.19e+03 1.61e-01 7.28e-02 10 5.77e+01 1.97e+00 1.11e+03 1.50e-01 6.24e-02 11 5.46e+01 2.13e+00 1.05e+03 1.39e-01 5.45e-02 12 5.23e+01 2.28e+00 1.00e+03 1.26e-01 4.96e-02 13 5.08e+01 2.42e+00 9.67e+02 1.12e-01 4.62e-02 14 5.01e+01 2.54e+00 9.50e+02 1.01e-01 4.28e-02 15 4.98e+01 2.64e+00 9.43e+02 9.12e-02 3.97e-02 16 4.92e+01 2.72e+00 9.30e+02 8.33e-02 3.75e-02 17 4.84e+01 2.78e+00 9.12e+02 7.70e-02 3.59e-02 18 4.74e+01 2.83e+00 8.92e+02 7.17e-02 3.44e-02 19 4.64e+01 2.88e+00 8.71e+02 6.74e-02 3.21e-02 20 4.54e+01 2.93e+00 8.49e+02 6.37e-02 2.97e-02 21 4.43e+01 2.99e+00 8.26e+02 6.02e-02 2.77e-02 22 4.31e+01 3.04e+00 8.02e+02 5.69e-02 2.59e-02 23 4.20e+01 3.10e+00 7.79e+02 5.37e-02 2.45e-02 24 4.11e+01 3.16e+00 7.58e+02 5.06e-02 2.35e-02 25 4.03e+01 3.22e+00 7.42e+02 4.77e-02 2.25e-02 26 3.98e+01 3.28e+00 7.31e+02 4.52e-02 2.14e-02 27 3.95e+01 3.33e+00 7.23e+02 4.29e-02 2.03e-02 28 3.91e+01 3.37e+00 7.15e+02 4.08e-02 1.93e-02 29 3.88e+01 3.41e+00 7.07e+02 3.89e-02 1.85e-02 30 3.83e+01 3.44e+00 6.97e+02 3.71e-02 1.81e-02 31 3.78e+01 3.47e+00 6.87e+02 3.55e-02 1.77e-02 32 3.74e+01 3.50e+00 6.79e+02 3.40e-02 1.70e-02 33 3.71e+01 3.53e+00 6.71e+02 3.27e-02 1.63e-02 34 3.68e+01 3.55e+00 6.64e+02 3.15e-02 1.55e-02 35 3.64e+01 3.57e+00 6.57e+02 3.04e-02 1.48e-02 36 3.60e+01 3.59e+00 6.49e+02 2.93e-02 1.42e-02 37 3.56e+01 3.61e+00 6.39e+02 2.82e-02 1.37e-02 38 3.51e+01 3.63e+00 6.29e+02 2.71e-02 1.34e-02 39 3.46e+01 3.66e+00 6.19e+02 2.60e-02 1.30e-02 40 3.42e+01 3.68e+00 6.10e+02 2.50e-02 1.26e-02 41 3.38e+01 3.70e+00 6.03e+02 2.41e-02 1.22e-02 42 3.36e+01 3.73e+00 5.97e+02 2.33e-02 1.17e-02 43 3.33e+01 3.75e+00 5.91e+02 2.26e-02 1.13e-02 44 3.31e+01 3.77e+00 5.86e+02 2.19e-02 1.09e-02 45 3.28e+01 3.79e+00 5.80e+02 2.12e-02 1.06e-02 46 3.25e+01 3.81e+00 5.74e+02 2.05e-02 1.04e-02 47 3.23e+01 3.83e+00 5.68e+02 1.99e-02 1.01e-02 48 3.20e+01 3.85e+00 5.64e+02 1.93e-02 9.82e-03 49 3.18e+01 3.87e+00 5.59e+02 1.88e-02 9.54e-03 50 3.17e+01 3.88e+00 5.56e+02 1.83e-02 9.22e-03 51 3.15e+01 3.90e+00 5.52e+02 1.78e-02 8.96e-03 52 3.13e+01 3.91e+00 5.48e+02 1.73e-02 8.72e-03 53 3.11e+01 3.93e+00 5.43e+02 1.68e-02 8.53e-03 54 3.09e+01 3.94e+00 5.39e+02 1.63e-02 8.38e-03 55 3.07e+01 3.95e+00 5.35e+02 1.59e-02 8.21e-03 56 3.05e+01 3.97e+00 5.32e+02 1.55e-02 8.04e-03 57 3.04e+01 3.98e+00 5.29e+02 1.51e-02 7.81e-03 58 3.03e+01 3.99e+00 5.26e+02 1.47e-02 7.58e-03 59 3.02e+01 4.00e+00 5.23e+02 1.43e-02 7.38e-03 60 3.00e+01 4.01e+00 5.21e+02 1.40e-02 7.20e-03 61 2.99e+01 4.02e+00 5.18e+02 1.36e-02 7.04e-03 62 2.98e+01 4.03e+00 5.15e+02 1.33e-02 6.89e-03 63 2.96e+01 4.04e+00 5.12e+02 1.30e-02 6.73e-03 64 2.95e+01 4.05e+00 5.09e+02 1.27e-02 6.54e-03 65 2.94e+01 4.06e+00 5.07e+02 1.25e-02 6.37e-03 66 2.93e+01 4.07e+00 5.04e+02 1.22e-02 6.24e-03 67 2.92e+01 4.08e+00 5.01e+02 1.19e-02 6.11e-03 68 2.90e+01 4.09e+00 4.99e+02 1.16e-02 6.04e-03 69 2.89e+01 4.10e+00 4.96e+02 1.14e-02 5.95e-03 70 2.88e+01 4.11e+00 4.93e+02 1.11e-02 5.86e-03 71 2.86e+01 4.11e+00 4.91e+02 1.09e-02 5.74e-03 72 2.86e+01 4.12e+00 4.89e+02 1.07e-02 5.60e-03 73 2.85e+01 4.13e+00 4.87e+02 1.04e-02 5.45e-03 74 2.84e+01 4.13e+00 4.85e+02 1.02e-02 5.31e-03 75 2.83e+01 4.14e+00 4.83e+02 1.00e-02 5.19e-03 76 2.82e+01 4.15e+00 4.81e+02 9.81e-03 5.09e-03 77 2.81e+01 4.15e+00 4.79e+02 9.61e-03 5.00e-03 78 2.80e+01 4.16e+00 4.76e+02 9.41e-03 4.93e-03 79 2.79e+01 4.17e+00 4.74e+02 9.21e-03 4.85e-03 80 2.78e+01 4.17e+00 4.72e+02 9.03e-03 4.75e-03 81 2.77e+01 4.18e+00 4.70e+02 8.85e-03 4.65e-03 82 2.76e+01 4.18e+00 4.68e+02 8.68e-03 4.56e-03 83 2.75e+01 4.19e+00 4.67e+02 8.51e-03 4.47e-03 84 2.74e+01 4.20e+00 4.65e+02 8.34e-03 4.40e-03 85 2.74e+01 4.20e+00 4.63e+02 8.18e-03 4.32e-03 86 2.73e+01 4.21e+00 4.61e+02 8.02e-03 4.24e-03 87 2.72e+01 4.21e+00 4.60e+02 7.87e-03 4.16e-03 88 2.71e+01 4.22e+00 4.58e+02 7.73e-03 4.09e-03 89 2.70e+01 4.22e+00 4.56e+02 7.58e-03 4.02e-03 90 2.70e+01 4.23e+00 4.55e+02 7.44e-03 3.94e-03 91 2.69e+01 4.23e+00 4.53e+02 7.30e-03 3.88e-03 92 2.68e+01 4.24e+00 4.52e+02 7.17e-03 3.81e-03 93 2.67e+01 4.24e+00 4.50e+02 7.04e-03 3.75e-03 94 2.67e+01 4.25e+00 4.49e+02 6.91e-03 3.69e-03 95 2.66e+01 4.25e+00 4.47e+02 6.79e-03 3.63e-03 96 2.66e+01 4.26e+00 4.46e+02 6.67e-03 3.56e-03 97 2.65e+01 4.26e+00 4.45e+02 6.56e-03 3.50e-03 98 2.65e+01 4.26e+00 4.44e+02 6.45e-03 3.42e-03 99 2.64e+01 4.27e+00 4.43e+02 6.33e-03 3.36e-03 100 2.64e+01 4.27e+00 4.42e+02 6.22e-03 3.30e-03 101 2.63e+01 4.27e+00 4.41e+02 6.11e-03 3.25e-03 102 2.63e+01 4.28e+00 4.40e+02 6.00e-03 3.21e-03 103 2.62e+01 4.28e+00 4.39e+02 5.90e-03 3.17e-03 104 2.62e+01 4.28e+00 4.37e+02 5.79e-03 3.12e-03 105 2.61e+01 4.29e+00 4.36e+02 5.70e-03 3.07e-03 106 2.61e+01 4.29e+00 4.35e+02 5.60e-03 3.01e-03 107 2.60e+01 4.29e+00 4.34e+02 5.51e-03 2.97e-03 108 2.59e+01 4.29e+00 4.33e+02 5.42e-03 2.91e-03 109 2.59e+01 4.30e+00 4.32e+02 5.33e-03 2.86e-03 110 2.59e+01 4.30e+00 4.31e+02 5.24e-03 2.81e-03 111 2.58e+01 4.30e+00 4.30e+02 5.16e-03 2.75e-03 112 2.58e+01 4.31e+00 4.29e+02 5.08e-03 2.70e-03 113 2.57e+01 4.31e+00 4.29e+02 5.00e-03 2.64e-03 114 2.57e+01 4.31e+00 4.28e+02 4.92e-03 2.59e-03 ------------------------------------------------------
Initialise and run parallel CSC solver using ADMM dictionary partition method [25].
opt_par = parcbpdn.ParConvBPDN.Options({'Verbose': True, 'MaxMainIter': 200,
'RelStopTol': 1e-2, 'AuxVarObj': False, 'AutoRho':
{'Enabled': False}, 'alpha': 2.5})
b_par = parcbpdn.ParConvBPDN(D, sh, lmbda, opt=opt_par, dimK=0)
X_par = b_par.solve()
Itn Fnc DFid Regl1 r s ------------------------------------------------------ 0 3.72e+02 2.06e+02 3.32e+03 2.95e+00 2.95e+00 1 1.18e+02 1.21e+01 2.12e+03 2.21e+00 2.19e+00 2 1.48e+02 3.59e+01 2.24e+03 1.78e+00 1.89e+00 3 1.14e+02 1.90e+01 1.90e+03 1.52e+00 1.95e+00 4 9.07e+01 3.16e+00 1.75e+03 1.32e+00 1.63e+00 5 9.10e+01 1.22e+01 1.58e+03 1.13e+00 1.43e+00 6 7.77e+01 2.90e+00 1.50e+03 1.00e+00 1.29e+00 7 7.58e+01 7.08e+00 1.37e+03 8.96e-01 1.17e+00 8 6.94e+01 3.45e+00 1.32e+03 8.10e-01 1.07e+00 9 6.78e+01 5.35e+00 1.25e+03 7.41e-01 9.87e-01 10 6.39e+01 3.93e+00 1.20e+03 6.83e-01 9.16e-01 11 6.27e+01 5.04e+00 1.15e+03 6.33e-01 8.50e-01 12 5.95e+01 4.30e+00 1.10e+03 5.90e-01 7.91e-01 13 5.78e+01 4.86e+00 1.06e+03 5.51e-01 7.42e-01 14 5.53e+01 4.46e+00 1.02e+03 5.17e-01 7.00e-01 15 5.38e+01 4.75e+00 9.81e+02 4.85e-01 6.59e-01 16 5.18e+01 4.52e+00 9.46e+02 4.58e-01 6.21e-01 17 5.03e+01 4.65e+00 9.14e+02 4.33e-01 5.87e-01 18 4.87e+01 4.53e+00 8.83e+02 4.10e-01 5.57e-01 19 4.75e+01 4.59e+00 8.58e+02 3.89e-01 5.32e-01 20 4.64e+01 4.53e+00 8.37e+02 3.71e-01 5.08e-01 21 4.55e+01 4.59e+00 8.18e+02 3.54e-01 4.84e-01 22 4.45e+01 4.59e+00 7.99e+02 3.38e-01 4.61e-01 23 4.37e+01 4.62e+00 7.81e+02 3.24e-01 4.43e-01 24 4.30e+01 4.61e+00 7.67e+02 3.10e-01 4.25e-01 25 4.23e+01 4.63e+00 7.53e+02 2.98e-01 4.07e-01 26 4.16e+01 4.63e+00 7.38e+02 2.86e-01 3.91e-01 27 4.08e+01 4.63e+00 7.24e+02 2.75e-01 3.77e-01 28 4.02e+01 4.62e+00 7.12e+02 2.65e-01 3.63e-01 29 3.96e+01 4.62e+00 7.00e+02 2.55e-01 3.50e-01 30 3.91e+01 4.61e+00 6.89e+02 2.46e-01 3.36e-01 31 3.85e+01 4.60e+00 6.77e+02 2.38e-01 3.25e-01 32 3.79e+01 4.59e+00 6.66e+02 2.29e-01 3.16e-01 33 3.74e+01 4.59e+00 6.56e+02 2.22e-01 3.06e-01 34 3.70e+01 4.57e+00 6.48e+02 2.15e-01 2.96e-01 35 3.66e+01 4.56e+00 6.40e+02 2.08e-01 2.86e-01 36 3.61e+01 4.56e+00 6.31e+02 2.01e-01 2.77e-01 37 3.57e+01 4.55e+00 6.22e+02 1.95e-01 2.68e-01 38 3.53e+01 4.55e+00 6.14e+02 1.89e-01 2.60e-01 39 3.49e+01 4.55e+00 6.07e+02 1.83e-01 2.52e-01 40 3.45e+01 4.54e+00 5.99e+02 1.78e-01 2.45e-01 41 3.41e+01 4.54e+00 5.92e+02 1.72e-01 2.38e-01 42 3.38e+01 4.54e+00 5.85e+02 1.67e-01 2.31e-01 43 3.35e+01 4.54e+00 5.79e+02 1.63e-01 2.25e-01 44 3.32e+01 4.54e+00 5.73e+02 1.58e-01 2.18e-01 45 3.29e+01 4.54e+00 5.67e+02 1.54e-01 2.13e-01 46 3.26e+01 4.53e+00 5.61e+02 1.49e-01 2.07e-01 47 3.23e+01 4.53e+00 5.56e+02 1.45e-01 2.02e-01 48 3.21e+01 4.53e+00 5.51e+02 1.42e-01 1.97e-01 49 3.19e+01 4.53e+00 5.47e+02 1.38e-01 1.92e-01 50 3.16e+01 4.53e+00 5.42e+02 1.34e-01 1.87e-01 51 3.14e+01 4.54e+00 5.37e+02 1.31e-01 1.82e-01 52 3.11e+01 4.54e+00 5.32e+02 1.28e-01 1.78e-01 53 3.09e+01 4.53e+00 5.28e+02 1.24e-01 1.74e-01 54 3.07e+01 4.53e+00 5.24e+02 1.21e-01 1.70e-01 55 3.05e+01 4.52e+00 5.20e+02 1.18e-01 1.65e-01 56 3.03e+01 4.52e+00 5.17e+02 1.15e-01 1.61e-01 57 3.02e+01 4.52e+00 5.13e+02 1.13e-01 1.58e-01 58 3.00e+01 4.52e+00 5.09e+02 1.10e-01 1.54e-01 59 2.98e+01 4.52e+00 5.05e+02 1.07e-01 1.51e-01 60 2.96e+01 4.52e+00 5.02e+02 1.05e-01 1.48e-01 61 2.95e+01 4.52e+00 4.99e+02 1.03e-01 1.44e-01 62 2.93e+01 4.52e+00 4.96e+02 1.00e-01 1.41e-01 63 2.92e+01 4.52e+00 4.93e+02 9.80e-02 1.38e-01 64 2.90e+01 4.51e+00 4.90e+02 9.58e-02 1.36e-01 65 2.89e+01 4.51e+00 4.87e+02 9.37e-02 1.33e-01 66 2.87e+01 4.51e+00 4.85e+02 9.17e-02 1.30e-01 67 2.86e+01 4.51e+00 4.82e+02 8.97e-02 1.27e-01 68 2.84e+01 4.51e+00 4.79e+02 8.77e-02 1.24e-01 69 2.83e+01 4.51e+00 4.76e+02 8.59e-02 1.22e-01 70 2.82e+01 4.51e+00 4.74e+02 8.41e-02 1.20e-01 71 2.81e+01 4.50e+00 4.71e+02 8.23e-02 1.17e-01 72 2.79e+01 4.50e+00 4.69e+02 8.06e-02 1.15e-01 73 2.78e+01 4.50e+00 4.66e+02 7.90e-02 1.13e-01 74 2.77e+01 4.50e+00 4.64e+02 7.74e-02 1.11e-01 75 2.76e+01 4.50e+00 4.63e+02 7.59e-02 1.09e-01 76 2.75e+01 4.50e+00 4.60e+02 7.44e-02 1.07e-01 77 2.74e+01 4.50e+00 4.58e+02 7.30e-02 1.05e-01 78 2.73e+01 4.50e+00 4.56e+02 7.15e-02 1.03e-01 79 2.72e+01 4.50e+00 4.54e+02 7.02e-02 1.01e-01 80 2.71e+01 4.49e+00 4.53e+02 6.88e-02 9.92e-02 81 2.70e+01 4.49e+00 4.51e+02 6.75e-02 9.73e-02 82 2.69e+01 4.49e+00 4.49e+02 6.62e-02 9.57e-02 83 2.68e+01 4.49e+00 4.47e+02 6.50e-02 9.43e-02 84 2.67e+01 4.49e+00 4.45e+02 6.38e-02 9.29e-02 85 2.67e+01 4.49e+00 4.44e+02 6.26e-02 9.11e-02 86 2.66e+01 4.49e+00 4.42e+02 6.15e-02 8.94e-02 87 2.65e+01 4.49e+00 4.41e+02 6.04e-02 8.79e-02 88 2.64e+01 4.49e+00 4.39e+02 5.94e-02 8.67e-02 89 2.64e+01 4.49e+00 4.37e+02 5.83e-02 8.55e-02 90 2.63e+01 4.49e+00 4.36e+02 5.73e-02 8.41e-02 91 2.62e+01 4.49e+00 4.35e+02 5.63e-02 8.27e-02 92 2.62e+01 4.49e+00 4.34e+02 5.54e-02 8.13e-02 93 2.61e+01 4.49e+00 4.32e+02 5.44e-02 8.01e-02 94 2.60e+01 4.49e+00 4.31e+02 5.35e-02 7.90e-02 95 2.60e+01 4.48e+00 4.30e+02 5.26e-02 7.77e-02 96 2.59e+01 4.48e+00 4.29e+02 5.18e-02 7.65e-02 97 2.59e+01 4.48e+00 4.28e+02 5.09e-02 7.54e-02 98 2.58e+01 4.48e+00 4.26e+02 5.01e-02 7.44e-02 ------------------------------------------------------
Report runtimes of different methods of solving the same problem.
print("ConvBPDN solve time: %.2fs" % b.timer.elapsed('solve_wo_rsdl'))
print("ParConvBPDN solve time: %.2fs" % b_par.timer.elapsed('solve_wo_rsdl'))
print("ParConvBPDN was %.2f times faster than ConvBPDN\n" %
(b.timer.elapsed('solve_wo_rsdl')/b_par.timer.elapsed('solve_wo_rsdl')))
ConvBPDN solve time: 112.36s ParConvBPDN solve time: 23.51s ParConvBPDN was 4.78 times faster than ConvBPDN
Reconstruct images from sparse representations.
shr = b.reconstruct().squeeze()
imgr = sl + shr
shr_par = b_par.reconstruct().squeeze()
imgr_par = sl + shr_par
Report performances of different methods of solving the same problem.
print("Serial reconstruction PSNR: %.2fdB" % sm.psnr(img, imgr))
print("Parallel reconstruction PSNR: %.2fdB\n" % sm.psnr(img, imgr_par))
Serial reconstruction PSNR: 38.25dB Parallel reconstruction PSNR: 38.40dB
Display original and reconstructed images.
fig = plot.figure(figsize=(21, 7))
plot.subplot(1, 3, 1)
plot.imview(img, title='Original', fig=fig)
plot.subplot(1, 3, 2)
plot.imview(imgr, title=('Serial Reconstruction PSNR: %5.2f dB' %
sm.psnr(img, imgr)), fig=fig)
plot.subplot(1, 3, 3)
plot.imview(imgr_par, title=('Parallel Reconstruction PSNR: %5.2f dB' %
sm.psnr(img, imgr_par)), fig=fig)
fig.show()
Display low pass component and sum of absolute values of coefficient maps of highpass component.
fig = plot.figure(figsize=(21, 7))
plot.subplot(1, 3, 1)
plot.imview(sl, title='Lowpass component', fig=fig)
plot.subplot(1, 3, 2)
plot.imview(np.sum(abs(X), axis=b.cri.axisM).squeeze(),
cmap=plot.cm.Blues, title='Serial Sparse Representation',
fig=fig)
plot.subplot(1, 3, 3)
plot.imview(np.sum(abs(X_par), axis=b.cri.axisM).squeeze(),
cmap=plot.cm.Blues, title='Parallel Sparse Representation',
fig=fig)
fig.show()