计算机视觉实战:从零开始写一个图像分类小工具
大家好,我是老张,一个从培训班出来的前端开发。虽然现在主要写 Vue 和 React,但刚入行那会儿,我也和你们一样,对“人工智能”“算法”这些词又怕又好奇。后来为了接外包项目,硬着头皮学了点计算机视觉(Computer Vision),没想到真能做出点实用的东西!今天我就用最接地气的方式,带你动手做一个本地运行的图像分类小工具——不用联网、不碰区块链,但我会告诉你为什么很多人总把“区块链”和“AI”混在一起说。
为什么我要写这篇教程?
我当初学的时候,一搜“计算机视觉”,满屏都是“卷积神经网络”“反向传播”“Transformer”……看得我头大。其实,你不需要懂所有理论才能动手!就像学开车不用先学会造发动机。这篇文章就带你用现成的工具,快速做出一个能识别猫狗的小程序,顺便搞懂几个核心概念。
📌 注意:本文不涉及区块链技术本身!但会在最后解释为什么“区块链+AI”常被一起提及。
第一步:环境准备(5分钟搞定)
我们用 Python + OpenCV + 预训练模型,全程离线运行。
安装必备工具
安装 Python(推荐 3.8~3.11)
去 python.org 下载安装,记得勾选 “Add to PATH”。创建虚拟环境(强烈建议)
# 创建
python -m venv cv-env
# 激活(Windows)
cv-env\Scripts\activate
# 激 activate(Mac/Linux)
source cv-env/bin/activate
- 安装依赖包
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:运行!
- 准备一张测试图,比如
cat.jpg,放到项目目录 - 修改代码中的
image_path = "cat.jpg" - 终端运行:
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 开始!
下一步学习建议
别停在这里!按这个路径继续深入:
玩转 OpenCV
- 学习图像滤波、边缘检测、人脸检测(OpenCV 自带 Haar 级联)
- 推荐项目:实时摄像头人脸马赛克
理解模型原理(不必深究数学)
- 看 3Blue1Brown 的《深度学习》动画视频(B站有)
- 重点理解:输入→特征提取→分类 的流程
尝试自定义分类
- 用 Teachable Machine(Google 出的在线工具)训练自己的模型
- 导出为 TensorFlow Lite,在手机上跑
探索部署方案
- 用 Flask 写个 Web 接口
- 用 Docker 打包,部署到云服务器
最后说两句
我写这篇教程,就是想告诉你:计算机视觉没那么可怕。你不需要懂区块链,也不需要推导反向传播公式。只要会装环境、会抄代码、会改参数,就能做出有意思的东西。
记住:所有大神,都是从“跑通第一个 demo”开始的。你现在看到的每一行代码,都是我当初熬夜查 Stack Overflow 拼出来的。
所以,别犹豫——
马上去下个猫图,跑一遍代码!
你的 AI 之旅,就从这一行 python classifier.py 开始。
✨ 代码人生,始于运行。

评论 0