future.graph.merge_hierarchical

91 views
Skip to first unread message

brickl...@gmail.com

unread,
Sep 1, 2015, 7:24:31 PM9/1/15
to scikit...@googlegroups.com
Hi All,

I am looking at generating some detection proposals, see  Hosang, Jan, et al. "What makes for effective detection proposals?." arXiv preprint arXiv:1502.05082 (2015), http://arxiv.org/pdf/1502.05082.pdf    Starting with the Selective Search algorithm, Section 3 of  Uijlings, Jasper RR, et al. "Selective search for object recognition." International journal of computer vision 104.2 (2013): 154-171,    https://staff.fnwi.uva.nl/th.gevers/pub/GeversIJCV2013.pdf

The basic idea is the performing a hierarchical merging of the image, where each new merge get added to the list of regions suspected to contain an object, you can capture objects at all scales.  This reduces the search space significantly than say compared to floating window.  The output is NOT a image segmentaiton, rather a list of regions (bounding boxes) of potential objects (deteciton proposals).

I have looked in the gallery at RAG Merging http://scikit-image.org/docs/dev/auto_examples/plot_rag_merge.html,  fairly confident I can setup the callback methods to provided the similarity measure.   I am naively hoping that future.graph.hierarchical(), even though it seems to output a segmentation (labels), can be easily adapted to the task.    What would be the best way to have future.graph.merge_hierarchica() merge regions with the "highest" similarity measure, rather thana threshold?   What would be the best way future.graph.merge_hierarchica() save each merged region?   Tried setting  "in_place" to false, but didn't notice any difference.

Any help appreciated,

Brickle.
--




Vighnesh Birodkar

unread,
Sep 3, 2015, 11:26:54 AM9/3/15
to scikit-image, brickl...@gmail.com
Hello

At each step, the edge with the least weight is merged. The code uses a min heap for that. You could take an inverse of your measure such that similar nodes have lesser values. 'in_place' just decides whether a new node is created for a merge or not, it most likely won't do what you need in this case.

I hope I was clear.

Thanks
Vighnesh

brickl...@gmail.com

unread,
Sep 9, 2015, 9:23:52 AM9/9/15
to scikit...@googlegroups.com
Hi,

Been away for a few days.  Thanks for that, clears a few things up.  I am looking at modifying the RAG code from the furture.graph.

Regards,

Brickle.
--
You received this message because you are subscribed to the Google Groups "scikit-image" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scikit-image...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Juan Nunez-Iglesias

unread,
Sep 16, 2015, 5:34:05 AM9/16/15
to scikit...@googlegroups.com
Hey Brickle,

This is a very cool application! Feel free to ask for more guidance about this. The RAG is in future because we weren't sure whether the API would provide enough for all use cases, so if it needs extending, this is exactly the kind of feedback we're looking for!

If you've made any interesting changes to the code, but want help, you can submit them as a pull request on GitHub. Just start the PR title with "[WIP]" for "work in progress".

Thanks!

Juan.

brickl...@gmail.com

unread,
Sep 17, 2015, 11:12:27 AM9/17/15
to scikit...@googlegroups.com
Hi Juan,

I am working on this in slow time.   At the moment I am writing a generic function to create the RAG.  It is similar to rag_mean_colour() but takes two callbacks, one to describe the nodes and another to compute the edge weight.  Based on Vighnesh advice below, I my use case I  will ensure the "least" weight implies the most similar.   Theh first step will be to have the rag_generic() duplicate rag_mean_colour().

Once I am happy with rag_generic(), I will need to an create alternative merging process.  The alternative method wont use a threshold but rather at each step will select the "most" similar nodes for merging.  This merge process will terminate once there is a single node in the graph.   The final output will be the initial regions, plus each of the single merge (hope that make sense).

Anyway, I have created a fork and when basic functionally is working will submit a PR.

Regards,

Michael.
--

Vighnesh Birodkar

unread,
Sep 17, 2015, 11:23:54 AM9/17/15
to scikit-image
Hello

Rather than creating an alternative method, you could always set the threshold to infinity. Won't that work in your case ?

Thanks
Vighnesh

brickl...@gmail.com

unread,
Sep 17, 2015, 12:16:27 PM9/17/15
to scikit...@googlegroups.com
Setting the threshold to infinity will merge everything, but in what
order are the nodes merged?

Assuming setting threshold to infinity works, I still need to save a
copy of each merge. Any suggestions?

Regards,

Michael.
--

Vighnesh Birodkar

unread,
Sep 18, 2015, 10:30:46 AM9/18/15
to scikit...@googlegroups.com

Hi

Using in _ place = False, couldn't you get the entire sequence of merging from the root node ?

--
You received this message because you are subscribed to a topic in the Google Groups "scikit-image" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/scikit-image/rnsVLQ-tFJM/unsubscribe.
To unsubscribe from this group and all its topics, send an email to scikit-image...@googlegroups.com.

brickl...@gmail.com

unread,
Sep 18, 2015, 10:48:06 AM9/18/15
to scikit...@googlegroups.com
Hi

Today I finished the code for a more generic RAG construction.    Tomorrow I will start looking at the hierarchical merge code, hopefully I can report more then.

Thanks for your help and suggestions, I am hopeful they will suffice.

Michael.
--
You received this message because you are subscribed to the Google Groups "scikit-image" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scikit-image...@googlegroups.com.

brickl...@gmail.com

unread,
Sep 18, 2015, 9:46:28 PM9/18/15
to scikit...@googlegroups.com
Hi,

My graph theory is pretty weak so I may be missing something obvious.  Can you elaborate a little more on your suggestion below. 

Are you saying the setting in_place=False, will the graph then retain a copy of the intermediate steps?  If so how do I access these intermediate steps?   

Playing around with RAG Merging example (from the skimage gallery).  If set rag_copy=True,  I will have the starting graph, and can use the labels returned from merge_hierarchical to see the result of final merge, but I can't see way to review the intermediate steps.

Any help appreciated,


Michael.
--

On 18/09/2015 10:30 pm, Vighnesh Birodkar wrote:
You received this message because you are subscribed to the Google Groups "scikit-image" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scikit-image...@googlegroups.com.

Vighnesh Birodkar

unread,
Sep 18, 2015, 11:51:49 PM9/18/15
to scikit...@googlegroups.com
Hello

I am sorry, I was mistaken, there is no way of getting the merge sequence right now without changing the source.

Thanks

brickl...@gmail.com

unread,
Sep 19, 2015, 4:55:01 PM9/19/15
to scikit...@googlegroups.com
Hi Vighnesh,

I am struggling with both Python and the graph stuff, hope you can help me.  I have taken discussion off list.

I am using your idea in your blog:  Hierarchical Merging In Action.   Similar to your seg_list[] concept, I plan to store a copy of the merged regions in a list.  The best place appears to be at bottom of the while loop in merge_hierarchical (about line 130 in graph_merge.py).   Default plan is to duplicate Lines 132-136 of graph_merge.py to create a label map:

label_map = np.arange(labels.max() + 1)
for ix, (n, d) in enumerate(rag.nodes_iter(data=True)):
    for label in d['labels']:
         label_map[label] = ix


Seems bit of an overkill to traverse the entire graph each time.   Is there any other way you can suggest?    All I need is a label map that consists of two labels, one being the merged region and everything else grouped/labeled as another region.

Any help appreciated.

Regards,

Michael.
--

Juan Nunez-Iglesias

unread,
Sep 20, 2015, 8:50:32 PM9/20/15
to scikit...@googlegroups.com
Hey Michael,

I don't understand your question. Why are you traversing the graph "each time"? Vighnesh only traverses it once?

Juan.

brickl...@gmail.com

unread,
Sep 20, 2015, 10:36:36 PM9/20/15
to scikit...@googlegroups.com
Hi Juan,

Because Vighnesh is smarter than me :)

I can't see how to obtain the intermediate merger other than to create a complete label_map at each step, which requires me to iterate over all the nodes in the graph.    I sure there is enough information at node to reconstruct just local map/mask but I don't know how.

Hope that clarifies.

Regards,

Michael.
--

Vighnesh Birodkar

unread,
Sep 20, 2015, 11:08:44 PM9/20/15
to scikit-image, brickl...@gmail.com
Hello

For the demo videos in that post I was traversing the graph at each iteration to obtain the segmentation, see 118 of graph_merge.py

This was because I needed the entire segmentation at each step to display it. Juan, I think you mean I traverse it only once in the code on master ? For the video I was indeed traversing it each time.

The nodes are merged here

On line 127 you can inject your logic.

So if I understand correctly, you want [src + dst](the regions being merged at that point of time) as one region and the rest of the graph as other ?

label_map = np.arange(labels.max() + 1)
for l in rag.node[src]['labels'] :






Thanks
Vighnesh

Vighnesh Birodkar

unread,
Sep 20, 2015, 11:13:54 PM9/20/15
to scikit-image, brickl...@gmail.com
Hello

Sorry for the repost, I accidentally submitted incomplete code in the last one. 

For the demo videos in that post I was traversing the graph at each iteration to obtain the segmentation, see 118 of graph_merge.py

This was because I needed the entire segmentation at each step to display it. Juan, I think you mean I traverse it only once in the code on master ? For the video I was indeed traversing it each time.

The nodes are merged here

On line 127 you can inject your logic.

So if I understand correctly, you want [src + dst](the regions being merged at that point of time) as one region and the rest of the graph as other ?

label_map = np.arange(labels.max() + 1)
label_map[:] = 2 # Label the rest of the graph as one region

# Label src as one region

for l in rag.node[src]['labels']:
    label_map[l] = 1 


for l in rag.node[dst]['labels']:
    label_map[l] = 1 

seg_list.append(labels[label_map])

Thanks
Vighnesh


On Tuesday, September 1, 2015 at 7:24:31 PM UTC-4, bricklemacho wrote:

brickl...@gmail.com

unread,
Sep 20, 2015, 11:26:12 PM9/20/15
to Vighnesh Birodkar, scikit-image
Hi Vighnesh,

That basically what I am after.  If I inject the code at line 130 after the merger then I only need use [dst] to create the label map, correct?

I just submitted a [WIP] pull request, but will update code to reflect these changes.

Thanks for your help.

Michael.
--

Vighnesh Birodkar

unread,
Sep 20, 2015, 11:45:27 PM9/20/15
to scikit-image, vighnesh...@gmail.com, brickl...@gmail.com
Hello

Only if in_place = True. If not, the new node could be something entirely different.

The new_id is the safer bet.


Thanks
Vighnesh
Reply all
Reply to author
Forward
0 new messages