计算机视觉初体验:你的第一个“看”世界程序
你有没有过这样的经历:早上起床刷脸解锁手机,买早餐时刷脸支付,上班路上看到自动驾驶的汽车稳稳避开突然窜出的行人,晚上刷短视频时一键切换AI漫画特效,连修图时一键祛痘、换背景都准得离谱?这些你习以为常甚至觉得“理所当然”的功能背后,都藏着同一个核心技术——计算机视觉。在本章,你将第一次亲手触摸这个看似高大上的领域,用不到10行代码完成你的第一个“教计算机看懂世界”的小程序,全程不需要你懂高数、线性代数,只要跟着步骤走,你也能感受到AI视觉的魅力。
1.1 什么是计算机视觉:不是修图,是教计算机“看懂”世界
很多人第一次听到“计算机视觉”这个词,第一反应是“是不是就是PS那种修图软件?”,其实这是对计算机视觉最大的误解。我们可以用两个简单的例子区分:
- 你用美颜APP磨皮、瘦脸,本质是对图片的像素做调整:把某个区域的像素变亮、变模糊、拉伸变形,属于**传统图像处理**,计算机根本不知道你在“磨皮”,它只是按指令改了像素点的数值。
- 而你刷脸支付时,手机摄像头拍下你的脸,瞬间就能判断“这是机主本人,允许支付”,这个过程中计算机不仅拿到了你脸的像素数据,还“理解”了这是“你”的脸,不是别人的,也不是一张猫的图,这才是**计算机视觉**的核心:让计算机像人一样,不仅能“看到”图像,还能“理解”图像的内容。
用更学术一点的话说,计算机视觉(Computer Vision,简称CV)是让计算机通过摄像头、图片、视频等输入设备获取视觉信息,进而完成识别、检测、分割、理解等任务的一门学科。它的终极目标,是让计算机拥有和人类相当甚至超越人类的视觉能力——你一眼就能认出这是猫、那是狗,还能判断猫在跑、狗在叫,计算机视觉就是要让机器也能做到这些。
> 💡 电子版侧边栏:扩展阅读 > 计算机视觉的发展可以追溯到1963年,MIT的Larry Roberts在论文中首次提出“三维视觉”的概念,被认为是计算机视觉的开端。但直到2012年,深度学习模型AlexNet在ImageNet图像识别大赛中将错误率从之前的26%降到15%,才真正引爆了计算机视觉的落地热潮。现在从你手机里的拍照识物,到工厂里的零件缺陷检测,背后都有计算机视觉的影子。
1.2 计算机视觉不是黑科技:它已经在你身边无处不在
很多人觉得计算机视觉是实验室里的高大上技术,离普通人很远,但实际上它已经渗透到了你生活的方方面面,甚至你已经离不开它了。我们可以把它的应用分成三大类,每一类都有你熟悉的场景:
1.2.1 消费级应用:你已经每天都在用
这是你最常接触的计算机视觉场景,主打一个“润物细无声”:
- **支付与身份验证**:刷脸支付、刷脸解锁手机、火车站的人脸核验进站,本质都是计算机视觉在做人脸识别,判断“你是你”。现在国内刷脸支付的覆盖率已经超过60%,你出门带个手机甚至不用掏出来就能完成支付。
- **内容创作与娱乐**:抖音、快手的AI特效、美颜相机的瘦脸大眼、剪映的一键抠图,都是计算机视觉在做人脸关键点检测、图像分割,把你从背景里“抠”出来,再给你加特效。现在短视频平台每天新增的特效里,80%以上都用了计算机视觉技术。
- **拍照与搜索**:手机相册的“按人物分类”“按宠物分类”,百度/谷歌的“以图搜图”,甚至你拍个商品就能直接跳转到购买链接,都是计算机视觉在做图像分类和相似性匹配。
1.2.2 行业级应用:它已经在帮你赚更多钱、省更多钱
如果说消费级应用是让你用得更爽,行业级应用就是在实实在在降本增效:
- **医疗领域**:AI辅助诊断是现在计算机视觉落地最快的场景之一。据国家药监局2023年公示的数据,国内已获批的AI医疗三类证产品中,62%是计算机视觉类的,其中肺结节辅助诊断产品的平均准确率已经达到96.8%,超过普通放射科医生的平均水平,阅片时间从15分钟缩短到30秒,现在已经在超过200家三甲医院落地,帮助医生更早发现早期肺癌。除此之外,AI还能看眼底片判断糖尿病视网膜病变、看病理切片判断癌症类型,甚至辅助手术机器人做精准定位。
- **工业领域**:以前工厂检测零件缺陷,要靠工人拿放大镜一个个看,一天最多看几千个,还容易漏检、错检。现在用计算机视觉的缺陷检测系统,一秒就能检测上百个零件,漏检率低于0.1%,现在已经广泛应用于电子、汽车、光伏等行业。比如富士康的iPhone生产线,用视觉检测系统检测屏幕缺陷,检测效率是人工的10倍,每年节省成本超过2亿元。
- **农业领域**:极飞、大疆的农业无人机搭载计算机视觉系统,可以在1分钟内识别100亩麦田的病虫害情况,精准施药后农药用量减少30%以上,亩产提高8%。还有养殖场用视觉系统识别猪的体温、进食情况,提前发现病猪,死亡率降低15%。
1.2.3 前沿应用:它正在改变未来
最前沿的计算机视觉应用还在不断刷新我们的认知:自动驾驶汽车通过视觉感知系统识别行人、车辆、交通信号灯,现在已经可以在部分城市实现无人驾驶;机器人通过视觉系统判断物体的位置、形状,就能完成抓取、组装等复杂操作;甚至天文学家用计算机视觉处理望远镜拍下的星空照片,自动识别新的星系、彗星,效率是人工的几百倍。
据IDC预测,2025年全球计算机视觉市场规模将突破800亿美元,其中行业级应用的年复合增长率超过25%。可以说,现在正是进入计算机视觉领域的最好时机。
1.3 零基础环境搭建:5分钟跑通你的视觉开发环境
很多新手一听到“环境搭建”就头大,担心自己装不好、配不对,其实现在计算机视觉的工具链已经非常完善了,我们只需要三个核心工具就能入门:Python(编程语言)、OpenCV(图像处理工具库)、PyTorch(深度学习框架)。整个搭建过程不超过5分钟,跟着步骤走就能成功。
> 💡 新手避坑指南 > 本章的环境搭建只需要CPU版本的工具库即可,不需要装显卡驱动、CUDA这些复杂的东西,完全够入门使用,等你后面学到需要跑大模型的时候,再装GPU版本也不迟。
1.3.1 第一步:安装Python
Python是现在计算机视觉领域最主流的编程语言,工具库最全、教程最多,对新手最友好。 1. 打开浏览器访问Python官网(https://www.python.org/downloads/),点击页面上的黄色「Download Python」按钮,下载最新版本的Python安装包。 2. 双击安装包打开安装界面,一定要勾选最下方的「Add Python to PATH」选项,不然后续命令行找不到Python命令,然后点击「Install Now」等待安装完成。 3. 安装完成后,按Win+R键(Windows)或打开终端(Mac),输入`python --version`,如果显示出`Python 3.x.x`的版本号,说明安装成功。
1.3.2 第二步:安装核心工具库
我们只需要安装三个库:OpenCV(处理图像的瑞士军刀)、PyTorch(跑AI模型的框架)、torchvision(PyTorch的配套库,里面有预训练好的模型和图像处理工具)。 1. 打开命令行工具(Windows按Win+R输入cmd,Mac打开终端),输入以下命令,一次性安装所有依赖: ```bash
国内用户建议用清华镜像,下载速度快10倍以上,不会出现下载卡顿的问题
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python torch torchvision pillow ``` 2. 等待安装完成,整个过程大概需要3-5分钟,取决于你的网速。 3. 安装完成后,输入以下代码测试环境是否正常: ```python import cv2 import torch print("OpenCV版本:", cv2.__version__) print("PyTorch版本:", torch.__version__) print("CUDA是否可用:", torch.cuda.is_available()) # 显示False是正常的,我们入门用CPU版本就行 ``` 如果显示出版本号,没有报错,说明环境已经搭建成功!
1.3.3 环境搭建常见问题
- **问题1:pip安装的时候提示权限不足**:Windows用户可以用管理员身份打开命令行,Mac用户可以在命令前面加`sudo`,输入电脑密码后回车。
- **问题2:下载速度非常慢**:确认你用了清华镜像地址,或者换成阿里云镜像:`-i https://mirrors.aliyun.com/pypi/simple/`
- **问题3:提示找不到cv2模块**:一般是OpenCV安装失败,重新跑一遍安装命令即可。
1.4 第一个视觉Demo:10行代码识别图片里的猫
环境搭好后,我们马上来跑第一个Demo:给计算机一张猫的图片,让它识别出这是猫,甚至能说出是什么品种的猫。这个Demo会用到一个现成的“学霸”——预训练模型,你不需要自己收集数据、训练模型,直接调用就行,完全零门槛。
1.4.1 先理解两个核心概念:预训练模型与图像预处理
在写代码之前,你需要先理解两个概念,不然代码跑通了也不知道为什么: 1. 什么是预训练模型? 训练一个能识别1000种物体的AI模型,需要上万张标注好的图片,用高性能显卡跑几天甚至几周,对新手来说完全不现实。而预训练模型就是别人已经训练好的“学霸模型”:比如我们要用的ResNet18,已经在包含120万张图片、1000个类别的ImageNet数据集上训练完成,能识别从猫、狗到汽车、飞机的1000种常见物体。我们直接调用这个模型,就能直接用来识别新的图片,就像你找了一个已经考上大学的全科状元帮你做题,不需要你从1+1开始教他。 2. 什么是图像预处理? 模型训练的时候,喂进去的图片都是固定尺寸、固定格式的:比如都是224×224像素,颜色数值都被调整到了统一的范围内。如果你直接喂一张原始的手机照片(比如4000×3000像素,颜色数值范围是0-255),模型根本认不出来。预处理就是把原始图片处理成模型“吃得惯”的格式,相当于你吃饭前把菜切成小块、调好味,模型才能“消化”。
1.4.2 完整代码与逐行解释
我们先准备好你要识别的图片:找一张猫的图片,保存到电脑上,记住保存的路径,比如Windows下是`C:\Users\你的用户名\Desktop\cat.jpg`,Mac下是`/Users/你的用户名/Desktop/cat.jpg`,也可以直接把图片放在你写代码的文件夹里,文件名改成`cat.jpg`。
然后打开你常用的代码编辑器(新手可以用记事本、VS Code,甚至Python自带的IDLE),写入以下代码,每行都有注释,你跟着看就能懂:
```python
---------------------- 第一步:导入工具库 ----------------------
import cv2 # OpenCV:用来读图、显示图的工具,相当于图片的“读取器” import torch # PyTorch:深度学习框架,用来跑AI模型的“发动机” from torchvision import models, transforms # torchvision:PyTorch的配套工具库,里面有预训练模型和图像处理工具 from PIL import Image # PIL:用来处理图片格式转换的工具
---------------------- 第二步:加载预训练模型 ----------------------
加载ResNet18模型,pretrained=True表示用别人已经训练好的权重
```python model = models.resnet18(pretrained=True)
把模型设置为评估模式:关闭训练时的随机失活(Dropout)、批归一化(BatchNorm)等训练专属逻辑
如果不加这行,模型每次推理的结果会有随机波动,准确率也会下降,相当于你考试的时候突然被随机抽走部分答题卡,肯定考不好
model.eval() ```
```python
---------------------- 第三步:图像预处理:把图片变成模型能“吃”的格式 ----------------------
预处理流程完全匹配模型训练时的处理规则,相当于给模型喂它“习惯吃”的“标准餐”
preprocess = transforms.Compose([
第一步:把图片缩放到224×224像素,因为ResNet18训练时用的输入尺寸就是224×224
如果图片太大或太小,直接等比例缩放,不会裁剪,避免丢失猫脸、狗头等关键信息
transforms.Resize((224, 224)),
第二步:把PIL格式的图片转换成PyTorch能处理的张量(可以理解为计算机能快速计算的多维数字数组)
转换后数值范围会自动从0-255变成0-1,符合模型的输入要求
transforms.ToTensor(),
第三步:归一化处理:用ImageNet数据集的均值和标准差调整张量的数值
ImageNet是计算机视觉的“标准高考题库”,包含120万张标注图片、1000个类别,几乎所有预训练模型都是基于这个数据集训练的
三个颜色通道(红、绿、蓝)的均值分别是0.485、0.456、0.406,标准差是0.229、0.224、0.225
这一步相当于把不同来源的图片“校准”到和训练数据一样的分布,是识别准确的关键,就像你平时用A4纸写字,考试突然给你B5纸,你肯定不适应
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) ```
```python
---------------------- 第四步:加载你要识别的图片 ----------------------
用OpenCV读取图片,注意OpenCV默认读进来的是BGR(蓝绿红)格式,而模型训练用的是RGB(红绿蓝)格式,必须转换!
img = cv2.imread("cat.jpg") # 这里写你图片的路径,比如Windows下是r"C:\Users\你的用户名\Desktop\cat.jpg"
把BGR格式转成RGB格式,这一步没做的话,识别准确率会下降30%以上,是新手最容易踩的“第一坑”
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
把OpenCV的数组格式转成PIL格式,因为预处理工具是基于PIL图片库写的
img_pil = Image.fromarray(img)
对图片做预处理,增加一个“批次维度”(模型要求输入是4维的:[批次大小, 颜色通道数, 高, 宽])
unsqueeze(0)就是在最前面加一个维度,相当于把单张图片放到“批次大小为1”的快递箱里,符合模型的输入要求
img_tensor = preprocess(img_pil).unsqueeze(0) ```
```python
---------------------- 第五步:让模型做推理,得到识别结果 ----------------------
推理时不需要计算梯度,加with torch.no_grad()可以省内存、加快速度,是推理的标准操作
就像你考试的时候不需要写解题过程,只要写答案就行,省时间还不容易错
with torch.no_grad():
把处理好的图片喂给模型,得到输出结果
output = model(img_tensor) ```
```python
---------------------- 第六步:解析结果,得到识别出的类别和概率 ----------------------
先拿到概率最高的那个类别的索引
_, pred_idx = torch.max(output, 1) pred_idx = pred_idx.item() # 把PyTorch的张量格式转成普通的Python整数
用softmax函数把模型的原始输出转换成0-100%的概率,所有类别的概率加起来是100%
prob = torch.nn.functional.softmax(output, dim=1)[0][pred_idx].item() * 100
加载ImageNet的1000个类别标签,你可以直接复制下面的简版标签,或者从网上下载完整的
简版标签只包含常见的100个类别,足够入门使用,完整版链接:https://github.com/pytorch/hub/raw/master/imagenet_classes.txt
imagenet_labels = { 0: "tench, Tinca tinca", 1: "goldfish, Carassius auratus", 2: "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias",
省略大部分标签,重点给出常见的猫、狗、交通工具标签
281: "tabby, tabby cat", 282: "tiger cat", 283: "Persian cat", 284: "Siamese cat, Siamese", 285: "Egyptian cat", 207: "golden retriever", 208: "Labrador retriever", 209: "cocker spaniel, English cocker spaniel, cocker", 391: "mountain bike, all-terrain bike", 392: "unicycle, monocycle", 393: "go-kart", 394: "bobsled, bobsleigh, bob",
更多标签可以访问上面的链接下载
} label = imagenet_labels.get(pred_idx, f"未知类别(索引{pred_idx})")
输出结果
print(f"识别结果:{label}") print(f"置信度:{prob:.2f}%") ```
```python
---------------------- 可选:可视化识别结果 ----------------------
import numpy as np # 用来处理数组格式转换