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 传统方法的局限优点 - 可解释性强 - 计算量相对小 - 不需要大量数据 缺点 - 需要人工设计特征 - 难以处理复杂场景 - 准确率有瓶颈四、卷积神经网络CNN4.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 LeNet1998早期CNN用于手写数字识别。结构 输入32×32 → 卷积628×28 → 池化614×14 → 卷积1610×10 → 池化165×5 → 全连接120 → 全连接84 → 输出10 应用银行支票识别5.2 AlexNet2012ImageNet竞赛冠军开启深度学习时代。创新点 - 更深的网络8层 - ReLU激活函数 - Dropout正则化 - GPU训练 错误率15.3%比第二名低10%5.3 VGG2014使用小卷积核构建深层网络。特点 - 全部使用3×3卷积核 - 网络深度16-19层 - 结构规整易于理解 VGG16约1.38亿参数5.4 ResNet2015引入残差连接解决深层网络训练问题。问题网络越深训练越难梯度消失 解决残差连接 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 单阶段检测器直接预测物体位置和类别。YOLOYou Only Look Once思想将检测视为回归问题 流程 1. 图像划分网格 2. 每个网格预测边界框和类别 3. 非极大值抑制NMS去重 优点速度快适合实时检测 版本YOLOv1 → v8不断进化SSDSingle Shot Detector多尺度特征图检测 - 不同层检测不同大小物体 - 浅层小物体 - 深层大物体七、图像分割7.1 语义分割像素级分类每个像素分配类别。输入图像 输出每个像素的类别标签 例如 原图街道场景 输出 - 道路蓝色 - 建筑红色 - 车辆绿色 - 行人黄色7.2 实例分割区分同一类别的不同个体。语义分割所有人一个类别 实例分割区分人1、人2、人3 代表模型Mask R-CNN7.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 - timmPyTorch图像模型库10.3 标注工具LabelImg目标检测标注 Labelme语义分割标注 CVAT视频标注十一、动手实践计算机视觉完整示例11.1 环境准备pipinstallopencv-python torch torchvision matplotlib numpy pillow11.2 图像分类完整代码 计算机视觉实战图像分类 使用PyTorch实现CNN图像分类 importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,modelsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportnumpyasnp# 1. 数据准备使用CIFAR-10数据集transformtransforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])train_datasetdatasets.CIFAR10(./data,trainTrue,downloadTrue,transformtransform)test_datasetdatasets.CIFAR10(./data,trainFalse,transformtransform)train_loaderDataLoader(train_dataset,batch_size32,shuffleTrue)test_loaderDataLoader(test_dataset,batch_size100)print(f训练集:{len(train_dataset)}张图片)print(f测试集:{len(test_dataset)}张图片)print(f类别:{train_dataset.classes})# 2. 使用预训练的ResNet模型devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)print(f\n使用设备:{device})# 加载预训练模型modelmodels.resnet18(pretrainedTrue)# 修改最后一层适应10分类num_featuresmodel.fc.in_features model.fcnn.Linear(num_features,10)modelmodel.to(device)print(f模型: ResNet18)print(f输出类别数: 10)# 3. 训练设置criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 4. 训练函数deftrain_epoch(model,loader,criterion,optimizer):model.train()running_loss0.0correct0total0forimages,labelsinloader:images,labelsimages.to(device),labels.to(device)optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,labels)loss.backward()optimizer.step()running_lossloss.item()_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/total# 5. 测试函数defevaluate(model,loader,criterion):model.eval()running_loss0.0correct0total0withtorch.no_grad():forimages,labelsinloader:images,labelsimages.to(device),labels.to(device)outputsmodel(images)losscriterion(outputs,labels)running_lossloss.item()_,predictedoutputs.max(1)totallabels.size(0)correctpredicted.eq(labels).sum().item()returnrunning_loss/len(loader),100.*correct/total# 6. 训练模型print(\n开始训练...)forepochinrange(1,4):train_loss,train_acctrain_epoch(model,train_loader,criterion,optimizer)test_loss,test_accevaluate(model,test_loader,criterion)print(fEpoch{epoch}: fTrain Loss{train_loss:.4f}, Acc{train_acc:.2f}% | fTest Loss{test_loss:.4f}, Acc{test_acc:.2f}%)print(f\n最终测试准确率:{test_acc:.2f}%)11.3 目标检测示例 目标检测使用预训练模型检测物体 importtorchfromtorchvisionimporttransformsfromPILimportImageimportmatplotlib.pyplotaspltimportmatplotlib.patchesaspatches# 加载预训练的Faster R-CNN模型modeltorch.hub.load(pytorch/vision:v0.10.0,fasterrcnn_resnet50_fpn,pretrainedTrue)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,threshold0.5):检测图像中的物体# 加载图像imageImage.open(image_path).convert(RGB)transformtransforms.Compose([transforms.ToTensor()])image_tensortransform(image)# 检测withtorch.no_grad():predictionsmodel([image_tensor])# 解析结果boxespredictions[0][boxes]scorespredictions[0][scores]labelspredictions[0][labels]# 过滤低置信度结果keepscoresthreshold boxesboxes[keep]scoresscores[keep]labelslabels[keep]returnboxes,scores,labels,image# 使用示例需要准备一张图片# boxes, scores, labels, image detect_objects(street.jpg, threshold0.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,# linewidth2, edgecolorr, facecolornone# )# ax.add_patch(rect)# ax.text(x1, y1-5, f{COCO_CLASSES[label]}: {score:.2f},# colorred, fontsize12)## plt.axis(off)# plt.savefig(detection_result.jpg, bbox_inchestight)# 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)# 边缘检测Cannygraycv2.cvtColor(image,cv2.COLOR_RGB2GRAY)results[edges]cv2.Canny(gray,100,200)# 图像缩放h,wimage.shape[:2]results[resized]cv2.resize(image,(w//2,h//2))returnresults# 3. 人脸检测示例defdetect_faces(image_path):使用OpenCV检测人脸# 加载预训练的人脸检测器face_cascadecv2.CascadeClassifier(cv2.data.haarcascadeshaarcascade_frontalface_default.xml)# 读取图像imgcv2.imread(image_path)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 检测人脸facesface_cascade.detectMultiScale(gray,1.1,4)# 绘制人脸框for(x,y,w,h)infaces:cv2.rectangle(img,(x,y),(xw,yh),(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图像分割语义分割、实例分割应用自动驾驶、医疗影像、安防监控十三、思考题为什么CNN适合处理图像它的哪些设计契合图像的特点图像分类、目标检测、图像分割有什么区别传统计算机视觉方法和深度学习方法各有什么优缺点下一篇预告我们将进入当前最热门的AI领域——生成式AI看看AI是如何创作内容的。标签计算机视觉CNN目标检测图像分割人脸识别AI入门版权声明本文为原创内容转载请注明出处。