机器学习笔记 - 使用遗传算法进行图像重建

一、遗传算法概述

        遗传算法的灵感来自染色体的生物进化,主要用于各种问题的最优特征选择。遗传算法基本上遵循启发式算法的方法来寻找接近最优解的最优解。该算法在各个领域都有广泛的应用,大多数是在优化问题中。它还可以用于图像重建,以获取原始形式的图像。本文的重点是应用遗传算法来进行这种有趣的图像重建应用。

        遗传算法基本上用于优化任务,这些算法遵循元启发式方法来获得所有候选解决方案中的最佳最优解决方案。遗传算法对生物染色体的层次结构进行操作,该算法试图获得最适合的解决方案以传递给下一代。

        遗传算法最初在称为初始种群的最佳可能解决方案集群上运行,其中集群包含问题的最佳可能解决方案。集群中的每个解决方案都按某些参数分类,它们被称为基因在遗传算法中,遗传算法中的基因将根据参数集进行排序。具有所有能力集的基因将被传递给适应度函数,以确定从问题的候选解决方案集群中选择的最佳可能解决方案的适应度。如果可能的最佳解决方案能够继承适应度函数的所有功能,则该解决方案将传递给下一代。遗传算法的整体操作发生在三个层次上,它们是选择、变异和交叉。

        遗传算法中的选择是用于在候选解决方案中选择最佳可能解决方案的标准术语。选择在遗传算法中起着重要作用,因为它将负责选择可能的最佳解决方案,这些解决方案将传递给下一代进行进一步处理。所以遗传算法中的选择阶段是遗传算法中非常重要的阶段。

        遗传算法的交叉阶段主要负责在基因中的随机位置设置一定的阈值,交叉将负责在选择阶段获得的两个随机解之间交换基因。因此,信息必须通过各个解决方案传递,直到达到基因的交叉。

        遗传算法中的突变阶段确保基因内以更高的随机概率发生交叉。因此,突变将负责在基因中设置更高的随机阈值,以便在解决方案之间传递的信息相当多,并且还需要突变阶段来保持为问题选择的最佳可能解决方案之间的多样性。

二、基使用遗传算法重建图像

1、图像重建

        图像重建是通过图像的各个像素进行进化的迭代过程,并试图通过进化获得原始图像。图像重建主要应用于医学成像、反向成像和原始图像恢复任务。 

        以类似的方式,遗传算法可用于图像重建,其中该算法试图重建接近原始图像的图像。遗传算法基本上遵循基于元启发式的方法,并且该算法迭代重建接近原始图像的图像的最佳方法。Pygad 就是这样一种遗传算法库,它的结构和设计旨在重建接近原始图像的图像。

2、使用遗传算法重建图像

        遗传算法中的图像重建可以使用专门为使用遗传算法原理进行图像重建而设计的 Pygad 库。

        那么让我们看看如何使用 Pygad 进行图像重建。

        让我们首先安装库并将库导入工作环境。

!pip install pygad
import pygad

        让我们使用 matplotlib 库可视化原始图像。

import matplotlib.pyplot as plt
img=plt.imread('/content/drive/MyDrive/Colab notebooks/GA_Img_reconstruction/tiger.jpeg')
plt.imshow(img)
plt.show()

         图像必须归一化到标准比例值,才能将原始图像传递给遗传算法。因此,让我们使用 numpy 库来缩放图像。

img = np.asarray(img/255, dtype=np.float)

        一旦图像被缩放,我们将不得不使用一个名为 GARI [用于再现图像的遗传算法] 的库,该库设计用于将原始图像分解为染色体并相应地重新塑造原始图像,它可以传递给遗传算法。所以 GARI 可以说是 Pygad 的子模块之一,它必须通过克隆到各自的 Github 存储库中才能在工作环境中使用。

!git clone 'https://github.com/ahmedfgad/GARI'
%cd /content/drive/MyDrive/Colab notebooks/GA_Img_reconstruction/GARI
import gari

        因此,一旦将 gari 库导入工作环境,就必须使用该库将图像分解为染色体,这些染色体将位于最接近原始图像的最佳可能图像的初始种群的簇中。那么让我们看看如何将原始图像分解为一组可能的重建图像。

target_chromosome = gari.img2chromosome(img)

        所以这里必须使用“img2chromosome”函数将原始图像分解成最好的重建图像。因此,一旦原始图像被重建,我们将不得不创建一个适应度函数来仅生成最合适的解决方案,这些解决方案可以传递给 Pygad 实例以重建图像。因此,让我们创建一个适应度函数,考虑原始图像和重建图像之间的最大差异,以便重建的图像接近原始图像。 

def fitness_fun(solution, solution_idx):
 fitness = np.sum(np.abs(target_chromosome-solution))
 fitness = np.sum(target_chromosome) - fitness
 return fitness

        因此,这里使用一个用户定义的函数来创建一个适应度函数,该函数将负责产生一个适应度得分,该得分用于交叉验证种群中候选解决方案之间的适应度得分,并且通过适应度得分的解决方案将是考虑突变来重建图像。

        现在让我们使用 Pygad 创建一个遗传算法实例,并声明某些参数以进行有效优化并重建接近原始图像的图像。

ga_instance = pygad.GA(num_generations=15000,
                      num_parents_mating=4,
                      fitness_func=fitness_fun,
                      sol_per_pop=10,
                      num_genes=img.size,
                      init_range_low=0.0,
                      init_range_high=1.0,
                      mutation_percent_genes=0.01,
                      mutation_type="random",
                      mutation_by_replacement=True,
                      random_mutation_min_val=0.0,
                      random_mutation_max_val=1.0)

        这里使用 Pygad 库创建了一个遗传算法实例,其中在某些参数中,例如算法必须通过使用种群中存在的候选解决方案进化的代数,父母交配的数量表示将是的解决方案集负责共享信息(变异),直到达到交叉点,所有将被变异的解决方案都应该传递适应度函数中强制执行的参数等等。因此,在创建遗传算法实例时,必须使用启发式算法的基本原理对实例进行迭代,并且在迭代过程中,实例试图找到可能的最佳解决方案,这意味着图像被重建得更接近原始图像。

ga_instance.run()

        适应度分数随着代数的增加而增加,并且可以使用“plot_result”内置函数进行可视化。

ga_instance.plot_result()
plt.show()

        适应度得分随着代数的增加而增加,因为候选解决方案将尝试根据适应度函数中声明的各种因素进行进化,并尝试重现可以传递给突变的最佳最优解决方案。

        可以使用 Pygad 实例可视化在最佳解决方案附近产生的最佳解决方案。这里正在重建的图像可以使用 GARI 库的“chromosome2img”内置函数进行可视化,如下所示。

solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Fitness value of the best solution = {solution_fitness}".format(solution_fitness=solution_fitness))
print("Index of the best solution : {solution_idx}".format(solution_idx=solution_idx))
 
if ga_instance.best_solution_generation != -1:
   print("Best fitness value reached after {best_solution_generation} generations.".format(best_solution_generation=ga_instance.best_solution_generation))
 
result = gari.chromosome2img(solution, img.shape)
plt.imshow(result)
plt.title("PyGAD & GARI for Reproducing Images")
plt.show()

        在这里我们可以看到,在遍历 15000 个候选解决方案后,Pygad 实例已尝试重建接近原始图像的图像,如上所示。 

        在这里,我们可以清楚地看到遗传算法如何尝试重建更接近原始图像的图像。随着代数的增加和突变数的增加,重建的图像会更好。这是因为该算法迭代了集群中的所有候选解决方案,并且将为突变传递的最合适的解决方案将更多。这使得算法重建的图像更接近原始图像。

         遗传算法主要用于优化各种问题,在本文中,我们已经了解了如何使用遗传算法重建图像。更多的代数和更多的最佳突变数是算法提供的解决方案。遗传算法的优化过程是耗时的,这就是它在进化算法中的主要用途,其中最优解是进化算法的主要要求。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125645457