从零开始做计算机视觉项目:用算法、爬虫和前端打造你的第一份技术简历
大家好,我是一名开源项目的维护者,也写过不少技术文档。经常有初学者问我:“我想学计算机视觉,但完全不知道从哪开始,是不是要先学很多数学?”其实我当初学的时候也有同样的困惑。后来我发现,最好的学习方式是做一个小而完整的项目——不仅能理解核心概念,还能直接放进简历里。
今天这篇教程,我就带你用最简单的方式完成一个计算机视觉实战项目。我们会用到关键词里的四个要素:算法(图像识别)、爬虫(获取数据)、前端(展示结果),最后你还能把它写进简历!全程不用高深数学,只需要一点 Python 基础。
一、我们要做什么?
我们将做一个“名人脸识别小工具”:
- 用爬虫从网上下载一些名人照片(比如周杰伦、杨幂)
- 用现成的计算机视觉算法识别人脸
- 用简单的前端页面上传照片并显示识别结果
这个项目虽然小,但包含了完整的开发流程,非常适合新手练手。
二、环境准备: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>
运行整个项目
- 先运行训练脚本(只需一次):
python train.py - 启动 Web 服务:
python app.py - 浏览器打开
http://localhost:5000 - 上传一张含有人脸的图片,看看能否识别!
五、新手常见问题 & 解决方案
| 问题 | 原因 | 解决方法 |
|---|---|---|
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
🔜 下一步学习建议
- 深入算法:学习 OpenCV 的更多功能(边缘检测、目标跟踪)
- 改进爬虫:用 Scrapy 框架写更健壮的爬虫
- 美化前端:用 Vue/React 替代 Flask 模板,做成现代 Web 应用
- 部署上线:用 Docker 打包,部署到云服务器(如阿里云、Vercel)
💬 最后说一句:我当初也是从这样“玩具项目”开始的。别怕小,重要的是跑通全流程。当你能向别人演示“这是我做的”,你就已经超越了 80% 的观望者。
现在,打开你的编辑器,复制上面的代码,亲手跑一遍吧!遇到问题随时查文档、搜错误信息——解决问题的过程,就是你能力增长的过程。
祝你 coding 愉快!

评论 0