使用遗传算法猜测图像

问题描述 投票:1回答:1

我正在尝试编写一种遗传算法,该算法将获取给定的图像,然后生成该图像。对于28x28的黑白图像,我已经实现了这一目标,但是我正在努力研究如何对较大的RGB图像进行此处理。

我以为我将从生成总体中的个体开始,所以我随机生成了一个大小为x * y的列表,其中x和y是输入图像的尺寸,并且列表中的每个项目都采用(r ,g,b)。像这样

random_numbers = np.random.randint(low=0, high=256, size=(pixel_amount, 3))
generated_colours = [tuple(colour) for colour in random_numbers.tolist()]

为了评估适合度,我仔细检查了要生成的图像中的每个像素,然后检查了总体中的个体,然后检查了在正确的位置有多少像素是正确的颜色。但是,这显然不是一个好方法,因为每种颜色有256 ^ 3个组合。因此,我认为根据r,g和b的各个正确值中的多少进行评估可能是一个更好的主意。因此,一个28x28像素的图像的最大适应度为28 * 28 * 3 = 2352(在这种情况下,这很好,而低适应度通常是理想的,因此您可以将其反转)。虽然,我认为也许最好将一个人口中每个个体的r,g和b值与我们想要的图像中的r,g和b值分别相距多远。类似于神经网络的成本函数。但是,我不确定该如何实现。也许

fitness = 0
for i in range(pixel_amount):
    given_image_rgb = given_image_pixels[i]
    individual_rgb = individual_pixels[i]
    for j in range(3):
        fitness += (individual_rgb[j] - given_image_rgb[j])**2

因此,如果适应度保持为零,那是因为图像完全正确。而如果它比我们想要的更高。虽然,我认为这将给出非常大的数字,因为对于仅28x28的图像,最差的适应度为28 * 28 * 3 * 255 ^ 3 = 152938800。

因此,假设我可以在人群中找到最合适的人,那么我将删除最差的一半人。然后,我会选拔最适合自己的人来创造下一代。我正在考虑通过从剩余的一半中随机选择两个人来做到这一点。然后,我随机选择一半的像素坐标,然后从parent1中获取这些像素,然后从parent2中获取另一半像素来生成child1。然后,我采取逆以形成child2。这将一直持续到恢复初始人口规模为止。但是,我认为这种交叉不仅需要组合像素,还需要组合像素的(r,g,b)值。也许计算两个平均值并始终取整?这是当前的方法:

first_child = [None for _ in range(pixel_amount)]
second_child = [None for _ in range(pixel_amount)]
first_parent = first_parent[1]
second_parent = second_parent[1]
for i in range(pixel_amount):
    if i in random_pixels:
        first_child[i] = first_parent[i]
        second_child[i] = second_parent[i]
    else:
        first_child[i] = second_parent[i]
        second_child[i] = first_parent[i]
return first_child, second_child

[之后,我将对个体进行突变,这将涉及随机改变每个个体中一定百分比的像素。说每个图像的0.25%将被设置为随机值(r,g,b)。

for individual in population:
    mutated_pixels = random.sample(range(pixel_amount - 1), int(pixel_amount * mutation_rate))
    for pixel in mutated_pixels:
        individual[pixel] = tuple(np.random.randint(low=0, high=256, size=3))

就停止条件而言,我将计算出正确百分比的像素或正确百分比的rgb值,然后在达到一定百分比正确率(例如70%)时停止它。

很抱歉,我发表了一篇较长的文章,但是我非常感谢您提供一些有关如何使它在更大的彩色图像上工作的建议。我知道使用这种方法实际上是不可能的,因此我开始研究使用一组半透明多边形。

python genetic-algorithm
1个回答
0
投票

您为什么不尝试在搜索空间中使用Markov Chain Monte Carlo(MCMC)?选择具有给定限制的随机采样以减少搜索空间。您将分频保持在[[60%附近,将突变保持在[[1%附近,并选择具有给定限制的随机图像,即与给定图像相关的给定阈值内像素的平均值。尽管选择过程不是最理想的,但是您可以使用基于期望最大化算法的轮盘作为克服这种启发式方法的方法,以及选择最适个人的门槛。

© www.soinside.com 2019 - 2024. All rights reserved.