tests.Dbscan_labels   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 19
Duplicated Lines 0 %
Metric Value
dl 0
loc 19
rs 10
wmc 3

3 Methods

Rating   Name   Duplication   Size   Complexity  
A test_dbscan_labels_colored() 0 6 1
A test_dbscan_labels() 0 6 1
A setUp() 0 3 1
1
import pcl
2
from patty.segmentation.dbscan import (get_largest_dbscan_clusters,
3
                                       _get_top_labels, dbscan_labels)
4
import numpy as np
5
import unittest
6
from nose.tools import assert_equal, assert_equals
7
8
9
def test_largest_dbscan_clusters():
10
    """get_largest_dbscan_clusters returns at least desired fragment of
11
    points"""
12
    # Arrange
13
    pc = get_one_big_and_10_small_clusters()
14
    desired_fragment = 0.7
15
    expected = pc.size * desired_fragment
16
17
    # Act
18
    segmentedpc = get_largest_dbscan_clusters(
19
        pc, min_return_fragment=desired_fragment, epsilon=3., minpoints=5)
20
    segmented = segmentedpc.to_array()
21
22
    # Assert
23
    actual = segmented.shape[0]
24
    message = 'expected: %r, actual: %r' % (expected, actual)
25
    assert_equals(actual, expected, msg=message)
26
27
28
def get_one_big_and_10_small_clusters():
29
    '''Create clusters as advertised'''
30
    ar = np.empty([0, 3], dtype=np.float32)
31
    rn = np.random.RandomState(1234)
32
    big = rn.randn(100, 3) + 10
33
    ar = np.vstack([ar, big])
34
    for i in range(0, 10):
35
        small = rn.rand(10, 3) - (10 * i)
36
        ar = np.vstack([ar, small])
37
    pc = pcl.PointCloud(ar.astype(np.float32))
38
    return pc
39
40
41
def test_get_top_labels():
42
    '''Test _get_top_labels function from patty.segmentation.dbscan'''
43
    # With outliers
44
    labels = np.array([0, 0, 0, -1, -1, 0, 1, 1, 2, 3])
45
    assert_equal(_get_top_labels(labels, .6), ([0, 1], 6))
46
47
    # Without outliers
48
    labels = np.array([0, 1, 0, 0, 2, 2, 0, 0, 2, 2])
49
    assert_equal(_get_top_labels(labels, .6), ([0, 2], 9))
50
51
52
class Dbscan_labels(unittest.TestCase):
53
54
    def setUp(self):
55
        self.pc = pcl.PointCloudXYZRGB(
56
            [[0.0, 0.0, 0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]])
57
58
    def test_dbscan_labels(self):
59
        '''Points with different color should be one cluster with
60
        rgb_weight = 0'''
61
        labels = dbscan_labels(self.pc, 0.1, 1, rgb_weight=0)
62
        labelcount = len(np.unique(labels))
63
        assert_equals(labelcount, 1)
64
65
    def test_dbscan_labels_colored(self):
66
        '''Points with different color should be two clusters with
67
        rgb_weight = 1'''
68
        labels = dbscan_labels(self.pc, 0.1, 1, rgb_weight=1)
69
        labelcount = len(np.unique(labels))
70
        assert_equals(labelcount, 2)
71