简介本资源是一套完整的Python毕业设计项目面向计算机、农业信息化及相关专业本科生解决农作物病虫害图像智能识别与分类的实际问题。项目基于深度学习构建端到端识别系统涵盖数据采集规范、图像预处理流程、CNN模型搭建含PyTorch/TensorFlow双框架适配、训练调优及部署推理全流程适用于课程设计、毕设开题与中期实践。压缩包共31个文件约19.64MB包含9张示例PNG/JPG病害图、4个Vue前端页面含识别界面、3个核心Python脚本训练/推理/服务、2个JSON配置与标签映射文件、README.md使用说明及LICENSE等工程必需文件结构清晰开箱即用。目前已有180人学习下载提供完整可运行源码、标注数据集、详细使用文档及前后端分离部署方案助读者快速复现结果并拓展至其他农业视觉任务。1. 这不是又一个“调用model.predict()就完事”的毕设它真能拍张玉米叶就分出是锈病还是灰斑病且整套流程跑通在3060显卡Win10Python3.8环境里你手头正赶着农学或计算机专业的毕业设计 deadline导师说“要落地、要有数据、要有可演示界面”但搜到的所谓“农作物病虫害识别源码”点开全是 Jupyter Notebook 里三行代码加载预训练模型、五张测试图硬凑效果——实际一换自家田里拍的模糊图就崩。这个项目不一样它自带 2174 张实拍病害图含水稻稻瘟病、小麦赤霉病、玉米大斑病/小斑病/锈病/灰斑病六类模型结构明确写死为 EfficientNet-B0 自定义双分支注意力模块非简单微调训练脚本支持断点续训推理端封装成带摄像头实时识别的 PyQt5 GUI连“拍照→自动裁剪叶片区域→分类→显示置信度防治建议”都做了状态机逻辑。它不承诺工业级鲁棒性但保证你在宿舍用笔记本跑通全流程从 pip install -r requirements.txt 到双击 run_gui.exe 弹出识别窗口全程无玄学报错。适合农学专业想交出有图有表有交互的毕设也适合计算机专业需要快速验证 CV 分类 pipeline 的同学——尤其当你发现导师问“你这个模型为什么比 ResNet-50 好”时代码里真有消融实验对比表格。2. 从数据清洗到模型训练为什么选 EfficientNet-B0 而不是 YOLOv8六个关键决策点拆解2.1 数据集结构与清洗逻辑2174 张图不是堆在一起就叫“数据集”项目附带的dataset/目录下是标准的 PyTorch ImageFolder 结构dataset/ ├── train/ │ ├── rice_blast/ # 水稻稻瘟病 │ ├── wheat_fusarium/ # 小麦赤霉病 │ ├── maize_large_spot/ # 玉米大斑病 │ ├── maize_small_spot/ # 玉米小斑病 │ ├── maize_rust/ # 玉米锈病 │ └── maize_gray_spot/ # 玉米灰斑病 ├── val/ └── test/但真正关键的是utils/data_cleaning.py——它不是简单按比例划分而是做了三件事光照归一化对每张图计算 HSV 空间的 V 通道直方图剔除 V 均值 40过暗或 220过曝的样本背景过滤用 GrabCut 算法粗略分割叶片区域若分割后前景像素占比 30%该图被移入dataset/unclean/待人工复核标签校验遍历所有子目录检查是否存在文件名含_corrupted或尺寸 300×300 的图自动记录日志cleaning_report.txt。提示运行python utils/data_cleaning.py --root dataset/后你会看到类似Removed 47 images (2.1%): 12 overexposed, 23 underexposed, 12 low-foreground的输出。这步省掉后续训练时 val_loss 会抖得像心电图。2.2 模型架构选择EfficientNet-B0 的三个不可替代性为什么不用更火的 ViT 或 ConvNeXt看三点硬指标显存友好性在 batch_size16、输入 224×224 下B0 占用显存 3.2GBRTX3060而 ViT-Base 需 6.8GB直接卡死学生党迁移学习适配度ImageNet 预训练权重中B0 的 stem 层首层卷积对植物纹理的低频特征提取更稳我们实测在冻结前 3 层时B0 的 val_acc 比 ResNet-18 高 4.7%轻量部署可行性导出的 ONNX 模型仅 18MBPyQt GUI 中用 onnxruntime 推理单图耗时 82msCPU i5-10210U比 PyTorch 模型快 3.1 倍。项目在models/efficientnet_custom.py中扩展了原生 B0在最后两个 MBConv 块后插入CBAM 注意力模块Channel Spatial 双路并用nn.AdaptiveAvgPool2d(1)替代原版全局池化——这是为解决病斑常占画面小区域而做的针对性改动。2.3 训练策略为什么用 Focal Loss 而不是 CrossEntropy原始数据中玉米锈病样本321 张比灰斑病189 张多 70%但两类病害在田间发生率接近。若直接用 CrossEntropy模型会偏向锈病预测。项目采用loss/focal_loss.py实现的 Focal Lossclass FocalLoss(nn.Module): def __init__(self, alpha1, gamma2, reductionmean): super().__init__() self.alpha alpha # 类别权重此处设为 [1.0, 1.0, 1.0, 1.0, 0.8, 1.2] self.gamma gamma # 难例聚焦系数 self.reduction reduction def forward(self, inputs, targets): ce_loss F.cross_entropy(inputs, targets, reductionnone) pt torch.exp(-ce_loss) # 预测概率 focal_weight (self.alpha[targets] * (1-pt)**self.gamma) focal_loss focal_weight * ce_loss return torch.mean(focal_loss) if self.reduction mean else focal_loss参数说明alpha数组按类别顺序rice_blast → maize_gray_spot设置权重灰斑病权重 1.2 是为补偿其样本少gamma2是经验值过高会导致 easy sample 梯度消失。实测该 Loss 使灰斑病的 recall 从 68.3% 提升至 82.1%。2.4 训练脚本详解train.py 的五个核心参数怎么调运行python train.py默认启动完整训练但你需要根据硬件调整以下参数参数默认值说明修改建议--batch-size16每批图像数RTX3060 保持 16GTX1660Ti 建议改 8--lr0.001初始学习率若 val_acc 在 epoch5 后停滞降为 0.0005--epochs100总训练轮数实际 62 轮时 val_acc 达峰值早停触发--resumeNone断点路径如中断填runs/train/exp10/weights/last.pt--workers4数据加载线程数Win10 下超过 4 易卡死勿改关键逻辑在train.py第 187 行if (epoch 1) % 10 0: save_checkpoint(...)——每 10 轮存一次权重避免崩溃丢进度。我一般会在 epoch30、60、90 手动备份因为第 62 轮的best.pt虽然 acc 最高但对新场景泛化稍弱。2.5 验证与测试不只是 accuracy要看 confusion_matrix.csv 里的细节训练完成后test.py会生成results/test_metrics.csv和results/confusion_matrix.png。重点看 CSV 中的 per-class metricsclass,precision,recall,f1-score,support rice_blast,0.92,0.89,0.90,124 wheat_fusarium,0.87,0.85,0.86,98 maize_large_spot,0.94,0.91,0.92,156 maize_small_spot,0.89,0.87,0.88,132 maize_rust,0.93,0.90,0.91,167 maize_gray_spot,0.85,0.82,0.83,112注意maize_gray_spot的 recall 仅 0.82 ——这说明模型对灰斑病易漏检。翻看results/fail_cases/maize_gray_spot/目录下的误分类图你会发现它们共同点是病斑呈细密灰点状且叶片背面拍摄RGB 图中灰度值接近健康组织。解决方案已在README.md的 “进阶优化” 章节注明需补充背面拍摄的灰斑病图并在transforms.py中加入RandomGrayscale(p0.3)增强。3. GUI 交互与部署PyQt5 界面不是摆设它把识别结果变成农技员能看懂的语言3.1 界面逻辑链从点击“拍照”到弹出防治建议的七步状态机gui/main_window.py的核心是RecognitionEngine类它把识别流程拆成原子状态Idle初始状态按钮灰色CameraOpen调用cv2.VideoCapture(0)检测是否成功FrameCapture每 200ms 截一帧送入preprocess_frame()LeafCrop用utils/leaf_segmentation.py的阈值法粗略裁剪叶片区域非 U-Net轻量InferenceONNX 模型推理返回 top3 class_id scoreAdviceLookup查data/disease_advice.json获取对应防治建议DisplayResult更新 UI 的 QLabel 显示病名、置信度、建议文字及示意图。关键代码在main_window.py第 215 行def _on_inference_complete(self, result: dict): # result {class_id: 4, confidence: 0.92, top3: [(4,0.92), (2,0.05), (0,0.02)]} disease_name self.class_names[result[class_id]] # maize_rust advice self.advice_db.get(disease_name, 暂无建议) self.result_label.setText(f检测到{disease_name}\n置信度{result[confidence]:.2%}) self.advice_text.setPlainText(advice) # 加载对应示意图 pixmap QPixmap(fdata/images/{disease_name}_example.jpg) self.example_img.setPixmap(pixmap.scaled(200, 150, Qt.KeepAspectRatio))参数说明self.class_names来自data/class_mapping.json确保 GUI 与模型输出 ID 对齐advice_db是字典键为类名字符串值为农技手册摘要文本。3.2 ONNX 模型导出与加速为什么不用 PyTorch 直接推理export_onnx.py脚本将训练好的.pt模型转 ONNX关键参数torch.onnx.export( model, dummy_input, weights/best.onnx, input_names[input], output_names[output], dynamic_axes{input: {0: batch_size}, output: {0: batch_size}}, opset_version12, # 必须 ≥11否则 onnxruntime 报错 verboseFalse )opset_version12是硬性要求项目用的nn.AdaptiveAvgPool2d(1)在 opset11 时不支持动态 batch。导出后必须用onnxruntime加载非onnx库因后者无推理引擎。gui/inference_engine.py中self.session ort.InferenceSession(weights/best.onnx, providers[CUDAExecutionProvider, CPUExecutionProvider]) # 若无 GPU自动 fallback 到 CPU实测同一张图PyTorch 推理耗时 210msONNX CUDA 耗时 82msONNX CPU 耗时 145ms。对 GUI 流畅度而言82ms 意味着每秒稳定 12 帧肉眼无卡顿。3.3 打包成 exePyInstaller 的三个隐藏坑与绕过方案build_exe.bat脚本调用pyinstaller --onefile --windowed --add-data weights;weights --add-data data;data main.py但会遇到坑1cv2 无法加载→ 在main.py开头加import cv2并在.spec文件中手动添加binaries[(cv2.pyd, cv2, BINARY)]坑2ONNX 模型找不到→--add-data参数必须用分号Win或冒号Mac/Linux且路径不能含空格坑3PyQt5 中文乱码→ 在main.py中QApplication创建后立即执行font QFont() font.setFamily(Microsoft YaHei) app.setFont(font)打包后生成dist/main.exe大小约 142MB含 OpenCV、ONNXRuntime、PyQt5。实测在无 Python 环境的 Win10 电脑上双击即运行无需安装任何依赖。3.4 防治建议数据库disease_advice.json 不是随便写的文本data/disease_advice.json是结构化 JSON每项含{ maize_rust: { name_zh: 玉米锈病, symptom: 叶片出现夏孢子堆呈橙红色粉状后期变黑褐色, chemical_control: [25% 三唑酮可湿性粉剂 1000 倍液, 43% 戊唑醇悬浮剂 3000 倍液], agricultural_control: [选用抗病品种, 合理密植避免田间郁闭], warning: 发病初期施药间隔 7 天连喷 2 次 } }字段说明chemical_control是农药清单agricultural_control是农艺措施warning是关键提醒。这个 JSON 被gui/main_window.py的AdviceLookup类直接读取确保 GUI 输出不是“请咨询农技站”这种废话。3.5 实时识别的延迟控制如何让摄像头不卡成 PPTGUI 中QTimer设置为self.timer.timeout.connect(self._capture_and_process)但默认 33ms30fps会导致 CPU 占用飙升。项目在main_window.py第 132 行做了自适应self.fps_counter 0 self.last_time time.time() def _capture_and_process(self): # ... 图像采集 ... current_time time.time() if current_time - self.last_time 0.1: # 强制最低 100ms 间隔 return self.last_time current_time # ... 推理 ... self.fps_counter 1 if self.fps_counter % 10 0: fps 10 / (current_time - self.last_time) self.fps_label.setText(fFPS: {fps:.1f})参数说明0.1秒间隔是平衡流畅度与负载的临界值——低于此值RTX3060 的 GPU 利用率超 95%风扇狂转高于此值用户会觉得响应迟钝。实测 100ms 间隔下GPU 利用率稳定在 65%~72%风扇噪音可接受。4. 避坑指南六个血泪教训来自我在三所高校毕设答辩现场记下的真实翻车记录4.1 现象训练时 val_loss 突然暴涨loss 曲线像心电图原因dataset/val/目录下混入了train/中的同名文件如maize_rust/IMG_001.jpg同时存在于 train 和 val导致验证集数据泄露。PyTorch ImageFolder 会把重复文件当作不同样本但实际是同一张图的两次加载。解决运行utils/check_data_leakage.py它会扫描所有子目录比对文件 MD5 值输出冲突列表。删掉 val 中重复的文件重新划分验证集。4.2 现象GUI 点击“拍照”后黑屏控制台报cv2.error: OpenCV(4.5.5) ... error: (-215:Assertion failed) !ssize.empty() in function cv::resize原因摄像头未正确初始化cap.read()返回False, None后续cv2.resize(None, ...)崩溃。常见于 USB 摄像头被其他程序占用或笔记本内置摄像头权限被系统禁用。解决在gui/camera_handler.py的open_camera()方法中增加重试逻辑for i in range(3): cap cv2.VideoCapture(index) if cap.isOpened(): ret, frame cap.read() if ret and frame.size 0: # 确保帧有效 self.cap cap return True cap.release() time.sleep(0.5) return False4.3 现象ONNX 模型推理结果全为 0session.run()返回的 output 全是零向量原因导出 ONNX 时dummy_input的 dtype 是torch.float64但 ONNX Runtime 默认只支持float32。模型权重和输入类型不匹配导致计算失效。解决在export_onnx.py中强制指定dummy_input torch.randn(1, 3, 224, 224, dtypetorch.float32) # 必须 float32 model.eval() model.to(torch.float32) # 确保模型也是 float324.4 现象PyInstaller 打包后 exe 运行报ModuleNotFoundError: No module named onnxruntime.capi._pybind_state原因onnxruntime的 C 扩展模块未被 PyInstaller 自动收集。解决修改build_exe.bat在 pyinstaller 命令后加--hidden-import onnxruntime.capi._pybind_state或在.spec文件中hiddenimports列表里添加该模块。4.5 现象识别结果置信度总是 0.99但实际图是健康叶片原因utils/leaf_segmentation.py的阈值分割对健康叶片失效——健康叶绿色均匀Otsu 阈值会把整片叶子判为背景裁剪后只剩黑边模型对纯黑输入输出随机高置信度。解决在leaf_segmentation.py的crop_leaf_region()函数末尾加兜底逻辑if np.sum(mask) 5000: # 像素少于 5000认为未分割出有效区域 h, w img.shape[:2] # 返回中心 224x224 区域 x, y (w-224)//2, (h-224)//2 return img[y:y224, x:x224]4.6 现象答辩现场演示时老师用自己手机拍的图识别失败显示“未知病害”原因手机图分辨率远高于 224×224如 4000×3000preprocess_frame()中的cv2.resize()使用INTER_AREA插值在大幅缩小后丢失病斑纹理细节。解决在gui/preprocess.py中对高分辨率图改用INTER_LANCZOS4if max(h, w) 1000: resized cv2.resize(img, (224, 224), interpolationcv2.INTER_LANCZOS4) else: resized cv2.resize(img, (224, 224), interpolationcv2.INTER_AREA)5. 模型轻量化与跨平台部署把 142MB 的 exe 压到 68MB且能在 Jetson Nano 上跑起来5.1 模型剪枝用 torch.nn.utils.prune 去掉 30% 的冗余通道项目提供prune_model.py脚本对训练好的best.pt进行结构化剪枝# 对每个 Conv2d 层的 weight 剪枝 for name, module in model.named_modules(): if isinstance(module, nn.Conv2d) and features in name: # 基于 L1 norm 剪枝通道 prune.l1_unstructured(module, nameweight, amount0.3) # 导出剪枝后模型 torch.save(model.state_dict(), weights/pruned_best.pt)关键参数amount0.3表示剪掉每层 30% 的通道l1_unstructured是通道级剪枝比非结构化剪枝更易部署。剪枝后模型大小从 28MB 降至 19MB推理速度提升 18%accuracy 仅下降 0.9%val_acc 从 92.3% → 91.4%。5.2 TensorRT 加速Jetson Nano 上从 145ms 降到 38ms 的实操步骤在 Jetson NanoUbuntu 18.04 JetPack 4.6上部署需四步安装 TensorRTsudo apt-get install tensorrt确认版本 ≥ 7.2转换 ONNX 到 TRT 引擎运行trtexec --onnxweights/best.onnx --saveEngineweights/best.trt --fp16修改 inference_engine.py替换 ONNXRuntime 为 TensorRTimport pycuda.autoinit import pycuda.driver as cuda from tensorrt import ICudaEngine, IExecutionContext class TRTInferenceEngine: def __init__(self, engine_path): with open(engine_path, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) self.engine runtime.deserialize_cuda_engine(f.read()) self.context self.engine.create_execution_context()编译依赖Jetson 上需sudo apt-get install python3-pycuda且trtexec必须用 JetPack 自带版本否则报libnvinfer.so.7 not found。实测TRT 引擎在 Jetson Nano 上推理耗时 38msFP16比 ONNX CPU 快 3.8 倍功耗仅 5W可连续运行 8 小时不发热。5.3 Web 端部署Flask API 的最小可行方案web/app.py提供轻量 APIapp.route(/predict, methods[POST]) def predict(): if image not in request.files: return jsonify({error: No image provided}), 400 file request.files[image] img Image.open(file.stream).convert(RGB) # 预处理同 GUI input_tensor preprocess(img).unsqueeze(0) # [1,3,224,224] with torch.no_grad(): output model(input_tensor) probs torch.nn.functional.softmax(output, dim1) top3 torch.topk(probs, 3) return jsonify({ classes: [class_names[i] for i in top3.indices[0].tolist()], scores: [float(s) for s in top3.values[0].tolist()] })部署命令gunicorn -w 2 -b 0.0.0.0:5000 web.app:app。测试用curl -F imagetest.jpg http://localhost:5000/predict返回 JSON。注意Web 版不包含 GUI 的实时视频流仅支持单图上传内存占用 300MB。5.4 数据增强再升级解决“同一种病不同角度拍就认不出”的顽疾原始数据增强仅用RandomHorizontalFlip和ColorJitter对田间多角度拍摄无效。train.py中新增Albumentations增强import albumentations as A from albumentations.pytorch import ToTensorV2 train_transform A.Compose([ A.RandomRotate90(p0.5), A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), A.HueSaturationValue(hue_shift_limit10, sat_shift_limit20, val_shift_limit10, p0.5), A.GaussNoise(var_limit(10.0, 50.0), p0.3), ToTensorV2() ])参数说明RandomRotate90解决叶片旋转问题HueSaturationValue模拟不同光照下叶片色偏GaussNoise增加传感器噪声鲁棒性。开启后模型在测试集上对旋转 45° 的图识别准确率从 73.2% 提升至 86.5%。5.5 模型解释性用 Grad-CAM 可视化“模型到底在看哪里”utils/gradcam.py实现 Grad-CAM生成热力图覆盖原图def generate_cam(model, img_tensor, target_layer, class_idxNone): grad_cam GradCAM(model, target_layer) cam grad_cam(img_tensor, class_idx) return show_cam_on_image(img_tensor.squeeze().permute(1,2,0).numpy(), cam) # 调用示例 cam_img generate_cam(model, input_tensor, model.features[-1], class_idx4) cv2.imwrite(results/cam_maize_rust.jpg, cam_img)效果热力图高亮区域与病斑位置高度重合证明模型不是靠背景“猜”病害。答辩时展示这张图比讲一百句“我们用了注意力机制”更有说服力。6. 毕设答辩终极技巧如何用这份代码让导师觉得“这学生真干了活”而不是“网上抄的”6.1 答辩 PPT 的三页黄金结构拒绝“第一章绪论”式八股第一页问题现场照片 你的解决方案截图左半一张真实的田间病害图比如你亲戚家玉米地拍的锈病叶标注“传统识别依赖农技员经验误判率高”右半你的 GUI 界面截图箭头指向“检测到maize_rust置信度92.3%建议25%三唑酮1000倍液”底部小字“基于 2174 张实拍图训练6 类病害平均 recall 87.1%”。这页的目的不是炫技是让导师第一眼确认你解决的是真问题不是玩具数据集。第二页模型对比表格 你改的那行关键代码表格列Model / Params(M) / Val-Acc / Inference(ms) / Your-Change行填ResNet-18 / 11.7 / 85.2% / 156 / 未改EfficientNet-B0 / 5.3 / 90.3% / 82 / 原始EfficientNet-B0CBAM / 5.8 / 92.3% / 85 /models/efficientnet_custom.py第 47 行加 attention旁边贴代码片段x self.cbam(x)并标红注释“CBAM 模块提升小斑病 recall 3.2%”。这页证明你不是调包侠你理解每一行代码的业务价值。第三页失败案例分析 你的改进动作左results/fail_cases/maize_gray_spot/IMG_123.jpg背面灰斑模型判为健康右你手写的改进计划“1. 补充背面拍摄灰斑图 50 张2. 在 transforms.py 中增加 RandomGrayscale(p0.3)3. 重新训练目标 recall ≥85%”。这页最致命——它告诉导师你有工程思维知道模型不是终点而是起点。6.2 答辩时必答的三个灵魂问题与应答话术Q1“你这个模型在没网的田间能用吗”→ 不说“可以”说“我们提供了离线部署方案打包成 142MB 的 exeU 盘拷贝到农户笔记本即用也适配 Jetson Nano装在便携设备里功耗 5W电池续航 6 小时。”同时打开dist/main.exe演示Q2“数据就 2000 多张够吗”→ 不说“够”说“农业图像获取成本高2174 张是经农技站确认的有效样本。我们用 Grad-CAM 验证了模型关注病斑区域展示热力图且通过 Albumentations 增强模拟了 10 倍视角变化等效数据量超 2 万张。”Q3“和商业系统比有什么优势”→ 不说“更好”说“商业系统贵且封闭我们的优势是透明可定制比如您提到的水稻纹枯病只需按相同格式补充 200 张图改class_mapping.json3 小时就能接入新类别——这是开源代码给农技推广留的活口。”6.3 代码注释的隐藏价值让导师相信这是你写的我坚持一个习惯在train.py的if __name__ __main__:块开头写一段中文注释 毕设训练主脚本 v1.2 作者XXX 学号XXXXXX 日期2024-03-15首次提交 修改记录 2024-04-02修复 val_loss 波动问题增加 early stopping patience10 2024-04-18加入 Focal Lossalpha 参数按类别样本数反比设置 2024-05-05优化摄像头采集逻辑解决黑屏 bug见 camera_handler.py L132 同样在gui/main_window.py的类定义上方写 PyQt5 GUI 主窗口 核心功能实时摄像头识别 病害防治建议弹窗 特别注意L215 的 _on_inference_complete 方法耦合了 class_names 与 advice_db 确保 data/class_mapping.json 与 data/disease_advice.json 键名严格一致 这些注释不是为了好看是给导师一个快速验证你工作量的锚点——他扫一眼就知道你改过多少次、在哪改的、为什么改。从那以后我每次提交代码都强制走一遍这个注释流程哪怕只是改了个缩进。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
使用函数二值化进行数据特征离散化 在数据分析与机器学习中,数据预处理是一个极为关键的环节。其中,特征的离散化可以有效地提升模型的表现。离散化特征是指将连续变量转换为离散变量,这对于分类任务以及某些模型结构特别有帮助。Python提供了丰富的函数和方法来实现数据的离散化,本文将重点介绍通过阈值二值… · 2026/9/26 2:09:09
吴恩达大模型系列中文版:开发者入门LLM的最短路径与实战指南 简介:这份面向开发者的LLM入门教程合集,源自吴恩达大模型系列课程,由国内开发者翻译为中文并复现全部示例代码,适合希望快速上手大模型应用开发的程序员与AI从业者。资源共469个文件,包括176个Markdown文档、74个Jupyt… · 2026/9/26 2:09:02
递归方式展平多层json学科知识点数据 在数据处理中,目录结构往往存在多级嵌套的情况,直接手动处理这些数据会耗费大量时间。面对这种多层次的结构可以通过Python程序快速地提取并展平这些嵌套数据,从而便于后续存储和分析。
本文将通过一个实际的例子,展示如何将某学网获取的多层嵌套目录信息展平为Excel表格格… · 2026/9/26 2:08:56
金融行业网络钓鱼攻击演进与防御体系适应性强化策略 上周三下午,我收到了一封自称来自“内部系统管理中心”的邮件,提示财务报销系统需要重新认证。发件域名看起来是内部后缀,邮件里嵌的链接点开后的登录页和我们实际使用的系统几乎一模一样,唯一破绽是URL前缀多了一个字符。那一刻我… · 2026/9/26 3:23:21
Laya+System 1本地部署实战:轻量级可解释决策模型落地指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:23:21
SolidWorks紫色漏斗怎么解决?选择过滤器导致草图选不中 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:23:21
IntelliCLI 开源啦!!!用 Docker + ollama 把本地 LLM 接进命令行 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:23:15
Cursor Rule 实战:用 MDC 规则文件让大模型不再胡乱回答 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 3:23:15
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46