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

目录

  • 1. 第一题
  • 2. 第二题
  • 3. 第三题

⏰ 时间:2024/08/19
🔄 输入输出:ACM格式
⏳ 时长:2h

本试卷分为单选,自我评价题,编程题

单选和自我评价这里不再介绍,4399的编程题一如既往地抽象,明明是NLP岗位的笔试题,却考了OpenCV相关的知识。btw,跟网友讨论了下,4399似乎不同时间节点的笔试题是一样的???

1. 第一题

第一题是LC原题:441. 排列硬币,题目和题解请前往LC查看。

2. 第二题

题目描述

请使用OpenCV库编写程序,实现在视频文件中实时追踪一个人手持手机绿幕的四个顶点的坐标。

要求

  1. 使用颜色分割技术检测绿幕区域。(8分)
  2. 使用适当的方法(如轮廓检测)找到绿幕的四个顶点。(10分)
  3. 在视频帧中标记出这四个顶点。(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

  1. Training Dataset: A set of images, including images with and without green screens.
  2. Labels: Labels for each image, where 0 indicates no green screen and 1 indicates the presence of a green screen.

Output Requirements

  1. Trained Model: Train a binary classifier using the Swin Transformer model.
  2. Model Evaluation: Evaluate the model’s accuracy, precision, recall, and F1-score on a validation or test set.

Programming Requirements

  1. Data Preprocessing: Including image loading, normalization, and label processing.
  2. Model Definition: Using the Swin Transformer model.
  3. Training Process: Including loss function, optimizer, and training loop.
  4. Evaluation Process: Evaluate the model’s performance on the validation or test set.
  5. 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis AOF机制

在redis运行期间,不断将redis执行的写命令写到文件中,redis重启之后,只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中,因此其执行效率高于RDB,开启AOF即使Redis发生故障&#xff0…

前端使用miniO上传文件

项目背景:vue2&#xff0c;前提是请先安装miniO,若安装引入时报错&#xff0c;那就是版本不对&#xff0c;通常指定版本安装即可。 页面样式&#xff1a; 前端vue页面代码&#xff1a; //<el-form>表单中:<el-form-item label"文件" prop"fileIds&q…

TY6802 同步整流PCB设计注意事项

TY6802 系列是一款用于反激式电源次级同步整流芯片&#xff0c;TY6802能可靠支持包括 DCM、CCM和准谐振模式。TY6802 集成了一个 100V 功率 MOSFET&#xff08;TY6802A&#xff1a;100V15mR; TY6802B&#xff1a;100V10mR; TY6802C&#xff1a;100V7.5mR;) &#xff0c;可以取代…

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及&#xff0c;网络安全问题日益严峻&#xff0c;API&#xff08;应用程序接口&#xff09;已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁&#xff0c;其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

JavaScript(25)——BOM、延迟函数、JS执行机制

BOM BOM是浏览器对象模型 window对象是一个全局对象&#xff0c;也就是JavaScript中的顶级对象所有通过var定义的全局作用域中的变量&#xff0c;函数都会变成window对象的属性和方法window对象下的属性和方法调用的时候可以省略window 延时函数 let a setTimeout(回调函数…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

【Python零基础学习】字典

文章目录 前言一、简单字典示例二、使用字典三、字典遍历四、嵌套总结 前言 Python 字典 是一种非常强大且灵活的数据结构&#xff0c;它允许你通过键&#xff08;key&#xff09;来存储和检索值&#xff08;value&#xff09;。想象一下&#xff0c;字典就像一个巨大的电话簿…

8月21日微语报,星期三,农历七月

8月21日微语报&#xff0c;星期三&#xff0c;农历七月十八&#xff0c;工作愉快&#xff0c;生活喜乐&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、今日出发&#xff01;中国体育代表团将分两批出征巴黎残奥会。 2、股价再创新高&#xff01;工商银行市值…

suricata编译安装和运行

目录 编译安装 运行 调试 编译安装 apt -y install autoconf automake build-essential cargo \ libjansson-dev libpcap-dev libpcre2-dev libtool \ libyaml-dev make pkg-config rustc zlib1g-dev apt-get install libpcre3-dev wget https://www.openin…

项目实战--SpringBoot整合EasyExcel实现数据导入导出

SpringBoot整合EasyExcel实现数据导入导出 一、前言二、实践2.1 实体类注解方式2.2 动态参数化导出导入 一、前言 在公司业务系统开发过程中&#xff0c;操作 Excel 实现数据的导入导出是个非常常见的需求。 最近公司的项目采用EasyPoi来实现的&#xff0c;但是在数据量大的情…

GPT-SoVITS

文章目录 model archS1 ModelS2 model model arch S1 model: AR model–ssl tokensS2 model: VITS&#xff0c;ssl 已经是mel 长度线性相关&#xff0c;MRTE(ssl_codes_embs, text, global_mel_emb)模块&#xff0c;将文本加强相关&#xff0c;学到一个参考结果 S1 Model cla…

Linux进程间通信——SystemV消息队列与信号量

文章目录 消息队列信号量同步互斥原语、原子性信号量多线程并发访问锁 消息队列 SystemV除了共享内存之外&#xff0c;还有一个进程间通信的方式&#xff0c;是消息队列 我们说一切进程间通信的方式本质其实就是让不同进程看到同一份资源 这个消息队列的本质其实就是让两个进…

十二步:像玩游戏一样搞量化,量化交易不是“黑神话”

十二步&#xff1a;像玩游戏一样搞量化&#xff0c;量化交易不是“黑神话” 1、定义您的目标2、数据收集和清理3、构思4、模型开发5、回测6、风险管理7、交易成本分析 (TCA)8、模拟交易9、优化10、执行11、监控和维护12、记录和审查结论 《黑神话&#xff1a;悟空》今日上线了&…

OSPF-基础多区域实验

1.ENSP下载 阿里云盘分享 ⭐/*无需密钥 免费下载 安装不成功&#xff0c;可关注并私信博主*/ 2.OSPF的基础需求和规则 实验规则&#xff1a; 1.接口地址→XY.XY.XY.R /24 X:两者之间最小的 Y:两者之间最大的 R:谁的接口就是谁的编号 以R1和R2之间的连接为例&#xff0…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(中)

目录 一.Nginx版本和安装方式:源码编译安装 1.验证版本及编译参数 2.使用安装完成的二进制文件nginx 3.Nginx 启动文件 二.平滑升级和回滚 三.全局配置 实现 nginx 的高并发配置 四.核心配置&#xff1a;新建一个 PC web 站点 五.核心配置&#xff1a;location的详细使用…

GlobalMapper-大疆的航点kmz转航线文件展示空间轨迹

0序&#xff1a; 在大疆遥控器或者司空2中设置航线&#xff0c;都是一个个的航点&#xff0c;如果把航点转为航线&#xff0c;在三维地球中显示其空间效果。用于分析和实际物体的距离&#xff0c;或者展示该航线都做了哪些方面的考虑。 如何把一堆点连城一条线&#xff1f; 本…

Kali Linux 命令大全

一、引言 Kali Linux 作为一款专为渗透测试和安全研究设计的操作系统&#xff0c;拥有丰富的命令行工具&#xff0c;熟练掌握这些命令对于高效地进行安全测试和分析至关重要。本文将为您详细介绍 Kali Linux 中常用的命令&#xff0c;涵盖系统信息获取、文件操作、网络分析、用…

如何轻松有效地将 Windows 10 电脑迁移到 SSD

您想将 Windows 10 迁移到新硬盘驱动器吗&#xff1f;在专业第三方应用程序的帮助下&#xff0c;它可以简单有效地完成。这篇文章将为读者提供有关如何将 Windows 10 迁移到 SSD 的详细指南。 Windows 10 电脑系统迁移到 SSD 的四个原因 Windows 10 克隆到 SSD 意味着将设备上…

【C++】————智能指针

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年8月20日 一&#xff0c;什么是智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&…

标准版v5.4安卓手机小程序扫码核销读取不到核销码的问题

修改这个文件&#xff0c;红色的那块代码替换成绿色的这段代码&#xff0c;然后重新打包上传。 文件地址&#xff1a;template/uni-app/pages/admin/order_cancellation/index.vue let path decodeURIComponent(res.path); self.verify_code path.split(‘code’)[1]; h5…