1. 项目概述:研电赛与深度学习的交汇点
如果你是一名在读研究生,尤其是电子信息、计算机、自动化等相关专业的同学,最近肯定被“研电赛”这个词刷屏了。中国研究生电子设计竞赛,这个国内研究生阶段最具影响力的电子类创新竞赛,每年都吸引着数万学子投身其中。而近年来,一个趋势愈发明显:纯粹的硬件电路设计已经不再是唯一的焦点,以深度学习为代表的人工智能技术,正以前所未有的深度和广度,与传统的电子系统设计发生着化学反应。这不仅仅是给作品加上一个“AI”的标签那么简单,它意味着从问题定义、方案设计、硬件选型到算法部署的整个研发流程,都发生了根本性的重构。
我参加过也指导过好几届研电赛,亲眼见证了从早期用单片机跑个简单神经网络都费劲,到现在边缘计算芯片遍地开花、模型轻量化技术成为标配的演变。今天,我们不谈那些宏大的概念,就从一个一线参赛者和指导者的角度,拆解一下“研电赛深度学习”这个命题到底意味着什么。它绝不仅仅是调个PyTorch模型那么简单,而是一个涉及嵌入式AI、模型压缩、异构计算、软硬件协同设计的系统工程。你的作品能否在评审现场稳定运行、实时响应,并且功耗可控,这些才是决定你能否从众多队伍中脱颖而出的关键。这篇文章,我就结合自己的踩坑经验,把从选题构思到最终部署上板的完整链条给你捋清楚,希望能帮你避开那些我当年摔过的跤。
2. 研电赛深度学习项目的核心设计思路
2.1 选题定位:从“炫技”到“解决真问题”
很多队伍一开始就容易陷入一个误区:盲目追求最前沿、最复杂的深度学习模型,比如一上来就想搞Transformer的嵌入式部署。这往往会导致项目后期举步维艰。研电赛的评审,尤其是技术竞赛,非常看重作品的完整性、创新性和实用性。一个成功的深度学习选题,应该遵循“问题驱动”而非“技术驱动”。
首先,找到那个“小而美”的痛点。别想着做一个通用的“智能机器人”,那太大太空。你应该思考的是:在某个具体的垂直场景下,是否存在一个用传统方法(比如规则判断、经典图像处理)解决起来很麻烦,但用深度学习却能显著提升效果或效率的问题?举个例子:
- 工业场景:PCB板上的微小缺陷(划痕、漏铜)自动光学检测。传统方法对光照、角度极其敏感,而一个轻量化的目标检测模型(如YOLO Nano, NanoDet)就能很好地解决。
- 农业场景:基于无人机影像的农作物病虫害识别。难点在于背景复杂、目标小,且需要模型能在端侧(无人机机载计算机)实时处理。
- 医疗辅助场景:可穿戴设备上的实时心电信号异常分类。这属于时序信号分类,可以用一维卷积神经网络(1D-CNN)或轻量级Transformer来处理。
其次,明确你的创新点在哪里。创新不一定非得是发明一个新算法。在研电赛的语境下,以下几种创新同样有价值:
- 应用创新:将成熟的深度学习模型(如MobileNet, EfficientNet-Lite)应用到一个全新的、有实际需求的领域。
- 工程创新:针对特定硬件平台(如瑞芯微RK3568、英伟达Jetson Nano、STM32+AI加速核)做了极致的性能优化,实现了在资源受限环境下别人做不到的推理速度或精度。
- 系统创新:设计了一套巧妙的软硬件协同方案。例如,用FPGA对模型的某个计算密集型层(如卷积)进行硬件加速,而其他部分仍在CPU上运行,从而在成本和性能间取得最佳平衡。
注意:商业计划书专项赛对深度学习项目的需求更为直接,它要求你清晰地阐述技术的商业落地潜力、市场壁垒和盈利模式。你的深度学习模型在这里是核心产品的一部分,需要重点说明其相比现有解决方案的成本优势、性能优势或数据优势。
2.2 技术栈选型:平衡性能、效率与开发难度
选型决定了你未来几个月是顺风顺水还是焦头烂额。一个典型的研电赛深度学习项目技术栈可以分为四层:硬件平台、推理框架、模型算法、开发工具。
硬件平台是地基。你需要根据项目预算、算力需求和功耗限制来挑选。
- 高性能边缘计算平台(预算充足之选):如英伟达Jetson系列(Nano, Xavier NX, Orin Nano)。优势是生态完善,CUDA加速强大,支持TensorRT,适合视觉类复杂模型。缺点是成本较高,功耗相对大。
- 国产AIoT芯片(性价比之选):如瑞芯微的RK3566/RK3568(带NPU)、晶晨的A311D、地平线的旭日X3派。这些板子通常NPU算力在0.5~2 TOPS,功耗低,价格亲民(几百元级别),是研电赛的“爆款”选择。但需要关注其官方推理框架(如RKNN Toolkit)的易用性和对算子支持度。
- MCU+AI加速核(极致低功耗之选):如STM32系列中集成Cortex-M核与AI加速器的型号(如STM32H7系列),或ESP32-S3。这类平台算力有限(通常在GOPS级别),只能运行极度轻量化的模型(如TensorFlow Lite for Microcontrollers格式的模型),适合传感器信号处理、关键词唤醒等应用。
推理框架是桥梁。它负责将你训练好的模型“翻译”成硬件能高效执行的指令。
- TensorRT (NVIDIA专属):如果你用Jetson,这是不二之选。它能对模型进行图优化、层融合、精度校准(INT8量化),带来数倍的推理速度提升。
- RKNN / TNN / MNN (跨平台部署框架):国产芯片通常有自家的SDK(如RKNN),也可以选择腾讯的TNN、阿里的MNN等开源跨平台框架。它们的目标是在多种硬件(CPU, GPU, NPU)上获得高性能。关键点:必须在项目早期就验证你设计的模型结构,是否被目标平台的推理框架良好支持。我曾遇到过因为使用了某个不常见的激活函数(如SiLU),导致模型无法在NPU上编译的坑。
模型算法是灵魂。切忌直接拿大型预训练模型(如ResNet50)来用。你的核心工作之一是模型轻量化。
- 直接使用轻量级网络:MobileNet系列、ShuffleNet系列、EfficientNet-Lite、GhostNet等都是为移动和嵌入式设备设计的优秀基准网络。
- 模型剪枝与量化:这是必做步骤。剪枝(Pruning)去掉网络中不重要的连接或通道,量化(Quantization)将模型权重和激活从FP32转换为INT8甚至更低精度,能大幅减少模型体积和提升推理速度,且精度损失通常可控(1-3%以内)。PyTorch和TensorFlow都提供了相应的工具(如PyTorch的Torch.quantization)。
- 知识蒸馏:如果有条件,可以让一个大的“教师网络”指导一个小的“学生网络”学习,让小模型获得接近大模型的性能。
开发工具是生产力。Python(PyTorch/TensorFlow)用于模型训练和调试,C++用于嵌入式端高性能推理代码编写。版本管理用Git,协作用GitHub/Gitee。此外,Docker可以帮你固化训练环境,避免“在我机器上好好的”这种问题。
2.3 团队协作与任务拆解
研电赛是团队作战,清晰的职责分工至关重要。一个典型的3人团队可以这样分配:
- 算法岗(1人):负责数据收集/清洗、模型选型、训练、轻量化、精度调优。需要精通Python和深度学习框架。
- 嵌入式软件岗(1人):负责硬件驱动、传感器数据读取、模型在嵌入式端的部署与集成、编写上位机通信协议。需要精通C/C++,熟悉Linux系统和交叉编译。
- 硬件与系统岗(1人):负责硬件平台选型、电路设计(如需自制扩展板)、电源管理、系统联调。需要熟悉电路设计软件(如Altium Designer, KiCad)和硬件调试仪器。
每周至少进行一次同步会议,使用看板(如Trello, 飞书项目)管理任务进度。特别提醒:部署环节一定要尽早启动,不要等算法模型“完全调好”才开始。应该建立一个简单的“Hello World”级模型,先走通从训练到部署的完整Pipeline,这能提前暴露90%的集成环境问题。
3. 核心环节深度实操:从数据到部署
3.1 数据工程:小数据下的生存之道
学生项目最缺的就是高质量、大规模的数据。但这不代表无计可施。
首先,明确你需要什么样的数据。定义清晰的标注规范。比如做缺陷检测,要明确缺陷的类型、标注框的精度要求。这个规范需要算法和硬件同学共同确认,确保标注数据的形式便于后续模型训练和部署(如YOLO格式的txt,或COCO格式的json)。
其次,高效获取数据。
- 爬虫与公开数据集:在Kaggle、天池、Roboflow等网站寻找相关领域的数据集。即使不完全匹配,也可以用于预训练或迁移学习。
- 数据合成与增强:这是解决数据匮乏的利器。使用像
albumentations这样强大的数据增强库,对有限的真实数据进行旋转、裁剪、色彩抖动、添加噪声等,能极大地增加数据多样性。对于某些场景(如工业缺陷),甚至可以用3D渲染(Blender)或游戏引擎(Unity)来合成逼真的训练数据。 - 小样本学习技术:如果你的类别很多,但每类只有几个样本,可以研究Few-Shot Learning方法,如基于度量学习(Metric Learning)或元学习(Meta-Learning)的模型。
数据处理的实战技巧:
- 务必做数据标准化/归一化。将图像像素值从[0, 255]缩放到[0, 1]或[-1, 1],能加速模型收敛。这个操作的参数(均值、标准差)必须在训练和推理时保持一致。
- 划分数据集的学问:按8:1:1或7:2:1划分训练集、验证集和测试集。验证集用于训练过程中监控模型表现和调参,测试集只在最终评估时使用一次,严禁根据测试集结果反复调参,否则会导致模型过拟合测试集,评估结果虚高。
- 做好数据版本管理。使用DVC(Data Version Control)或简单的文件夹命名规则(如
dataset_v1_raw,dataset_v2_augmented)来管理不同版本的数据,确保实验可复现。
3.2 模型训练与优化实战
假设我们选择一个经典的轻量化目标检测模型YOLOv5s(Small版本)作为基线。
环境搭建:强烈建议使用Conda创建独立的Python环境。
conda create -n yolo python=3.8 conda activate yolo pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本选择 pip install ultralytics # 这是YOLOv5/v8的官方库训练脚本示例与关键参数解析:
from ultralytics import YOLO # 加载预训练模型 model = YOLO('yolov5s.pt') # 开始训练 results = model.train( data='your_dataset.yaml', # 数据配置文件,定义了路径、类别数等 epochs=100, # 迭代轮次,小数据集可适当减少 imgsz=640, # 输入图像尺寸,减小尺寸可加快训练和推理,但可能影响小目标检测精度 batch=16, # 批次大小,根据GPU内存调整 device='0', # 使用GPU 0,如果是CPU则写 'cpu' workers=4, # 数据加载线程数 patience=20, # 早停耐心值,如果验证集指标连续20轮不提升则停止训练 optimizer='SGD', # 优化器,SGD通常比Adam泛化性更好 lr0=0.01, # 初始学习率 weight_decay=0.0005, # 权重衰减,防止过拟合 # 以下是数据增强参数 hsv_h=0.015, # 色调增强幅度 hsv_s=0.7, # 饱和度增强幅度 hsv_v=0.4, # 明度增强幅度 flipud=0.5, # 上下翻转概率 fliplr=0.5, # 左右翻转概率 )关键点解析:
patience(早停)非常重要,能防止过拟合,节省时间。imgsz需要权衡。部署到嵌入式端时,输入尺寸越大,计算量呈平方增长。通常需要尝试320、416、640等不同尺寸,在精度和速度间找到平衡点。- 数据增强参数(
hsv_h/s/v,flipud等)是提升模型泛化能力的“免费午餐”,对于小数据集尤其关键。
模型评估与可视化:训练完成后,使用model.val()在测试集上评估,重点关注mAP@0.5(平均精度均值)和mAP@0.5:0.95(更严格的指标)。同时,务必查看混淆矩阵和PR曲线,分析模型在哪些类别上表现不佳,是数据不足还是类别间难以区分。
3.3 模型轻量化与转换:通往硬件的关键一步
训练好的PyTorch模型(.pt)不能直接在嵌入式端运行,必须进行转换和优化。
步骤一:模型导出为ONNX格式。ONNX是一种开放的模型交换格式,是连接训练框架和推理框架的通用桥梁。
from ultralytics import YOLO model = YOLO('runs/train/exp/weights/best.pt') # 加载训练好的最佳模型 success = model.export(format='onnx', imgsz=[640, 640], simplify=True, opset=12)simplify=True会启用ONNX简化器,去除计算图中的冗余算子,对后续转换至关重要。opset指定ONNX算子集版本,需确保目标推理框架支持该版本。
步骤二:模型量化(以PyTorch PTQ为例)。后训练量化(PTQ)是一种简单有效的量化方式。
import torch import torch.quantization # 1. 加载模型并设置为评估模式 model_fp32 = ... # 你的模型 model_fp32.eval() # 2. 准备量化配置 model_fp32.qconfig = torch.quantization.get_default_qconfig('fbgemm') # 针对服务器端,移动端用 'qnnpack' # 3. 插入观察器,准备量化 model_fp32_prepared = torch.quantization.prepare(model_fp32) # 4. 用校准数据(少量无标签数据)运行,收集激活值的统计信息用于确定量化参数 with torch.no_grad(): for data in calibration_dataloader: model_fp32_prepared(data) # 5. 转换为量化模型 model_int8 = torch.quantization.convert(model_fp32_prepared) # 保存量化后的模型 torch.jit.save(torch.jit.script(model_int8), 'quantized_model.pt')量化后,模型大小通常会减小为原来的1/4,推理速度提升2-4倍,但会引入轻微的精度损失(通常<3%)。必须用测试集重新评估量化后模型的精度!
步骤三:转换为目标平台格式。这里以瑞芯微RK3568的RKNN Toolkit为例。
- 在开发机(通常是x86 Ubuntu)上安装RKNN-Toolkit2。
- 编写转换脚本,将ONNX模型转换为
.rknn格式。
from rknn.api import RKNN rknn = RKNN() # 配置模型预处理参数,必须与训练时一致! ret = rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3568') # 加载ONNX模型 ret = rknn.load_onnx(model='best.onnx') # 构建RKNN模型 ret = rknn.build(do_quantization=True, dataset='./dataset.txt') # dataset.txt是用于量化的图片列表 # 导出RKNN模型 ret = rknn.export_rknn('./best.rknn') rknn.release()这个.rknn文件就是最终可以加载到RK3568板卡NPU上运行的模型文件。转换过程可能遇到算子不支持的问题,需要根据错误信息回溯修改模型结构或使用自定义算子插件。
3.4 嵌入式端部署与集成
这是将算法“落地”的最后一步,也是最考验工程能力的一步。
环境搭建:在目标板卡上搭建推理环境。对于RK3568,需要:
- 刷写官方提供的带有NPU驱动和RKNN Runtime的Linux系统镜像。
- 安装必要的库,如OpenCV(用于图像读取和前处理)、RGA(Rockchip Graphics Acceleration,用于图像格式转换和缩放,速度远快于OpenCV)。
编写推理代码(C++示例片段):
#include <rknn_api.h> #include <opencv2/opencv.hpp> int main() { // 1. 初始化RKNN上下文 rknn_context ctx; int ret = rknn_init(&ctx, "best.rknn", 0, 0, nullptr); // 2. 查询模型输入输出信息 rknn_input_output_num io_num; ret = rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num)); // 3. 准备输入数据(关键步骤) cv::Mat img = cv::imread("test.jpg"); cv::Mat resized; cv::resize(img, resized, cv::Size(640, 640)); // 缩放到模型输入尺寸 // 使用RGA进行高效的BGR到RGB, HWC到CHW,归一化等操作(此处简化) // ... 实际项目中强烈建议使用RGA API ... rknn_input inputs[1]; inputs[0].index = 0; inputs[0].type = RKNN_TENSOR_UINT8; // 量化模型一般为UINT8 inputs[0].fmt = RKNN_TENSOR_NHWC; inputs[0].buf = resized.data; // 指向预处理后的数据 inputs[0].size = 640 * 640 * 3; ret = rknn_inputs_set(ctx, 1, inputs); // 4. 运行推理 ret = rknn_run(ctx, nullptr); // 5. 获取输出 rknn_output outputs[io_num.n_output]; memset(outputs, 0, sizeof(outputs)); for (int i = 0; i < io_num.n_output; i++) { outputs[i].want_float = 1; // 输出为浮点数,便于后处理 } ret = rknn_outputs_get(ctx, io_num.n_output, outputs, nullptr); // 6. 后处理:解析输出张量,应用置信度阈值、非极大值抑制(NMS)得到最终框 // ... 后处理代码 ... // 7. 释放资源 rknn_outputs_release(ctx, io_num.n_output, outputs); rknn_destroy(ctx); return 0; }部署阶段的黄金法则:
- 前处理一致性:嵌入式端的数据预处理(缩放、归一化、颜色空间转换)必须与训练时完全一致,差之毫厘,谬以千里。
- 性能 profiling:使用
time命令或嵌入式端的性能分析工具,测量模型推理的耗时,并拆解前处理、推理、后处理各阶段的时间,找到瓶颈。 - 内存管理:嵌入式设备内存有限,注意避免内存泄漏,及时释放不再使用的资源。
4. 系统联调与性能优化实战
4.1 端到端系统集成
当模型能在板子上跑起来后,就要把它集成到完整的作品系统中。这通常是一个多线程/多进程的架构。
典型的数据流架构:
- 采集线程:负责从摄像头(使用V4L2或OpenCV)、传感器(通过I2C/SPI)持续读取数据。
- 预处理线程:将原始数据(如图像)转换为模型需要的输入格式。这里尽量使用硬件加速(如RK3568的RGA)来减轻CPU负担。
- 推理线程:调用RKNN/TensorRT等Runtime API执行模型推理。为了降低延迟,通常采用流水线(Pipeline)方式:当一帧图像在推理时,下一帧已经在进行预处理了。
- 后处理与决策线程:解析模型输出,执行应用逻辑(如判断为缺陷后触发报警,或计算出机器人控制指令)。
- 通信线程:通过UDP/TCP/MQTT等协议,将结果发送给上位机(PC/手机)进行显示或记录。
使用线程池和队列进行高效数据流转:
#include <queue> #include <thread> #include <mutex> #include <condition_variable> template<typename T> class ThreadSafeQueue { // 实现一个简单的线程安全队列,用于线程间传递数据帧 }; int main() { ThreadSafeQueue<cv::Mat> rawFrameQueue, processedFrameQueue, resultQueue; std::thread captureThread(captureFunction, std::ref(rawFrameQueue)); std::thread preprocessThread(preprocessFunction, std::ref(rawFrameQueue), std::ref(processedFrameQueue)); std::thread inferenceThread(inferenceFunction, std::ref(processedFrameQueue), std::ref(resultQueue)); std::thread decisionThread(decisionFunction, std::ref(resultQueue)); // ... 等待线程结束 ... }这种架构能充分利用多核CPU,保证系统的实时性和吞吐量。
4.2 性能瓶颈分析与优化
当系统跑通后,下一步就是让它跑得更快、更稳。
1. 推理延迟优化:
- 模型层面:尝试更小的输入尺寸(如从640降到416)、更轻量的模型架构、更激进的量化(INT8甚至INT4)。
- 框架层面:确保使用了硬件厂商提供的最新驱动和推理库版本。对于RKNN,可以尝试不同的
rknn_build配置,如开启optimization_level优化。 - 代码层面:确保前处理使用了硬件加速(RGA/OpenCL),避免在推理循环中进行动态内存分配。
2. 功耗与散热管理:
- 动态频率调节:许多嵌入式平台(如Jetson)支持DVFS。在负载低时,可以降低CPU/GPU频率以节省功耗。但要注意,频率降低会增加推理延迟。
- 温度监控:编写守护进程监控芯片温度。如果温度超过阈值(如85°C),可以主动降低频率或暂停部分任务,防止过热重启。这在封闭的作品外壳内是常见问题!
- 外设管理:不使用的传感器、摄像头、通信模块要及时关闭电源或进入休眠模式。
3. 稳定性保障:
- 看门狗(Watchdog):启用硬件看门狗或实现软件看门狗。当主程序因未知原因卡死时,看门狗会强制重启系统。这对于需要长时间稳定运行的演示至关重要。
- 异常处理与日志:所有关键函数调用都要有健壮的异常处理。将系统状态、错误信息实时写入日志文件(如
/var/log/your_project.log),方便现场调试。 - 压力测试:在最终演示前,让系统连续运行24-48小时,模拟比赛现场长时间工作的场景,观察内存是否缓慢增长(内存泄漏),CPU温度是否稳定。
5. 备赛全流程避坑指南与心得
5.1 常见技术问题速查与解决
以下是我和身边同学在备赛中反复遇到的“坑”,附上排查思路:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 模型在PC上精度高,上板后结果混乱或全零。 | 1.前/后处理不一致(最常见)。 2. 量化误差过大。 3. 模型转换时输入/输出节点名或尺寸不匹配。 | 1.逐字节比对:在PC和板子上,对同一张图片,打印出输入给模型前的第一个像素块数据(如前10x10个像素的RGB值),必须完全一致。 2.关闭量化测试:先在板子上用FP16或FP32模型运行,如果正常,则是量化问题。尝试用更多样化的校准数据集重新量化。 3. 使用Netron可视化ONNX和RKNN模型,确认输入输出名称和维度。 |
| 推理速度远低于预期。 | 1. 未使用NPU/GPU加速,跑在CPU上。 2. 前处理(如resize)是CPU瓶颈。 3. 内存带宽瓶颈(频繁的数据拷贝)。 | 1. 使用htop或nvtop查看推理时NPU/GPU是否被调用,使用率如何。2. 用时间戳分别测量前处理、推理、后处理的耗时。 3. 使用零拷贝或硬件加速的前处理(如RGA, V4L2直接输出RGB数据)。 |
| 系统运行一段时间后卡死或重启。 | 1.内存泄漏。 2. 散热不良导致过热保护。 3. 多线程同步问题(死锁)。 | 1. 使用valgrind或mtrace工具检查内存泄漏。2. 监控 /sys/class/thermal/thermal_zone*/temp文件查看温度。3. 检查线程锁的使用,确保所有异常分支都能正确释放锁。 |
| 摄像头采集卡顿、丢帧。 | 1. 采集分辨率/帧率过高,USB带宽或CPU处理不过来。 2. 缓冲区设置不当。 3. 采集线程被高优先级任务阻塞。 | 1. 降低采集分辨率或帧率,或使用MJPEG格式代替YUV。 2. 增加V4L2驱动缓冲区数量。 3. 调整线程优先级,或使用专用的视频采集框架(如GStreamer)。 |
5.2 非技术性备赛要点
1. 文档与代码管理:
- 技术报告/论文:尽早开始撰写,不要堆到最后。报告应突出问题背景、你的创新解决方案(系统框图、算法框图)、详实的实验数据(对比表格、曲线图)、完整的测试结果。图表要专业清晰。
- 代码仓库:使用Git进行版本管理,
README.md要写清楚环境依赖、编译步骤、运行方式。这不仅是好习惯,在评审时也能体现你们的工程素养。 - 演示材料:PPT要精炼,逻辑为“痛点 -> 解决方案 -> 效果展示”。准备一个一分钟视频,精彩展示作品功能,这在初赛网评时极其重要。
2. 现场演示准备:
- 冗余设计:准备两套完全相同的硬件,一套演示,一套备用。所有线缆、电源适配器都带双份。
- 稳定供电:使用可靠的开关电源,避免使用容易接触不良的USB供电。如果作品移动,考虑使用充电宝+升压模块。
- 快速恢复方案:在SD卡或eMMC上制作好全盘镜像。一旦系统崩溃,几分钟就能恢复。准备一个写有“一键演示”脚本的U盘,插入后自动启动所有程序。
- 应对提问:团队每个成员都要吃透自己负责的部分,并能讲清楚整体架构。提前准备一些可能被问到的技术问题,比如“为什么选这个模型而不是另一个?”“你的创新点具体体现在系统设计的哪一步?”
3. 时间管理:研电赛周期长,容易前期松懈后期熬夜。建议制定严格的里程碑计划:
- 第1-2月:确定选题、完成技术调研、搭建基础开发环境、跑通第一个端到端Demo。
- 第3-4月:算法迭代优化、嵌入式端部署、完成核心功能。
- 第5月:系统集成与联调、性能优化、稳定性测试。
- 第6月:撰写技术报告、制作演示材料、准备现场答辩预演。
回过头看,参加研电赛最大的收获不是那个奖状,而是逼着自己完成了一个从算法理论到硬件实物的完整闭环。这个过程里,你会被迫去学习硬件知识、调试底层驱动、优化系统性能,这些能力在纯粹的算法研究或软件开发中很难获得。最深的体会是,“鲁棒性”和“可演示性”往往比单纯的算法精度更重要。评审专家可能只有几分钟看你的演示,一个稳定、流畅、反应迅速的展示,比一个精度高但时不时卡顿的作品,印象分要高得多。所以,在最后一个月,请把至少一半的精力放在打磨系统的稳定性和演示脚本的可靠性上。最后,保持沟通,队友间多互相测试,多向指导老师汇报进展,好的作品是迭代出来的,也是“磨”出来的。祝各位在研电赛中都能做出让自己满意的作品。