计算机视觉实战:从零开始写一个图像分类小工具

全栈手艺人
2026-01-05 12:37
阅读 2104

大家好,我是老张,一个从培训班出来的前端开发。虽然现在主要写 Vue 和 React,但刚入行那会儿,我也和你们一样,对“人工智能”“算法”这些词又怕又好奇。后来为了接外包项目,硬着头皮学了点计算机视觉(Computer Vision),没想到真能做出点实用的东西!今天我就用最接地气的方式,带你动手做一个本地运行的图像分类小工具——不用联网、不碰区块链,但我会告诉你为什么很多人总把“区块链”和“AI”混在一起说。

为什么我要写这篇教程?

我当初学的时候,一搜“计算机视觉”,满屏都是“卷积神经网络”“反向传播”“Transformer”……看得我头大。其实,你不需要懂所有理论才能动手!就像学开车不用先学会造发动机。这篇文章就带你用现成的工具,快速做出一个能识别猫狗的小程序,顺便搞懂几个核心概念。

📌 注意:本文不涉及区块链技术本身!但会在最后解释为什么“区块链+AI”常被一起提及。


第一步:环境准备(5分钟搞定)

我们用 Python + OpenCV + 预训练模型,全程离线运行。

安装必备工具

  1. 安装 Python(推荐 3.8~3.11)
    python.org 下载安装,记得勾选 “Add to PATH”。

  2. 创建虚拟环境(强烈建议)

# 创建
python -m venv cv-env

# 激活(Windows)
cv-env\Scripts\activate

# 激 activate(Mac/Linux)
source cv-env/bin/activate
  1. 安装依赖包
pip install opencv-python numpy pillow

💡 新手避坑:别直接 pip install cv2!正确包名是 opencv-python


第二步:搞懂三个关键词(用大白话)

什么是计算机视觉?

就是让计算机“看懂”图片或视频。比如:

  • 自动识别人脸
  • 自动给照片打标签(“这是一只猫”)
  • 自动检测工厂零件是否破损

算法在这里起什么作用?

“算法”就是一套处理图像的规则。比如:

  • 边缘检测算法:找出物体轮廓
  • 分类算法:判断图中是猫还是狗

我们不用自己写算法,而是用别人训练好的模型(就像用现成的轮子)。

区块链和这事有关系吗?

基本没关系! 但有些项目会吹“AI+区块链”,比如:

  • 用区块链存AI训练数据的哈希值(防篡改)
  • 用代币激励用户贡献数据

但对我们新手来说,先专注把视觉功能做出来,别被 buzzword 带偏!


第三步:实战!做一个图像分类器

我们将用 OpenCV 加载一个预训练的 MobileNet 模型(轻量级,适合本地运行),实现上传一张图,输出它最可能是什么。

步骤 1:下载模型文件

我们需要两个文件(已打包好,直接下载):

文件 作用 下载地址
mobilenet_v2.onnx 模型权重 点击下载
imagenet_labels.txt 分类标签(1000个类别) 点击下载

🔍 提示:如果链接失效,搜索 “mobilenetv2 onnx model github” 即可找到。

把这两个文件放到你的项目文件夹,比如叫 cv-project/

步骤 2:写代码(逐行解释)

新建文件 classifier.py,粘贴以下代码:

import cv2
import numpy as np

# 1. 读取标签文件
with open("imagenet_labels.txt", "r") as f:
    labels = eval(f.read())  # 简单处理,实际项目建议用 json.loads

# 2. 加载 ONNX 模型
net = cv2.dnn.readNetFromONNX("mobilenet_v2.onnx")

# 3. 读取要识别的图片
image_path = "your_image.jpg"  # ←←← 这里改成你的图片路径!
img = cv2.imread(image_path)
if img is None:
    print("❌ 图片没找到!检查路径是否正确")
    exit()

# 4. 预处理:调整尺寸 + 归一化
blob = cv2.dnn.blobFromImage(
    img, 
    scalefactor=1.0 / 255.0,  # 像素值除以255(归一到0~1)
    size=(224, 224),          # MobileNet 输入尺寸
    mean=(0, 0, 0),           # 不减均值
    swapRB=True,              # BGR → RGB
    crop=False
)

# 5. 推理(让模型“思考”)
net.setInput(blob)
output = net.forward()

# 6. 解析结果:找出概率最高的类别
top_idx = np.argmax(output[0])
confidence = output[0][top_idx]
label = labels[top_idx]

print(f"✅ 识别结果: {label} (置信度: {confidence:.2f})")

步骤 3:运行!

  1. 准备一张测试图,比如 cat.jpg,放到项目目录
  2. 修改代码中的 image_path = "cat.jpg"
  3. 终端运行:
python classifier.py

你应该看到类似输出:

✅ 识别结果: Egyptian cat (置信度: 0.92)

🎯 成功!你刚刚完成了第一个计算机视觉项目!


第四步:性能优化小技巧

虽然模型已经很快(MobileNet 设计就是为移动端优化),但我们还能做得更好:

1. 缓存模型加载

每次运行都加载模型很慢。可以改成启动时加载一次,重复使用

# 全局变量(适合做成 Web API 时用)
MODEL = cv2.dnn.readNetFromONNX("mobilenet_v2.onnx")

def classify_image(img_path):
    # ... 复用 MODEL ...

2. 调整输入尺寸

如果对精度要求不高,可以把 size=(224,224) 改成 (128,128),速度提升 3 倍以上!

3. 使用 CPU 优化(OpenVINO 或 ONNX Runtime)

进阶方案:用 Intel 的 OpenVINO 工具套件,推理速度再快 2~5 倍(适合部署到服务器)。


新手常见问题解答

❓ Q1:为什么我的图片识别不准?

  • 原因1:图片太小/模糊 → 尽量用清晰、主体突出的图
  • 原因2:模型只认识 ImageNet 的 1000 类 → 别拿它识“螺蛳粉”或“老板的脸” 😅
  • 解决:想识别特定物体(比如“电路板缺陷”),需要重新训练模型(那是另一个话题了)

❓ Q2:能在网页里用吗?

可以!但要用 TensorFlow.js 或 ONNX.js。不过性能不如本地 Python。建议:前端只负责上传,后端 Python 处理

❓ Q3:一定要用 ONNX 吗?能不能用 PyTorch/TensorFlow?

能!但 ONNX 是跨框架标准,OpenCV 原生支持,对新手最友好。等你熟悉后再尝试其他。

❓ Q4:这和“代码人生”有什么关系?

🌟 我当初学编程,以为必须成为算法大神才能做 AI。后来发现:会调用工具 + 理解流程 = 能解决问题。你的“代码人生”不是从推导公式开始,而是从跑通第一行 demo 开始!


下一步学习建议

别停在这里!按这个路径继续深入:

  1. 玩转 OpenCV

    • 学习图像滤波、边缘检测、人脸检测(OpenCV 自带 Haar 级联)
    • 推荐项目:实时摄像头人脸马赛克
  2. 理解模型原理(不必深究数学)

    • 看 3Blue1Brown 的《深度学习》动画视频(B站有)
    • 重点理解:输入→特征提取→分类 的流程
  3. 尝试自定义分类

    • 用 Teachable Machine(Google 出的在线工具)训练自己的模型
    • 导出为 TensorFlow Lite,在手机上跑
  4. 探索部署方案

    • 用 Flask 写个 Web 接口
    • 用 Docker 打包,部署到云服务器

最后说两句

我写这篇教程,就是想告诉你:计算机视觉没那么可怕。你不需要懂区块链,也不需要推导反向传播公式。只要会装环境、会抄代码、会改参数,就能做出有意思的东西。

记住:所有大神,都是从“跑通第一个 demo”开始的。你现在看到的每一行代码,都是我当初熬夜查 Stack Overflow 拼出来的。

所以,别犹豫——
马上去下个猫图,跑一遍代码!
你的 AI 之旅,就从这一行 python classifier.py 开始。

✨ 代码人生,始于运行。

评论 0

最热最新
暂无评论
全栈手艺人Lv.1
0
影响力
0
文章
0
粉丝