mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.8 KiB
122 lines
3.8 KiB
#!/usr/bin/env python |
|
|
|
# 2009-01-12, Xavier Delacour <xavier.delacour@gmail.com> |
|
|
|
# gdb --cd ~/opencv-lsh/tests/python --args /usr/bin/python lsh_tests.py |
|
# set env PYTHONPATH /home/x/opencv-lsh/debug/interfaces/swig/python:/home/x/opencv-lsh/debug/lib |
|
# export PYTHONPATH=/home/x/opencv-lsh/debug/interfaces/swig/python:/home/x/opencv-lsh/debug/lib |
|
|
|
import unittest |
|
from numpy import *; |
|
from numpy.linalg import *; |
|
import sys; |
|
|
|
import cvtestutils |
|
from cv import *; |
|
from adaptors import *; |
|
|
|
def planted_neighbors(query_points, R = .4): |
|
n,d = query_points.shape |
|
data = zeros(query_points.shape) |
|
for i in range(0,n): |
|
a = random.rand(d) |
|
a = random.rand()*R*a/sqrt(sum(a**2)) |
|
data[i] = query_points[i] + a |
|
return data |
|
|
|
class lsh_test(unittest.TestCase): |
|
|
|
def test_basic(self): |
|
n = 10000; |
|
d = 64; |
|
query_points = random.rand(n,d)*2-1; |
|
data = planted_neighbors(query_points) |
|
|
|
lsh = cvCreateMemoryLSH(d, n); |
|
cvLSHAdd(lsh, data); |
|
indices,dist = cvLSHQuery(lsh, query_points, 1, 100); |
|
correct = sum([i == j for j,i in enumerate(indices)]) |
|
assert(correct >= n * .75); |
|
|
|
def test_sensitivity(self): |
|
n = 10000; |
|
d = 64; |
|
query_points = random.rand(n,d); |
|
data = random.rand(n,d); |
|
|
|
lsh = cvCreateMemoryLSH(d, 1000, 10, 10); |
|
cvLSHAdd(lsh, data); |
|
|
|
good = 0 |
|
trials = 20 |
|
print |
|
for x in query_points[0:trials]: |
|
x1 = asmatrix(x) # PyArray_to_CvArr doesn't like 1-dim arrays |
|
indices,dist = cvLSHQuery(lsh, x1, n, n); |
|
indices = Ipl2NumPy(indices) |
|
indices = unique(indices[where(indices>=0)]) |
|
|
|
brute = vstack([(sqrt(sum((a-x)**2)),i,0) for i,a in enumerate(data)]) |
|
lshp = vstack([(sqrt(sum((x-data[i])**2)),i,1) for i in indices]) |
|
combined = vstack((brute,lshp)) |
|
combined = combined[argsort(combined[:,0])] |
|
|
|
spread = [i for i,a in enumerate(combined[:,2]) if a==1] |
|
spread = histogram(spread,bins=4,new=True)[0] |
|
print spread, sum(diff(spread)<0) |
|
if sum(diff(spread)<0) == 3: good = good + 1 |
|
print good,"pass" |
|
assert(good > trials * .75); |
|
|
|
def test_remove(self): |
|
n = 10000; |
|
d = 64; |
|
query_points = random.rand(n,d)*2-1; |
|
data = planted_neighbors(query_points) |
|
lsh = cvCreateMemoryLSH(d, n); |
|
indices = cvLSHAdd(lsh, data); |
|
assert(LSHSize(lsh)==n); |
|
cvLSHRemove(lsh,indices[0:n/2]) |
|
assert(LSHSize(lsh)==n/2); |
|
|
|
def test_destroy(self): |
|
n = 10000; |
|
d = 64; |
|
lsh = cvCreateMemoryLSH(d, n); |
|
|
|
def test_destroy2(self): |
|
n = 10000; |
|
d = 64; |
|
query_points = random.rand(n,d)*2-1; |
|
data = planted_neighbors(query_points) |
|
lsh = cvCreateMemoryLSH(d, n); |
|
indices = cvLSHAdd(lsh, data); |
|
|
|
|
|
# move this to another file |
|
|
|
# img1 = cvLoadImage(img1_fn); |
|
# img2 = cvLoadImage(img2_fn); |
|
# pts1,desc1 = cvExtractSURF(img1); # * make util routine to extract points and descriptors |
|
# pts2,desc2 = cvExtractSURF(img2); |
|
# lsh = cvCreateMemoryLSH(d, n); |
|
# cvLSHAdd(lsh, desc1); |
|
# indices,dist = cvLSHQuery(lsh, desc2, 2, 100); |
|
# matches = [((pts1[x[0]].pt.x,pts1[x[0]].pt.y),(pts2[j].pt.x,pts2[j].pt.y)) \ |
|
# for j,x in enumerate(hstack((indices,dist))) \ |
|
# if x[2] and (not x[3] or x[2]/x[3]>.6)] |
|
# out = cvCloneImage(img1); |
|
# for p1,p2 in matches: |
|
# cvCircle(out,p1,3,CV_RGB(255,0,0)); |
|
# cvLine(out,p1,p2,CV_RGB(100,100,100)); |
|
# cvNamedWindow("matches"); |
|
# cvShowImage("matches",out); |
|
# cvWaitKey(0); |
|
|
|
|
|
def suite(): |
|
return unittest.TestLoader().loadTestsFromTestCase(lsh_test) |
|
|
|
if __name__ == '__main__': |
|
unittest.TextTestRunner(verbosity=2).run(suite()) |
|
|
|
|