入门 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 负责界面,模型负责分类。