从零开始玩转计算机视觉:一个“能认猫”的实战项目

代码小镇
2025-12-13 02:33
阅读 468

大家好!我是工作5年的后端开发工程师,但别被“后端”两个字吓到——其实我也曾是个对图像、摄像头完全陌生的小白。我当初学计算机视觉(Computer Vision)时,光是装环境就折腾了三天,还一度以为自己不适合搞AI。后来才明白,不是我不行,是教程太复杂。

今天我就用最简单的方式,带你完成一个能识别图片中是不是有猫的实战项目。全程只用20行代码,但背后藏着的是真实可用的算法和开发经验。如果你连Python都没写过几行,也别担心——我会把每一步拆得像搭积木一样清楚。


什么是计算机视觉?它能做什么?

简单说,计算机视觉就是让机器“看懂”图片或视频

  • 手机人脸解锁 → 看懂“这是不是你”
  • 自动驾驶识别红绿灯 → 看懂“现在是红灯”
  • 电商搜图找同款 → 看懂“这件衣服长这样”

我们今天要做的,就是一个超简版的“猫识别器”。虽然小,但它包含了模型加载、图像预处理、推理预测这些核心流程——也就是所有CV项目的骨架。


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

💡 提示:我建议你用 Python 3.8~3.11,太新或太旧都可能出问题。

1. 安装 Python 和 pip

如果你还没装 Python,请先去 python.org 下载安装。安装时记得勾选 “Add to PATH”

验证是否成功:

python --version
pip --version

2. 创建虚拟环境(强烈推荐!)

这能避免包冲突,是我踩坑后总结的血泪经验。

# 创建名为 cv_env 的虚拟环境
python -m venv cv_env

# 激活它(Windows)
cv_env\Scripts\activate
# 激激活它(Mac/Linux)
source cv_env/bin/activate

你会看到命令行前面多了 (cv_env),说明激活成功。

3. 安装核心库

我们只需要两个库:opencv-python(处理图像)和 torchvision(提供预训练模型)。

pip install opencv-python torchvision

⚠️ 常见问题:如果下载慢,可以加国内源:

pip install opencv-python torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple

第二步:理解几个关键概念(用大白话)

在动手前,先搞懂三个词:

术语 我的理解(人话版) 类比
模型(Model) 一个已经“学过很多图片”的程序 像一个背过100万张猫狗照片的学生
预训练模型 别人训练好的模型,我们可以直接用 相当于借学霸的笔记来考试
推理(Inference) 把一张新图片给模型,让它判断是什么 就像拿一张新照片问:“这是猫吗?”

我们今天用的模型叫 ResNet-18,它是ImageNet比赛中的经典模型,能识别1000种物体(包括猫!)。


第三步:实战!20行代码实现“猫识别器”

下面是最核心的部分。我会逐行解释,保证你每一步都懂。

步骤1:导入需要的库

import torch
from torchvision import models, transforms
import cv2
  • torch:PyTorch框架,深度学习的主流工具
  • models:包含各种预训练模型
  • transforms:用于图像预处理(比如缩放、转格式)
  • cv2:OpenCV,用来读取和显示图片

步骤2:加载预训练模型

model = models.resnet18(pretrained=True)
model.eval()  # 切换到“推理模式”,关闭训练时的随机性

🌟 开发心得:一定要写 model.eval()!我第一次忘了这行,结果每次运行结果都不一样,差点以为电脑坏了。

步骤3:定义图像预处理流程

模型对输入有严格要求:必须是 224x224 像素、RGB 格式、数值归一化。

preprocess = transforms.Compose([
    transforms.ToPILImage(),          # OpenCV读的是numpy数组,先转成PIL图像
    transforms.Resize(256),           # 先放大一点
    transforms.CenterCrop(224),       # 再从中间裁剪出224x224
    transforms.ToTensor(),            # 转成PyTorch张量
    transforms.Normalize(             # 归一化(用ImageNet的均值和标准差)
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]
    )
])

步骤4:读取图片并预测

# 读取本地图片(假设你有一张 cat.jpg)
img = cv2.imread('cat.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # OpenCV默认是BGR,要转成RGB

# 预处理
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)  # 加一个batch维度

# 推理
with torch.no_grad():  # 关闭梯度计算,加快速度
    output = model(input_batch)

# 获取预测类别
probabilities = torch.nn.functional.softmax(output[0], dim=0)
predicted_class = probabilities.argmax().item()

步骤5:看看结果是不是“猫”

ImageNet 中,“猫”的类别编号是 281(家猫)、282(老虎猫)等。我们可以粗略判断:

if 281 <= predicted_class <= 287:
    print("✅ 这是一只猫!")
else:
    print("❌ 不是猫,是别的东西。")

🔍 小技巧:你可以打印 predicted_class 看具体数字,再查 ImageNet标签列表 确认是什么。


完整代码汇总

import torch
from torchvision import models, transforms
import cv2

# 1. 加载模型
model = models.resnet18(pretrained=True)
model.eval()

# 2. 定义预处理
preprocess = transforms.Compose([
    transforms.ToPILImage(),
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 3. 读图 & 预测
img = cv2.imread('cat.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)

with torch.no_grad():
    output = model(input_batch)

# 4. 判断是否为猫
predicted_class = output[0].argmax().item()
if 281 <= predicted_class <= 287:
    print("✅ 这是一只猫!")
else:
    print("❌ 不是猫。")

新手常见问题 & 解决方案

问题 原因 解决办法
ModuleNotFoundError: No module named 'cv2' 没装OpenCV 运行 pip install opencv-python
图片路径报错 文件不存在或路径写错 把图片和.py文件放同一目录,用相对路径如 'cat.jpg'
输出总是“不是猫” 图片质量差 or 模型没加载成功 先用网络上的高清猫图测试;检查是否漏了 model.eval()
运行特别慢 没用GPU(但CPU也能跑) 初学者不用管,等后面学了再优化

💡 我当初就因为路径问题卡了两小时——后来学会:永远用绝对路径或把文件放当前目录


学习建议:下一步怎么走?

这个项目只是起点。如果你想深入,我建议按这个顺序走:

  1. 玩转更多模型:试试 mobilenet_v2(更快)、resnet50(更准)
  2. 自己训练模型:用 PyTorch Lightning + 自己拍的猫狗照片
  3. 部署到Web:用 Flask 写个网页上传图片,返回识别结果(我做过,超有成就感!)
  4. 学目标检测:不只是“有没有猫”,还要知道“猫在哪”(YOLO系列)

📌 避坑指南:

  • 别一上来就啃论文!先跑通代码,再回头看原理
  • GPU不是必须的,CPU足够入门
  • 多用 Google Colab(免费GPU),省去环境配置烦恼

结语

看到这里,你已经完成了人生第一个计算机视觉项目!虽然只有20行代码,但它背后是完整的工业级流程。所有复杂的系统,都是从“Hello World”开始的

我写这篇教程,就是希望你别像我当初那样被术语吓退。技术没有魔法,只有一步步拆解。你现在能识别猫,明天就能识别人脸、车牌、甚至医学影像。

记住:会跑通代码的人,已经打败了80%的观望者

快去试试吧!把你家主子的照片喂给程序,看看它认不认得出来 😺

有任何问题,欢迎在评论区留言。我会用“过来人”的经验帮你避坑。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝