首页 > 解决方案 > 将图像数据发送到 NEAT 中的神经网络,但我需要保留颜色?

问题描述

我目前正在尝试使用复古健身房和整洁来创建一个神经网络,它将扮演 Robotniks Mean Bean Machine 博士。

import retro
import numpy as np
import cv2
import neat
import pickle

env = retro.make('DrRobotniksMeanBeanMachine-Genesis')
imgarray = []

def eval_genomes(genomes, config):

    for genome_id, genome in genomes:
        ob = env.reset()   # start obs view
        ac = env.action_space.sample()   # action

        inx, iny, inc = env.observation_space.shape    # screen resolution
        inx = int(inx/8)
        iny = int(iny/8)
        print(inc)
        net = neat.nn.recurrent.RecurrentNetwork.create(genome, config)     # create NN

        current_max_fitness = 0
        fitness_current = 0
        frame = 0
        counter = 0
        score = 0
        score_aim = 1000
        score_max = 0
        finished = False

        done = False
        while not done:
            env.render()
            frame += 1
            # image rendering for NN
            ob = cv2.resize(ob, (inx, iny))
            ob = cv2.cvtColor(ob, cv2.COLOR_BGR2GRAY)
            ob = np.reshape(ob, (inx, iny))

            for x in ob:
                for y in x:
                    imgarray.append(y)

            nnOutput = net.activate(imgarray)

            ob, rew, done, info = env.step(nnOutput)

            imgarray.clear()
            score = info['score']
            if score > score_max:
                fitness_current += 1
                score_max = score
            if score > score_aim:
                fitness_current += 100000
                done = True
            if fitness_current > current_max_fitness:
                current_max_fitness = fitness_current
                counter = 0
            else:
                counter += 1

            if done or counter == 40:
                done = True
                print(genome_id, fitness_current)

            genome.fitness = fitness_current


config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,
                     neat.DefaultSpeciesSet, neat.DefaultStagnation,
                     'config-feedforward')

p = neat.Population(config)

winner = p.run(eval_genomes)
with open('winner.pkl', 'wb') as output:
    pickle.dump(winner, output, 1)

这行得通,但是它很慢,我担心查看它正在查看的内容无法区分不同的 bean。我知道每个豆子都有一个与其颜色相对应的形状,但是我认为图像数据太压缩,神经网络无法看到这一点。

反正有没有让神经网络看到颜色?当我尝试使用不同的 cv2 颜色转换(如 BGR2HSL)时,它建议我无法调整 numpy 数组的大小以适应。我稍微调整了屏幕分辨率,但数字跳来跳去。这是一个示例错误消息:

ValueError:无法将大小为 3360 的数组重塑为形状 (28,40)

如果有人有任何经验或建议,或者可以为我指出正确的解决方案,我将不胜感激!

标签: pythonneural-networkartificial-intelligencecv2

解决方案


推荐阅读