范闲通过机器学习算法识别太子画中女人的真实身份

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料

剧情

在这里插入图片描述
在《庆余年2》第7集中,除了皇后外有”这画的到底是谁“的疑问外。范闲也发现了太子画的无脸女子,他想搞清楚太子跟谁有勾结。面临一个棘手的难题:范闲需要找出这个女人究竟是谁。为了完成这个任务,范闲决定使用机器学习算法,通过图像识别和特征匹配技术,将这些画作与宫里所有女子的照片进行比对。从而发现太子与哪个女人进行勾结。

1. 数据收集与预处理

首先,范闲需要收集足够的数据,包括太子画的女人头像和宫里所有宫女的正面照片。这些数据可以通过以下步骤进行收集和预处理:

数据收集
  • 太子画的女人头像:从太子的画册中提取所有没有人脸的女人头像。

在这里插入图片描述

  • 所有女性的正面照片:收集居中所有女性的照片。

在这里插入图片描述

数据预处理
  1. 灰度化:将所有图像转换为灰度图像,以减少计算复杂度。
  2. 调整尺寸:将所有图像调整为统一的尺寸(例如128x128像素)。
  3. 归一化:将像素值归一化到[0, 1]范围。
import cv2
import numpy as np

def preprocess_image(image_path):
    # 读取图像
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    # 调整图像大小
    image = cv2.resize(image, (128, 128))
    # 归一化
    image = image / 255.0
    # 增加维度,以适应模型输入
    image = np.expand_dims(image, axis=-1)  # 形状变为 (128, 128, 1)
    return image
# 示例使用
image_path = 'path_to_image.jpg'
processed_image = preprocess_image(image_path)
print(processed_image.shape)  # 输出: (128, 128, 1)
print(processed_image)  # 输出预处理后的图像数据

2. 特征提取

整个的特征提取过程经过了多轮的卷积层和池化层,这是整体的特征可视化过程,每个步骤都是通过代码跑出来的,输入的李云睿的图片,每层提取的特征是抽象的特征,所以到输出的时候会变得模糊,最好是把各个角度的照片都跑一遍。
在这里插入图片描述

为了识别图像中的特征,范闲使用卷积神经网络(CNN)进行特征提取。卷积神经网络是一种深度学习模型,能够有效地从图像中提取高级特征。以下是一个简单的CNN示例:

import tensorflow as tf
from tensorflow.keras import layers, models

def build_cnn(input_shape):
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    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(11, activation='softmax'))  # 假设有128个人

    return model

input_shape = (128, 128, 1)  # 假设输入为128x128的灰度图像
model = build_cnn(input_shape)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

3. 模型训练

使用宫中女性的正面照片进行模型训练,标签是每个女的身份。假设我们已经准备好了训练数据和标签。

# 假设已经准备好了训练数据和标签
# X_train, y_train 为训练数据和标签
history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)

4. 特征匹配

通过特征匹配的方法,将太子画的女人头像与已知女的图像进行比较。可以使用预训练的VGG16模型提取特征,然后计算相似度。

from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
from tensorflow.keras.preprocessing import image

# 加载预训练的VGG16模型
vgg_model = VGG16(weights='imagenet', include_top=False, input_shape=(128, 128, 3))

def extract_features(img_path, model):
    img = image.load_img(img_path, target_size=(128, 128))
    img_data = image.img_to_array(img)
    img_data = np.expand_dims(img_data, axis=0)
    img_data = preprocess_input(img_data)
    features = model.predict(img_data)
    return features

# 提取特征
known_image_path = 'path_to_known_image.jpg'
unknown_image_path = 'path_to_unknown_image.jpg'

known_features = extract_features(known_image_path, vgg_model)
unknown_features = extract_features(unknown_image_path, vgg_model)

各层会逐步模糊,这里只展示第一个
在这里插入图片描述

5. 计算余弦相似度

余弦相似度是通过计算两个特征向量的夹角余弦值来度量相似度,公式为:
在这里插入图片描述

# 计算余弦相似度
similarity = np.dot(known_features.flatten(), unknown_features.flatten()) / (np.linalg.norm(known_features) * np.linalg.norm(unknown_features))
print('相似度:', similarity)

6. 比较相似度

计算所有已知女图像与太子画的女人头像的相似度,选择相似度最高的作为匹配结果。

known_images_paths = ['path_to_known_image1.jpg', 'path_to_known_image2.jpg', ...]
similarities = []

for known_image_path in known_images_paths:
    known_features = extract_features(known_image_path, vgg_model)
    similarity = np.dot(known_features.flatten(), unknown_features.flatten()) / (np.linalg.norm(known_features) * np.linalg.norm(unknown_features))
    similarities.append(similarity)

# 找到相似度最高的图像
max_similarity_index = np.argmax(similarities)
best_match_image_path = known_images_paths[max_similarity_index]
print('最佳匹配图像路径:', best_match_image_path)

最后输出匹配结果:
李云睿: 匹配度 85.60%
袁梦: 匹配度 14.30%
其他候选人匹配度均低于10%

总结

通过以上步骤,范闲利用机器学习算法和特征匹配技术,成功地将太子画的没有人脸的女人头像与宫女李云睿的照片匹配,揭示了画中女人的真实身份。这一过程包括数据收集、预处理、特征提取、模型训练和相似度计算,展示了机器学习在图像识别中的强大应用。通过这些步骤,范闲不仅揭开了太子画中女人的身份,还发现了太子和长公主李云睿背后的故事,知道长公主和二皇子只是逢场作戏,为后面进一步瓦解各个皇子提前做好准备,同时展现了现代技术在解决复杂问题中的潜力。

  • 27
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据分析螺丝钉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值