Java 如何有效地调整图像处理算法的参数?

Java 如何有效地调整图像处理算法的参数?,java,statistics,artificial-intelligence,mathematical-optimization,Java,Statistics,Artificial Intelligence,Mathematical Optimization,在开始为我的问题实施解决方案之前,我只想确定我是否不会“重新发明轮子”,以及我是否可以重用以前有人做过的工作。所以我的问题是: 我使用OpenCV库制作了图像匹配器。此匹配器接收一组图像文件,并尝试在数据库中查找相似的图像。最后,它根据定义返回统计结果(真阳性、真阴性、假阳性和假阴性匹配数)。这些结果可能会因OpenCV的库算法参数值而有所不同,这些参数值约为10。这意味着参数调整将带来更多的真阳性匹配和更少的假阳性匹配。由于我必须调整或多或少的10个参数,蛮力调节器将非常缓慢。我所说的暴力是指

在开始为我的问题实施解决方案之前,我只想确定我是否不会“重新发明轮子”,以及我是否可以重用以前有人做过的工作。所以我的问题是:

我使用OpenCV库制作了图像匹配器。此匹配器接收一组图像文件,并尝试在数据库中查找相似的图像。最后,它根据定义返回统计结果(真阳性、真阴性、假阳性和假阴性匹配数)。这些结果可能会因OpenCV的库算法参数值而有所不同,这些参数值约为10。这意味着参数调整将带来更多的真阳性匹配和更少的假阳性匹配。由于我必须调整或多或少的10个参数,蛮力调节器将非常缓慢。我所说的暴力是指:

While(param1 < 50){
  While(param2 < 50){
    While(param3 < 50){
      …
      PerformMatching();
      param3 +=2;
    }
    param2++;
  }
  pram1 +=5;
}
While(参数1<50){
而(参数2<50){
而(参数3<50){
…
性能匹配();
参数3+=2;
}
param2++;
}
pram1+=5;
}
我想做的是随机选择参数,然后分析统计结果是否变得更好。这一分析将有助于改变随机生成参数的方法,以便选择更好的参数

所以我的问题是,Java中是否有库,或者是否有任何AI算法,哪种算法会在评估真正值和假正值的基础上返回更好的参数集


非常感谢您的帮助。

有一系列算法优化技术,从示例中的简单网格搜索到各种自适应算法。如果你想了解更先进的技术,我建议你先看看微软的研究。他的著作对该领域有很好的概述

如果您不想花费太多时间,可以做的一大改进是随机生成参数,而不是使用常规网格。这样,如果某些参数不重要,就不会浪费时间来固定其他参数。你想要的是:

param1 = random.Next(50);
param2 = random.Next(50);
...
PerformMatching();
这种方法的另一个优点是,您可以收集任意长时间的采样点,而不必等到整个网格被探索。通过使用参数序列,可以更好地保持点均匀分布。有一些库将为您生成这些


生成点后,您可以简单地选择最佳组合,或使用绘图工具对其进行分析,或使用模式查找算法,如MeanShift。

有一系列算法优化技术,从示例中的简单网格搜索到各种自适应算法。如果你想了解更先进的技术,我建议你先看看微软的研究。他的著作对该领域有很好的概述

如果您不想花费太多时间,可以做的一大改进是随机生成参数,而不是使用常规网格。这样,如果某些参数不重要,就不会浪费时间来固定其他参数。你想要的是:

param1 = random.Next(50);
param2 = random.Next(50);
...
PerformMatching();
这种方法的另一个优点是,您可以收集任意长时间的采样点,而不必等到整个网格被探索。通过使用参数序列,可以更好地保持点均匀分布。有一些库将为您生成这些

生成点后,您可以简单地选择最佳组合,或使用绘图工具进行分析,或使用模式查找算法,如MeanShift。

爬山 你可以尝试一些随机优化算法,例如,从一个随机解开始(如@Don Reba所指出的),然后查看相邻解的集合,找出那些与成本函数相对应的更好的解。我将使用一些示例python代码来解释这个想法

获取邻居解决方案 对于您的邻居,您可以使用以下简单函数:

n_params = 5  # number of parameters
upper_bound = 5  # upper limit of your parameters
lower_bound = 0  # lower limit of your parameters

def get_neighbors(solution):
    neighbors = []
    for i in range(n_params):
        x = copy.deepcopy(solution)
        if x[i] < upper_bound:
            x[i] += 1 # increment one of the components
            neighbors.append(x)
        x = copy.deepcopy(solution)
        if x[i] > lower_bound:
            x[i] -= 1 # decrement one of the components
            neighbors.append(x)
    return neighbors 
这里我们假设每个参数都是一个整数。您可以通过调整步长(例如,0.05)来实现更高的粒度

爬山的迭代 即:

def get_cost(solution):
    cost = 0
    for i,param in enumerate(solution):
        cost += (-1.)**i * param**(i+1)  
    return cost
优化结果: 结果如下。我们使用[4,0,1,3,1]的随机初始猜测。经过14个步骤(评估14*10=140个邻居),我们找到了使成本最小化的最优答案[0,5,0,5,0]。对于暴力,您必须评估6^6=46656个解决方案。当您拥有高维解决方案时,可以节省更多的运行时间

注意,由于这是一种随机方法,因此最终结果是局部最小值(尽管有时它与全局最小值相同,但不能保证)。但实际上它已经足够好了

initial solution:               [4 0 1 3 1]
hill-climbing cost at step      1: -75
hill-climbing cost at step      2: -250
hill-climbing cost at step      3: -619
hill-climbing cost at step      4: -620
hill-climbing cost at step      5: -621
hill-climbing cost at step      6: -622
hill-climbing cost at step      7: -623
hill-climbing cost at step      8: -624
hill-climbing cost at step      9: -627
hill-climbing cost at step     10: -632
hill-climbing cost at step     11: -639
hill-climbing cost at step     12: -648
hill-climbing cost at step     13: -649
hill-climbing cost at step     14: -650
Final solution:                 [0 5 0 5 0]
相关职位 一个相关但更复杂的问题是:

可以找到以上所有代码。

爬山 你可以尝试一些随机优化算法,例如,从一个随机解开始(如@Don Reba所指出的),然后查看相邻解的集合,找出那些与成本函数相对应的更好的解。我将使用一些示例python代码来解释这个想法

获取邻居解决方案 对于您的邻居,您可以使用以下简单函数:

n_params = 5  # number of parameters
upper_bound = 5  # upper limit of your parameters
lower_bound = 0  # lower limit of your parameters

def get_neighbors(solution):
    neighbors = []
    for i in range(n_params):
        x = copy.deepcopy(solution)
        if x[i] < upper_bound:
            x[i] += 1 # increment one of the components
            neighbors.append(x)
        x = copy.deepcopy(solution)
        if x[i] > lower_bound:
            x[i] -= 1 # decrement one of the components
            neighbors.append(x)
    return neighbors 
这里我们假设每个参数都是一个整数。您可以通过调整步长(例如,0.05)来实现更高的粒度

爬山的迭代 即:

def get_cost(solution):
    cost = 0
    for i,param in enumerate(solution):
        cost += (-1.)**i * param**(i+1)  
    return cost
优化结果: 结果如下。我们使用[4,0,1,3,1]的随机初始猜测。经过14个步骤(评估14*10=140个邻居),我们找到了使成本最小化的最优答案[0,5,0,5,0]。对于暴力,您必须评估6^6=46656个解决方案。当您拥有高维解决方案时,可以节省更多的运行时间

注:由于这是一种随机方法,局部最小值为