新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于深度学习的新冠肺炎检测系统:五模型对比与Flask部署实践

发布时间:2026/9/28 13:52:17来源:尧图网络
基于深度学习的新冠肺炎检测系统:五模型对比与Flask部署实践
简介这套基于深度学习的肺炎检测系统源自北京印刷学院人工智能大赛深度学习组作品面向深度学习入门者、医学影像分析开发者及学科竞赛团队。系统以图像分类为核心任务提供从数据预处理、模型训练到界面演示的完整链路可帮助理解卷积神经网络在真实医疗场景中的落地方式。资源共72个文件压缩包仅2.16MB包含17个Python脚本、36张样张图片、2个HTML页面及模型权重等文件。脚本覆盖CNN、VGG16、VGG19、InceptionNetV3、ResNet等多种主流网络结构每个模型均配有独立训练脚本便于横向对比配套Flask应用能快速启动本地Web界面上传图片即可查看检测结果。目前已有139人学习该资源。对参赛者而言这是一套可直接复用的项目范本对自学者而言可借助源码与界面进一步拓展数据增强、模型调优等实验节省从零搭建的时间。1. 基于深度学习的新冠肺炎检测系统课程设计级完整工程五种网络加可视化页面一步到位提起基于深度学习的新冠肺炎检测系统很多人第一反应是数据集多大、模型多先进但真正打算在课程设计或比赛里复现的人更关心另一个问题——压缩包下载下来能不能马上跑通。这个来自北京印刷学院人工智能大赛深度学习组的作品给我最大的感受不是单个模型有多强而是训练端到推理端被完整接起来了五个模型各自的训练脚本、一个能跑的 Flask 检测页面、一套清晰的目录结构。对于想把深度学习图像分类做成可演示项目的学生来说它比零散的算法片段值钱得多。下面我从文件结构、数据处理、训练到 Web 部署逐步拆给你看。2. 压缩包里的文件各自在干什么从模型定义到训练入口再到页面渲染很多下载完压缩包的人第一件事是双击 README.md这没错但 README 往往只写了“怎么跑”不会写“为什么要这么组织”。我先把整个工程的链路讲透。2.1 五个模型文件并存不是冗余而是方便做对照实验model/目录下放着 CNN.py、VGG16.py、VGG19.py、InceptionNetV3.py 四个网络定义文件而 ResNet 的训练入口ResNet_Train.py直接放在根目录这说明作者把五种主流 CNN 结构都做了一份。为什么一个比赛作品要塞五种网络常见做法是先用小模型把整条链路跑通再换大模型提精度。网络入口脚本特点运算压力自定义 CNNCNN_train.py结构最简单适合先验证数据和流程低CPU 也能跑VGG16VGG16_train.py经典结构预训练权重好找中等VGG19VGG19_train.py比 VGG16 更深特征更强偏高InceptionNetV3InceptionNetV3_train.py多尺度卷积加上辅助输出收敛更稳中等ResNetResNet_Train.py残差连接深度网络首选偏高我的习惯是先用自定义 CNN 跑通一遍完整流程再切 VGG16、ResNet 拿对比结果。比赛答辩时导师问“你为什么选这个网络”有五种模型的对比结果比空口说“ResNet 效果好”有说服力得多。2.2 训练脚本是入口模型文件才是真正干活的人model/里定义的是网络结构真正调用它的是根目录下的*_train.py系列脚本。这种拆分在 PyTorch 项目里是标准做法模型定义、训练逻辑、推理逻辑分文件管理换网络时只需要改训练脚本里一两行引用不用动整个文件。logs/目录保存训练过程中的日志和模型权重runs/目录则是 TensorBoard 这类工具生成的运行记录。拿到工程后我一般先看logs/下有没有现成跑出来的权重文件如果有可以跳过训练直接体验推理页面这也是这个压缩包“能马上跑”的关键。2.3 app.py 加上 templates 和 static构成一条完整的可视化推理链路app.py是 Flask 入口配合templates/index.html、templates/index_1.html两个页面模板static/uploads/存用户上传的图片。这就是一个完整的推理 Web 应用浏览器上传肺 CT 图后端加载训练好的模型判断类别并返回置信度。这里需要特别注意templates下有两个 HTML 文件这一点。常见做法是 index.html 是正式页面index_1.html 是调试备用页。如果你启动 app.py 后发现页面样式不对多半是模板引用了另一个 HTML 的变量名打开两个文件对比一下就知道差异。2.4pycache这类目录不用管但 README 一定要从头读压缩包里出现__pycache__说明作者在打包前实际运行过项目里边的.pyc文件可以直接忽略。uploads如果带了测试图片会是很好的推理验证素材。 README 建议从头读完它一般会写清需要用哪个 Python 版本、PyTorch 版本、装了哪些依赖这是最容易被新手跳过却最值钱的信息。3. 数据准备让 PyTorch 的 ImageFolder 直接读你的肺 CT 图这个工程里没有单独写dataset.py说明训练部分大概率用的是torchvision.datasets.ImageFolder。它的规则很简单按文件夹名分类train/正常/xxx.jpg里的图片全算正常类。把原始数据整理成这个结构是最关键的一步我单独写了一个整理脚本。3.1 用脚本把散装图片归类成 ImageFolder 目录结构import os import shutil import random # 你的原始数据目录比如直接堆放了一堆 CT 图片 src_dir raw_ct_images # 整理后的数据集根目录 dst_dir dataset_ct categories {normal: 0, covid: 1, pneumonia: 2} random.seed(42) # 先建目录骨架ImageFolder 按文件夹名生成类别标签 for split_name in [train, val]: for cls_name in categories: os.makedirs( os.path.join(dst_dir, split_name, cls_name), exist_okTrue ) # 假设文件名是以类别名开头的比如 normal_001.jpg for fname in os.listdir(src_dir): if not fname.lower().endswith((.jpg, .jpeg, .png)): continue matched_class None for cls_name in categories: if fname.startswith(cls_name): matched_class cls_name break if matched_class is None: print(f跳过未匹配文件: {fname}) continue # 按 8:2 划分训练集和验证集注意这里的随机种子要固定 split_name train if random.random() 0.8 else val src_path os.path.join(src_dir, fname) dst_path os.path.join(dst_dir, split_name, matched_class, fname) shutil.copy(src_path, dst_path) print(数据整理完成生成目录结构如下) for split_name in [train, val]: for cls_name in categories: count len(os.listdir(os.path.join(dst_dir, split_name, cls_name))) print(f{split_name}/{cls_name}: {count} 张)这段脚本的核心逻辑很简单按文件名前缀匹配类别文件名固定随机种子后按比例复制到训练集和验证集目录。random.seed(42)的目的是保证每次运行划分结果一致不会因重启脚本导致训练集和验证集数据重叠或缺失。如果你的文件名不是这种带前缀的命名方式把matched_class匹配逻辑改成从一个 CSV 映射表读取即可。这一步有几个容易翻车的地方我后面在避坑章节会细讲这里先说最关键的目录名一定不要用中文PyTorch 的 ImageFolder 对中文路径兼容性不好开发者电脑上没事换台电脑跑就可能报编码错误。3.2 预处理参数尺寸、归一化、数据增强怎么设拿到数据后预处理标准是直接影响模型能不能收敛的关键。肺 CT 图像和自然图像有明显区别我一般会在transform里做如下配置from torchvision import transforms transform_train transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomRotation(degrees15), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ]) transform_val transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ])训练集和验证集的预处理必须分开。训练集加了随机翻转、随机旋转和颜色扰动增强模型泛化能力验证集只做缩放和归一化保证评估结果稳定。Resize((224, 224))是兼容 VGG 系列的标准输入尺寸如果切到 InceptionNetV3它的原始设计是 299×299需要确认工程里的预处理到底用的多少否则模型会报维度不匹配或者效果骤降。归一化用的 mean 和 std 是 ImageNet 预训练权重对应的统计量迁移学习场景下用这套参数最省事。如果你的模型是从零开始训练的换成mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]也完全可以效果差距一般在可接受范围。不知道用哪套时先看项目 README 里训练脚本的写的是什么以工程里的为准。3.3 类别不平衡是医学影像分类的第一道坎医学影像数据几乎天然不平衡正常样本多病变样本少新冠这类阳性样本更少。如果直接拿原始分布训练模型会学到“全部预测为多数类”的偷懒策略准确率看着很高但实际毫无用处。常见做法是给损失函数加类别权重。用 PyTorch 做很简单import torch # 先统计每个类别的样本数比如上面脚本打印的 train 目录统计结果 sample_counts torch.tensor([1500, 300, 400], dtypetorch.float) # 权重 总样本数 / (类别数 * 该类样本数)少数类自动获得更高权重 class_weights sample_counts.sum() / (len(sample_counts) * sample_counts) criterion torch.nn.CrossEntropyLoss(weightclass_weights)计算方式并不唯一但思路一致少数类在损失函数里被放大模型不敢无视它们。这条规则在这类项目里适用也适用于其他医学图像分类比赛。4. 训练脚本实操从加载数据集到换模型改学习率每一步怎么调训练脚本是整个工程的核心。这个压缩包里五种网络各自有独立入口我先拆通用的训练主循环再讲换模型时哪些参数必须联动修改。4.1 通用训练框架完整抄下来就能用的一段代码不管哪个*_train.py核心流程都是下图这段逻辑import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision.datasets import ImageFolder from torchvision import transforms # 数据读取train 和 val 目录下的文件夹名即标签 train_set ImageFolder(dataset_ct/train, transformtransform_train) val_set ImageFolder(dataset_ct/val, transformtransform_val) train_loader DataLoader( train_set, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue ) val_loader DataLoader( val_set, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue ) # 换模型时只替换这里的网络类和 num_classes from model.CNN import CNN net CNN(num_classeslen(train_set.classes)) criterion nn.CrossEntropyLoss(weightclass_weights) optimizer torch.optim.Adam(net.parameters(), lr1e-4) for epoch in range(50): net.train() total_loss 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs net(images) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() # 验证集评估必须切 eval 模式否则 BatchNorm 和 Dropout 造成结果不稳定 net.eval() correct 0 total 0 val_loss 0.0 with torch.no_grad(): for images, labels in val_loader: outputs net(images) loss criterion(outputs, labels) val_loss loss.item() _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() acc 100.0 * correct / total print(fEpoch {epoch1}: train_loss{total_loss/len(train_loader):.4f}, fval_loss{val_loss/len(val_loader):.4f}, val_acc{acc:.2f}%) # 简单保存策略每个 epoch 都存一份跑完挑验证集最高的那个 torch.save(net.state_dict(), fcheckpoints/cnn_epoch{epoch1}.pth)这段代码的要点有三个。DataLoader里的num_workers4是用 4 个子进程预读取数据加快训练如果机器内存不够改成 2 或者在 Windows 下改成 0 更稳定。net.train()和net.eval()的切换不能漏漏了会导致验证结果时好时坏。torch.no_grad()告诉 PyTorch 验证阶段不用计算梯度省显存也省时间。num_classes要从train_set.classes的长度读取ImageFolder会自动按字母序把文件夹名映射为 0、1、2 等索引训练时用的标签顺序和推理时必须保持一致否则会出现“训练时正常是 0、推理时正常是 1”的灾难。4.2 切到 VGG16、ResNet 时学习率和优化器要跟着改从自定义 CNN 切到 VGG16 或 ResNet不是换一行 import 那么简单。大模型参数量暴增同样的学习率和 batch size 可能直接导致显存溢出或梯度爆炸。我整理了一套可参考的调整组合网络推荐 batch_size推荐初始学习率注意事项自定义 CNN641e-3小模型可直接用 AdamVGG16321e-4有预训练权重时学习率降到 1e-4 起步VGG19161e-4显存吃紧先减 batchInceptionNetV3161e-4确认输入尺寸是否为 299ResNet161e-4可从冻结前几层开始迁移如果使用 ImageNet 预训练权重做迁移学习常见做法是先把模型除全连接层以外的参数冻结只训练最后一层分类器跑几个 epoch 后再解冻全部参数并且把学习率降到 1e-5 量级。这种做法在医学图像的小数据集上尤其管用因为有限样本不足以重新训练百万级参数。from model.VGG16 import VGG16 net VGG16(num_classes3) # 先冻结所有层 for param in net.parameters(): param.requires_grad False # 只解冻最后一层分类器常见做法是遍历命名参数时跳过 features for name, param in net.named_parameters(): if name.startswith(classifier) or name.startswith(fc): param.requires_grad True optimizer torch.optim.Adam( filter(lambda p: p.requires_grad, net.parameters()), lr1e-4 )这段代码的原理是保留预训练提特征的能力只让分类头适应新类别。训练的时候注意named_parameters的输出层名前缀取决于模型定义文件里的写法VGG 一般是classifierResNet 一般是fc要看一眼model/下对应文件确认。5. Web 推理链路把训练好的模型装进 Flask做个能上传图片的检测页面训练完成只是工程的一半这个压缩包最有竞争力的地方在app.py——它把模型真正变成了“能演示的东西”。比赛答辩时评委能亲手上传一张图看到结果比只看训练曲线有说服力得多。5.1 Flask 应用初始化和模型加载import os import torch from flask import Flask, request, render_template from PIL import Image from torchvision import transforms from model.VGG16 import VGG16 app Flask(__name__) # 上传文件保存目录必须在 static 下才能被浏览器访问 app.config[UPLOAD_FOLDER] static/uploads ALLOWED_EXTENSIONS {png, jpg, jpeg, bmp} # 加载训练好的权重注意 load_state_dict 而不是 load model VGG16(num_classes3) model.load_state_dict( torch.load(checkpoints/vgg16_best.pth, map_locationcpu) ) model.eval() transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ) ])torch.load和load_state_dict是两回事前者读文件后者把读出的权重灌进模型。如果checkpoints/vgg16_best.pth是用torch.save(model.state_dict(), path)保存的就需要先构造模型再调用load_state_dict反过来如果保存的是整个模型加载方式又不一样。这个坑在医学影像相关的权重管理里几乎一定遇到。5.2 预测函数和上传路由图像校验、推理、返回结果def predict_image(img_path): img Image.open(img_path).convert(RGB) img_tensor transform(img).unsqueeze(0) with torch.no_grad(): logits model(img_tensor) probs torch.softmax(logits, dim1) return probs[0].tolist() app.route(/, methods[GET, POST]) def index(): if request.method POST: file request.files.get(file) if file is None or file.filename : return render_template(index.html, error请选择图片) ext file.filename.rsplit(., 1)[-1].lower() if ext not in ALLOWED_EXTENSIONS: return render_template(index.html, error不支持的图片格式) save_path os.path.join( app.config[UPLOAD_FOLDER], file.filename ) file.save(save_path) probs predict_image(save_path) result { class_names: [covid, normal, pneumonia], probabilities: probs, filename: file.filename } return render_template(index.html, resultresult) return render_template(index.html) if __name__ __main__: # debugTrue 只用于本地调试线上或答辩演示务必关掉 app.run(host0.0.0.0, port5000, debugFalse)这段代码有几个值得强调的设计。图片格式白名单必须写在前面避免用户传一个非图片文件进来导致Image.open直接抛异常。.convert(RGB)是为了兼容灰度图或带透明通道的 PNG用 PIL 统一转成三通道。torch.softmax(logits, dim1)把输出转成概率分布三个类的概率加起来等于 1。模板里的class_names顺序必须和训练时的ImageFolder类别顺序一致。因为这个工程用ImageFolder类别索引是按文件夹名排序来的比如covid、normal、pneumonia排出来这个顺序写死在代码里就是隐患如果后来数据目录变了这里要同步改。5.3 模板页面和上传目录的配合templates/index.html负责渲染上传按钮和检测结果里边的表单action一般指向/enctype必须是multipart/form-data。上传的图片会保存到static/uploads/这个目录必须已经存在否则file.save会报错。static目录下的文件可以通过/static/uploads/xxx.jpg直接访问所以保存图片后浏览器能正常显示。这个工程里有两个 HTML 文件如果打开页面发现排版错乱或变量不显示就把index.html和index_1.html对比一下。常见差异是调用了不同的 CSS 文件路径或者用了{{ result.probabilities[0] }}这种模板变量而app.py回传的字典里没有对应键。6. 避坑与排查医学影像深度学习项目里真正会卡住你的五个问题这类项目报错翻车的高发区我把实际跑过之后遇到最多的五个问题整理如下每条都是现象、原因、解决三步。6.1 加载权重时报 unexpected key现象load_state_dict抛出Missing key(s)或Unexpected key(s)模型训练白跑。原因保存时用的是torch.save(model, path)而不是torch.save(model.state_dict(), path)或者网络结构定义文件被改过层名对不上。解决先确认保存方式。如果保存的是整个模型直接model torch.load(path, map_locationcpu)如果保存的是状态字典就先构造模型再load_state_dict。检查model/下的网络定义和训练时是否一致尤其是num_classes是否改动。6.2 显存明明够用但 VGG19 一跑就 OOM现象切到 VGG19 后CUDA out of memory但用 VGG16 没问题。原因VGG19 的参数量和中间特征图比 VGG16 大不少batch_size32时中间激活值直接撑爆显存。解决先把 batch_size 降到 16 或 8再加torch.cuda.empty_cache()。还不行就把输入尺寸从 224 降到 192验证集和训练集同步改。比赛或课题场景里小 batch 多迭代并不是坏事反而更容易跳出局部最优。6.3 训练损失下降但验证准确率一直在 50% 上下现象损失值从 2 降到 0.8但验证集准确率始终在随机水平。原因类别不平衡加上预设的类别名顺序和推理时的class_names不一致或者验证集和训练集存在同样的脏数据。解决先打印出来看看train_set.classes的索引顺序再去app.py核对class_names列表。如果确认顺序没问题就在训练时打印每轮每个类别的召回率配合class_weights一起排查。准确率 50% 往往是随机猜的表现先看类别分布再谈调参。6.4 上传图片推理时概率永远是 [0.33, 0.33, 0.33]现象多头跑完推理页面输出的概率恒等于 1/类别数。原因模型推理前没有调用model.eval()BatchNorm 层还在用训练状态统计量或者预测时忘了包torch.no_grad()更隐蔽的原因是上传图片本身是无效图像PIL 打开后全是噪声。解决加载模型后马上model.eval()。推理函数里确认with torch.no_grad():包住了前向计算。再上传一张已知分类的图片交叉验证排除图片本身的问题。6.5 图片文件名带中文上传失败或路径解码报错现象本地调试正常换台电脑上传中文名图片后后端报 UnicodeDecodeError 或文件找不到。原因Windows 下 Flask 保存文件用的是系统默认编码中文文件名跨平台后编码不一致部分 Linux 服务器直接拒绝。解决保存上传文件时强制改成随机英文名import uuid safe_filename str(uuid.uuid4()) . ext save_path os.path.join(app.config[UPLOAD_FOLDER], safe_filename) file.save(save_path)这样还能避免两个用户上传同名文件互相覆盖的问题上传目录里的历史文件也更容易管理。7. 进阶技巧用五模型软投票和水印级约束提升结果可信度当你把单模型跑顺后这个工程可以往前再走一步。五套训练脚本的存在不只是为了对比曲线更是为了做模型集成。常见的做法是让 VGG16、VGG19、InceptionNetV3、ResNet 各出一个概率分布然后按权重求和def ensemble_predict(path_list): final_probs [0.0, 0.0, 0.0] for prob in path_list: final_probs [a b for a, b in zip(final_probs, prob)] final_probs [p / len(path_list) for p in final_probs] return final_probs软投票的原理很简单不同网络关注的图像特征侧重点不同CNN 关注局部纹理ResNet 关注更深的语义特征平均后的结果通常比任何单模型更稳。答辩或演示时我习惯把单模型结果和集成结果同时展示这本身就是很好的模型分析素材。更值得做的是验证指标升级。医学影像这种类别不平衡场景只看 accuracy 会被数据分布欺骗。比赛作品汇报时你应该补上敏感度sensitivity和特异度specificitydef medical_metrics(preds, labels, target_class1): tp sum(1 for p, l in zip(preds, labels) if p target_class and l target_class) fn sum(1 for p, l in zip(preds, labels) if p ! target_class and l target_class) fp sum(1 for p, l in zip(preds, labels) if p target_class and l ! target_class) sensitivity tp / (tp fn) if (tp fn) else 0 specificity tp / (tp fp) if (tp fp) else 0 # 注意这里的写法通常为负类指标 return sensitivity, specificity严格的特异度计算还要区分负类统计但思路是明确的盲猜正常的模型准确率可以很高敏感度却会暴露它根本没识别出阳性样本。从那以后我每次跑这类医学影像项目都会先把训练脚本里的指标改成敏感度加特异度再动手调参验证集上这两项不达标其他都是虚的。希望这个工程里的目录组织和训练链路能帮你把自己的数据集跑通少走我当时走过的弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

对齐蒸馏:让小模型真正理解人类意图的实战方法 2026/9/28 15:42:23

对齐蒸馏:让小模型真正理解人类意图的实战方法

1. 为什么“对齐蒸馏”不是模型瘦身,而是让小模型真正听懂人类意图最近在几个技术群里看到不少朋友发截图:“微调完的Qwen2.5-7B在本地跑得挺快,但一问‘请用表格对比三种融资方式的税务影响’就直接胡说八道”;还有人贴出VLLM日志…

阅读更多 →
GitHub Trending日榜深度玩法:从star增速到项目评估清单 2026/9/28 15:42:23

GitHub Trending日榜深度玩法:从star增速到项目评估清单

每天早上到工位,我做的第一件事往往不是开邮箱,而是打开 GitHub Trending 的日榜。这个习惯保持了挺多年,手机、电脑上各存了一个入口。很多人觉得日榜是"热门项目集合",每天翻一翻图个新鲜就关了。但我逐渐发现&#x…

阅读更多 →
hindsight 实战:基于 MCP 与 Docker 的 LLM Agent 事后记忆方案 2026/9/28 15:42:23

hindsight 实战:基于 MCP 与 Docker 的 LLM Agent 事后记忆方案

1. 从“事后诸葛亮”说起:hindsight 到底想解决什么问题第一次看到 “hindsight” 这个词,我脑子里蹦出来的就是“事后诸葛亮”。但在 LLM Agent 这个圈子里, hindsight 不是调侃,而是一个相当硬核的工程命题:当 Agent…

阅读更多 →
Hermes Agent工程实战:产品级智能体交付方法论 2026/9/28 15:42:23

Hermes Agent工程实战:产品级智能体交付方法论

1. 这不是又一个“Agent概念课”,而是一次真实交付现场的切片回放你点开这个标题,大概率不是想听“Agent是什么”“Hermes有多酷”这种泛泛而谈。你手上正卡在一个需求:要上线一个能真正处理用户工单、自动调用内部API、支持多轮业务逻辑判断…

阅读更多 →
告别r8169:Ubuntu下为RTL8125 2.5G网卡安装官方r8125驱动 2026/9/28 15:42:23

告别r8169:Ubuntu下为RTL8125 2.5G网卡安装官方r8125驱动

我弄到一块RTL8125BG 2.5GbE网卡之后,插到主力Ubuntu机器上测内网速度,结果当场就愣住了。Windows下能跑到280MB/s左右的对拷,到了Ubuntu这里死活卡在112MB/s,抽风的时候iperf3还会出现波动和丢包。一开始我怀疑是网线、交换机、甚…

阅读更多 →
STM32烧录全流程详解:ST-LINK接线、Keil5配置与故障排查 2026/9/28 15:42:16

STM32烧录全流程详解:ST-LINK接线、Keil5配置与故障排查

玩STM32的人,迟早要跟“烧录”这两个字打交道。不管是点亮第一颗LED,还是调试复杂的电机控制算法,你写好的程序最终都要经过编译、下载这一步,才能跑在芯片上。而在所有烧录工具里,ST-LINK应该是绝大多数新手接触到的第…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉