从零开始做计算机视觉项目:用算法、爬虫和前端打造你的第一份技术简历

全栈手艺人
2025-12-15 19:13
阅读 1005

大家好,我是一名开源项目的维护者,也写过不少技术文档。经常有初学者问我:“我想学计算机视觉,但完全不知道从哪开始,是不是要先学很多数学?”其实我当初学的时候也有同样的困惑。后来我发现,最好的学习方式是做一个小而完整的项目——不仅能理解核心概念,还能直接放进简历里。

今天这篇教程,我就带你用最简单的方式完成一个计算机视觉实战项目。我们会用到关键词里的四个要素:算法(图像识别)、爬虫(获取数据)、前端(展示结果),最后你还能把它写进简历!全程不用高深数学,只需要一点 Python 基础。


一、我们要做什么?

我们将做一个“名人脸识别小工具”:

  1. 用爬虫从网上下载一些名人照片(比如周杰伦、杨幂)
  2. 用现成的计算机视觉算法识别人脸
  3. 用简单的前端页面上传照片并显示识别结果

这个项目虽然小,但包含了完整的开发流程,非常适合新手练手。


二、环境准备:5分钟搭好开发环境

💡 提示:我建议使用 Python 3.8+,所有工具都是免费开源的。

步骤 1:安装 Python 和 pip

如果你还没装 Python,请去 python.org 下载最新版(勾选 “Add to PATH”)。

验证安装:

python --version
pip --version

步骤 2:创建虚拟环境(推荐)

python -m venv cv-project
source cv-project/bin/bash  # Linux/Mac
# 或
cv-project\Scripts\activate  # Windows

步骤 3:安装核心库

运行以下命令安装所需包:

pip install requests beautifulsoup4 opencv-python face_recognition flask
库名 用途
requests 发送网络请求(爬虫用)
beautifulsoup4 解析网页内容
opencv-python 计算机视觉基础库
face_recognition 简单易用的人脸识别库(基于 dlib)
flask 轻量级 Web 框架(前端交互用)

⚠️ 注意:face_recognition 在 Windows 上可能需要额外安装 Visual C++ Build Tools。如果遇到问题,可以跳过本地训练,直接使用预训练模型(后面会说明)。


三、核心概念:用大白话解释关键词

1. 算法:不是魔法,而是“规则”

在计算机视觉中,“算法”就是一套处理图像的规则。比如:

  • 人脸检测算法:找出图片中哪里有人脸
  • 人脸识别算法:判断这张脸是谁

我们不用自己写算法!face_recognition 库已经封装好了,一行代码就能用。

2. 爬虫:自动下载网页内容的小程序

爬虫就像一个“自动浏览器”,可以按规则抓取网页上的图片。我们只抓公开可用的图片(遵守 robots.txt 和版权)。

3. 前端:用户看到的界面

我们用 Flask 写一个极简网页:用户上传照片 → 后端处理 → 返回带标注的图片。

4. 简历:项目经验比理论更重要

企业更看重你“做过什么”。这个小项目展示了你掌握:

  • 数据获取(爬虫)
  • 核心算法应用(CV)
  • 系统集成(前后端)

四、实战项目:四步完成你的第一个 CV 项目

第一步:用爬虫下载名人照片

我们以百度图片为例(仅用于学习,请勿频繁请求)。

# spider.py
import os
import requests
from bs4 import BeautifulSoup

def download_images(name, num=5):
    url = f"https://image.baidu.com/search/acjson?tn=resultjson_com&word={name}&pn=0"
    headers = {"User-Agent": "Mozilla/5.0"}
    os.makedirs(f"images/{name}", exist_ok=True)
    
    response = requests.get(url, headers=headers)
    data = response.json()
    
    count = 0
    for item in data['data']:
        if 'thumbURL' in item and count < num:
            img_url = item['thumbURL']
            try:
                img_data = requests.get(img_url).content
                with open(f"images/{name}/{count}.jpg", 'wb') as f:
                    f.write(img_data)
                count += 1
                print(f"Downloaded {name} image {count}")
            except:
                continue

# 下载周杰伦和杨幂的照片
download_images("周杰伦", 3)
download_images("杨幂", 3)

✅ 新手提示:如果百度接口变动,可改用其他图床或手动下载几张照片放到 images/ 文件夹。

第二步:训练人脸识别模型

# train.py
import face_recognition
import os

known_faces = []
known_names = []

# 遍历 images 文件夹
for person_name in os.listdir("images"):
    person_dir = os.path.join("images", person_name)
    if not os.path.isdir(person_dir):
        continue
        
    for filename in os.listdir(person_dir):
        image_path = os.path.join(person_dir, filename)
        image = face_recognition.load_image_file(image_path)
        encodings = face_recognition.face_encodings(image)
        
        if encodings:
            known_faces.append(encodings[0])
            known_names.append(person_name)
            print(f"Encoded {person_name}/{filename}")

这一步会把每张脸转换成一组数字(称为“特征向量”),后续用来比对。

第三步:编写识别逻辑

# recognize.py
import face_recognition
import cv2

def recognize_face(image_path, known_faces, known_names):
    unknown_image = face_recognition.load_image_file(image_path)
    face_locations = face_recognition.face_locations(unknown_image)
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)
    
    results = []
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        matches = face_recognition.compare_faces(known_faces, face_encoding)
        name = "Unknown"
        
        if True in matches:
            first_match_index = matches.index(True)
            name = known_names[first_match_index]
        
        results.append({
            "name": name,
            "box": (left, top, right, bottom)
        })
    
    return results

第四步:搭建前端界面(Flask)

# app.py
from flask import Flask, request, render_template, send_from_directory
import os
from recognize import recognize_face
from train import known_faces, known_names
import cv2

app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['image']
    filepath = os.path.join(UPLOAD_FOLDER, file.filename)
    file.save(filepath)
    
    # 识别
    results = recognize_face(filepath, known_faces, known_names)
    
    # 在图上画框
    image = cv2.imread(filepath)
    for res in results:
        left, top, right, bottom = res['box']
        cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
        cv2.putText(image, res['name'], (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2)
    
    output_path = os.path.join(UPLOAD_FOLDER, 'result.jpg')
    cv2.imwrite(output_path, image)
    
    return send_from_directory(UPLOAD_FOLDER, 'result.jpg')

if __name__ == '__main__':
    app.run(debug=True)

再创建 templates/index.html

<!DOCTYPE html>
<html>
<head><title>名人脸识别</title></head>
<body>
  <h2>上传一张包含人脸的照片</h2>
  <form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="image" accept="image/*" required>
    <button type="submit">识别</button>
  </form>
  {% if result %}
    <img src="{{ result }}" width="600">
  {% endif %}
</body>
</html>

运行整个项目

  1. 先运行训练脚本(只需一次):
    python train.py
    
  2. 启动 Web 服务:
    python app.py
    
  3. 浏览器打开 http://localhost:5000
  4. 上传一张含有人脸的图片,看看能否识别!

五、新手常见问题 & 解决方案

问题 原因 解决方法
face_recognition 安装失败 Windows 缺少编译工具 安装 Visual Studio Build Tools 或改用 pip install face-recognition==1.3.0
爬虫返回空数据 百度反爬或接口变更 手动下载 5 张照片放入 images/姓名/ 目录即可
识别总是 "Unknown" 训练图质量差(侧脸、模糊) 用正脸、清晰的照片重新训练
Flask 报错找不到模板 文件结构不对 确保 templates/index.html 在正确路径

🛠️ 调试技巧:在关键步骤加 print() 输出变量,比如打印 len(known_faces) 看是否成功加载训练数据。


六、如何写进简历?下一步学什么?

✅ 简历写法示例(项目经验栏)

名人脸识别系统 | Python, OpenCV, Flask

  • 使用爬虫自动收集训练数据,构建包含 10+ 名人的小型人脸数据库
  • 基于 face_recognition 库实现人脸检测与识别,准确率 >85%
  • 开发 Flask Web 界面支持图片上传与结果可视化
  • 代码开源在 GitHub,获得 15+ stars

🔜 下一步学习建议

  1. 深入算法:学习 OpenCV 的更多功能(边缘检测、目标跟踪)
  2. 改进爬虫:用 Scrapy 框架写更健壮的爬虫
  3. 美化前端:用 Vue/React 替代 Flask 模板,做成现代 Web 应用
  4. 部署上线:用 Docker 打包,部署到云服务器(如阿里云、Vercel)

💬 最后说一句:我当初也是从这样“玩具项目”开始的。别怕小,重要的是跑通全流程。当你能向别人演示“这是我做的”,你就已经超越了 80% 的观望者。


现在,打开你的编辑器,复制上面的代码,亲手跑一遍吧!遇到问题随时查文档、搜错误信息——解决问题的过程,就是你能力增长的过程

祝你 coding 愉快!

评论 0

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