Geometry Processingで学ぶSparse Matrix
Upcoming SlideShare
Loading in...5
×
 

Geometry Processingで学ぶSparse Matrix

on

  • 5,744 views

 

Statistics

Views

Total Views
5,744
Views on SlideShare
4,855
Embed Views
889

Actions

Likes
11
Downloads
43
Comments
0

5 Embeds 889

http://www.hidotech.com 725
https://twitter.com 156
http://webcache.googleusercontent.com 3
http://pinterest.com 3
http://us-w1.rockmelt.com 2

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Geometry Processingで学ぶSparse Matrix Geometry Processingで学ぶSparse Matrix Presentation Transcript

  • GEOMETRY PROCESSINGで学ぶ SPARSE MATRIX 2012/3/18 Tokyo.SciPy #3 齊藤 淳 Jun Saito @dukecyto
  • 本日の概要 Laplacian Mesh Processingを通じてsparse matrix一般、scipy.sparseの理解を深める !! = ! − !L !
  • Computer Graphics Animation (c) copyright 2008, Blender Foundation / www.bigbuckbunny.org
  • Computer Graphics Animation Modeling Animation Rendering•  作る •  動かす •  絵にする
  • SIGGRAPH 2011 Papers Categories Modeling Animation Rendering Images•  Understanding •  Capturing & •  Stochastic •  Drawing, Painting Shapes Modeling Humans Rendering & and Stylization•  Mapping & •  Facial Animation Visibility •  Tone Editing Warping Shapes •  Call Animal Control! •  Volumes & Photons •  By-Example Image•  Capturing •  Contact and •  Real-Time Synthesis Geometry and Constraints Rendering •  Image Processing Appearance •  Example-Based Hardware •  Video Resizing &•  Geometry Simulation •  Sampling & Noise Stabilization Processing •  Fluid Simulation •  Stereo & Disparity•  Discrete Differential •  Fast Simulation •  Interactive Image Geometry Editing•  Geometry •  Colorful Acquisition•  Surfaces•  Procedural & Interactive Modeling•  Fun With Shapes
  • SIGGRAPH 2011 Papers Categories Modeling Animation Rendering Images•  Understanding •  Capturing & •  Stochastic •  Drawing, Painting Shapes Modeling Humans Rendering & and Stylization•  Mapping & •  Facial Animation Visibility •  Tone Editing Warping Shapes •  Call Animal Control! •  Volumes & Photons •  By-Example Image•  Capturing •  Contact and •  Real-Time Synthesis Geometry and Constraints Rendering •  Image Processing Appearance •  Example-Based Hardware •  Video Resizing &•  Geometry Simulation •  Sampling & Noise Stabilization Processing •  Fluid Simulation •  Stereo & Disparity•  Discrete Differential •  Fast Simulation •  Interactive Image Geometry Editing•  Geometry •  Colorful Acquisition•  Surfaces•  Procedural & Interactive Modeling•  Fun With Shapes
  • Geometry Processingとは Geometry processing, or mesh processing, is a fast-growingarea of research that uses concepts from applied mathematics,computer science and engineering to design efficientalgorithms for the¨  acquisition¨  reconstruction¨  analysis¨  manipulation¨  simulation¨  transmissionof complex 3D models. http://en.wikipedia.org/wiki/Geometry_processing
  • Triangle Meshによる形状の表現
  • Differential Coordinates ¨  形状の局所的な特徴 ¤  方向は法線、大きさは平均曲率の近似 γ 1 1 δi = ∑ ( vi − v ) ∫γ ( vi − v ) ds di v∈N ( i ) len(γ ) v∈ Discrete Laplace-Beltrami operator Continuous Laplace-Beltrami operator [Sorkine 2005]
  • Discrete Laplace Operator “Majority of Applications contemporary geometry processing tools rely on Mesh Parameterization discrete Laplace Fairing / Smoothing operators” Denoising [Alexa 2011] Manipulation / Editing Compression Shape Analysis Physical Simulation
  • Laplacian Mesh Processing
  • Graph Laplacian(a.k.a. Uniform Laplacian, Topological Laplacian) http://en.wikipedia.org/wiki/Laplacian_matrix
  • Cotan-Weighted Laplacian 緑: Graph Laplacian赤: Cotan-Weighted Laplacian 1 1 !!! = cot !!" + cot !!" (!! − !! ) 4!(!! ) 2 !∈! ! [Sorkine 2005]
  • Stanford 3D Scan Repository ¨  Stanford Bunny ¤  頂点数: 35,947 ¤  35,947 x 35,947 = 1.2 G
  • Stanford 3D Scan Repository ¨  Dragon ¤  頂点数: 566,098 ¤  566,098 x 566,098 = 298G
  • 疎行列 Sparse Matrix 成分のほとんどがゼロである ことを活用した形式で行列を 記憶・演算 “Sparse matrices are widely used in scientific computation, especially in large-scale optimization, structural and circuit analysis, computational fluid dynamics, and, generally, the numerical solution of partial differential equations.” Sparse Matrices in MATLAB: Design and Implementation
  • 疎行列 Sparse Matrix 成分のほとんどがゼロである ことを活用した形式で行列を 記憶・演算 Laplacian Matrixは ¨  sparse ¨  symmetric ¨  positive semi-definite
  • Python Sparse Matrix Packages SciPy SparsePySparseCVXOPT
  • Python Sparse Matrix Packages SciPy SparsePySparseCVXOPT
  • From OpenOpt doc... “Unfortunately, sparse matrices stillremains one of most weak features inPython usage for scientific purposes”
  • From OpenOpt doc... “Unlike MATLAB, Octave, and a number of othersoftware, there is not standard Python library forsparse matrices: someone uses scipy.sparse, someonePySparse, someone (as CVXOPT) uses its own libraryand/or BLAS, someone just uses 3 columns (for thenumber indexes and value). SciPy developers refusedto author of scipy.sparse to include it into NumPy, Ithink its a big mistake, probably now it would been aunified standard. Still I hope in future numpy versionsdifference in API for handling sparse and densearrays will be removed. “
  • 基本的な流れ 構築に適した形 演算に適した形式式で行列を作る に変換し演算を行う A = lil_matrix((N,N))! A = A.tocsr()! A[i,j] = a! A = A.dot(D)! ! f = factorized(A)! x = f.solve(b)!
  • Graph Laplacian(a.k.a. Uniform Laplacian, Topological Laplacian) http://en.wikipedia.org/wiki/Laplacian_matrix
  • Graph Laplacian in scipy.sparse from scipy import sparse!!N = len(points)!L = sparse.lil_matrix((N, N))!for vids in faces:! L[vids, vids] = 1!D = sparse.spdiags(L.sum(axis=0), 0, N, N)!L = L.tocsc()-D!
  • Graph Laplacian in scipy.sparse from scipy import sparse!!N = len(points)!L = sparse.lil_matrix((N, N))!for vids in faces:! L[vids, vids] = 1!D = sparse.spdiags(L.sum(axis=0), 0, N, N)!L = L.tocsc()-D!
  • points and faces from Maya !import numpy as np!import pymel.core as pm!!mesh = pm.PyNode(‘bunny’)!points = np.array(mesh.getPoints())!faces = np.array(mesh.getVertices()! ! ! [1]).reshape(mesh.numFaces(),3)!
  • Graph Laplacian in scipy.sparse from scipy import sparse!!N = len(points)!L = sparse.lil_matrix((N, N))!for vids in faces:! L[vids, vids] = 1!D = sparse.spdiags(L.sum(axis=0), 0, N, N)!L = L.tocsc()-D!
  • Sparse Matrix Storage Formats 構築に適した形式 演算に適した形式¨  LIst of Lists ¨  Compressed Sparse (LIL) Row (CSR) ¨  Compressed Sparse¨  COOrdinate lists (COO) Column (CSC) ¨  Block Sparse Row¨  Dictionary Of Keys (BSR) (DOK) ¨  DIAgonal (DIA)
  • sparse.lil_matrixLIst of Lists (LIL) 形式 ¨  データ構造 ¨  利点 ¤  行毎に非ゼロ要素の ¤  柔軟なslice ソートされた列インデッ ¤  他のmatrix形式への変 クスを保持するarray 換が速い ¤  対応する非ゼロ要素の ¨  欠点 値も同様に保持 ¤  LIL+ LIL が遅い (CSR/¨  用途 CSC推奨) ¤  行列の構築用 ¤  column slicingが遅い ¤  巨大な行列を構築する (CSC推奨) 際にはCOOも検討する ¤  行列ベクトル積が遅い と良い (CSR/CSC推奨)
  • sparse.csr_matrixCompressed Sparse Rows (CSR)形式 ¨  CSC: 行と列が逆 ¨  利点¨  データ構造 ¤  高速な演算 CSR + CSR, CSR * CSR,等. ¤  Row slicingが速い ¤  行列ベクトル積が速い ¨  欠点 ¤  Column slicingが遅いA = [1 2 3 1 2 2 1] 非ゼロ要素リスト! (CSC推奨)(IA = [1 1 1 2 3 3 4] i行)!IA = [1 4 5 7] ! ¤  他のmatrix形式への変JA = [1 2 3 4 1 4 4] j列! 換が遅い (そうでもない?後述ベンチマーク参照)A, IA’, JAを保持 http://ja.wikipedia.org/wiki/%E7%96%8E%E8%A1%8C%E5%88%97
  • sparse.dia_matrixDIAgonal (DIA)形式 ¨  帯行列に適した形式¨  オフセットを指定可能>>> data = array([[1,2,3,4]]).repeat(3,axis=0)!>>> offsets = array([0,-1,2])!>>> dia_matrix( (data,offsets),shape=(4,4)).todense()!matrix([[1, 0, 3, 0],! [1, 2, 0, 4],! [0, 2, 3, 0],! [0, 0, 3, 4]])!
  • Sparse Matrix Format Benchmark:Construction Benchmark by modified bench_sparse.py in SciPy distribution
  • Sparse Matrix Format Benchmark:Conversion Benchmark by modified bench_sparse.py in SciPy distribution
  • Sparse Matrix Format Benchmark:Matrix Vector Product Benchmark by modified bench_sparse.py in SciPy distribution
  • Graph Laplacian in scipy.sparse from scipy import sparse!!N = len(points)!L = sparse.lil_matrix((N, N))!for vids in faces:! L[vids, vids] = 1!D = sparse.spdiags(L.sum(axis=0), 0, N, N)!L = L.tocsc()-D!
  • Fancy indexingの仕様の違い sparse.lil_matrix numpy.array >>> L = sparse.lil_matrix((N,N))! >>> Ldense = np.zeros((N,N))!>>> ix = [1,3,4]! >>> ix = [1,3,4]!>>> L[ix,ix] = 1! >>> Ldense[ix,ix] = 1!>>> L.todense()! >>> Ldense!matrix([[ 0., 0., 0., 0., 0.],! array([[ 0., 0., 0., 0., 0.],! [ 0., 1., 0., 1., 1.],! [ 0., 1., 0., 0., 0.],! [ 0., 0., 0., 0., 0.],! [ 0., 0., 0., 0., 0.],! [ 0., 1., 0., 1., 1.],! [ 0., 0., 0., 1., 0.],! [ 0., 1., 0., 1., 1.]])! [ 0., 0., 0., 0., 1.]])!
  • 補足: numpy.ix_() >>> Ldense = np.zeros((N,N))!>>> ix = [1,3,4]!>>> Ldense[np.ix_(ix,ix)] = 1!>>> Ldense!array([[ 0., 0., 0., 0., 0.],! [ 0., 1., 0., 1., 1.],! [ 0., 0., 0., 0., 0.],! [ 0., 1., 0., 1., 1.],! [ 0., 1., 0., 1., 1.]])!
  • Graph Laplacian in scipy.sparse from scipy import sparse!!N = len(points)!L = sparse.lil_matrix((N, N))!for vids in faces:! L[vids, vids] = 1!D = sparse.spdiags(L.sum(axis=0), 0, N, N)!L = L.tocsc()-D!
  • 細かい演算の仕様 !# LがCSC,CSRだとNotImplementedError!L -= D!!# OK!L = L-D!
  • Laplacian Mesh Fairing ! ! = ! − !L !A Signal Processing Approach To Fair Surface Design[Taubin 95]
  • Mesh Fairing in scipy.sparse from scipy.sparse import linalg as spla!!A = sparse.identity(L.shape[0]) - _lambda * L!solve = spla.factorized(A.tocsc())!x = solve(points[:,0])!y = solve(points[:,1])!z = solve(points[:,2])!new_points = np.array([x, y, z]).T!!# Set result back to Maya mesh!mesh.setPoints(new_points)!
  • Mesh Fairing in scipy.sparse from scipy.sparse import linalg as spla!!A = sparse.identity(L.shape[0]) - _lambda * L!solve = spla.factorized(A.tocsc())!x = solve(points[:,0])!y = solve(points[:,1])!z = solve(points[:,2])!new_points = np.array([x, y, z]).T!!# Set result back to Maya mesh!mesh.setPoints(new_points)!
  • Solving sparse linear system ¨  sparse.linalg.factorized(A) ¤  AのLU分解結果を保持したlinear system solver関数を 返す ¤  AはCSC形式で渡す必要がある SparseEfficiencyWarning: splu requires CSC matrix format
  • Mesh Fairing in scipy.sparse from scipy.sparse import linalg as spla!!A = sparse.identity(L.shape[0]) - _lambda * L!solve = spla.factorized(A.tocsc())!x = solve(points[:,0])!y = solve(points[:,1])!z = solve(points[:,2])!new_points = np.array([x, y, z]).T!!# Set result back to Maya mesh!mesh.setPoints(new_points)!
  • Solving sparse linear system # Error! 右辺はベクトルのみ!new_points = solve(points)!!# 仕方がないので一列ずつ!x = solve(points[:,0])!y = solve(points[:,1])!z = solve(points[:,2])!new_points = np.array([x, y, z]).T!
  • Cotan-Weighted Laplacian 緑: Graph Laplacian赤: Cotan-Weighted Laplacian 1 1 !!! = cot !!" + cot !!" (!! − !! ) 4!(!! ) 2 !∈! ! [Sorkine 2005]
  • Cotan Laplacian in scipy.sparse (1/2) def laplacian_cotan(points, faces):! EDGE_LOOP = [(0,1,2),(0,2,1),(1,2,0)]! N = len(points)! point_area = np.zeros(N)! L = sparse.lil_matrix((N, N))! for vids in faces:! point_area[vids] += area_triangle(points[vids]) /3.0! for i in EDGE_LOOP:! v0 = vids[i[0]]! v1 = vids[i[1]]! v2 = vids[i[2]]! e1 = points[v1] - points[v2]! e2 = points[v0] - points[v2]!
  • Cotan Laplacian in scipy.sparse (2/2) cosa = np.dot(e1, e2) / math.sqrt(np.dot(e1,e1) * np.dot(e2, e2))! sina = math.sqrt(1 - cosa * cosa)! cota = cosa / sina! w = 0.5 * cota! L[v0, v0] -= w! L[v0, v1] += w! L[v1, v1] -= w! L[v1, v0] += w! D = sparse.spdiags(0.25/point_area, 0, N, N)! return D.dot(L.tocsc())!
  • Cotan Laplacian in scipy.sparse (2/2) cosa = np.dot(e1, e2) / math.sqrt(np.dot(e1,e1) * np.dot(e2, e2))! sina = math.sqrt(1 - cosa * cosa)! cota = cosa / sina! w = 0.5 * cota! L[v0, v0] -= w! L[v0, v1] += w! L[v1, v1] -= w! L[v1, v0] += w! D = sparse.spdiags(0.25/point_area, 0, N, N)! return D.dot(L.tocsc())!
  • 行列積について # Denseに変換されてしまう!np.dot(D, L)!!# Sparseのまま行列積!D.dot(L)!
  • Laplacian Matrix構築Cythonによる高速化 ¨  Python: 2.6秒¨  Cython: 1.8秒¨  Cython + Dense: 0.8秒! ¤ あまり大きくないMeshならばDenseで Laplacianを作った方が速い
  • ファイル入出力 ¨  numpy.savetxt() >>> io.savemat(sparsetest.mat, {lil: L.tolil(), ¤  Sparse Matrixでは使えない csr: L.tocsr()}, oned_as=row)¨  scipy.io.savemat() / >>> M = io.loadmat(‘sparsetest.mat) loadmat() >>> M[lil] ¤  MATLAB .mat形式で保存 <5x5 sparse matrix of type <type numpy.float64> ¤  Sparse Matrixは強制的に CSCで保存される with 9 stored elements in Compressed Sparse Column format> >>> M[csr] <5x5 sparse matrix of type <type numpy.float64> with 9 stored elements in Compressed Sparse Column format>
  • MATLAB vs. SciPy – Sparse Matrices MATLAB SciPy Sparse ¨  sparse()で行列を作る ¨  内部形式(denseも含 だけ! め)を意識して使う¨  後の演算はdenseと全 ¨  形式によって同じ演 く同じ 算、関数が使えない¨  内部形式はCSC ケースがある
  • まとめ ¨  Sparse matrix一般 ¤  よく使われるデータ構造を理解した¨  scipy.sparse ¤  使い方の基本がわかった ¤  いいところ n  やりたいことはできる。実用可能。 n  Mesh Processingが省メモリで計算可能。〜1000倍のオーダーで 速くなる。 ¤  悪いところ n  ドキュメントされていない仕様が多過ぎ。 n  ndarrayと透過的に使えるようにしてください L¨  Laplacian Mesh Processingはおもしろいですよ J
  • Future Work ¨  scipy.sparse.linalg の調査 ¤  Iterative sparse linear system solver系¨  Mesh Processingのもうちょっと深いネタを紹介
  • Further Readings [Sorkine 2005] Sorkine, Olga.“Laplacian Mesh Processing” Eurographics 2005http://igl.ethz.ch/projects/Laplacian-mesh-processing/STAR/STAR-Laplacian-mesh-processing.pdf ¤  Mesh Laplacianの基礎と応用に関するまとめ
  • Further Readings Levy, Bruno and Zhang, Hao.“Spectral Mesh Processing” ACM SIGGRAPH 2010http://alice.loria.fr/WIKI/index.php/Graphite/SpectralMeshProcessing ¤  Laplacianの特異値分解を用いてMeshの周波数解析
  • Further Readings [Alexa 2011] Alexa, Marc and Wardetzky, Max.“Discrete Laplacians on General Polygonal Meshes”ACM SIGGRAPH 2011http://cybertron.cg.tu-berlin.de/polymesh/ (ソースコード有) ¤  Discrete Laplacianを一般的なポリゴンメッシュに対し定義