视觉识别模块
视觉识别模块的作用是将纯像素输入转化为符号,它的输入是纯像素numpy矩阵,输出是符号化的numpy矩阵。
例如,对于默认使用的环境MiniHack-KeyRoom-S5-v0来说,它的输入是大小为[336, 1264, 3]的numpy数组, 即大小为宽336长1264的rgb图片,而输出则是[21, 79]的numpy数组。
Minihack的每一个格子的像素值为16x16
视觉识别模块的代码都位于src/rec_manager下,并且继承自src/rec_manager/rec_interface.py中的RecInterface类。用户只需创建一个新类继承RecInterface,并重写其中的recognize方法即可。
class RecInterface(ABC):
def __init__(self):
pass
@abstractmethod
def recognize(self, obs: np.ndarray) -> np.ndarray:
pass
视觉识别模块在配置文件src/config_manager/conf.yaml中的部分为
# 视觉模块设置
vision_config:
type: "cnn" # none, cnn
cnn_config:
num_classes: 7 # 分类器的label数目
目前暂时只支持none与cnn
none
none的意思即不做任何视觉识别方面的处理,直接将原始图像输入送入下一个环节。只需要将type设置为none就可以了。
设置为none的情况一般是当Agent模块为vlm的时候。
cnn
cnn的输入是一个16*16的像素小块,而输出则是这个小块所属的类别。需要注意的是,对于不同的任务,类别可能会发生变化,例如对于默认的环境MiniHack-KeyRoom-S5-v0,我们只需要定义7个类别:0-虚空,1-墙壁,2-地板,3-门,4-钥匙,5-玩家,6-目标点。因此这个cnn本质上是在做7分类的任务。
众所周知,训练一个cnn, 需要一个带标签的数据集,自动获取并保存图像小块的代码已经内置,但是打标这一步,仍然需要人工执行。 如果您的任务仍然是MiniHack-KeyRoom-S5-v0,那么您可以跳过这一步,因为这个任务的cnn已经训练好了,权重位于src/rec_manager/cnn_rec/cnn_model.pth
但是如果你的任务是一个全新的任务,需要自己定义新的符号以及类别,那么您可能需要考虑重新训练一个cnn来适配这个任务。您需要
- 1.删除原来的src/rec_manager/cnn_rec/tiles文件夹、cnn权重以及labels.txt文件。
- 2.再重新在配置文件中设置新的类别数。
- 3.然后重新运行main.py。
- 4.在labels.txt文件打标,第i行表示src/rec_manager/cnn_rec/tiles文件夹下第i张图片的标签
- 由于可能单次运行无法获取所有的tile,并且最初的cnn是随机分类的,可能会导致策略异常,因此您可能需要多次执行步骤3与步骤4
由于对于新任务的cnn训练较为繁琐,我们可能未来会推出webui,可以在网页中直接打标,单次运行即可。
自定义
如果您想要自己实现一个视觉识别模块,那么您可以参考src/rec_manager/cnn_rec/rec_factory.py的代码,将自己实现的继承RecInterface的新类填入其中,然后修改conf.yaml配置文件即可。