[opengm] 236/386: superpixel dataset creator

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Wed Aug 31 08:37:56 UTC 2016


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch debian/master
in repository opengm.

commit c353d7086e49e8ff82c442dbc7a0d9413eb9467d
Author: DerThorsten <thorsten.beier at iwr.uni-heidelberg.de>
Date:   Wed Jan 14 17:22:30 2015 +0100

    superpixel dataset creator
---
 fubar/brown_horse.py                              |   4 +-
 fubar/make_grid_potts_dset.py                     | 128 ---------
 fubar/toy_dataset.py                              |  34 +--
 src/interfaces/python/opengm/learning/__init__.py | 314 +++++++++++++++++++++-
 4 files changed, 320 insertions(+), 160 deletions(-)

diff --git a/fubar/brown_horse.py b/fubar/brown_horse.py
index d63c147..da46a97 100644
--- a/fubar/brown_horse.py
+++ b/fubar/brown_horse.py
@@ -6,7 +6,7 @@ from progressbar import *
 import glob
 import os
 from functools import partial
-from make_grid_potts_dset import secondOrderImageDataset, getPbar
+from opengm.learning import secondOrderImageDataset, getPbar
 
 
 
@@ -103,7 +103,7 @@ dataset,test_set = secondOrderImageDataset(imgs=imgs, gts=gts, numberOfLabels=2,
 
 
 learner =  learning.subgradientSSVM(dataset, learningRate=0.05, C=100, 
-                                    learningMode='workingSets',maxIterations=1000)
+                                    learningMode='batch',maxIterations=1000)
 
 
 #learner = learning.structMaxMarginLearner(dataset, 0.1, 0.001, 0)
diff --git a/fubar/make_grid_potts_dset.py b/fubar/make_grid_potts_dset.py
index 192223e..8b13789 100644
--- a/fubar/make_grid_potts_dset.py
+++ b/fubar/make_grid_potts_dset.py
@@ -1,129 +1 @@
-import numpy
-import opengm
-from opengm import learning
-import vigra
-from progressbar import *
-from functools import partial
-
-
-
-def getPbar(size, name):
-    widgets = ['%s: '%name, Percentage(), ' ', Bar(marker='0',left='[',right=']'),
-               ' ', ETA(), ' ', FileTransferSpeed()] #see docs for other options
-    pbar = ProgressBar(widgets=widgets, maxval=size)
-    return pbar
-
-def secondOrderImageDataset(imgs, gts, numberOfLabels, fUnary, fBinary, addConstFeature, trainFraction=0.75):
-
-
-    # train test
-    nImg = len(imgs)
-    nTrain = int(float(nImg)*trainFraction+0.5)
-    nTest = (nImg-nTrain)
-    
-    def getFeat(fComp, im):
-        res = []
-        for f in fComp:
-            r = f(im)
-            if r.ndim == 2:
-                r = r[:,:, None]
-            res.append(r)
-        return res
-
-    # compute features for a single image
-    tImg = imgs[0]
-    unaryFeat = getFeat(fUnary, tImg)
-    unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray))
-    nUnaryFeat = unaryFeat.shape[-1] + int(addConstFeature)
-    nUnaryFeat *= numberOfLabels - int(numberOfLabels==2)
-
-    binaryFeat = getFeat(fBinary, tImg)
-    binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray))
-    nBinaryFeat = binaryFeat.shape[-1] + int(addConstFeature)
-    nWeights  = nUnaryFeat + nBinaryFeat
-    print "------------------------------------------------"
-    print "nTrain",nTrain,"nTest",nTest
-    print "nWeights",nWeights,"(",nUnaryFeat,nBinaryFeat,")"
-    print "------------------------------------------------"
-
-    train_set = []
-    tentative_test_set = []
-
-    for i,(img,gt) in enumerate(zip(imgs,gts)):
-        if(i<nTrain):
-            train_set.append((img,gt))
-        else:
-            tentative_test_set.append((img,gt))
-
-
-    dataset = learning.createDataset(numWeights=nWeights)
-    weights = dataset.getWeights()
-    uWeightIds = numpy.arange(nUnaryFeat ,dtype='uint64')
-    if numberOfLabels != 2:
-        uWeightIds = uWeightIds.reshape([numberOfLabels,-1])
-    bWeightIds = numpy.arange(start=nUnaryFeat,stop=nWeights,dtype='uint64')
-
-    def makeModel(img,gt):
-        shape = gt.shape[0:2]
-        numVar = shape[0] * shape[1]
-
-        # make model
-        gm = opengm.gm(numpy.ones(numVar)*numberOfLabels)
-
-
-
-
-        # compute features
-        unaryFeat = getFeat(fUnary, img)
-        unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray))
-        unaryFeat  = unaryFeat.reshape([numVar,-1])
-        binaryFeat = getFeat(fBinary, img)
-        binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray))
-        binaryFeat  = binaryFeat.reshape([numVar,-1])
-
-
-
-        # add unaries
-        lUnaries = learning.lUnaryFunctions(weights =weights,numberOfLabels = numberOfLabels, 
-                                            features=unaryFeat, weightIds = uWeightIds,
-                                            featurePolicy= learning.FeaturePolicy.sharedBetweenLabels,
-                                            makeFirstEntryConst=numberOfLabels==2, addConstFeature=addConstFeature)
-        fids = gm.addFunctions(lUnaries)
-        gm.addFactors(fids, numpy.arange(numVar))
-
-        # add second order
-        vis2Order=opengm.gridVis(shape[0:2],True)
-
-        fU = binaryFeat[vis2Order[:,0],:]
-        fV = binaryFeat[vis2Order[:,1],:]
-        fB  = (fU +  fV / 2.0)
-        lp = learning.lPottsFunctions(weights=weights, numberOfLabels=numberOfLabels,
-                                      features=fB, weightIds=bWeightIds,
-                                      addConstFeature=addConstFeature)
-        gm.addFactors(gm.addFunctions(lp), vis2Order) 
-
-        return gm
-
-    # make training models
-    pbar = getPbar(nTrain,"Training Models")
-    pbar.start()
-    for i,(img,gt) in enumerate(train_set):
-        gm = makeModel(img, gt)
-        dataset.pushBackInstance(gm,gt.reshape(-1).astype(opengm.label_type))
-        pbar.update(i)
-    pbar.finish()
-
-
-    # make test models
-    test_set = []
-    pbar = getPbar(nTest,"Test Models")
-    pbar.start()
-    for i,(img,gt) in enumerate(tentative_test_set):
-        gm = makeModel(img, gt)
-        test_set.append((img, gt, gm))
-        pbar.update(i)
-    pbar.finish()
-
-    return dataset, test_set
-
 
diff --git a/fubar/toy_dataset.py b/fubar/toy_dataset.py
index 58e2e26..acd70e1 100644
--- a/fubar/toy_dataset.py
+++ b/fubar/toy_dataset.py
@@ -6,13 +6,13 @@ from progressbar import *
 import glob
 import os
 from functools import partial
-from make_grid_potts_dset import secondOrderImageDataset, getPbar
+from opengm.learning import secondOrderImageDataset, getPbar
 
 numpy.random.seed(42)
 
 nImages = 8 
-shape = [20, 20]
-noise = 4.0
+shape = [30, 30]
+noise = 2.0
 imgs = []
 gts = []
 
@@ -29,12 +29,12 @@ for i in range(nImages):
 
     gtImg = vigra.sampling.rotateImageDegree(gtImg.astype(numpy.float32),int(ra),splineOrder=0)
 
-    if i<1 :
+    if i<2 :
         vigra.imshow(gtImg)
         vigra.show()
 
     img = gtImg + numpy.random.random(shape)*float(noise)
-    if i<1 :
+    if i<2 :
         vigra.imshow(img)
         vigra.show()
 
@@ -90,7 +90,6 @@ dataset,test_set = secondOrderImageDataset(imgs=imgs, gts=gts, numberOfLabels=3,
 
 
 
-
 learningModi = ['normal','reducedinference','selfFusion','reducedinferenceSelfFusion']
 lm = 0
 
@@ -106,26 +105,8 @@ if False:
     print "exit"
 
 else:
-   learner =  learning.subgradientSSVM(dataset, learningRate=0.5, C=100, learningMode='batch',maxIterations=1000,averaging=-1,nConf=15)
-   learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='n')
-
-   learner =  learning.subgradientSSVM(dataset, learningRate=0.5, C=100, learningMode='batch',maxIterations=1000,averaging=-1,nConf=0)
+   learner =  learning.subgradientSSVM(dataset, learningRate=0.5, C=100, learningMode='batch',maxIterations=500,averaging=-1,nConf=0)
    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='n')
-#with opengm.Timer("n  2"):
-#    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='n')
-#with opengm.Timer("sf"):
-#    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='sf')
-#with opengm.Timer("ri -30"):
-#    learner =  learning.subgradientSSVM(dataset, learningRate=0.5, C=100, learningMode='batch',maxIterations=200,averaging=-1,nConf=2)
-#    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='n')
-
-#with opengm.Timer("ri -0"):
-#    
-#    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='n')
-
-#with opengm.Timer("risf"):
-#    learner.learn(infCls=infCls,parameter=param,connectedComponents=True,infMode='risf')
-
 
 
 # predict on test test
@@ -136,6 +117,9 @@ for (rgbImg, gtImg, gm) in test_set :
     arg = inf.arg()
     arg = arg.reshape( numpy.squeeze(gtImg.shape))
 
+    vigra.imshow(rgbImg)
+    vigra.show()
+
     vigra.imshow(arg+2)
     vigra.show()
 
diff --git a/src/interfaces/python/opengm/learning/__init__.py b/src/interfaces/python/opengm/learning/__init__.py
index b91b86f..a85f772 100644
--- a/src/interfaces/python/opengm/learning/__init__.py
+++ b/src/interfaces/python/opengm/learning/__init__.py
@@ -2,12 +2,11 @@ from _learning import *
 from _learning import _lunarySharedFeatFunctionsGen,_lpottsFunctionsGen
 import numpy
 import struct
-from opengm import index_type,value_type, label_type
+from opengm import index_type,value_type, label_type, graphicalModel,gridVis
 from opengm import configuration as opengmConfig, LUnaryFunction
 from opengm import to_native_boost_python_enum_converter
-
-
-
+from progressbar import *
+from functools import partial
 
 
 def _extendedGetLoss(self, model_idx, infCls, parameter = None):
@@ -213,7 +212,7 @@ def subgradientSSVM(dataset, learningMode='batch',eps=1e-5, maxIterations=10000,
 
     lm = None
     if learningMode not in ['online','batch']:
-        raise RuntimeError("wrong learning mode, must be 'online', 'batch' or 'workingSets' ")
+        raise RuntimeError("wrong learning mode, must be 'online' or 'batch' ")
 
     if learningMode == 'online':
         lm = learningModeEnum.online
@@ -365,3 +364,308 @@ def lPottsFunctions(weights, numberOfLabels, features, weightIds,
     res.__dict__['_features_'] = wid
     res.__dict__['_weights_'] = ff
     return res
+
+
+
+
+
+
+
+def getPbar(size, name):
+    widgets = ['%s: '%name, Percentage(), ' ', Bar(marker='0',left='[',right=']'),
+               ' ', ETA(), ' ', FileTransferSpeed()] #see docs for other options
+    pbar = ProgressBar(widgets=widgets, maxval=size)
+    return pbar
+
+def secondOrderImageDataset(imgs, gts, numberOfLabels, fUnary, fBinary, addConstFeature, trainFraction=0.75):
+    #try:
+    #    import vigra
+    #    from progressbar import *
+    #except:
+    #    pass
+
+    # train test
+    nImg = len(imgs)
+    nTrain = int(float(nImg)*trainFraction+0.5)
+    nTest = (nImg-nTrain)
+    
+    def getFeat(fComp, im):
+        res = []
+        for f in fComp:
+            r = f(im)
+            if r.ndim == 2:
+                r = r[:,:, None]
+            res.append(r)
+        return res
+
+    # compute features for a single image
+    tImg = imgs[0]
+    unaryFeat = getFeat(fUnary, tImg)
+    unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray))
+    nUnaryFeat = unaryFeat.shape[-1] + int(addConstFeature)
+    nUnaryFeat *= numberOfLabels - int(numberOfLabels==2)
+
+    if len(fBinary)>0:
+        binaryFeat = getFeat(fBinary, tImg)
+        binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray))
+        nBinaryFeat = binaryFeat.shape[-1] + int(addConstFeature)
+        nWeights  = nUnaryFeat + nBinaryFeat
+    else:
+        nBinaryFeat = 0
+    print "------------------------------------------------"
+    print "nTrain",nTrain,"nTest",nTest
+    print "nWeights",nWeights,"(",nUnaryFeat,nBinaryFeat,")"
+    print "------------------------------------------------"
+
+    train_set = []
+    tentative_test_set = []
+
+    for i,(img,gt) in enumerate(zip(imgs,gts)):
+        if(i<nTrain):
+            train_set.append((img,gt))
+        else:
+            tentative_test_set.append((img,gt))
+
+
+    dataset = createDataset(numWeights=nWeights)
+    weights = dataset.getWeights()
+    uWeightIds = numpy.arange(nUnaryFeat ,dtype='uint64')
+    if numberOfLabels != 2:
+        uWeightIds = uWeightIds.reshape([numberOfLabels,-1])
+    else:
+        uWeightIds = uWeightIds.reshape([1,-1])
+    bWeightIds = numpy.arange(start=nUnaryFeat,stop=nWeights,dtype='uint64')
+
+    def makeModel(img,gt):
+        shape = gt.shape[0:2]
+        numVar = shape[0] * shape[1]
+
+        # make model
+        gm = graphicalModel(numpy.ones(numVar)*numberOfLabels)
+
+
+
+
+        # compute features
+        unaryFeat = getFeat(fUnary, img)
+        unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray))
+        unaryFeat  = unaryFeat.reshape([numVar,-1])
+        
+
+
+
+        # add unaries
+        lUnaries = lUnaryFunctions(weights =weights,numberOfLabels = numberOfLabels, 
+                                            features=unaryFeat, weightIds = uWeightIds,
+                                            featurePolicy= FeaturePolicy.sharedBetweenLabels,
+                                            makeFirstEntryConst=numberOfLabels==2, addConstFeature=addConstFeature)
+        fids = gm.addFunctions(lUnaries)
+        gm.addFactors(fids, numpy.arange(numVar))
+
+
+        if len(fBinary)>0:
+            binaryFeat = getFeat(fBinary, img)
+            binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray))
+            binaryFeat  = binaryFeat.reshape([numVar,-1])
+
+            # add second order
+            vis2Order=gridVis(shape[0:2],True)
+
+            fU = binaryFeat[vis2Order[:,0],:]
+            fV = binaryFeat[vis2Order[:,1],:]
+            fB  = (fU +  fV / 2.0)
+            lp = lPottsFunctions(weights=weights, numberOfLabels=numberOfLabels,
+                                          features=fB, weightIds=bWeightIds,
+                                          addConstFeature=addConstFeature)
+            gm.addFactors(gm.addFunctions(lp), vis2Order) 
+
+        return gm
+
+    # make training models
+    pbar = getPbar(nTrain,"Training Models")
+    pbar.start()
+    for i,(img,gt) in enumerate(train_set):
+        gm = makeModel(img, gt)
+        dataset.pushBackInstance(gm,gt.reshape(-1).astype(label_type))
+        pbar.update(i)
+    pbar.finish()
+
+
+    # make test models
+    test_set = []
+    pbar = getPbar(nTest,"Test Models")
+    pbar.start()
+    for i,(img,gt) in enumerate(tentative_test_set):
+        gm = makeModel(img, gt)
+        test_set.append((img, gt, gm))
+        pbar.update(i)
+    pbar.finish()
+
+    return dataset, test_set
+
+
+
+def superpixelDataset(imgs,sps, gts, numberOfLabels, fUnary, fBinary, addConstFeature, trainFraction=0.75):
+    try:
+        import vigra
+    except:
+        raise ImportError("cannot import vigra which is needed for superpixelDataset")
+
+    # train test
+    nImg = len(imgs)
+    nTrain = int(float(nImg)*trainFraction+0.5)
+    nTest = (nImg-nTrain)
+    
+    def getFeat(fComp, im, topoShape=False):
+        res = []
+        if(topoShape):
+            shape = im.shape[0:2]
+            tshape = [2*s-1 for s in shape]
+            iiimg = vigra.sampling.resize(im, tshape)
+        else:
+            iiimg = im
+        for f in fComp:
+            r = f(iiimg)
+            if r.ndim == 2:
+                r = r[:,:, None]
+            res.append(r)
+        return res
+
+    # compute features for a single image
+    tImg = imgs[0]
+    unaryFeat = getFeat(fUnary, tImg)
+    unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray))
+    nUnaryFeat = unaryFeat.shape[-1] + int(addConstFeature)
+    nUnaryFeat *= numberOfLabels - int(numberOfLabels==2)
+    if len(fBinary)>0:
+        binaryFeat = getFeat(fBinary, tImg)
+        binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray))
+        nBinaryFeat = binaryFeat.shape[-1] + int(addConstFeature)
+    else:
+        nBinaryFeat =0
+
+    nWeights  = nUnaryFeat + nBinaryFeat
+
+    print "------------------------------------------------"
+    print "nTrain",nTrain,"nTest",nTest
+    print "nWeights",nWeights,"(",nUnaryFeat,nBinaryFeat,")"
+    print "------------------------------------------------"
+
+    train_set = []
+    tentative_test_set = []
+
+    for i,(img,sp,gt) in enumerate(zip(imgs,sps,gts)):
+        if(i<nTrain):
+            train_set.append((img,sp,gt))
+        else:
+            tentative_test_set.append((img,sp,gt))
+
+
+    dataset = createDataset(numWeights=nWeights)
+    weights = dataset.getWeights()
+    uWeightIds = numpy.arange(nUnaryFeat ,dtype='uint64')
+    if numberOfLabels != 2:
+        uWeightIds = uWeightIds.reshape([numberOfLabels,-1])
+    else:
+        uWeightIds = uWeightIds.reshape([1,-1])
+
+    if len(fBinary)>0:
+        bWeightIds = numpy.arange(start=nUnaryFeat,stop=nWeights,dtype='uint64')
+
+
+
+
+
+    def makeModel(img,sp,gt):
+        assert sp.min() == 0
+        shape = img.shape[0:2]
+        gg = vigra.graphs.gridGraph(shape)
+        rag = vigra.graphs.regionAdjacencyGraph(gg,sp)
+        numVar = rag.nodeNum
+        assert rag.nodeNum == rag.maxNodeId +1
+
+        # make model
+        gm = graphicalModel(numpy.ones(numVar)*numberOfLabels)
+
+        assert gm.numberOfVariables == rag.nodeNum 
+        assert gm.numberOfVariables == rag.maxNodeId +1
+
+        # compute features
+        unaryFeat = getFeat(fUnary, img)
+        unaryFeat = numpy.nan_to_num(numpy.concatenate(unaryFeat,axis=2).view(numpy.ndarray)).astype('float32')
+        unaryFeat = vigra.taggedView(unaryFeat,'xyc')
+        accList = []
+
+        #for c in range(unaryFeat.shape[-1]):
+        #    cUnaryFeat = unaryFeat[:,:,c]
+        #    cAccFeat = rag.accumulateNodeFeatures(cUnaryFeat)[:,None]
+        #    accList.append(cAccFeat)
+        #accUnaryFeat = numpy.concatenate(accList,axis=1)
+        accUnaryFeat = rag.accumulateNodeFeatures(unaryFeat)#[:,None]
+
+
+        #print accUnaryFeat.shape
+
+        #accUnaryFeat = rag.accumulateNodeFeatures(unaryFeat[:,:,:])
+        #accUnaryFeat = vigra.taggedView(accUnaryFeat,'nc')
+        #accUnaryFeat = accUnaryFeat[1:accUnaryFeat.shape[0],:]
+
+      
+
+
+
+        #binaryFeat  = binaryFeat.reshape([numVar,-1])
+
+
+
+        # add unaries
+        lUnaries = lUnaryFunctions(weights =weights,numberOfLabels = numberOfLabels, 
+                                            features=accUnaryFeat, weightIds = uWeightIds,
+                                            featurePolicy= FeaturePolicy.sharedBetweenLabels,
+                                            makeFirstEntryConst=numberOfLabels==2, addConstFeature=addConstFeature)
+        fids = gm.addFunctions(lUnaries)
+        gm.addFactors(fids, numpy.arange(numVar))
+
+        
+        if len(fBinary)>0:
+            binaryFeat = getFeat(fBinary, img, topoShape=False)
+            binaryFeat = numpy.nan_to_num(numpy.concatenate(binaryFeat,axis=2).view(numpy.ndarray)).astype('float32')
+            edgeFeat = vigra.graphs.edgeFeaturesFromImage(gg, binaryFeat)
+            accBinaryFeat = rag.accumulateEdgeFeatures(edgeFeat)
+
+            uvIds =  numpy.sort(rag.uvIds(), axis=1)
+            assert uvIds.min()==0
+            assert uvIds.max()==gm.numberOfVariables-1
+
+
+
+        
+            lp = lPottsFunctions(weights=weights, numberOfLabels=numberOfLabels,
+                                          features=accBinaryFeat, weightIds=bWeightIds,
+                                          addConstFeature=addConstFeature)
+            fids = gm.addFunctions(lp)
+            gm.addFactors(fids, uvIds) 
+
+        return gm
+
+    # make training models
+    pbar = getPbar(nTrain,"Training Models")
+    pbar.start()
+    for i,(img,sp,gt) in enumerate(train_set):
+        gm = makeModel(img,sp, gt)
+        dataset.pushBackInstance(gm,gt.astype(label_type))
+        pbar.update(i)
+    pbar.finish()
+
+
+    # make test models
+    test_set = []
+    pbar = getPbar(nTest,"Test Models")
+    pbar.start()
+    for i,(img,sp,gt) in enumerate(tentative_test_set):
+        gm = makeModel(img,sp, gt)
+        test_set.append((img, sp, gm))
+        pbar.update(i)
+    pbar.finish()
+
+    return dataset, test_set
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/opengm.git



More information about the debian-science-commits mailing list