新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv5目录格式行人跌倒检测数据集制作:5类别标注与训练全攻略

发布时间:2026/10/1 9:08:12来源:尧图网络
YOLOv5目录格式行人跌倒检测数据集制作:5类别标注与训练全攻略
简介这是一份面向目标检测入门者与行人跌倒检测应用开发者的数据集采用YOLOV5目录格式组织。数据按训练集和验证集划分其中训练集包含7609张图片验证集包含1902张图片均为800×800的RGB图像每一张图片都配有对应的txt标签文件类别共5种涵盖person、跌倒及相关动作目标可直接用于YOLOv5系列模型的训练与验证免除格式转换和目录调整的麻烦。压缩包内共有2000个文件包括1999个标签txt和1个可视化脚本show.py运行脚本即可随机抽取图片绘制边界框并保存结果方便快速核对标注质量。资源包整体约438.48MB目录结构简洁按YOLOV5标准组织适合作为行人跌倒检测的基准数据集进行算法实验、模型微调与性能评估。目前已有404人学习下载对于刚接触目标检测的读者尤其友好既可直接上手训练也可在此基础上扩展自己的跌倒检测应用。1. 目标检测数据集(YOLOV5目录格式)行人跌倒检测5类别到底在解决什么问题在养老院、地铁站、家庭监控这类场景里跌倒检测如果只输出“跌倒/未跌倒”二分类误报会高到没法用蹲下系鞋带、弯腰捡东西、孩子在地上打滚都会被模型判定成跌倒。把任务拆成5个姿态类别正常行走、站立、坐下、弯腰、躺地是更稳妥的做法YOLOV5目录格式的数据集就是为了让这类检测模型能直接训练和部署。这篇笔记从数据集目录骨架、标注转换脚本、YOLOv5训练命令一路写到避坑经验适合正在做行为识别和安防监控的从业者也适合手上有视频但不知道如何整理成训练集的新手。你不需要先理解复杂的时序网络只要把每帧画面里的行人姿态检准确再接一段很短的逻辑就能把“跌倒动作”从“已经躺下”里挑出来。2. YOLOV5目录格式与5类别跌倒任务先搞懂标注和目录骨架2.1 为什么跌倒检测要拆成5个姿态类别跌倒这个动作本身在画面里只有几百毫秒真正留给模型判定的往往是跌倒后的姿态。如果把“跌倒”当成一个单独的框去标你会在标注时觉得很别扭跌倒瞬间人的框是斜的、半蹲的、重心偏移的不同摄像头视角下手型和框形差异极大模型很难学到稳定特征。拆成“正常行走、站立、坐下、弯腰、躺地”5个类别之后模型学到的是静态姿态。躺地这个类别在跌倒发生后会持续存在遮挡少、形变大检测稳定。后续再在连续帧里判断“上一帧是站立或行走这一帧变躺地”就能把动作判定和姿态检测解耦。我一般在和数据打交道时先看类别分布如果躺地样本不是最少的那一档说明标注大概率把跌倒瞬间的中间帧也框进去了那样训练出来会互相打架。2.2 images 与 labels 一一对应YOLOV5目录格式的最基本要求YOLOV5目录格式本身不复杂复杂的是“一一对应”这四个字。标准结构长这样fall_dataset/ ├── images/ │ ├── train/ │ │ ├── fall_001_0001.jpg │ │ └── fall_001_0002.jpg │ └── val/ │ └── fall_002_0001.jpg ├── labels/ │ ├── train/ │ │ ├── fall_001_0001.txt │ │ └── fall_001_0002.txt │ └── val/ │ └── fall_002_0001.txt └── fall_data.yaml这里每个images/train下的 jpg 文件必须在labels/train下有同主名的 txt 文件。注意 jpg 和 txt 的前缀必须完全一致连扩展名都不能改。YOLOv5 在训练时只看 images 目录然后根据同名去 labels 目录找标注找不到就直接跳过这个样本而且不报错。很多训练结果 mAP 为 0 的问题根源就是这里。注意目录路径和文件名不要用中文不要带空格。YOLOv5 在 Windows 上对中文路径支持一直不干脆换机器跑训练时最容易在这上面翻车。2.3 一行标注的数学含义归一化的中心点与宽高YOLOv5 的标签文件是纯文本每一行对应一个真实目标框格式是类别id 中心点x 中心点y 宽度 高度后四个值必须归一化到 [0,1]。看一个实际例子0 0.62109375 0.28515625 0.150390625 0.296875 4 0.41210938 0.61523438 0.18359375 0.42187500第一行表示一个“正常行走”的行人框中心点在图片宽度 62.1% 的位置高度 28.5% 的位置框宽占图片宽 15%高占图片高 29.7%。第二行是“躺地”中心点偏低宽度占比更大——摔倒的人通常在地面附近框会更扁。这些坐标值如果直接用像素坐标写进去loss 会在前几个 batch 变成 inf 或者 nan因为归一化后数值远大于 1模型预测头根本对齐不上。写转换脚本时要养成习惯拿图片真实宽高来计算不要用标注文件里的近似宽高。部分标注工具导出的 JSON 里会带imageWidth和imageHeight但不同版本工具可能存的是整型近似值和实际解码后的宽高差几个像素看似没事却会让框整体偏移。我一般会用PIL或cv2读取一次真实尺寸再传给转换函数。2.4 data.yaml 里的类别顺序就是模型的输出顺序数据集目录准备好之后还要写一个 YAML 配置文件告诉 YOLOv5 去哪里读数据、分几类、类别名是什么。最常见的配置train: fall_dataset/images/train val: fall_dataset/images/val nc: 5 names: 0: walking 1: standing 2: sitting 3: bending 4: lyingtrain 和 val 字段填的是图片目录路径YOLOv5 会自动把路径前缀换成labels去读标注。nc必须和names的数量一致。names的顺序必须和每个 txt 文件里数字 id 的映射一致txt 里写 4模型就认为这个框是lying。很多人在标注时把类别名按字母序排但训练配置里按自然习惯排结果“站立”被当成“躺地”召回率全乱。我习惯在转换脚本里把类别映射表定义在一个地方同时生成 yaml 文件这样两处永远一致。比如class_to_id {walking:0, standing:1, sitting:2, bending:3, lying:4}然后从这个字典生成 names 列表避免手写两遍。3. 把任意标注转为YOLOV5目录格式三个脚本与划分参数3.1 Labelme JSON 转 YOLO txt核心转换脚本Labelme 是目标检测常用标注工具导出的是 JSON里面存的是像素坐标。你需要自己写脚本转成 YOLO txt。下面这个脚本我改过很多次已经稳定支持常见的矩形和多边形标注import json import os class_to_id {walking: 0, standing: 1, sitting: 2, bending: 3, lying: 4} def convert_labelme_json(json_path, img_w, img_h, out_txt): with open(json_path, r, encodingutf-8) as f: data json.load(f) lines [] for shape in data[shapes]: label shape[label] if label not in class_to_id: continue points shape[points] # 多边形顶点或矩形两个对角点 xs [p[0] for p in points] ys [p[1] for p in points] x_min, x_max max(0.0, min(xs)), min(float(img_w), max(xs)) y_min, y_max max(0.0, min(ys)), min(float(img_h), max(ys)) if x_max - x_min 0 or y_max - y_min 0: continue width x_max - x_min height y_max - y_min x_center x_min width / 2.0 y_center y_min height / 2.0 line f{class_to_id[label]} {x_center/img_w:.6f} {y_center/img_h:.6f} {width/img_w:.6f} {height/img_h:.6f} lines.append(line) with open(out_txt, w, encodingutf-8) as f: f.write(\n.join(lines))逻辑说明取所有顶点坐标的最小和最大值得到外接矩形然后把坐标裁剪到图片边界内防止标注时手滑画出界。最后把像素坐标除以宽高得到归一化值。这里用了max/min做裁剪是关键保护。参数说明img_w和img_h必须是图片实际尺寸用cv2.imread拿shape[1]和shape[0]。另外class_to_id和 data.yaml 里的 names 顺序要完全一致。多边形标注转矩形框会自动丢失旋转信息对行人这类直立目标影响不大但如果画面里有人倾斜度超过45度建议标注时就直接用矩形别用多边形。3.2 过滤坏样本与保留空标签文件从视频抽帧得到的图片不是每一帧都有完整行人。经常出现半个人在画面边缘、模糊到完全无法分辨、人被椅背完全挡住的情况。这些样本如果不处理训练时模型会很困惑明明没有可见的行人却要求它输出一个框。我一般这样处理先过滤掉那些标注面积小于图片面积 0.5% 的框再把一张图片所有有效框写入 txt。如果一个文件最终一行都没有我选择保留空 txt而不是把这张图直接删掉。原因是空标签文件告诉 YOLOv5 这张图画面上没有目标模型会学习“背景也是类别”这对抑制误报很有用。如果直接删图验证集里遇到大量无目标帧时模型会强行输出框。import os def prune_boxes(txt_path, min_rel_area0.005): kept [] with open(txt_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue _, _, _, w, h parts area float(w) * float(h) if area min_rel_area: kept.append(line.strip()) if kept: with open(txt_path, w) as f: f.write(\n.join(kept)) else: # 保留空文件表示该帧无目标 open(txt_path, w).close()逻辑说明遍历每行标注计算归一化后的框面积只保留面积占比大于 0.5% 的框。面积小于这个值的框一般是远处的行人像素太小就算标了模型也学不到稳定特征反而把注意力带偏。参数说明min_rel_area要根据你的摄像头分辨率调。1080p 下目标高度 50 像素左右时面积占比大约在 0.02% 到 0.1% 之间0.005% 的阈值足够宽松。4K 分辨率下可以适当提高到 0.01%。3.3 按视频片段划分 train/val而不是按帧随机抽跌倒数据集最常见的错误是把连续视频抽帧后直接随机划分 train 和 val。这样做等于把你的测试集污染了同一个人的同一段动作前一帧在 train后一帧在 val模型等于见过答案再考试验证 mAP 虚高到 0.9 以上实际部署一塌糊涂。正确做法是按视频片段划分。我通常先把文件名设计成场景编号_帧序号.jpg的格式例如corridor_001_00123.jpg然后用下划线第一个字段作为视频片段 ID按这个 ID 做分组划分import os import random from collections import defaultdict root fall_dataset all_images os.listdir(os.path.join(root, images, all)) groups defaultdict(list) for name in all_images: scene_id name.split(_)[0] # 按视频片段分组 groups[scene_id].append(name) random.seed(42) scene_list list(groups.keys()) random.shuffle(scene_list) split_idx int(len(scene_list) * 0.85) train_scenes set(scene_list[:split_idx]) os.makedirs(os.path.join(root, images, train), exist_okTrue) os.makedirs(os.path.join(root, labels, train), exist_okTrue) for name in all_images: scene_id name.split(_)[0] sub train if scene_id in train_scenes else val # 移动或复制对应的图片和txt逻辑说明先把同一视频片段的帧放进同一个桶然后按桶划分而不是按单帧划分。这样 train 和 val 没有任何一帧来自同一个片段模型测试时面对的是没见过的人和环境。参数说明random.seed(42)保证划分结果可复现方便之后调试。比例 85% 对中型数据集比较合适如果总帧数超过 5 万可以提到 9:1。划分后务必做一次校验打印缺失对的数量for split in [train, val]: imgs os.listdir(f{root}/images/{split}) missing 0 for img in imgs: txt img.rsplit(., 1)[0] .txt if not os.path.exists(f{root}/labels/{split}/{txt}): missing 1 print(f{split}: {missing} missing labels)3.4 标注工具选哪个LabelImg 与 X-AnyLabeling 的导出差异如果你是第一次做目标检测数据集我会推荐 X-AnyLabeling它支持自动检测辅助标注先让 YOLOv5 模型预标一遍人工修框效率比纯手动快很多。LabelImg 是老牌工具稳定但导出格式只有 VOC XML需要额外转一步。转换流程其实一致先用工具导出原始标注再用上面的脚本转换成 YOLO 格式。区别在于 XML 里存的是像素坐标且可能存有difficult字段转换时要过滤掉。另外 X-AnyLabeling 导出的 JSON 里可能包含shape_type你只取rectangle或polygon都能处理。无论用哪种工具最终都归一到那个五个数字的 txt 格式这就是 YOLOV5 目录格式的核心。4. 用YOLOv5训练自己的跌倒检测模型环境、命令与三个超参数4.1 环境配置conda 创建虚拟环境并安装依赖先说环境YOLOv5 官方仓库基于 PyTorch推荐用 conda 隔离。我一般这样建环境conda create -n yolov5 python3.9 -y conda activate yolov5 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt逻辑说明第一步创建独立 Python 环境避免和系统 Python 依赖冲突。第二步装 CPU 版或 CUDA 版 PyTorchcu118是 CUDA 11.8 对应版本如果你机器是 CUDA 12把cu118换成cu121。第三步克隆 YOLOv5 仓库第四步装它要求的全部依赖。参数说明Python 3.9 兼容性最稳3.10 以上偶尔会遇到 NumPy 版本冲突。如果你的机器没有 GPU就把--index-url后面的链接去掉直接pip install torch装 CPU 版速度慢一点但能把流程跑通。4.2 训练命令数据量、显存和 epoch 怎么配数据整理好之后训练命令很直接。我用得最多的起步配置是这样python train.py --img 640 --batch 16 --epochs 100 --data fall_data.yaml --weights yolov5s.pt --cache逻辑说明--img是训练图像分辨率640 是精度和速度的平衡点。--batch根据显卡显存来常见 8G 显存用 1616G 以上可以用 32。--data指向你写的 yaml 文件。--weights用官方预训练权重yolov5s.pt从这个基础上微调比从零训练收敛快很多对小数据集尤其重要。--cache把图片提前缓存到内存避免每轮都磁盘读图能省不少时间。参数说明epochs 不是越多越好。跌倒数据集如果只有几千帧100 epoch 足够了再往后模型开始记住训练集噪声验证 mAP 反而下降。你可以每 20 epoch 看一次results.png里的val/box_loss如果连续两次不降就提前CtrlC停掉。batch size 如果太小比如显存 4G 只能开 8那么要同步把学习率调低否则 loss 震荡很厉害。4.3 影响跌倒检测的三个超参数mosaic、fliplr 与 cls_pwYOLOv5 有现成的超参数文件路径是data/hyps/hyp.scratch-low.yaml。对跌倒检测这个任务我每次都改三个参数。mosaic: 0.5 fliplr: 0.5 cls_pw: 1.5逻辑说明mosaic默认是 1.0把四张图拼在一起训练对小目标检测帮助很大但跌倒场景里很多行人是“单人大目标”拼图会把人物切碎导致漏检。我一般降到 0.5保留一半 mosaic 一半完整图。fliplr是水平翻转跌倒姿态左右对称0.5 的翻转概率能有效把训练数据翻一倍。cls_pw是类别权重当躺地样本明显少于其他类时把它从默认 1.0 调到 1.5让模型在计算分类 loss 时对躺地类别的误判惩罚更大。参数说明如果你发现躺地类别的 recall 很低优先调cls_pw而不是无脑加样本。命令里可以显式指定超参数文件--hyp data/hyps/hyp.scratch-low.yaml改完文件后重新训练。注意mosaic改成 0.5 后mosaic生成的那一半 batch 里目标会被裁切如果你的标注框本身就在图片边缘可能要再降一点。4.4 验证与导出val.py 看 mAP导出 ONNX 给边缘设备用训练完成后不要急着部署先用验证脚本看指标python val.py --data fall_data.yaml --weights runs/train/exp/weights/best.pt --img 640输出里重点关注mAP0.5和mAP0.5:0.95。跌倒检测属于安全类任务我要求mAP0.5至少到 0.85 才敢往下走如果只有 0.7 说明类别混淆严重回到数据层面去看标注质量。导出到边缘设备用 ONNX 是常见做法python export.py --weights runs/train/exp/weights/best.pt --img 640 --include onnx --simplify逻辑说明export.py会把 PyTorch 权重转成 ONNX 格式--simplify会做计算图优化去掉冗余节点。之后可以用 ONNX Runtime 或转成 TensorRT 引擎在 NVIDIA 设备上跑。如果要部署到树莓派5这样的 ARM 板子ONNX Runtime 推理速度比纯 PyTorch 快很多但还需要把输入输出解析写成 C 或 Python 脚本。参数说明导出时--img必须和训练时一致否则模型输入尺寸不匹配部署后框的位置会偏。另外如果训练时用了自定义--img 960导出也要用 960这点特别容易忘。5. 行人跌倒数据集的避坑指南5个让训练翻车的真实案例5.1 躺地样本太少模型直接忽略跌倒现象训练结束mAP0.5有 0.9但看每个类别的 PR 曲线时躺地类别的 AP 只有 0.3甚至验证集的召回率是 0。模型把躺地的人都当成背景或坐下。原因跌倒动作在真实视频中占比极低。连续 10 小时的监控视频跌倒可能只出现几十秒按帧抽出来躺地样本可能不到 1%。类别不平衡导致模型学到的最优策略是“永远不预测躺地”。解决不要硬性增加权重先做数据重采样。把躺地这一类样本单独复制 3 到 5 份或者用增强生成变体让训练集中躺地比例达到 10%~15%。同时在 yaml 里把cls_pw设为 1.5~2.0。如果还不行去采集更多“人躺在地面”的场景比如从公开的异常行为数据集里挑躺地帧补充。5.2 坐标越界导致 loss 变 NaN现象训练第一个 epoch 还没结束终端里box_loss突然变成nan后面所有指标都是nan只能重新开始。原因标注工具里手滑把框拖到图片边界外或者转换脚本没做裁剪归一化坐标出现负值或大于 1。YOLOv5 在计算 IoU 时遇到负坐标会得到非法值loss 反向传播时梯度爆炸。解决在转换脚本里强制裁剪就是第 3 章脚本里的x_min max(0.0, min(xs))那一行。训练前再写一个检查脚本遍历 labels 里所有 txt如果发现x_center 0或x_center 1直接报错并打印文件名。我每次转换完都会跑一遍这个检查从不跳过。5.3 labels 与 images 文件不同名mAP 全为 0现象val.py跑完每个类别的 AP 都是 0但训练 loss 正常下降。打开预测结果图发现模型实际输出了很多框只是全部框都不与真实框匹配。原因最常见的错误是图片扩展名和 txt 扩展名不同步。比如图片是fall_001.jpg标注生成的是fall_001.PNG.txt或fall_001_2.txtYOLOv5 只认同名文件找不到标注的图片全部当背景验证集里一个都没有正确配对。解决写一段校验脚本以图片目录为主检查 labels 目录是否存在对应主名 txt并给出所有缺失列表。更稳妥的办法是直接用文件名前缀统一重命名import os for f in os.listdir(labels_dir): if f.endswith(.txt): new_name f.rsplit(., 2)[0] .txt # 去掉多余后缀 os.rename(...)逻辑说明有时候标注工具会输出xxx.jpg.txt需要去掉中间那个jpg。这个脚本只保留最后一个.txt扩展名并把前面的点都去掉。参数说明如果文件名本身包含多个点用rsplit(., 2)只切最后两段能保留主名里的小数点。5.4 连续帧随机划分造成数据泄露现象训练时 mAP 一度到 0.95几乎是完美但部署到现场摄像头后同一个行人从走到摔倒模型完全识别不出。回头检查数据划分发现train 和 val 用了同一段视频的相邻帧。原因随机打乱到 train/val 时同一场景的连续帧被拆到两边。模型在 train 里见过第 50 帧val 里出现第 51 帧它只要记住上一帧的画面特征就能把框蒙对并没有学到真正的“跌倒躺地”泛化特征。解决必须按视频片段划分而不是按帧划分具体做法参考第 3.3 节。另外划分比例 85% 和 15% 是从片段数算的不是从帧数算的。我习惯先把每个片段的帧数打印出来确认没有单一片段占了 40% 以上的数据否则即使按片段划分局部片段特征也会主导训练。5.5 目标太小默认 anchor 匹配不到现象所有类别 AP 都还行但画面里离摄像头远的目标漏检率极高。尤其躺地的人在 2 米外监控视角下只有几十个像素高模型直接当作背景。原因YOLOv5 默认 anchor 是从 COCO 数据集统计出来的偏目标尺度大。人体跌倒后躺地框往往变成细长条或小矩形和 anchor 的 IoU 匹配不上正样本太少。解决让 YOLOv5 自动重新聚类 anchor。训练时加--evolve参数它会用遗传算法在训练集上搜 anchor但耗时较长。更快的办法是先用python train.py --data fall_data.yaml --weights yolov5s.pt --img 640 --epochs 1 --evolve预热一组 anchor然后手动把yolov5s.yaml里的 anchors 替换掉再正式训练。注意--evolve会在当前目录生成evolve_results.csv可以直接读里面的最优值。6. 锁住最后的10%效果连续帧时序判定与部署验证6.1 把单帧“躺地”变成时序“跌倒”模型训练完直接对每一帧输出“躺地”就报警会把睡觉、躺卧休息都识别成跌倒。我一般会在模型后面加一个极简的时序过滤器frame_buffer [] def detect_fall(detections, frame_id, threshold0.6): lying [d for d in detections if d[class] 4 and d[conf] threshold] if len(lying) 0: frame_buffer.clear() return False # 记录当前帧是否存在站立/行走类 up any(d[class] in (0, 1) and d[conf] threshold for d in detections) frame_buffer.append({lying: True, up: up, frame: frame_id}) if len(frame_buffer) 5: last_5 frame_buffer[-5:] has_up any(f[up] for f in last_5[:-1]) # 之前有站立/行走 all_lying all(f[lying] for f in last_5) # 连续5帧躺地 if has_up and all_lying: return True return False逻辑说明只有当最近 5 帧都是躺地且前面帧里出现过站立或行走才判定为跌倒。这个逻辑挡住了“进来就坐在沙发上不动”的人也挡住了“玩手机躺在地上”的误报。参数说明threshold根据模型置信度分布调整一般设在 0.5~0.7 之间。frame_buffer要按帧号维护不能靠list.append简单计数因为推理时间不固定隔几帧丢一次检测结果会让窗口长度失真。6.2 导出 TensorRT 模型后在树莓派5上验证如果你想在树莓派5这种边缘设备上部署ONNX Runtime 是最省事的路径。先用第 4.4 节的export.py导出 ONNX然后在树莓派上安装onnxruntime用cv2读帧把图像 resize 到 640x640按训练时的归一化方式预处理推理后解析输出。第一次跑通时让摄像头对准一个躺着的人看输出框的 class 是否为 4。这里最容易踩的坑是输入矩阵的通道顺序YOLOv5 训练时用的是 RGB但 OpenCV 默认读 BGR预览用 BGR 写没问题喂给模型前必须cv2.cvtColor(img, cv2.COLOR_BGR2RGB)否则框会偏移到完全无关的位置。6.3 训练前的最后一轮人工抽检我习惯在训练前花半小时做一次视觉抽检随机挑 50 张训练图片把标注框画上去检查四个地方——躺地框是否框住完整的人而不是只框躯干弯腰和坐下的边界是否一致图片边缘被截半的人是否标了框空标签文件对应的图片是否真的是无人物场景。这一步比调任何超参数都有用因为标注不一致是跌倒检测模型最大的隐性噪声。我上一次做这个抽检时发现标注员把“蹲下”和“弯腰”混标了导致这两个类别在验证时互相打架。希望这个流程能帮你在跌倒检测这个方向上少走几段弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

Modern JavaScript Tutorial 实战:范围外判断的两种等价写法——NOT 变体与德摩根定律 2026/10/1 9:57:18

Modern JavaScript Tutorial 实战:范围外判断的两种等价写法——NOT 变体与德摩根定律

文档/教程前端 【免费下载链接】en.javascript.info Modern JavaScript Tutorial 项目地址: https://gitcode.com/gh_mirrors/en/en.javascript.info 点击查看 免费下载 导读 本文围绕 en.javascript.info(Modern JavaScript Tutorial)中&…

阅读更多 →
DeepSeek Harness 插件实战:dshmarket 与 modlens 安装配置及故障排查指南 2026/10/1 9:57:11

DeepSeek Harness 插件实战:dshmarket 与 modlens 安装配置及故障排查指南

1. 为什么我要花时间折腾 DeepSeek Harness 插件第一次接触 DeepSeek Harness 是在一个做智能体工作流的朋友那里。他当时给我演示了一段自动化流程:从本地知识库拉取资料,经过模型推理,再自动生成结构化的项目文档,整个过程行云流…

阅读更多 →
多租户Odoo SaaS部署实战:Docker架构、实例管理与避坑指南 2026/10/1 9:57:11

多租户Odoo SaaS部署实战:Docker架构、实例管理与避坑指南

简介:整套基于Docker的多租户Odoo实例管理方案,适合具备服务器管理经验、负责企业级Odoo部署与运维的技术人员。该资源详细讲解SaaS Kit工具包的安装配置流程,包括Python依赖库的安装、目录结构搭建、Nginx与PostgreSQL配置、Odoo用户权限调整…

阅读更多 →
技术选型的经历,比「我用了什么」值钱得多 2026/10/1 9:57:05

技术选型的经历,比「我用了什么」值钱得多

技术简历上写「使用 Kafka 实现异步解耦」,和写「在 Kafka 和 RabbitMQ 之间选了前者,因为……」,是两个层级。 前者说明你会用,后者说明你会判断。而工作年限越长,后者的权重越高。 为什么选型经历值钱 因为它暴露的是…

阅读更多 →
OFDM低复杂度无边带SLM改进:分组选择映射与幅值标记法 2026/10/1 9:57:05

OFDM低复杂度无边带SLM改进:分组选择映射与幅值标记法

简介:面向无线通信与信号处理领域,这份资源针对OFDM系统峰均功率比(PAPR)过高的问题,提出基于选择映射(SLM)的低复杂度改进方案。传统SLM需多次IFFT计算候选信号,还要传输边带信息&a…

阅读更多 →
内存又炸了!我用C# IAsyncEnumerator给国产库做“流式Left Join“,2亿行数据OOM从此说拜拜 [特殊字符] 2026/10/1 9:57:05

内存又炸了!我用C# IAsyncEnumerator给国产库做“流式Left Join“,2亿行数据OOM从此说拜拜 [特殊字符]

🩸 一、 翻车剖析:传统 JOIN 的"内存黑洞"是怎么形成的? 很多新手老铁写 LEFT JOIN,脑子里想的是这样的: // ❌ 反面教材:内存黑洞写法 var orders await conn.QueryAsync(“SELECT * FROM t_or…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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