【问题标题】:Using a genetic algorithm to guess an image使用遗传算法猜测图像
【发布时间】:2019-10-22 03:43:37
【问题描述】:

我正在尝试编写一个遗传算法,它将接收给定的图像,然后生成该图像。我已经为 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 值之间的距离,在 a类似于神经网络的成本函数。但是,我不确定我将如何实现这一点。也许

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】:

    您为什么不在搜索空间中尝试使用 马尔可夫链蒙特卡罗 (MCMC)?选择具有给定限制的随机抽样以减少搜索空间。您将交叉保持在 60% 左右,突变在 1% 并选择具有给定限制的随机图像,假设与您想要的图像相关的给定阈值内的像素平均值重建。尽管选择过程是次优的,但您可以使用基于期望最大化算法的轮盘赌来克服这种启发式方法,以及选择最适个体的阈值。

    【讨论】:

    • 我不知道 MCMC 是什么,但你是说对于我的初始人口,我应该只生成 rgb 值接近正确 rgb 值的 [ixels?这不算作弊吗?
    • 在实践中 60% 交叉意味着什么?还有 1% 的突变?
    • 您能解释一下使用基于 EM 的轮盘赌是什么意思吗?
    • 如果我没有任何观察到的可用数据,EM 如何应用?
    • RGB 值是随机生成的,随机过程。 60% 的交叉意味着您将在父母之间交换遗传物质以创建样本,1% 的突变将略微增加数据的方差,并且 EM 算法将仅选择最可能的样本给定上一轮的输入,这是已知的。这是可行的。
    猜你喜欢
    • 2018-05-10
    • 2023-03-04
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2011-01-11
    • 2016-03-26
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多