当前位置: 首页 > news >正文

7.AI入门:从机器学习到生成式AI,普通人也能看懂(七)—— 计算机视觉

系列导读:上一篇我们了解了自然语言处理,今天转向另一个重要的AI应用领域——计算机视觉,看看机器是如何"看懂"图像和视频的。


一、什么是计算机视觉?

1.1 定义

计算机视觉(Computer Vision,简称CV)= 让计算机从图像或视频中"看懂"内容的技术。

1.2 人类视觉 vs 计算机视觉

人类视觉: 眼睛接收光线 → 大脑处理 → 理解内容 计算机视觉: 摄像头采集图像 → 算法处理 → 输出结果 人类:看到"一只猫在沙发上睡觉" 计算机:像素数组 → 特征提取 → "猫" + "沙发" + "睡觉"

1.3 计算机视觉的任务

任务说明应用
图像分类判断图像类别相册分类、商品识别
目标检测定位并识别物体自动驾驶、安防监控
图像分割像素级分类医疗影像、自动驾驶
人脸识别识别或验证人脸门禁、支付、安防
姿态估计检测人体姿态动作捕捉、健身指导
图像生成生成新图像AI绘画、数据增强
视频分析理解视频内容监控分析、内容审核

二、图像的数字表示

2.1 图像是什么?

对计算机来说,图像就是一个数字矩阵。

灰度图
单通道,每个像素一个值(0-255) 例如:5×5的灰度图 ┌─────────────┐ │ 0 50 100 150 200 │ │ 20 60 110 160 210 │ │ 40 70 120 170 220 │ │ 60 80 130 180 230 │ │ 80 90 140 190 240 │ └─────────────┘ 0 = 黑色 255 = 白色 中间值 = 灰度
彩色图(RGB)
三通道:R(红)、G(绿)、B(蓝) 每个像素 = (R, G, B) 例如:(255, 0, 0) = 纯红 (0, 255, 0) = 纯绿 (0, 0, 255) = 纯蓝 (255, 255, 255) = 白色 (0, 0, 0) = 黑色 图像尺寸:高 × 宽 × 3 例如:1080 × 1920 × 3 = 6,220,800个数值

2.2 图像预处理

原始图像通常需要预处理才能输入模型。

常见预处理: 1. 缩放:统一尺寸(如224×224) 2. 归一化:像素值缩放到0-1 3. 数据增强:翻转、旋转、裁剪 4. 去噪:去除图像噪声 5. 直方图均衡化:增强对比度

三、传统计算机视觉方法

3.1 边缘检测

检测图像中的边缘(像素值突变的地方)。

Sobel算子
水平方向检测: ┌────────┐ │ -1 0 1 │ │ -2 0 2 │ │ -1 0 1 │ └────────┘ 垂直方向检测: ┌────────┐ │ -1 -2 -1 │ │ 0 0 0 │ │ 1 2 1 │ └────────┘ 梯度 = √(Gx² + Gy²)

3.2 特征提取

提取图像的关键特征点。

SIFT(尺度不变特征变换)
特点: - 尺度不变:物体远近都能识别 - 旋转不变:物体旋转也能匹配 - 部分遮挡也能工作 应用:图像拼接、物体识别
HOG(方向梯度直方图)
统计图像局部区域的梯度方向分布 步骤: 1. 计算梯度 2. 划分cell 3. 统计每个cell的梯度方向直方图 4. 归一化 应用:行人检测

3.3 传统方法的局限

优点: - 可解释性强 - 计算量相对小 - 不需要大量数据 缺点: - 需要人工设计特征 - 难以处理复杂场景 - 准确率有瓶颈

四、卷积神经网络(CNN)

4.1 为什么CNN适合处理图像?

图像的特点: - 局部相关性:相邻像素相关 - 平移不变性:物体位置变化特征不变 - 层次结构:边缘→形状→物体 CNN的设计: - 卷积:提取局部特征 - 池化:实现平移不变性 - 多层:学习层次特征

4.2 卷积操作

用卷积核在图像上滑动,提取特征。

图像: 卷积核(3×3): 1 2 3 1 0 -1 4 5 6 2 0 -2 7 8 9 1 0 -1 卷积计算: (1×1 + 2×0 + 3×(-1) + 4×2 + 5×0 + 6×(-2) + 7×1 + 8×0 + 9×(-1)) = 1 - 3 + 8 - 12 + 7 - 9 = -8 输出特征图的一个值

4.3 池化操作

降采样,减少参数,增强鲁棒性。

最大池化(2×2): 输入: 输出: 1 3 | 2 4 2 1 | 5 6 → 3 6 ─────┼───── 8 9 4 2 | 7 8 3 5 | 2 9 每个2×2区域取最大值

4.4 CNN架构

典型CNN结构: 输入图像 ↓ 卷积层1 → 激活 → 池化 ↓ 卷积层2 → 激活 → 池化 ↓ 卷积层3 → 激活 → 池化 ↓ 展平 ↓ 全连接层 → 输出

五、经典CNN模型

5.1 LeNet(1998)

早期CNN,用于手写数字识别。

结构: 输入(32×32) → 卷积(6@28×28) → 池化(6@14×14) → 卷积(16@10×10) → 池化(16@5×5) → 全连接(120) → 全连接(84) → 输出(10) 应用:银行支票识别

5.2 AlexNet(2012)

ImageNet竞赛冠军,开启深度学习时代。

创新点: - 更深的网络(8层) - ReLU激活函数 - Dropout正则化 - GPU训练 错误率:15.3%(比第二名低10%+)

5.3 VGG(2014)

使用小卷积核构建深层网络。

特点: - 全部使用3×3卷积核 - 网络深度:16-19层 - 结构规整,易于理解 VGG16:约1.38亿参数

5.4 ResNet(2015)

引入残差连接,解决深层网络训练问题。

问题:网络越深,训练越难(梯度消失) 解决:残差连接 y = F(x) + x 让网络学习残差F(x) = H(x) - x 而不是直接学习H(x) 深度:可达152层甚至1000+层

5.5 MobileNet

轻量级网络,适合移动设备。

创新:深度可分离卷积 = 深度卷积 + 逐点卷积 优点: - 参数量少 - 计算量小 - 适合移动端部署

六、目标检测

6.1 什么是目标检测?

不仅要识别图像中的物体,还要定位其位置。

输出: 物体类别 + 边界框(x, y, width, height) 例如: 检测到3个物体: - 猫:(100, 150, 200, 180) - 狗:(350, 200, 180, 160) - 人:(500, 100, 120, 300)

6.2 两阶段检测器

先生成候选区域,再分类。

R-CNN系列
R-CNN: 1. 选择性搜索生成候选区域 2. 每个区域用CNN提取特征 3. SVM分类 Fast R-CNN: - 共享卷积特征,加速 Faster R-CNN: - RPN生成候选区域,端到端训练

6.3 单阶段检测器

直接预测物体位置和类别。

YOLO(You Only Look Once)
思想:将检测视为回归问题 流程: 1. 图像划分网格 2. 每个网格预测边界框和类别 3. 非极大值抑制(NMS)去重 优点:速度快,适合实时检测 版本:YOLOv1 → v8,不断进化
SSD(Single Shot Detector)
多尺度特征图检测: - 不同层检测不同大小物体 - 浅层:小物体 - 深层:大物体

七、图像分割

7.1 语义分割

像素级分类,每个像素分配类别。

输入:图像 输出:每个像素的类别标签 例如: 原图:街道场景 输出: - 道路:蓝色 - 建筑:红色 - 车辆:绿色 - 行人:黄色

7.2 实例分割

区分同一类别的不同个体。

语义分割:所有"人"一个类别 实例分割:区分"人1"、"人2"、"人3" 代表模型:Mask R-CNN

7.3 经典分割模型

FCN(全卷积网络)
将全连接层替换为卷积层 实现任意尺寸输入
U-Net
编码器-解码器结构 跳跃连接保留细节 应用:医学图像分割

八、人脸识别

8.1 人脸检测

定位图像中的人脸位置。

方法: - Haar级联分类器(传统) - MTCNN(深度学习) - RetinaFace(最新)

8.2 人脸识别流程

1. 人脸检测:定位人脸 2. 关键点检测:眼睛、鼻子、嘴巴位置 3. 人脸对齐:校正姿态 4. 特征提取:提取人脸特征向量 5. 特征匹配:与数据库比对

8.3 人脸识别方法

传统方法: - Eigenfaces(特征脸) - Fisherfaces 深度学习方法: - DeepFace - FaceNet - ArcFace(当前主流)

九、计算机视觉应用

9.1 自动驾驶

感知系统: - 车道检测 - 车辆检测 - 行人检测 - 交通标志识别 - 红绿灯识别 技术栈: - 摄像头 + 激光雷达 + 毫米波雷达 - 多传感器融合 - 实时目标检测

9.2 医疗影像

应用: - CT/MRI病灶检测 - 细胞分类 - 眼底病变筛查 - 皮肤癌诊断 优势: - 辅助医生诊断 - 提高诊断效率 - 减少漏诊误诊

9.3 安防监控

应用: - 人脸识别门禁 - 行为分析(打架、跌倒) - 人群密度估计 - 异常事件检测

9.4 工业质检

应用: - 产品缺陷检测 - 零件尺寸测量 - 表面瑕疵识别 优势: - 24小时不间断 - 精度高于人工 - 速度快

十、计算机视觉工具

10.1 开源库

特点
OpenCV经典CV库,功能全面
PIL/Pillow图像处理
scikit-image科学图像处理
Albumentations数据增强

10.2 深度学习框架

PyTorch + torchvision TensorFlow + tf.keras 预训练模型: - torchvision.models - timm(PyTorch图像模型库)

10.3 标注工具

LabelImg:目标检测标注 Labelme:语义分割标注 CVAT:视频标注

十一、动手实践:计算机视觉完整示例

11.1 环境准备

pipinstallopencv-python torch torchvision matplotlib numpy pillow

11.2 图像分类完整代码

""" 计算机视觉实战:图像分类 使用PyTorch实现CNN图像分类 """importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,modelsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp# 1. 数据准备(使用CIFAR-10数据集)transform=transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])])train_dataset=datasets.CIFAR10('./data',train=True,download=True,transform=transform)test_dataset=datasets.CIFAR10('./data',train=False,transform=transform)train_loader=DataLoader(train_dataset,batch_size=32,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=100)print(f"训练集:{len(train_dataset)}张图片")print(f"测试集:{len(test_dataset)}张图片")print(f"类别:{train_dataset.classes}")# 2. 使用预训练的ResNet模型device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")print(f"\n使用设备:{device}")# 加载预训练模型model=models.resnet18(pretrained=True)# 修改最后一层适应10分类num_features=model.fc.in_features model.fc=nn.Linear(num_features,10)model=model.to(device)print(f"模型: ResNet18")print(f"输出类别数: 10")# 3. 训练设置criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 4. 训练函数deftrain_epoch(model,loader,criterion,optimizer):model.train()running_loss=0.0correct=0total=0forimages,labelsinloader:images,labels=images.to(device),labels.to(device)optimizer.zero_grad()outputs=model(images)loss=criterion(outputs,labels)loss.backward()optimizer.step()running_loss+=loss.item()_,predicted=outputs.max(1)total+=labels.size(0)correct+=predicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/total# 5. 测试函数defevaluate(model,loader,criterion):model.eval()running_loss=0.0correct=0total=0withtorch.no_grad():forimages,labelsinloader:images,labels=images.to(device),labels.to(device)outputs=model(images)loss=criterion(outputs,labels)running_loss+=loss.item()_,predicted=outputs.max(1)total+=labels.size(0)correct+=predicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/total# 6. 训练模型print("\n开始训练...")forepochinrange(1,4):train_loss,train_acc=train_epoch(model,train_loader,criterion,optimizer)test_loss,test_acc=evaluate(model,test_loader,criterion)print(f"Epoch{epoch}: "f"Train Loss={train_loss:.4f}, Acc={train_acc:.2f}% | "f"Test Loss={test_loss:.4f}, Acc={test_acc:.2f}%")print(f"\n最终测试准确率:{test_acc:.2f}%")

11.3 目标检测示例

""" 目标检测:使用预训练模型检测物体 """importtorchfromtorchvisionimporttransformsfromPILimportImageimportmatplotlib.pyplotaspltimportmatplotlib.patchesaspatches# 加载预训练的Faster R-CNN模型model=torch.hub.load('pytorch/vision:v0.10.0','fasterrcnn_resnet50_fpn',pretrained=True)model.eval()# COCO数据集的类别名称COCO_CLASSES=['__background__','person','bicycle','car','motorcycle','airplane','bus','train','truck','boat','traffic light','fire hydrant','stop sign','parking meter','bench','bird','cat','dog','horse','sheep','cow','elephant','bear','zebra','giraffe','backpack','umbrella','handbag','tie','suitcase','frisbee','skis','snowboard','sports ball','kite','baseball bat','baseball glove','skateboard','surfboard','tennis racket','bottle','wine glass','cup','fork','knife','spoon','bowl','banana','apple','sandwich','orange','broccoli','carrot','hot dog','pizza','donut','cake','chair','couch','potted plant','bed','dining table','toilet','tv','laptop','mouse','remote','keyboard','cell phone','microwave','oven','toaster','sink','refrigerator','book','clock','vase','scissors','teddy bear','hair drier','toothbrush']defdetect_objects(image_path,threshold=0.5):"""检测图像中的物体"""# 加载图像image=Image.open(image_path).convert("RGB")transform=transforms.Compose([transforms.ToTensor()])image_tensor=transform(image)# 检测withtorch.no_grad():predictions=model([image_tensor])# 解析结果boxes=predictions[0]['boxes']scores=predictions[0]['scores']labels=predictions[0]['labels']# 过滤低置信度结果keep=scores>threshold boxes=boxes[keep]scores=scores[keep]labels=labels[keep]returnboxes,scores,labels,image# 使用示例(需要准备一张图片)# boxes, scores, labels, image = detect_objects('street.jpg', threshold=0.7)## # 可视化结果# fig, ax = plt.subplots(1, figsize=(12, 8))# ax.imshow(image)## for box, score, label in zip(boxes, scores, labels):# x1, y1, x2, y2 = box# rect = patches.Rectangle(# (x1, y1), x2-x1, y2-y1,# linewidth=2, edgecolor='r', facecolor='none'# )# ax.add_patch(rect)# ax.text(x1, y1-5, f'{COCO_CLASSES[label]}: {score:.2f}',# color='red', fontsize=12)## plt.axis('off')# plt.savefig('detection_result.jpg', bbox_inches='tight')# plt.show()

11.4 图像处理基础

""" OpenCV图像处理基础 """importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 1. 读取和显示图像# img = cv2.imread('image.jpg')# img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR转RGB# 2. 常用图像处理操作defprocess_image(image):"""常用图像处理"""results={}# 灰度化results['gray']=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 高斯模糊results['blur']=cv2.GaussianBlur(image,(15,15),0)# 边缘检测(Canny)gray=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)results['edges']=cv2.Canny(gray,100,200)# 图像缩放h,w=image.shape[:2]results['resized']=cv2.resize(image,(w//2,h//2))returnresults# 3. 人脸检测示例defdetect_faces(image_path):"""使用OpenCV检测人脸"""# 加载预训练的人脸检测器face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')# 读取图像img=cv2.imread(image_path)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 检测人脸faces=face_cascade.detectMultiScale(gray,1.1,4)# 绘制人脸框for(x,y,w,h)infaces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)returnimg,len(faces)# 使用示例# result_img, num_faces = detect_faces('photo.jpg')# print(f"检测到 {num_faces} 张人脸")# cv2.imwrite('faces_detected.jpg', result_img)

十二、小结

  • 计算机视觉 = 让机器看懂图像和视频
  • 图像 = 数字矩阵,RGB三通道
  • 传统方法:边缘检测、特征提取
  • CNN:卷积提取特征,池化降维
  • 经典模型:LeNet、AlexNet、VGG、ResNet
  • 目标检测:YOLO、Faster R-CNN
  • 图像分割:语义分割、实例分割
  • 应用:自动驾驶、医疗影像、安防监控

十三、思考题

  1. 为什么CNN适合处理图像?它的哪些设计契合图像的特点?

  2. 图像分类、目标检测、图像分割有什么区别?

  3. 传统计算机视觉方法和深度学习方法各有什么优缺点?


下一篇预告:我们将进入当前最热门的AI领域——生成式AI,看看AI是如何创作内容的。


标签计算机视觉CNN目标检测图像分割人脸识别AI入门

版权声明:本文为原创内容,转载请注明出处。

http://www.jsqmd.com/news/720974/

相关文章:

  • 别再傻傻分不清了!Matlab里Unit Delay和Memory模块到底怎么选?(附Simulink仿真对比)
  • 内网穿透方案:Fish-Speech 1.5在企业防火墙后的部署
  • 每日安全情报报告 · 2026-04-29
  • Uniapp插件开发入门:手把手教你制作一个简单的Android原生插件(附Hello World示例)
  • 跨国软件企业的“合规风暴“:834号令三条红线深度解析与应对策略
  • 告别手动拼接命令!fscan实战:从B段扫描到Redis一键写公钥的保姆级参数指南
  • 10分钟搞定黑苹果:OpCore-Simplify自动化配置终极指南 [特殊字符]
  • Win11Debloat:3分钟快速清理Windows系统垃圾的终极免费工具
  • 【Vercel实用Skill】skill-creator 技能
  • Zotero浏览器扩展跨平台架构深度解析:如何实现学术文献一键保存的终极解决方案
  • 嵌入式编程学习日记(一)——C语言篇(文件分析库函数版)
  • 算法工程师效率工具:用 OpenClaw 自动生成数据集预处理代码、实验报告、调参日志整理
  • Meta、HuggingFace等大佬联手搞的GAIA基准测试,到底在测什么?GPT-4为啥才15%?
  • 实测 DeepSeek V4:为什么真正决定 Coding Agent 上限的,往往不是模型,而是 Harness Engineering
  • 双碳目标下的智慧园区:数字化如何赋能绿色高效运营
  • 【第26期】2026年4月29日 AI日报
  • Windows下用清华源5分钟搞定ONNX全家桶(含CUDA版本匹配避坑指南)
  • 保姆级教程:图形验证码后端核验全流程(多语言实现)
  • Winhance中文版:让你的Windows系统飞起来的免费优化神器
  • 3分钟解锁QQ音乐加密文件:qmcdump终极解密指南
  • 【助睿ETL】实验作业1——订单利润分流数据加工
  • Henghao恒浩HH温度开关原厂一级代理分销经销
  • 揭秘导师不会说:6款AI论文神器,效率飙升200%从此告别拖延 - 麟书学长
  • 在家用显卡上也能生成720P高清视频:Wan2.2-TI2V-5B实战指南
  • YOLO已经不够了:为什么自动驾驶开始转向BEV? ——从“看见物体”到“理解空间”的一次升级
  • Web运行
  • Vue3 + 高德地图JS API v2:手把手教你实现一个带进度条和倍速控制的车辆轨迹回放组件
  • 2025届必备的五大降重复率助手解析与推荐
  • 告别丑图:MapChart 2.32从安装到高级绘图(共线性、LOD曲线)全攻略
  • 定义“具身智造”新范式,海康机器人助推制造业全面升维