入门 Eva J Patel(freeCodeCamp) 2026-09-10 16:14:02 · 0 阅读

第17章 构建图像分类应用

图像分类是另一个非常适合用 Gradio 做的项目,因为用户交互非常直观。

上传一张图片,点一下按钮,就能得到预测结果。

基本流程

分类应用的流程如下:

图片
→ 预处理
→ 模型推理
→ 类别概率
→ 用户友好的预测结果

先搭建界面

import gradio as gr

def classify(image):
    if image is None:
        return {}

    return {
        "cat": 0.8,
        "dog": 0.15,
        "bird": 0.05
    }

with gr.Blocks() as demo:
    image = gr.Image(
        label="Upload an image"
    )

    button = gr.Button(
        "Classify"
    )

    result = gr.Label(
        label="Prediction"
    )

    button.click(
        fn=classify,
        inputs=image,
        outputs=result
    )

demo.launch()

这里的字典表示各类别的概率。实际使用时,用真实模型的输出替换这个占位字典即可。

加载预训练模型

真实的分类器通常需要用机器学习库来加载,具体代码取决于你使用的模型。

但整体结构是不变的:

model = load_model()

def classify(image):
    processed = preprocess(image)
    prediction = model(processed)

    return format_prediction(prediction)

预处理

模型通常要求输入图片具有特定尺寸。

例如:

image = image.resize((224, 224))

可能还需要做归一化。

预处理方式必须与模型训练时的配置保持一致。

标签

模型可能输出这样的结果:

[0.01, 0.93, 0.06]

你需要知道这些索引分别对应什么类别。

比如:

labels = [
    "cat",
    "dog",
    "bird"
]

然后:

prediction = {
    labels[i]: float(score)
    for i, score in enumerate(probabilities)
}

置信度阈值

有时模型给出的最高置信度预测并不可靠。

假设最高的置信度只有:

0.34

你的应用可以这样提示:

The model is not confident enough to make a prediction.

而不是把结果说得像确定无疑。

示例如下:

def classify(image):
    probabilities = model(image)

    best_index = max(
        range(len(probabilities)),
        key=lambda i: probabilities[i]
    )

    confidence = probabilities[best_index]

    if confidence < 0.5:
        return {"Uncertain": 1.0}

    return {
        labels[best_index]: confidence
    }

阈值应根据具体模型和应用场景来设定,不能随意拍板。

展示 Top 预测

不要只展示排名第一的类别,可以列出前几名。

例如:

{
    "golden retriever": 0.82,
    "Labrador retriever": 0.11,
    "tennis ball": 0.04
}

这样用户能获得更完整的上下文。

添加图片预览

输入组件本身已提供预览功能。

你也可以返回一张经过处理的图片。

例如:

def classify(image):
    prediction = ...
    annotated = image

    return prediction, annotated

再配合显示:

result = gr.Label()
preview = gr.Image()

处理无效图片

函数中应做如下检查:

if image is None:
    ...

预处理或推理阶段也可能抛出异常,需要捕获处理。

动手试一试

搭建一个图像分类器界面,包含以下功能:

  • 图片上传

  • 分类按钮

  • 前三名预测结果

  • 置信度分数

  • 置信度阈值

再增加一个选项,将上传图片与结果并排显示。

要点总结

  • 图像分类融合了预处理、推理和后处理。

  • 模型标签必须与输出索引一一对应。

  • 置信度分数能为用户提供有用的参考信息。

  • 低置信度的预测不应被直接当作确定结果呈现。

  • Gradio 负责界面,模型负责分类。

评论 (0)