【2025校招】4399 NLP算法工程师笔试题

目录
- 1. 第一题
- 2. 第二题
- 3. 第三题
⏰ 时间:2024/08/19
🔄 输入输出:ACM格式
⏳ 时长:2h
本试卷分为单选,自我评价题,编程题
单选和自我评价这里不再介绍,4399的编程题一如既往地抽象,明明是NLP岗位的笔试题,却考了OpenCV相关的知识。btw,跟网友讨论了下,4399似乎不同时间节点的笔试题是一样的???
1. 第一题
第一题是LC原题:441. 排列硬币,题目和题解请前往LC查看。
2. 第二题
题目描述
请使用OpenCV库编写程序,实现在视频文件中实时追踪一个人手持手机绿幕的四个顶点的坐标。
要求
- 使用颜色分割技术检测绿幕区域。(8分)
- 使用适当的方法(如轮廓检测)找到绿幕的四个顶点。(10分)
- 在视频帧中标记出这四个顶点。(8分)
手机绿幕指:手机屏幕显示全绿色图片,用于后期处理替换为其他界面,绿色范围:lower_green = np.array([35, 100, 100])
,upper_green = np.array([85, 255, 255])
。
测试用例
输入:green_screen_track.mp4
输出:带顶点标记的视频序列帧图片
题解
import cv2
import numpy as nplower_green = np.array([35, 100, 100])
upper_green = np.array([85, 255, 255])def get_largest_contour(contours):""" 获取最大轮廓 """max_contour = max(contours, key=cv2.contourArea)return max_contourdef get_four_vertices(contour):""" 近似轮廓为四边形 """epsilon = 0.02 * cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon, True)if len(approx) == 4:return approx.reshape(4, 2)else:return Nonedef main(video_path):cap = cv2.VideoCapture(video_path)while cap.isOpened():ret, frame = cap.read()if not ret:breakhsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_frame, lower_green, upper_green)contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)if contours:largest_contour = get_largest_contour(contours)vertices = get_four_vertices(largest_contour)if vertices is not None:for (x, y) in vertices:cv2.circle(frame, (x, y), 5, (0, 0, 255), -1)cv2.polylines(frame, [vertices], isClosed=True, color=(0, 255, 0), thickness=2)cv2.imshow('Green Screen Tracking', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":video_path = 'green_screen_track.mp4'main(video_path)
3. 第三题
You can use Chinese to answer the questions.
Problem Description
You need to use the Swin Transformer model to train a binary classifier to identify whether an image contains a green screen. Green screens are commonly used in video production and photography for background replacement in post-production. Your task is to write a program that uses the Swin Transformer model to train and evaluate the performance of this classifier.
Input Data
- Training Dataset: A set of images, including images with and without green screens.
- Labels: Labels for each image, where 0 indicates no green screen and 1 indicates the presence of a green screen.
Output Requirements
- Trained Model: Train a binary classifier using the Swin Transformer model.
- Model Evaluation: Evaluate the model’s accuracy, precision, recall, and F1-score on a validation or test set.
Programming Requirements
- Data Preprocessing: Including image loading, normalization, and label processing.
- Model Definition: Using the Swin Transformer model.
- Training Process: Including loss function, optimizer, and training loop.
- Evaluation Process: Evaluate the model’s performance on the validation or test set.
- Results Presentation: Output evaluation metrics and visualize some prediction results.
Here is a sample code framework to help you get started:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms, datasets
from swin_transformer_pytorch import SwinTransformer
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from PIL import Image# Dataset class definition
class GreenScreenDataset(Dataset):def __init__(self, image_paths, labels, transform=None):self.image_paths = image_pathsself.labels = labelsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image = Image.open(self.image_paths[idx]).convert('RGB')label = self.labels[idx]if self.transform:image = self.transform(image)return image, label# Data preprocessing, please define transform
# TODO# Load datasets
train_dataset = GreenScreenDataset(train_image_paths, train_labels, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)val_dataset = GreenScreenDataset(val_image_paths, val_labels, transform=transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)# Define the SwinTransformer model
# TODO# Loss function and optimizer
criterion = nn.CrossEntropyLoss()
# TODO# Training process
def train(model, train_loader, criterion, optimizer, num_epochs=10):model.train()for epoch in range(num_epochs):running_loss = 0.0for images, labels in train_loader:# TODO: forward pass, compute loss, backpropagation, optimizer steprunning_loss += loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')# Evaluation process
def evaluate(model, val_loader):model.eval()all_preds = []all_labels = []with torch.no_grad():for images, labels in val_loader:outputs = model(images)_, preds = torch.max(outputs, 1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())accuracy = accuracy_score(all_labels, all_preds)# TODO: Calculate precision, recall, and F1-scoreprint(f'Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1-score: {f1:.4f}')# Train the model
train(model, train_loader, criterion, optimizer, num_epochs=10)# Evaluate the model
evaluate(model, val_loader)
题解
该问题要求训练一个基于Swin Transformer模型的二分类器,用以识别图像中是否包含绿幕。解决方案涉及数据预处理、模型设计、训练和评估等多个环节。
首先,在数据预处理阶段,图像需要被调整大小并进行归一化,以满足Swin Transformer的输入需求。此外,数据集中的标签是二值化的,分别代表有无绿幕(0表示无绿幕,1表示有绿幕),确保数据集类能够准确处理这些标签是至关重要的。在模型设计上,使用了预训练的Swin Transformer模型,并针对二分类任务进行了微调。输出层被替换为一个具有两个节点的全连接层,分别对应两个类别。通过这种方式,模型能够有效地适应二分类任务。训练过程采用了标准的训练循环,设置了损失函数和优化器,并使用学习率调度器动态调整学习率。此外,为了防止过拟合,模型在训练过程中还应用了正则化技术,如dropout。在模型评估阶段,除了准确率,还使用了精确率、召回率和F1分数等指标,以全面评估模型在二分类任务中的表现。同时,为了更直观地展示模型效果,选择了一些样本图像进行可视化,显示它们的预测结果与实际标签的对比。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
from swin_transformer_pytorch import SwinTransformer
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np# 数据集类定义
class GreenScreenDataset(Dataset):def __init__(self, image_paths, labels, transform=None):self.image_paths = image_pathsself.labels = labelsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image = Image.open(self.image_paths[idx]).convert('RGB')label = self.labels[idx]if self.transform:image = self.transform(image)return image, torch.tensor(label, dtype=torch.long)# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])train_dataset = GreenScreenDataset(train_image_paths, train_labels, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)val_dataset = GreenScreenDataset(val_image_paths, val_labels, transform=transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)model = SwinTransformer(hidden_dim=96,layers=(2, 2, 6, 2),num_heads=(3, 6, 12, 24),num_classes=2,window_size=7,input_resolution=224
)
model = model.to(torch.device('cuda' if torch.cuda.is_available() else 'cpu'))criterion = nn.CrossEntropyLoss()
optimizer = optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)# 训练
def train(model, train_loader, criterion, optimizer, scheduler, num_epochs=10):model.train()for epoch in range(num_epochs):running_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()scheduler.step()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')# 模型评估
def evaluate(model, val_loader):model.eval()all_preds = []all_labels = []with torch.no_grad():for images, labels in val_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())accuracy = accuracy_score(all_labels, all_preds)precision = precision_score(all_labels, all_preds)recall = recall_score(all_labels, all_preds)f1 = f1_score(all_labels, all_preds)print(f'Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1-score: {f1:.4f}')return all_preds, all_labels# 可视化
def visualize_predictions(val_loader, model):model.eval()images, labels = next(iter(val_loader))images, labels = images.to(device), labels.to(device)outputs = model(images)_, preds = torch.max(outputs, 1)images = images.cpu().numpy()preds = preds.cpu().numpy()labels = labels.cpu().numpy()# 可视化前6个样本plt.figure(figsize=(12, 8))for i in range(6):plt.subplot(2, 3, i + 1)image = np.transpose(images[i], (1, 2, 0))image = image * np.array([0.229, 0.224, 0.225]) + np.array([0.485, 0.456, 0.406]) # 反归一化image = np.clip(image, 0, 1)plt.imshow(image)plt.title(f'Pred: {preds[i]}, Actual: {labels[i]}')plt.axis('off')plt.show()device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
train(model, train_loader, criterion, optimizer, scheduler, num_epochs=10)
all_preds, all_labels = evaluate(model, val_loader)
visualize_predictions(val_loader, model)
相关文章:

【2025校招】4399 NLP算法工程师笔试题
目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间:2024/08/19 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷分为单选,自我评价题,编程题 单选和自我评价这里不再介绍,4399的编程题一如既往地抽象ÿ…...

数据库原理--关系1
目录 一、表的基本构成要素 二、域(Domain) 三、笛卡尔积 四、关系模式 五、关系模式与关系 六、关系的特性 一、表的基本构成要素 表又被叫做关系,在数据库当中,我们可以把行叫做元组和记录,而列在数据库当中通常被我们叫做字段或者…...

【人工智能】AI工程化是将人工智能技术转化为实际应用、创造实际价值的关键步骤
AI工程化是将人工智能技术转化为实际应用、创造实际价值的关键步骤。以下是对AI工程化的详细介绍: 一、概念与定义 AI工程化是使用数据处理、预训练模型、机器学习流水线等技术开发AI软件的过程,旨在帮助企业更高效地利用AI创造价值。它是软件工程在AI…...

《C语言实现各种排序算法》
文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序3、快速排序hoare找基准值4、快排挖坑法找基准值5、前后指针法6、快速排序非递归实现 五…...

【888题竞赛篇】第五题,2023ICPC澳门-传送(Teleportation)
这里写自定义目录标题 更多精彩内容256题算法特训课,帮你斩获大厂60W年薪offer 原题2023ICPC澳门真题传送B站动画详解 问题分析思路分析图的构建最短路径算法具体步骤 算法实现Dijkstra 算法图的构建 代码详解标准代码程序C代码Java代码Python代码Javascript代码 复…...

javascript写一个页码器-SAAS本地化及未来之窗行业应用跨平台架构
一代码 接引入 <script type"text/javascript" src"CyberWin_APP_Page.js" alt"未来之窗页码"></script>function 未来之窗页面触发器(页码){console.log("当前用户新"页码);}CyberWin_Page.set_callback(未来之窗页面触发…...

微信小程序如何自定义一个组件
微信小程序支持组件化开发,这有助于我们复用代码,提高开发效率。下面我将给出一个简单的微信小程序组件化示例,包括一个自定义组件的创建和使用。 1. 创建自定义组件 首先,在项目的 components 目录下创建一个新的组件文件夹&am…...

【数学建模备赛】Ep05:斯皮尔曼spearman相关系数
文章目录 一、前言🚀🚀🚀二、斯皮尔曼spearman相关系数:☀️☀️☀️1. 回顾皮尔逊相关系数2. 斯皮尔曼spearman相关系数3. 斯皮尔曼相关系数公式4. 另外一种斯皮尔曼相关系数定义5. matlab的用法5. matlab的用法 三、对斯皮尔曼相…...

MATLAB进行神经网络建模的案例
下面是一个使用MATLAB进行神经网络建模的案例,该案例涉及使用神经网络来逼近一个未知系统的输入输出关系。这个案例与您提到的学习资料中的实例类似,但我会简化并解释每个步骤。 案例背景 假设我们有一组输入和输出数据,我们希望通过建立一…...

每天一个数据分析题(四百八十九)- 主成分分析与因子分析
关于主成分分析和因子分析的区别,下列描述正确的是( ) A. 主成分分析是一种无监督学习算法,而因子分析是一种有监督学习算法 B. 主成分分析是一种线性变换方法,而因子分析是一种非线性变换方法 C. 主成分分析的结果…...

Java RPC、Go RPC、Node RPC、Python RPC 之间的互相调用
Java RPC、Go RPC、Node RPC、Python RPC 之间的互相调用是完全可以实现的,但需要满足一些条件和依赖于特定的工具和协议。以下是如何实现不同语言之间的RPC互相调用的详细解释: 1. 使用通用协议和标准:gRPC gRPC 是一个高性能、开源的RPC框…...

国外代理IP选择:IP池的大小有何影响
代理IP是跨境人不可或缺的工具,广泛应用于广告验证、数据获取和账号矩阵管理等方面。而在选择代理IP时,IP池的大小往往是一个至关重要的考量因素。本文将深入解析IP池大小对代理IP选择的影响,帮助大家更好地理解这一关键决策点。 一、IP池的…...

手机谷歌浏览器怎么用
谷歌浏览器不仅在PC端受欢迎,在移动端也是广泛应用的。为了帮助大家更好的理解和使用手机谷歌浏览器,本文将详细介绍如何使用手机谷歌浏览器,对这款浏览器感到陌生的话就快快学起来吧。(本文由https://chrome.cmrrs.com/站点的作者…...

Button窗口部件
# 2. Button窗口部件 # 简单说明: # Button(按钮)部件是一个标准的Tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图象, # 并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,Tki…...

PCIe学习笔记(25)
数据完整性 PCI Express的基本数据可靠性机制包含在数据链路层(data Link Layer)中,它使用32位的LCRC (CRC)码逐链路检测TLP中的错误,并采用逐链路重传机制进行错误恢复。TLP是一个数据和事务控制单元,由位于PCI Express域“边缘”的数据源(…...

8.20
上午 1、使用ansible安装并启动ftp服务 [root1 ~]# vim /etc/ansible/hosts s0 ansible_ssh_host10.0.0.12 ansible_ssh_port22 ansible_ssh_userroot ansible_ssh_pass1 s1 ansible_ssh_host10.0.0.13 ansible_ssh_port22 ansible_ssh_userroot ansible_ssh_pass1 s2 ansi…...

centos7.9系统安装talebook个人书库
1.简介: talebook —— 一个基于Calibre的简单的个人图书管理系统,支持在线阅读。 2.环境准备: #使用阿里源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo #安装docker yu…...

ES高级查询Query DSL查询详解、term术语级别查询、全文检索、highlight高亮
文章目录 ES高级查询Query DSLmatch_all返回源数据_source返回指定条数size分页查询from&size指定字段排序sort 术语级别查询term query术语查询terms query多术语查询range query范围查询exists queryids queryprefix query前缀查询wildcard query通配符查询fuzzy query模…...

关于Blender云渲染农场,你应该知道的一切!
Blender是一个功能强大的免费开源3D创作套件,提供了广泛的工具和特性,因此受到了许多3D艺术家的喜爱。在创建3D场景的过程中,渲染作为最后一步,常常是许多艺术家头疼的问题,因为它不仅耗时,还占用了他们的计…...

Obsidian如何安装插件
文章目录 前言开始安装写在最后 前言 没有插件的 Obsidian 是不完整的 Obsidian,如果你正在使用 Obsidian,一定要会安装插件。 本文将告诉你如何安装 Obsidian 第三方插件。 开始安装 首先进入 Obsidian 界面。 点击左下角的设置图标,就…...

Nginx服务器申请及配置免费SSL证书
免费SSL证书申请 背景: 我的情况是这样,域名解析是华为云的,然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是9天),申请步骤如下 主要步骤说明 申请免费SSL证书配置证书到域…...

STM32CubeMX 配置串口通信 HAL库
一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾:所有初始化代码都生成在 main.c 勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 #include <stdio.h>#ifdef __GNUC__#def…...

GitHub的未来:在微软领导下保持独立与AI发展的平衡
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

RGB与YUV格式详解
图像处理 文章目录 图像处理前言一、RGB格式二、YUV格式三、RGB与YUV转换四、NV21转换为YUV420p五、YUV旋转 前言 在图像的世界里,一般使用RGB作为存储格式。而在视频的世界里,一般使用YUV作为压缩存储格式。有时候面试官会问:为什么视频使用…...

JS获取当前浏览器名称
在JavaScript中,获取当前浏览器名称的方法并不是一个标准的功能,因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是,你可以通过分析用户代理字符串(User-Agent)来推断出浏览器的名称。 以下是一个简单的…...

学习计算机网络(五)——ICMP协议
ICMP 协议(Internet Control Message Protocol,互联网控制报文协议),主要用于在 IP 网络中传递控制消息和差错报告。 ICMP在IP系统间传递差错和管理报文,是任何IP实现必需和要求的组成部分。 可把ICMP报文分成两类&a…...

request.getRequestURI()与request.getRequestURL()的区别
1.返回值的区别: request.getRequestURL() 返回值是一个StringBuffer类型 request.getRequestURI() 返回值是一个String类型 先看 request.getRequestURL() 返回的是一个具体的地址,访问网页的地址 而 request.getRequestURI() 返回的是一个映射地址&a…...

3154. 到达第 K 级台阶的方案数(24.8.20)
今天发晚了,嘿嘿,玩黑神话玩的 题目 给你有一个 非负 整数 k 。有一个无限长度的台阶,最低 一层编号为 0 。 Alice 有一个整数 jump ,一开始值为 0 。Alice 从台阶 1 开始,可以使用 任意 次操作,目标是到达…...

如何使用docker打包后端项目并部署到阿里云k8s集群上
如何使用docker打包后端项目并部署到阿里云k8s集群上 1. 引言 在现代软件开发中,容器化技术已经成为主流,而Kubernetes (K8s) 是管理容器的首选平台之一。本文将详细介绍如何将一个后端项目使用Docker打包,并将其部署到阿里云的Kubernetes集群上。 2. 前置条件 阿里云账号…...

ES6中解构的使用
一、提取几个属性,构造一个新的对象 在JavaScript中,你可以使用对象解构(Object Destructuring)来提取一个对象中的几个属性,并构造一个新的对象。下面是一个示例: 在这个例子中,name和email属性…...