মতলব-এ অনুকূল ট্রান্সপোর্ট ওয়ার্পিং বাস্তবায়ন


11

আমি " নিবন্ধকরণ এবং ওয়ার্পিংয়ের জন্য অনুকূল গণ পরিবহণ " পত্রিকাটি বাস্তবায়ন করছি , আমার লক্ষ্য এটি অনলাইনে রাখার কারণ আমি অনলাইনে কোনও ইউলরিয়ান ভর পরিবহন কোড খুঁজে পাচ্ছি না এবং কমপক্ষে চিত্র প্রক্রিয়াকরণে গবেষণা সম্প্রদায়ের পক্ষে এটি আকর্ষণীয় হবে।

নিম্নরূপ কাগজ সংক্ষিপ্ত করা যেতে পারে:
- ইনিশিয়াল মানচিত্র খুঁজে তোমার দর্শন লগ করা বরাবর x এবং y স্থানাঙ্ক 1D হিস্টোগ্রাম matchings ব্যবহার
- নির্দিষ্ট পয়েন্টের জন্য সমাধান তোমার দর্শন লগ করাটি=1μ0ডিতোমার দর্শন লগ করা-1আমিবনাম(তোমার দর্শন লগ করা), যেখানেতোমার দর্শন লগ করা90 90 ডিগ্রি ঘড়ির কাঁটার বিপরীতেঘুরছেন,ডাইরিচলেটসীমানা শর্ত (= 0), এবংডিসহ পোয়েসন সমীকরণের সমাধানের জন্যআপনিজ্যাকবীয় ম্যাট্রিক্সের নির্ধারক। - স্থিরতা একটি টাইমস্টেপজন্য গ্যারান্টিযুক্ত-1ডিতোমার দর্শন লগ করা
টি<সর্বনিম্ন|1μ0-1আমিবনাম(তোমার দর্শন লগ করা)|

সংখ্যাসূচক সিমুলেশনগুলির জন্য (একটি নিয়মিত গ্রিডে সম্পাদিত), তারা পোষন সমীকরণ সমাধানের জন্য মতলবের পোইলিক ব্যবহার করে, তারা স্থানিক ডেরাইভেটিভগুলির জন্য কেন্দ্রিক সীমাবদ্ধ পার্থক্য ব্যবহার করে, ব্যতীত যা একটি আপুইন্ড স্কিম ব্যবহার করে গণনা করা হয়।ডিতোমার দর্শন লগ করা

আমার কোডটি ব্যবহার করে, ম্যাপিংয়ের শক্তি কার্যকরী এবং কার্ল সঠিকভাবে কয়েক বার পুনরাবৃত্তির জন্য হ্রাস পাচ্ছে (সময়ের ধাপের উপর নির্ভর করে কয়েক দশক থেকে কয়েক হাজারে)। কিন্তু তার পরে, সিমুলেশনটি বিস্ফোরিত হয়: খুব কম পুনরাবৃত্তিতে একটি এনএএন পৌঁছাতে শক্তি বৃদ্ধি পায়। আমি পার্থক্য এবং সংহতকরণের জন্য বেশ কয়েকটি অর্ডার চেষ্টা করেছি (কাম্পট্রপজে উচ্চতর অর্ডার প্রতিস্থাপনটি এখানে পাওয়া যাবে ) এবং বিভিন্ন অন্তরোলকরণ স্কিম, তবে আমি সর্বদা একই সমস্যাটি পাই (এমনকি খুব মসৃণ চিত্রগুলিতেও, সর্বত্র শূন্য নয় এমন ইত্যাদি) etc.
যে কেউ কোডটি এবং / অথবা আমি যে তাত্ত্বিক সমস্যার মুখোমুখি হচ্ছি তা দেখতে আগ্রহী হবেন? কোড বরং সংক্ষিপ্ত।

গ্রেডিয়েন্ট 2 () এর শেষে গ্রেডিয়েন্ট () দ্বারা প্রতিস্থাপন করুন। এটি একটি উচ্চতর অর্ডার গ্রেডিয়েন্ট ছিল তবে জিনিসগুলির সমাধানও করে না।

আমি কেবলমাত্র আপাতত কাগজের অনুকূল পরিবহণ অংশে আগ্রহী, অতিরিক্ত নিয়মিতকরণের মেয়াদ নয়।

ধন্যবাদ!

উত্তর:


5

আমার ভাল বন্ধু পাসকাল কয়েক বছর আগে এটি তৈরি করেছিল (এটি প্রায় মতলবতে):

#! /usr/bin/env python

#from scipy.interpolate import interpolate
from pylab import *
from numpy import *


def GaussianFilter(sigma,f):
    """Apply Gaussian filter to an image"""
    if sigma > 0:
        n = ceil(4*sigma)
        g = exp(-arange(-n,n+1)**2/(2*sigma**2))
        g = g/g.sum()

        fg = zeros(f.shape)

        for i in range(f.shape[0]):
            fg[i,:] = convolve(f[i,:],g,'same')
        for i in range(f.shape[1]):
            fg[:,i] = convolve(fg[:,i],g,'same')
    else:
        fg = f

    return fg


def clamp(x,xmin,xmax):
    """Clamp values between xmin and xmax"""
    return minimum(maximum(x,xmin),xmax)


def myinterp(f,xi,yi):
    """My bilinear interpolator (scipy's has a segfault)"""
    M,N = f.shape
    ix0 = clamp(floor(xi),0,N-2).astype(int)
    iy0 = clamp(floor(yi),0,M-2).astype(int)
    wx = xi - ix0
    wy = yi - iy0
    return ( (1-wy)*((1-wx)*f[iy0,ix0] + wx*f[iy0,ix0+1]) +
        wy*((1-wx)*f[iy0+1,ix0] + wx*f[iy0+1,ix0+1]) )


def mkwarp(f1,f2,sigma,phi,showplot=0):
    """Image warping by solving the Monge-Kantorovich problem"""
    M,N = f1.shape[:2]

    alpha = 1
    f1 = GaussianFilter(sigma,f1)
    f2 = GaussianFilter(sigma,f2)

    # Shift indices for going from vertices to cell centers
    iUv = arange(M)             # Up
    iDv = arange(1,M+1)         # Down
    iLv = arange(N)             # Left
    iRv = arange(1,N+1)         # Right
    # Shift indices for cell centers (to cell centers)
    iUc = r_[0,arange(M-1)]
    iDc = r_[arange(1,M),M-1]
    iLc = r_[0,arange(N-1)]
    iRc = r_[arange(1,N),N-1]
    # Shifts for going from centers to vertices
    iUi = r_[0,arange(M)]
    iDi = r_[arange(M),M-1]
    iLi = r_[0,arange(N)]
    iRi = r_[arange(N),N-1]


    ### The main gradient descent loop ###      
    for iter in range(0,30):
        ### Approximate derivatives ###
        # Compute gradient phix and phiy at pixel centers.  Array phi has values
        # at the pixel vertices.
        phix = (phi[iUv,:][:,iRv] - phi[iUv,:][:,iLv] + 
            phi[iDv,:][:,iRv] - phi[iDv,:][:,iLv])/2
        phiy = (phi[iDv,:][:,iLv] - phi[iUv,:][:,iLv] + 
            phi[iDv,:][:,iRv] - phi[iUv,:][:,iRv])/2
        # Compute second derivatives at pixel centers using central differences.
        phixx = (phix[:,iRc] - phix[:,iLc])/2
        phixy = (phix[iDc,:] - phix[iUc,:])/2
        phiyy = (phiy[iDc,:] - phiy[iUc,:])/2
        # Hessian determinant
        detD2 = phixx*phiyy - phixy*phixy

        # Interpolate f2 at (phix,phiy) with bilinear interpolation
        f2gphi = myinterp(f2,phix,phiy)

        ### Update phi ###
        # Compute M'(phi) at pixel centers
        dM = alpha*(f1 - f2gphi*detD2)
        # Interpolate to pixel vertices
        phi = phi - (dM[iUi,:][:,iLi] + 
            dM[iDi,:][:,iLi] + 
            dM[iUi,:][:,iRi] + 
            dM[iDi,:][:,iRi])/4


    ### Plot stuff ###      
    if showplot:
        pad = 2
        x,y = meshgrid(arange(N),arange(M))
        x = x[pad:-pad,:][:,pad:-pad]
        y = y[pad:-pad,:][:,pad:-pad]
        phix = phix[pad:-pad,:][:,pad:-pad]
        phiy = phiy[pad:-pad,:][:,pad:-pad]

        # Vector plot of the mapping
        subplot(1,2,1)
        quiver(x,y,flipud(phix-x),-flipud(phiy-y))
        axis('image')
        axis('off')
        title('Mapping')

        # Grayscale plot of mapping divergence
        subplot(1,2,2)  
        divs = phixx + phiyy # Divergence of mapping s(x)
        imshow(divs[pad:-pad,pad:-pad],cmap=cm.gray)
        axis('off')
        title('Divergence of Mapping')
        show()

    return phi


if __name__ == "__main__":  # Demo
    from pylab import *
    from numpy import * 

    f1 = imread('brain-tumor.png')
    f2 = imread('brain-healthy.png')
    f1 = f1[:,:,1]
    f2 = f2[:,:,1]

    # Initialize phi as the identity map
    M,N = f1.shape
    n,m = meshgrid(arange(N+1),arange(M+1))
    phi = ((m-0.5)**2 + (n-0.5)**2)/2

    sigma = 3
    phi = mkwarp(f1,f2,sigma,phi)
    phi = mkwarp(f1,f2,sigma/2,phi,1)
#   phi = mkwarp(f1,f2,sigma/4,phi,1)

টেস্ট রান, প্রায় 2 সেকেন্ড সময় নেয়।

গ্রেডিয়েন্ট বংশদ্ভুত পদ্ধতির এখানে ব্যাখ্যা করা হয়: people.clarkson.edu/~ebollt/Papers/quadcost.pdf


চমৎকার .. অনেক অনেক ধন্যবাদ! আমি এই কোডটি চেষ্টা করব এবং আমার ত্রুটিগুলি পরীক্ষা করার জন্য আমার সাথে তুলনা করব। এই পদ্ধতিরটিকে হ্যাকার এট আল দ্বারা কাগজের স্থানীয় সংস্করণ বলে মনে হচ্ছে। যা আমি উল্লেখ করেছি - অর্থাত্ কোনও ল্যালক্যাসিয়ানকে সমাধান না করে। আবার ধন্যবাদ !
হোয়াইটআংল

অবশেষে এই কোডটি নিয়ে আমি বেশ কয়েকটি সমস্যার মুখোমুখি হচ্ছি ...: যদি আমি f 2 ( ϕ ) ডিফল গণনা করি2(φ)Detএইচφ1এইচ

আরও অস্পষ্টতা NaN সমস্যা সাহায্য করে?
dranxo

φ

ওহ, ভাল। আমি মনে করি. অস্পষ্টতা রয়েছে যেহেতু চিত্রগুলি স্বাভাবিকভাবেই অবিচ্ছিন্ন (প্রান্তগুলি) না থাকে এবং গ্রেডিয়েন্ট সমস্যাযুক্ত হবে। আশা করি আপনি খুব বেশি ঝাপসা না করে এখনও ভাল উত্তর পেয়ে যাচ্ছেন।
dranxo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.