zoukankan      html  css  js  c++  java
  • 【机器学习实战】01——IRLS in paper Automatic watermark detection and removal

    References:

    1.Automatic watermark detection and removal

    2.矩阵求导解最小二乘问题

    3.IRLS WIKI Encyclopedia

    4.Image Gradient WIKI

    5.OpenCV Image Gradients

    6.矩阵求导

     接2证明带权重的IRLS

    Background:

    简述一下本文的大致思路,加了水印的图像由原图、水印、α蒙版值三部分构成:J = α*W + (1 - α) * I

    引入梯度,自然图像相邻像素间变化平缓,因此梯度期望为0 

     known property of natural image gradients to be sparse, i.e., the chance of having strong gradients at the same pixel location in multiple images is small. Hence, E [∇Ik] ≈ 0. 

    Optimization:

    where is a robust function that approximates L1 distance (p is omitted for brevity).The terms Ereg(∇I) and Ereg(∇W) are regularization terms that encourage the reconstructed images and the watermark to be piecewise smooth where the gradients of the alpha matte are strong.

     

     对最优化方程化简

    在求解过程中,分两次用IRLS。其一,更新I,W;其二,更新α。

    详细介绍第一步。

     

    # robust function
    def Func_Phi(X, epsilon=1e-3):
        return np.sqrt(X + epsilon**2)
    
    def Func_Phi_deriv(X, epsilon=1e-3):
        return 0.5/Func_Phi(X, epsilon) 

    因为引入了鲁棒函数 phi()以接近L1 distance, 故此时我们的p值为1。每次迭代的权值w为 1/(2*sqrt(X+0.001^2))

    *本文中全部输入矩阵均为np.diags(matrix.reshape(-1))构造,即均为对角矩阵

                phi_data = diags( Func_Phi_deriv(np.square(alpha*Wk[i] + (1-alpha)*Ik[i] - J[i]).reshape(-1)) )
                phi_W = diags( Func_Phi_deriv(np.square( np.abs(alpha_gx)*Wkx + np.abs(alpha_gy)*Wky  ).reshape(-1)) )
                phi_I = diags( Func_Phi_deriv(np.square( np.abs(alpha_gx)*Ikx + np.abs(alpha_gy)*Iky  ).reshape(-1)) )
                phi_f = diags( Func_Phi_deriv( ((Wm_gx - alphaWk_gx)**2 + (Wm_gy - alphaWk_gy)**2 ).reshape(-1)) )
                phi_aux = diags( Func_Phi_deriv(np.square(Wk[i] - W).reshape(-1)) )
                # E_reg_deta_I
                phi_rI = diags( Func_Phi_deriv( np.abs(alpha_gx)*(Ikx**2) + np.abs(alpha_gy)*(Iky**2) ).reshape(-1) )
                # E_reg_deta_W
                phi_rW = diags( Func_Phi_deriv( np.abs(alpha_gx)*(Wkx**2) + np.abs(alpha_gy)*(Wky**2) ).reshape(-1) )
                # sobel^T * c * E_reg_I * sobel
                L_i = sobelx.T.dot(cx*phi_rI).dot(sobelx) + sobely.T.dot(cy*phi_rI).dot(sobely)
                # sobel^T * c *E_reg_W * sobel
                L_w = sobelx.T.dot(cx*phi_rW).dot(sobelx) + sobely.T.dot(cy*phi_rW).dot(sobely)
                # sobel^T * E_f * sobel
                L_f = sobelx.T.dot(phi_f).dot(sobelx) + sobely.T.dot(phi_f).dot(sobely)
                # alpha^T * L_f * alpha + gamma * E_aux
                A_f = alpha_diag.T.dot(L_f).dot(alpha_diag) + gamma*phi_aux
    
                bW = alpha_diag.dot(phi_data).dot(J[i].reshape(-1)) + beta*L_f.dot(W_m.reshape(-1)) + gamma*phi_aux.dot(W.reshape(-1))
                # (1-alpha) * E_data * J
                bI = alpha_bar_diag.dot(phi_data).dot(J[i].reshape(-1))
    
                A = vstack([hstack([(alpha_diag**2)*phi_data + lambda_w*L_w + beta*A_f, alpha_diag*alpha_bar_diag*phi_data]), 
                             hstack([alpha_diag*alpha_bar_diag*phi_data, (alpha_bar_diag**2)*phi_data + lambda_i*L_i])]).tocsr()
    
                b = np.hstack([bW, bI])
                x = linalg.spsolve(A, b)
                # Solve the sparse linear system Ax=b jointly to get WK IK
                Wk[i] = x[:size].reshape(m, n, p)
                Ik[i] = x[size:].reshape(m, n, p)

     

     将inverse matrix消去,左右同左乘XTWX。得到 XTWXβ = XTWy。

    以E_data项为例, αW + (1 - α)I = J 

     bW = alpha_diag.dot(phi_data).dot(J[i].reshape(-1)) + beta*L_f.dot(W_m.reshape(-1)) + gamma*phi_aux.dot(W.reshape(-1))
     bI = alpha_bar_diag.dot(phi_data).dot(J[i].reshape(-1))

     b 指代XTWy,其中y为原图J,对于IK,1-α为其X(其中据帧均有np.diags()构造),E_data为其W;

     

    phi_f = diags( Func_Phi_deriv( ((Wm_gx - alphaWk_gx)**2 + (Wm_gy - alphaWk_gy)**2 ).reshape(-1)) 

    L_f = sobelx.T.dot(phi_f).dot(sobelx) + sobely.T.dot(phi_f).dot(sobely)
    bW = alpha_diag.dot(phi_data).dot(J[i].reshape(-1)) + beta*L_f.dot(W_m.reshape(-1)) + gamma*phi_aux.dot(W.reshape(-1))

    sobel as gradient image,除了与IK相似的项以外,对于WK多了两项E_f,E_aux要复杂一点。(对于E_f因为构造L_f是按β左部构造,故要dot W_m消去)

    L_i = sobelx.T.dot(cx*phi_rI).dot(sobelx) + sobely.T.dot(cy*phi_rI).dot(sobely)
    L_w = sobelx.T.dot(cx*phi_rW).dot(sobelx) + sobely.T.dot(cy*phi_rW).dot(sobely)
    L_f = sobelx.T.dot(phi_f).dot(sobelx) + sobely.T.dot(phi_f).dot(sobely)
    A_f = alpha_diag.T.dot(L_f).dot(alpha_diag) + gamma*phi_aux

    A = vstack([hstack([(alpha_diag**2)*phi_data + lambda_w*L_w + beta*A_f, alpha_diag*alpha_bar_diag*phi_data]), hstack([alpha_diag*alpha_bar_diag*phi_data, (alpha_bar_diag**2)*phi_data + lambda_i*L_i])]).tocsr()

    A指代XTWX ,因为Edata是二元线性涉及联合求解,过程如下。根据矩阵性质可得,其他系数要放在主对角线上

    以下为带权重的推导

     

  • 相关阅读:
    HTML学习笔记1
    hadoop的eclipse连接-PC端
    eclipse的菜单栏消失问题解决
    Hadoop的wordcount代码实现
    《机器学习》阅读进度记录
    《金粉世家》
    ubuntu下构建服务器环境-PC 端
    ubuntu安装chrome-PC端
    Discovering-论文
    矩阵取数游戏【NOIP】
  • 原文地址:https://www.cnblogs.com/yuelien/p/12758040.html
Copyright © 2011-2022 走看看