You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用VisualKeras可视化Keras模型时修改图例字体大小报错的解决办法及CNN层图例字体调整方案

修改VisualKeras图例字体大小的可行方案

你遇到的OSError: cannot open resource问题,本质是PIL找不到你指定的arial.ttf字体文件——要么系统里没有安装这个字体,要么你写的路径不对。下面给你一套完整的解决方案,从修复字体加载问题到成功修改图例字体大小:

一、先解决字体加载失败的问题

方法1:使用系统已存在字体的绝对路径

不同系统的字体位置不一样,你可以根据自己的系统替换路径:

  • Linux:常见字体比如DejaVu Sans的路径通常是/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
  • Windows:Arial字体的路径一般是C:/Windows/Fonts/arial.ttf
  • macOS:比如Arial的路径可能是/Library/Fonts/Arial.ttf

修改后的字体加载代码示例:

from PIL import ImageFont
# 以Linux的DejaVu Sans为例
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 42)

方法2:自动查找可用字体(如果不确定路径)

如果你不知道系统里有哪些字体,可以用这段代码遍历常见字体目录,输出所有可用的ttf字体路径:

from PIL import ImageFont
import os

font_dirs = [
    "/usr/share/fonts/truetype",
    os.path.expanduser("~/.fonts"),
    "/Library/Fonts",
    os.path.expanduser("~/Library/Fonts"),
    "C:/Windows/Fonts"
]

for dir_path in font_dirs:
    if os.path.exists(dir_path):
        for root, _, files in os.walk(dir_path):
            for file in files:
                if file.lower().endswith(".ttf"):
                    print(os.path.join(root, file))

从输出里挑一个你想用的字体路径即可。

方法3:降级使用默认字体

如果实在找不到合适的字体,可以用PIL的默认字体临时替代,虽然样式可能普通,但能解决报错问题:

font = ImageFont.load_default()
# 或者如果需要调整默认字体大小,可以这样(部分版本PIL支持)
font = ImageFont.load_default().font_variant(size=42)

二、完整的VisualKeras可视化代码

解决字体问题后,你的原代码逻辑是对的,下面是完整的可运行示例(替换成你自己的模型和颜色映射):

import visualkeras
from PIL import ImageFont
import tensorflow as tf

# 替换成你自己的Keras模型
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation='softmax')
])

# 加载字体(这里用Linux的DejaVu Sans为例)
try:
    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 42)
except OSError:
    #  fallback到Windows字体或默认字体
    try:
        font = ImageFont.truetype("C:/Windows/Fonts/arial.ttf", 42)
    except OSError:
        print("指定字体未找到,使用默认字体")
        font = ImageFont.load_default()

# 替换成你自己的颜色映射
color_map = {
    tf.keras.layers.Conv2D: '#88ff88',
    tf.keras.layers.MaxPooling2D: '#8888ff',
    tf.keras.layers.Dense: '#ff8888'
}

# 生成可视化图,字体参数会同时应用到层标签和图例
visualization_img = visualkeras.layered_view(
    model, 
    spacing=5, 
    font=font, 
    legend=True, 
    color_map=color_map
)

# 显示或保存图片
visualization_img.show()
visualization_img.save("model_visualization.png")

三、额外注意事项

  1. 升级VisualKeras版本:确保你用的是最新版VisualKeras(>=0.0.2),旧版本可能不支持将font参数传递给图例渲染。可以用pip install --upgrade visualkeras升级。
  2. 字体大小调整:你可以修改truetype方法里的第二个参数(比如把42改成30或50)来调整字体大小,直到满意为止。

内容的提问来源于stack exchange,提问作者Kenan Morani

火山引擎 最新活动