news 2026/9/4 11:10:52

YOLOv5课堂违纪检测系统:课程设计级完整落地实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5课堂违纪检测系统:课程设计级完整落地实践

简介:本资源是一套面向计算机视觉初学者与教育信息化开发者的课堂行为分析实战项目,聚焦学生睡觉、玩手机等典型违纪行为的实时检测需求,提供从数据准备、模型训练到系统部署的完整技术闭环。压缩包共220个文件,含103个Python脚本(涵盖数据加载、训练逻辑、推理接口与可视化模块)、79个YOLOv5配置文件(.yaml)用于模型结构与超参定制、11个Markdown文档说明设计思路与使用指南,以及Dockerfile系列(含CPU/ARM64双架构)支持跨平台部署,整体仅1.19MB,轻量易上手。已有1937人学习下载,资源结构清晰,包含CITATION规范引用、setup工程配置及多环境构建脚本,可直接复现论文级检测流程,特别适合课程设计、毕业设计或AI教育应用原型开发。

1. 这不是个“交作业式”课程设计,而是一套可落地的课堂行为监测闭环

YOLOv5学生课堂违纪检测系统——光看标题,很多人第一反应是“又一个课程设计模板”,但实际拆开来看,它远不止于应付答辩。我带过三届计算机视觉方向的毕业设计,也帮学院评审过上百份课程设计报告,真正能跑通、能部署、能看清真实课堂场景里“低头玩手机”“交头接耳”“站立走动”这三类高频违纪行为的,不到15%。问题不在于模型本身,而在于整个技术链路被严重低估:从数据采集的真实光照变化、课桌遮挡带来的小目标漏检、多尺度人体姿态导致的bbox漂移,到最终部署时GPU显存不足、Docker镜像体积爆炸、推理延迟卡顿——这些都不是论文里一句“实验效果良好”能掩盖的。

核心关键词yolov5课程设计完整代码数据Dockerfile,每一个都指向一个实操断点。比如“完整代码”常被误解为“能运行就行”,但真实项目里,它必须包含训练日志自动归档、验证集mAP曲线可视化、推理结果视频叠加逻辑、误检样本人工复核接口;再比如“Dockerfile”,绝不是简单COPY requirements.txt就完事——你要考虑OpenCV与PyTorch CUDA版本的ABI兼容性、torchvision编译时对libpng/libjpeg的静态链接控制、甚至Ubuntu基础镜像中systemd服务缺失导致的后台进程管理失效。这套系统真正的价值,是把课堂这个非结构化场景,用工程化手段压缩进可复现、可审计、可迭代的交付包里。适合两类人:一是大三/大四学生做课程设计或毕设起步,需要避开90%的坑直接上手;二是中学信息老师想在本校部署轻量级监控辅助教学管理,不需要懂算法,但必须能改配置、换摄像头、查日志。下面所有内容,全部基于我去年在某市重点中学试点部署的真实记录展开,连训练服务器的型号(RTX 3090×2)、教室摄像头参数(海康威视DS-2CD3T47G2-LUSU,2560×1440@30fps,FOV 85°)、甚至学生穿深蓝色校服导致的低对比度问题解决方案,都会一一道来。

2. 系统整体设计:为什么放弃YOLOv8/v10,死磕YOLOv5的工程确定性

2.1 技术选型背后的硬约束:课程设计不是科研竞赛

很多同学看到YOLOv8发布后性能提升12%,立刻想换模型。但课程设计的核心约束从来不是SOTA指标,而是交付确定性环境可控性。我们做过对比测试:同一组标注数据(含1200张课堂实拍图),在相同硬件(RTX 3060 12GB)上:

模型版本训练耗时(小时)推理FPS(640×640)Docker镜像大小部署失败率(新手)
YOLOv5s3.242.12.1GB8%
YOLOv8n4.738.63.4GB31%
YOLOv10n5.935.24.8GB67%

关键差异在依赖链长度:YOLOv5官方仓库仅依赖PyTorch+OpenCV+Numpy,而YOLOv8引入了ultralytics自研的hub模块、autobatch机制、以及对TensorRT的深度耦合,导致Docker构建时极易因pip源不稳定或CUDA驱动版本错配而中断。更致命的是,YOLOv5的train.py逻辑极其线性——读数据→预处理→前向→loss计算→反向→保存权重,调试时加一行print就能定位到具体batch出错;YOLOv8的trainer封装了太多抽象层,新手遇到“CUDA out of memory”时,根本分不清是anchor匹配问题还是loss函数梯度爆炸。

提示:课程设计评分标准里,“系统稳定性”权重通常占30%,比“mAP提升”高两倍。YOLOv5的.cfg文件结构清晰([net]、[convolutional]、[yolo]三段式),修改anchor尺寸只需改几行数字;YOLOv8的yaml配置里混着model、data、train三个维度参数,改错一个缩进就报错。

2.2 数据策略:拒绝“网上下载+简单裁剪”的虚假数据集

热搜词里反复出现“数据”,但90%的课程设计用的数据集存在致命缺陷:

  • 合成数据泛滥:用Unity生成的虚拟教室场景,光照均匀、人物姿态僵硬、无真实课桌遮挡,模型在真实教室里召回率<40%;
  • 标注质量粗糙:BBox框不贴合人体(尤其低头时颈部被课桌截断)、多人重叠时只标一个框、忽略“举手回答问题”与“玩手机”的动作区分;
  • 场景覆盖缺失:没有早晚自习(灯光昏暗)、没有投影仪强光直射镜头、没有窗帘半开造成的明暗交界线。

我们采用三级数据构建法

  1. 基础层:公开数据集Aeroscapes(含1000+张教室场景图)提供背景多样性;
  2. 增强层:用LabelImg在真实课堂录像帧中手动标注2000张,重点覆盖“侧身转头”“双臂交叉”“手持手机”等细粒度动作;
  3. 对抗层:对20%图像添加Mosaic增强(模拟多视角拼接)、HSV色域扰动(应对不同教室灯光色温)、以及动态模糊(模拟学生快速转头)。

特别说明:数据增强不是越多越好。实测发现,当Mosaic比例超过0.5时,模型对单人检测的precision反而下降11%,因为课桌边缘在拼接后产生伪影。最终采用0.3比例+随机裁剪组合,平衡泛化性与精度。

2.3 部署架构:Docker不是炫技,而是解决“在我电脑能跑,在你电脑崩了”的终极方案

Dockerfile被列为热搜词,恰恰说明这是课程设计最痛的点。传统做法是让同学在本地装CUDA、cuDNN、PyTorch,结果80%的人卡在“nvcc version与torch版本不匹配”。我们的Dockerfile设计原则是:最小可行镜像 + 最大兼容性

关键设计点:

  • 基础镜像选用nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04,而非最新版。因为CUDA 11.3.1是PyTorch 1.10.2(YOLOv5官方推荐版本)的黄金搭档,避免版本冲突;
  • OpenCV通过conda安装而非pip,解决Ubuntu20.04自带libglib版本过低导致的cv2.VideoCapture崩溃问题;
  • 删除所有调试工具(vim、nano、curl),镜像体积从4.2GB压至2.1GB,确保校园网环境下10分钟内拉取完成;
  • ENTRYPOINT封装成python detect.py --source /data/input.mp4 --weights /app/weights/best.pt --save-txt,用户只需挂载输入视频和权重文件,无需理解命令行参数。

注意:Docker run时必须加--gpus all且指定--shm-size=2g,否则多线程数据加载会因共享内存不足而卡死。这个细节在绝大多数课程设计文档里被忽略,但实际部署时90%的“黑屏无输出”问题都源于此。

3. 核心细节解析:从数据标注到模型微调的12个实操要点

3.1 数据标注:LabelImg不是万能的,必须定制化改造

LabelImg默认快捷键对课堂场景极不友好:

  • Ctrl+R旋转图片?教室监控是固定角度,旋转毫无意义;
  • W键画矩形?学生低头时BBox需从下巴开始框,而非头顶。

我们修改了labelImg源码(libs/pascal_voc_io.py),新增两个功能:

  1. 智能锚点吸附:当鼠标靠近课桌边缘(灰度值<30的连续像素带)时,自动将BBox下边界吸附至桌面高度线,解决“坐姿检测框偏高”问题;
  2. 动作标签快捷键F1=玩手机(框住手部+手机屏幕区域)、F2=交头接耳(框住两人头部+中间连线)、F3=站立走动(框住全身+地面接触点)。

标注规范强制要求:

  • 玩手机必须同时框出手部和手机屏幕(哪怕屏幕反光),仅框手部会被判定为“拿笔写字”;
  • 交头接耳的BBox需覆盖两人头部中心点连线,宽度≥两人头宽之和的1.2倍;
  • 站立走动必须包含脚部与地面接触区域,避免将“起立回答问题”误判为违纪。

3.2 数据集划分:别再用random_split!按教室ID分层采样

课程设计常见错误:用sklearn的train_test_split随机打乱数据。但真实场景中,同一间教室的光照、摄像头角度、学生着装高度相似,随机划分会导致验证集全是3号教室数据,而训练集没有该教室样本——模型在3号教室表现完美,在1号教室完全失效。

正确做法:

# 按教室ID分层,确保每间教室的样本在train/val/test中比例一致 from sklearn.model_selection import StratifiedShuffleSplit import pandas as pd # 假设df包含'img_path'和'room_id'列 sss = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42) train_val_idx, test_idx = next(sss.split(df, df['room_id'])) # 再对train_val_idx按room_id分层划分train/val

我们采集了6间教室数据(A-F),最终划分比例:A教室320张→train 224/val 64/test 32;B教室280张→train 196/val 56/test 28……严格保持各教室比例一致。实测mAP在跨教室测试中提升19.3%。

3.3 YOLOv5配置文件修改:超参数不是调参,而是场景适配

YOLOv5的models/yolov5s.yaml需针对性修改:

  • nc: 3→ 改为nc: 4(违纪类别:玩手机、交头接耳、站立走动、正常听课);
  • anchors:原配置针对COCO大目标,课堂小目标需缩小anchor尺寸。计算公式:
    # 统计训练集中所有BBox的宽高比(w/h) # 取聚类中心点作为新anchor python tools/cluster_anchors.py --dataset data/labels/train/ --n 9 --img-size 640
    实测得到新anchor:[[12,15, 21,28, 32,45], [48,62, 67,89, 92,121], [135,168, 182,219, 245,298]],比原anchor小35%;
  • depth_multiplewidth_multiple:课堂场景目标密集,降低网络深度(0.33→0.25)提升小目标检测速度,但需补偿head层通道数(256→320)保特征表达力。

实操心得:修改yaml后务必删除runs/train旧目录,否则resume训练会加载旧配置导致崩溃。这个坑我带的学生踩了17次。

3.4 训练过程监控:别只盯着loss曲线,要看这3个隐藏指标

YOLOv5的results.csv里除了loss、mAP,还有3个关键列常被忽略:

  • box_loss:若持续>0.05,说明BBox回归不准,需检查anchor是否匹配目标尺度;
  • obj_loss:若>0.15,表示前景背景分类困难,大概率是负样本(空教室)过多或正样本标注不精准;
  • cls_loss:若>0.2,说明类别混淆严重,需检查“玩手机”与“正常听课”的标注边界是否模糊。

我们增加了一个实时监控脚本:

# watch_train.sh tail -f runs/train/exp/results.csv | awk -F',' ' BEGIN{OFS=","} {if(NR>1) print $1,$4,$5,$6,$10,$11,$12}' | \ column -t -s',' | \ awk '{printf "\033[2J\033[H"; print; fflush()}'

每秒刷新表格,当obj_loss突增时立即暂停训练,检查当前batch的标注图——80%的标注错误都能在第3个epoch被发现。

3.5 推理优化:640×640不是万能尺寸,要按教室分辨率动态缩放

YOLOv5默认推理尺寸640×640,但教室摄像头分辨率各异:

  • 海康DS-2CD3T47G2-LUSU:2560×1440 → 缩放至1280×720(保持16:9);
  • 华为IPC6125:3840×2160 → 缩放至1920×1080;
  • 手机拍摄临时监控:1920×1080 → 直接使用1080p。

关键技巧:缩放不是简单resize,而是保持长边≤1280px,短边按比例计算,再padding至32倍数。代码实现:

def letterbox(img, new_shape=(1280, 720), color=(114, 114, 114)): # 计算缩放比 r = min(new_shape[0]/img.shape[0], new_shape[1]/img.shape[1]) # 新尺寸 new_unpad = int(round(img.shape[1] * r)), int(round(img.shape[0] * r)) # resize img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR) # padding dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] top, bottom = dh//2, dh - dh//2 left, right = dw//2, dw - dw//2 img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) return img

实测表明,对2560×1440视频,用1280×720推理比640×640的mAP高2.8%,且FPS从42→38(可接受)。

3.6 Dockerfile深度解析:每一行都是血泪教训

FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04 # 安装conda避免pip依赖冲突 RUN apt-get update && apt-get install -y wget bzip2 && \ wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-x86_64.sh && \ bash Miniconda3-py38_23.5.2-0-Linux-x86_64.sh -b -p /opt/conda && \ rm Miniconda3-py38_23.5.2-0-Linux-x86_64.sh ENV PATH="/opt/conda/bin:$PATH" RUN conda init bash && source ~/.bashrc # 创建专用环境,指定Python版本 RUN conda create -n yolov5 python=3.8 && conda activate yolov5 SHELL ["conda", "run", "-n", "yolov5", "/bin/bash", "-c"] # 安装PyTorch(CUDA 11.3专用) RUN pip3 install torch==1.10.2+cu113 torchvision==0.11.3+cu113 -f https://download.pytorch.org/whl/torch_stable.html # 安装OpenCV(conda版解决libglib问题) RUN conda install -c conda-forge opencv=4.5.5 # 复制代码并安装依赖 COPY requirements.txt . RUN pip install -r requirements.txt # 复制模型权重和配置 COPY models/ ./models/ COPY data/ ./data/ COPY weights/ ./weights/ # 设置工作目录 WORKDIR /app # 暴露端口(供Web UI使用) EXPOSE 5000 # 启动脚本 COPY start.sh /app/start.sh RUN chmod +x /app/start.sh ENTRYPOINT ["/app/start.sh"]

关键细节说明:

  • conda install opencv=4.5.5而非pip install opencv-python,解决Ubuntu20.04下cv2.VideoCapture无法打开RTSP流的问题;
  • torch==1.10.2+cu113必须带+cu113后缀,否则conda会安装CPU版;
  • start.sh封装了环境激活和启动逻辑,避免用户手动执行conda activate
  • EXPOSE 5000为后续集成Flask Web UI预留,即使本次不用也保留接口。

4. 实操全流程:从零开始部署,含完整命令与避坑清单

4.1 环境准备:三台机器的差异化配置

机器类型用途关键配置特殊要求
训练机模型训练RTX 3090×2, 64GB RAM, Ubuntu 20.04必须禁用NVIDIA驱动的Persistence Mode(sudo nvidia-smi -i 0 -dm 0),否则多卡训练时显存占用异常
测试机本地验证GTX 1660, 16GB RAM, Windows 10需安装WSL2 Ubuntu 20.04,直接Windows运行YOLOv5会因OpenCV DLL冲突崩溃
部署机教室终端Jetson Xavier NX, 8GB RAM, Ubuntu 18.04必须刷入JetPack 4.6(CUDA 10.2),YOLOv5需降级至v6.1版本适配

注意:Jetson部署时,models/export.py导出ONNX需加--include onnx --opset 11,否则TensorRT转换失败。这个参数在YOLOv5 v7.0后被移除,必须回退到v6.1。

4.2 数据准备:2000张图的标准化处理流程

  1. 原始视频采集

    • 使用教室现有监控摄像头,录制早自习(6:30-7:30)、上午第三节课(10:00-10:45)、下午自习(15:00-16:00)各30分钟;
    • 每5秒抽一帧,共3600帧,剔除黑屏、剧烈抖动、全空教室帧,剩余2150帧。
  2. 标注与清洗

    • 用定制LabelImg标注,每人每天标注200张,3人协作7天完成;
    • 清洗规则:BBox面积<500像素(小目标)且置信度<0.3的样本,人工复核后删除;
    • 生成YOLO格式标签:class_id center_x center_y width height(归一化到0~1)。
  3. 目录结构固化

data/ ├── images/ │ ├── train/ # 1400张 │ ├── val/ # 400张 │ └── test/ # 350张 ├── labels/ │ ├── train/ # 对应标签 │ ├── val/ │ └── test/ └── dataset.yaml # 定义路径和类别

dataset.yaml内容:

train: ../images/train val: ../images/val test: ../images/test nc: 4 names: ['normal', 'phone', 'talk', 'stand']

4.3 模型训练:完整命令与参数解释

# 进入YOLOv5根目录 cd yolov5 # 启动训练(关键参数说明) python train.py \ --img 1280 \ # 输入尺寸,按教室分辨率动态设置 --batch 16 \ # 根据GPU显存调整:RTX3090用16,GTX1660用4 --epochs 100 \ # 课程设计足够,更多epoch易过拟合 --data data/dataset.yaml \ # 数据集配置 --cfg models/yolov5s.yaml \ # 修改后的配置文件 --weights '' \ # 从头训练,不加载预训练权重(避免类别数不匹配) --name exp_classroom \ # 实验名称,自动创建runs/train/exp_classroom --cache \ # 将图像缓存到RAM加速训练(需64GB内存) --workers 8 \ # 数据加载线程数,设为CPU核心数 --exist-ok # 若exp_classroom已存在,不报错覆盖

参数避坑指南

  • --cache:开启后首次训练慢(需缓存),但后续epoch快3倍。若内存<48GB,改用--cache disk
  • --workers 8:在WSL2中需设为--workers 0,否则多进程报错;
  • --exist-ok:课程设计常需反复调试,避免每次新建exp目录导致路径混乱。

4.4 Docker镜像构建与部署:一行命令搞定

# 构建镜像(在yolov5根目录执行) docker build -t classroom-yolov5:v1.0 . # 运行容器(挂载数据和权重) docker run -it --gpus all \ --shm-size=2g \ -v $(pwd)/data:/app/data \ -v $(pwd)/weights:/app/weights \ -v $(pwd)/output:/app/output \ -p 5000:5000 \ classroom-yolov5:v1.0 \ python detect.py \ --source data/images/test/ \ --weights weights/best.pt \ --conf 0.4 \ --iou 0.5 \ --save-txt \ --save-conf

关键参数解释

  • --conf 0.4:置信度阈值,课堂场景误检多,0.4比默认0.25更合理;
  • --iou 0.5:NMS阈值,防止同一人被框多次;
  • --save-conf:保存置信度,用于后期分析误检原因;
  • -v $(pwd)/output:/app/output:将检测结果映射到宿主机,方便查看。

4.5 结果分析:不只是看mAP,更要读懂误检日志

检测完成后,output/labels/下生成txt文件,每行格式:class_id center_x center_y width height confidence。我们编写分析脚本:

# analyze_results.py import pandas as pd import numpy as np # 读取所有txt文件 all_dets = [] for txt in Path('output/labels').glob('*.txt'): if txt.stat().st_size == 0: continue df = pd.read_csv(txt, sep=' ', header=None, names=['cls','cx','cy','w','h','conf']) df['img'] = txt.stem all_dets.append(df) dets = pd.concat(all_dets) # 统计各类别置信度分布 print(dets.groupby('cls')['conf'].describe()) # 输出示例: # cls count mean std ... 75% max # 0 120 0.821 0.123 ... 0.89 0.98 # normal # 1 45 0.612 0.215 ... 0.72 0.93 # phone # 2 28 0.587 0.241 ... 0.68 0.91 # talk # 3 12 0.492 0.187 ... 0.57 0.85 # stand # 发现问题:stand类别平均置信度仅0.49,需检查标注质量

实操发现:stand类别置信度偏低,人工抽查发现30%的“站立”标注实际是“起立回答问题”。于是我们增加一条业务规则:

  • 若检测到stand且其BBox中心点y坐标<图像高度的0.3(即站在讲台附近),则标记为teacher_activity,不计入违纪统计。
    这条规则写入detect.py后处理逻辑,无需重新训练。

5. 常见问题与排查技巧实录:23个真实故障的速查表

故障现象根本原因排查步骤解决方案出现场景
训练loss不下降,始终>5.0anchor尺寸与目标不匹配1. 运行tools/analyze_labels.py查看BBox尺寸分布
2. 对比models/yolov5s.yaml中anchors
cluster_anchors.py重新聚类,替换yaml中anchors所有自定义数据集
Docker容器启动后立即退出ENTRYPOINT脚本权限不足或路径错误1.docker run -it classroom-yolov5:v1.0 /bin/bash进入容器
2.ls -l /app/start.sh检查权限
chmod +x start.sh并确认Dockerfile中COPY路径正确初学者构建镜像后
detect.py报错"cv2.VideoCapture failed"OpenCV未链接正确视频后端1.docker run -it classroom-yolov5:v1.0 python -c "import cv2; print(cv2.getBuildInformation())"
2. 查找Video I/O: YES (FFMPEG: YES)
在Dockerfile中conda install -c conda-forge opencv=4.5.5替代pip安装WSL2或Jetson部署
推理结果全是空列表权重文件路径错误或类别数不匹配1.ls -l weights/best.pt确认文件存在
2.python models/common.py -h检查模型类别数
确认dataset.yamlnc: 4models/yolov5s.yaml一致模型迁移时
GPU显存占用100%但FPS=0共享内存不足1.nvidia-smi查看显存占用
2.df -h /dev/shm查看共享内存
docker run --shm-size=2g启动容器多线程数据加载时
检测框严重偏移(如框到课桌腿)图像预处理时padding方式错误1. 在detect.pyletterbox函数后加cv2.imwrite('debug.jpg', img)
2. 查看debug.jpg是否变形
改用cv2.copyMakeBorder替代np.pad,保持长宽比高分辨率教室视频
mAP在val集很高,test集暴跌数据集划分未按教室ID分层1.ls data/images/test/ | head -10查看文件名
2. 统计教室ID分布
StratifiedShuffleSplit按room_id分层划分跨教室测试时
玩手机检测漏检率高手机屏幕反光导致颜色特征丢失1. 用cv2.cvtColor转HSV空间
2. 统计正常手部与手机屏幕的HSV范围
在数据增强中加入CLAHE(限制对比度自适应直方图均衡)阳光直射教室
交头接耳误检为正常听课两人距离过近导致BBox合并1. 查看误检样本的label txt文件
2. 统计BBox宽度占比
在NMS前增加distance_filter:若两BBox中心距<0.3*图像宽,则拆分为两个框密集座位教室
Jetson Xavier NX推理卡顿TensorRT引擎未生成或版本不匹配1.trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt
2. 查看trtexec版本是否匹配JetPack
torch2trt转换,指定fp16_mode=True边缘设备部署

独家避坑技巧

  • 训练中断恢复:若训练因断电中断,不要删runs/train/exp_classroom,直接加--resume runs/train/exp_classroom/weights/last.pt继续;
  • 权重文件瘦身best.pt含optimizer状态(占50MB),部署时用python models/export.py --weights best.pt --include torchscript导出精简版;
  • 教室光线自适应:在detect.py开头加cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)),应对早晚自习光线变化;
  • 误检人工复核:在output/下生成review.html,用iframe嵌入原始图+检测图+置信度滑块,老师拖动滑块筛选低置信度样本复核。

最后分享一个小技巧:课程设计答辩时,别只放mAP数字。我让学生做了个对比视频——左边原始监控画面,右边叠加检测框+实时违纪计数,当画面中学生突然抬头看手机,框立刻变红并计数+1。评委老师当场说:“这个看得懂,比10页公式管用。” 技术的价值不在多先进,而在多真实地解决问题。这套系统跑在真实教室里,每天生成的《课堂专注度日报》被年级组长打印出来贴在办公室墙上,这才是课程设计该有的样子。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 11:10:49

彻底搞懂MicroPython的流设备与块设备:从串口到Flash

1. 从一段串口代码聊起&#xff1a;为什么总有人说“设备分两种” 先看两段MicroPython代码&#xff0c;你可能都写过。第一段是往串口发数据&#xff1a; from machine import UART uart UART(1, baudrate115200, tx17, rx16) uart.write(bhello world\n)第二段是往Flash里…

作者头像 李华
网站建设 2026/9/4 11:08:56

FANUC控制柜LCD升级实战:A61L-0001-0095更换避坑指南

做工业机器人维修这些年&#xff0c;我经手的FANUC控制柜少说也有几十台。要说哪个备件最容易出问题&#xff0c;A61L-0001-0095这款LCD显示单元绝对排得上号。很多老款R-30iA、R-30iB控制柜上用的都是这块屏&#xff0c;开机黑屏、显示发暗、满屏竖线&#xff0c;问题五花八门…

作者头像 李华
网站建设 2026/9/4 11:08:16

智慧场馆解决方案小程序系统:从架构设计到落地实践

智慧场馆解决方案小程序系统&#xff1a;从架构设计到落地实践 一、系统架构与技术选型 智慧场馆解决方案小程序系统在架构上普遍采用“用户端小程序 管理后台 后端服务”的三端分离模式。参考同类系统的成熟做法&#xff0c;建议技术栈如下&#xff1a; 用户端&#xff1a;U…

作者头像 李华
网站建设 2026/9/4 11:08:09

人工智能常用工具学习(三)

第 3 章 主流 AI 工具分类全景 摘要&#xff1a;本章帮你建立对 AI 工具的全景认知。先按能力形态&#xff08;文本 / 图像 / 视频 / 语音 / 编程 / 数据分析等十大类&#xff09;和应用场景&#xff08;创作 / 办公 / 学习 / 开发 / 营销 / 企业 / 服务 / 自动化八大类&#x…

作者头像 李华