[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