计算机视觉与自然语言处理(NLP)从入门到精通:基于 Python 的学习之路
一、引言
在当今数字化时代,计算机视觉(Computer Vision)和自然语言处理(Natural Language Processing,NLP)作为人工智能领域的两大重要分支,正以前所未有的速度发展,并广泛应用于各个领域,如智能安防、自动驾驶、语音助手、智能翻译等。计算机视觉专注于让计算机理解和解释图像与视频信息,而自然语言处理则致力于使计算机能够理解、生成和处理人类语言。掌握这两项技术,不仅能为个人在人工智能领域的职业发展打开广阔的大门,还能为推动科技创新和社会进步贡献力量。本文将详细介绍计算机视觉与自然语言处理从入门到精通的学习路径,以 Python 为主要编程语言,结合丰富的实例和案例,帮助读者逐步深入这两个令人兴奋的领域。
二、计算机视觉入门
(一)Python 基础与环境搭建
Python 编程语言基础
Python 以其简洁易读的语法和丰富的库生态系统,成为计算机视觉和 NLP 开发的首选语言。对于初学者,首先需要掌握 Python 的基本语法,包括数据类型(如整数、浮点数、字符串、列表、字典等)、控制结构(如条件语句、循环语句)、函数定义与调用等。例如:
定义一个函数计算两个数的和
def add_numbers(a, b):
return a + b
调用函数并打印结果
result = add_numbers(3, 5)
print(result)
了解面向对象编程的基本概念,如类和对象的创建与使用,也是非常重要的。例如:
定义一个简单的类
点击查看代码
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
创建 Rectangle 对象并计算面积
rect = Rectangle(4, 6)
print(rect.area())
环境搭建与工具选择
安装 Python 解释器是入门的第一步。官方网站(https://www.python.org/downloads/)提供了不同操作系统的 Python 安装包。建议安装 Python 3.x 版本,因为 Python 2.x 已逐渐停止维护。
为了方便管理 Python 项目的依赖库,推荐使用虚拟环境工具,如 venv(Python 内置)或 conda(Anaconda 发行版自带)。以 venv 为例,在命令行中创建一个虚拟环境:
python -m venv myenv
激活虚拟环境(在 Windows 上):myenv\Scripts\activate
(在 Linux/Mac 上):source myenv/bin/activate
在虚拟环境中,可以使用 pip 命令安装所需的库。例如,安装用于图像处理的 Pillow 库:
pip install pillow
(二)图像处理基础与 OpenCV 库
图像的读取、显示与保存
OpenCV(Open Source Computer Vision Library)是计算机视觉领域广泛使用的库,提供了丰富的图像处理和计算机视觉算法。首先,学习如何使用 OpenCV 读取、显示和保存图像。例如:
点击查看代码
import cv2
读取图像
image = cv2.imread('image.jpg')
显示图像
cv2.imshow('My Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图像
cv2.imwrite('new_image.jpg', image)
点击查看代码
裁剪图像
cropped_image = image[100:300, 200:400]
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
缩放图像:
scaled_image = cv2.resize(image, (800, 600))
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
旋转图像:
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)
rotated_image = cv2.warpAffine(image, M, (w, h))
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
点击查看代码
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
点击查看代码
import cv2
from matplotlib import pyplot as plt
读取图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
创建 SIFT 对象并提取特征
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray, None)
绘制特征点
image_with_keypoints = cv2.drawKeypoints(gray, keypoints, image)
显示图像
plt.imshow(cv2.cvtColor(image_with_keypoints, cv2.COLOR_BGR2RGB))
plt.show()
pip install yolov5
然后,可以使用以下代码进行目标检测:
点击查看代码
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.utils.plots import plot_images, plot_results
from yolov5.utils.torch_utils import select_device
选择设备(CPU 或 GPU)
device = select_device('')
加载模型
model = attempt_load('yolov5s.pt', map_location=device)
读取图像
image = cv2.imread('image.jpg')
将图像转换为模型输入格式
img = torch.from_numpy(image).to(device)
img = img.float() / 255.0
img = img.permute(2, 0, 1).unsqueeze(0)
进行推理
with torch.no_grad():
pred = model(img)[0]
进行非极大值抑制
pred = non_max_suppression(pred)[0]
处理检测结果
for *xyxy, conf, cls in pred:
绘制边界框
cv2.rectangle(image, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
显示类别标签和置信度
label = f'{model.names[int(cls)]} {conf:.2f}'
cv2.putText(image, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
显示图像
cv2.imshow('Object Detection', image)
cv2.waitKey(0)
点击查看代码
import cv2
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.utils.plots import plot_images, plot_results
from yolov5.utils.torch_utils import select_device
选择设备
device = select_device('')
加载模型
model = attempt_load('yolov5s.pt', map_location=device)
打开摄像头
cap = cv2.VideoCapture(0)
while True:
读取视频帧
ret, frame = cap.read()
将图像转换为模型输入格式
img = torch.from_numpy(frame).to(device)
img = img.float() / 255.0
img = img.permute(2, 0, 1).unsqueeze(0)
进行推理
with torch.no_grad():
pred = model(img)[0]
进行非极大值抑制
pred = non_max_suppression(pred)[0]
处理检测结果
for *xyxy, conf, cls in pred:
绘制边界框
cv2.rectangle(frame, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
显示类别标签和置信度
label = f'{model.names[int(cls)]} {conf:.2f}'
cv2.putText(frame, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
显示视频帧
cv2.imshow('Object Detection', frame)
按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
释放摄像头资源
cap.release()
cv2.destroyAllWindows()
点击查看代码
import tensorflow as tf
from tensorflow.keras import layers, models
构建 CNN 模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
编译模型
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
点击查看代码
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
数据预处理
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
然后,对模型进行训练:
训练模型
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))
在训练过程中,模型会根据给定的训练数据和验证数据,不断调整权重参数,以提高分类的准确性。训练完成后,可以使用模型对测试数据进行预测,并评估模型的性能:
评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'Test accuracy: {test_acc}')
四、自然语言处理入门
(一)文本处理基础与 Python 库
文本清洗与预处理
在自然语言处理中,文本数据通常需要进行清洗和预处理,以去除噪声、标准化格式等。Python 的 re 库可用于正则表达式操作,实现文本清洗。例如,去除文本中的标点符号和数字:
点击查看代码
import re
text = "Hello, 123 World! This is an example."
clean_text = re.sub(r'[\d\W]+', ' ', text)
print(clean_text)
点击查看代码
import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer, WordNetLemmatizer
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
分词
words = nltk.word_tokenize(clean_text)
去除停用词
stop_words = set(stopwords.words('english'))
filtered_words = [word for word in words if word not in stop_words]
词干提取
stemmer = PorterStemmer()
stemmed_words = [stemmer.stem(word) for word in filtered_words]
词形还原
lemmatizer = WordNetLemmatizer()
lemmatized_words = [lemmatizer.lemmatize(word) for word in filtered_words]
点击查看代码
from sklearn.feature_extraction.text import CountVectorizer
创建词袋模型对象
vectorizer = CountVectorizer()
拟合数据并转换为词袋向量
texts = ["This is a sample text", "Another sample text"]
X = vectorizer.fit_transform(texts)
查看词袋向量
print(X.toarray())
点击查看代码
import gensim
加载预训练 Word2Vec 模型
model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
获取单词向量
vector = model['apple']
print(vector)
点击查看代码
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
读取电影评论数据集
data = pd.read_csv('movie_reviews.csv')
提取文本和标签
X = data['review']
y = data['sentiment']
划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
文本特征提取
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
训练朴素贝叶斯模型
model = MultinomialNB()
model.fit(X_train_vec, y_train)
预测并评估模型
y_pred = model.predict(X_test_vec)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
点击查看代码
import nltk
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag, ne_chunk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')
text = "Apple Inc. was founded by Steve Jobs in Cupertino."
分词和词性标注
words = word_tokenize(text)
pos_tags = pos_tag(words)
命名实体识别
ner_tags = ne_chunk(pos_tags)
print(ner_tags)
点击查看代码
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
构建 LSTM 模型
model = Sequential()
model.add(Embedding(vocab_size, 128))
model.add(LSTM(128, return_sequences=True))
model.add(LSTM(128))
model.add(Dense(vocab_size, activation='softmax'))
编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam')
假设已经完成数据预处理,得到英语句子列表 X 和法语句子列表 y
构建数据集
点击查看代码
dataset = tf.data.Dataset.from_tensor_slices((X, y))
dataset = dataset.shuffle(buffer_size=len(X)).batch(batch_size)
定义编码器和解码器模型
encoder = tf.keras.Sequential([
Embedding(encoder_vocab_size, 256),
LSTM(256, return_sequences=True),
LSTM(256)
])
decoder = tf.keras.Sequential([
Embedding(decoder_vocab_size, 256),
LSTM(256, return_sequences=True),
LSTM(256),
Dense(decoder_vocab_size, activation='softmax')
])
定义训练步骤
@tf.function
def train_step(inp, targ):
loss = 0
with tf.GradientTape() as tape:
enc_output = encoder(inp)
dec_hidden = enc_output
dec_input = tf.expand_dims([tokenizer_fr.word_index['<start>']] * BATCH_SIZE, 1)
for t in range(1, targ.shape[1]):
predictions = decoder(dec_input, dec_hidden)
loss += loss_function(targ[:, t], predictions)
dec_input = tf.expand_dims(targ[:, t], 1)
batch_loss = (loss / int(targ.shape[1]))
variables = encoder.trainable_variables + decoder.trainable_variables
gradients = tape.gradient(loss, variables)
optimizer.apply_gradients(zip(gradients, variables))
return batch_loss
pip install transformers
然后使用以下代码进行文本生成:
点击查看代码
from transformers import pipeline
创建文本生成管道
generator = pipeline('text-generation', model='gpt2')
生成文本
prompt = "Once upon a time"
generated_text = generator(prompt, max_length=100)[0]['generated_text']
print(generated_text)
点击查看代码
from transformers import BertTokenizer, BertForSequenceClassification
import torch
加载预训练的 BERT 模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
准备文本数据
text = "I love this movie. It's really great."
inputs = tokenizer(text, return_tensors='pt')
进行情感分析
with torch.no_grad():
logits = model(**inputs).logits
predicted_class = logits.argmax().item()
输出情感分类结果
if predicted_class == 1:
print("Positive")
else:
print("Negative")
六、综合项目实践
(一)图像描述生成系统
项目需求分析与设计
图像描述生成系统旨在结合计算机视觉与自然语言处理技术,为给定图像生成一段描述性文字。例如,对于一张包含一只猫在草地上玩耍的图像,系统能够输出 “一只猫在绿色的草地上欢快地玩耍” 这样的描述。项目需要先使用计算机视觉技术提取图像的特征,然后将这些特征输入到自然语言处理模型中,生成相应的文本描述。在设计上,可以采用预训练的图像分类模型(如 ResNet)提取图像特征,再使用基于序列到序列模型(如 LSTM)的文本生成模型将特征转换为文本。
代码实现与技术整合
首先,使用 torchvision 库加载预训练的 ResNet 模型并提取图像特征:
点击查看代码
import torch
import torchvision.models as models
import torchvision.transforms as transforms
加载预训练 ResNet 模型
resnet = models.resnet50(pretrained=True)
resnet.eval()
图像预处理
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
读取图像并提取特征
image = Image.open('image.jpg')
image_tensor = transform(image).unsqueeze(0)
with torch.no_grad():
features = resnet(image_tensor)
然后,将提取的图像特征输入到 LSTM 文本生成模型中(假设已经训练好该模型):
假设已经有训练好的 LSTM 文本生成模型 text_generator
description = text_generator(features)
print(description)
(二)智能问答系统
项目架构与功能模块
智能问答系统能够理解用户提出的问题,并给出准确的回答。其架构通常包括问题理解模块、信息检索模块和答案生成模块。问题理解模块使用自然语言处理技术对用户问题进行分析,如分词、词性标注、命名实体识别等,提取问题的关键信息;信息检索模块根据问题关键信息在知识库或互联网上搜索相关信息;答案生成模块将检索到的信息进行整理和加工,生成通顺、准确的回答。例如,对于用户提出的 “苹果公司的创始人是谁?” 这个问题,问题理解模块识别出 “苹果公司” 和 “创始人” 等关键信息,信息检索模块在知识库中查找关于苹果公司创始人的信息,答案生成模块将这些信息组织成回答 “苹果公司的创始人是史蒂夫・乔布斯等人”。
模型训练与优化策略
对于问题理解模块,可以使用基于深度学习的分类模型(如 BERT 进行分类任务)来确定问题的类型(如人物类、地点类、事件类等),以便更有针对性地进行信息检索。在信息检索模块,可以采用向量空间模型、倒排索引等技术提高检索效率和准确性。答案生成模块可以使用基于模板的方法或序列到序列模型(如 LSTM 或 GPT 系列模型)生成回答。在模型训练方面,需要收集大量的问答对数据,对各个模块的模型进行训练。例如,对于问题理解模块的分类模型,使用标注好问题类型的问答对数据进行训练;对于答案生成模块的序列到序列模型,使用问答对数据进行训练,通过调整模型的结构、超参数,如隐藏层数量、学习率等,以及使用正则化技术防止过拟合,不断优化模型性能,提高智能问答系统的准确性和实用性。

浙公网安备 33010602011771号