news 2026/10/5 7:31:00

COCO转YOLO避坑指南:传送带异物检测数据集处理全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
COCO转YOLO避坑指南:传送带异物检测数据集处理全流程

简介:传送带异物检测识别数据集聚焦工业生产线上的异物检测任务,可支持识别铁棍、垃圾等目标,面向计算机视觉算法工程师、工业质检系统开发者以及相关专业学生,能够为算法验证、项目演示和课程实验提供带标注的真实场景数据。数据集共108个文件,包含105张jpg原始图像和3个json标注文件,其中json文件采用COCO格式,记录了类别、边界框等信息,可直接用于YOLO、MMDetection等目标检测框架的训练与评估;图像来源于NVR监控录像抽取帧,覆盖不同角度与光照条件,贴合传送带实际运行环境。压缩包体积仅4.65MB,轻量便携,便于快速下载与本地实验。目前已有413人学习下载,适合希望快速获得可训练数据集的研究者与开发者,基于该数据还可开展数据清洗、标注格式转换、模型迭代及指标对比等完整流程。

1. 拿到一份“传送带异物检测”COCO数据集,第一件事别急着转YOLO

传送带异物检测识别数据集,拿到的第一时间通常是一份COCO JSON格式标注文件,里面标好了铁棍和垃圾(也可能有塑料片、木块这类东西)。很多朋友的第一个动作都是“赶紧转成YOLO格式然后开训”,但我建议你先把这份COCO JSON拆开看一遍。因为COCO的category_id很可能是跳号的,bbox存的是左上角像素坐标,有的标注还带着iscrowd和RLE掩码,直接无脑转格式,轻则类别全部错位,重则坐标归一化算错,训练完发现模型就是个黑匣子,翻车了都不知道该查哪一环。

这篇文章适合做工业视觉、传送带分拣、质检方案或二手设备改造的工程师。新手可以照着步骤把数据跑通,熟手可以直接跳到避坑那章对照自己遇到过的怪问题。整条线就是:读懂COCO JSON、可视化标注、转YOLO格式、训练参数、验证方法,每一步都给出能直接抄的代码和参数说明。

2. 先读懂COCO JSON:标注结构决定你后面少踩多少坑

COCO格式本质上是一个JSON字典,最外层固定有三个键:images、annotations、categories。工业数据集一般不会像COCO2017那样有几十万张图,结构也会精简一些,但核心字段是一样的。你把它拆开看三分钟,后面转换、训练、排障都会顺手很多。

2.1 一张COCO JSON里到底存了什么:从images到annotations

先写一段最基础的读取代码,把数据集的“骨架”摸出来:

import json with open("annotations.json", "r", encoding="utf-8") as f: coco = json.load(f) print(coco.keys()) # 一般就是 dict_keys(['images', 'annotations', 'categories']) print("图片数量:", len(coco["images"])) print("标注数量:", len(coco["annotations"])) print("类别数量:", len(coco["categories"]))

运行结果一眼就能看出数据规模。images是一个列表,每个元素里包含id、file_name、width、height四个必填字段;annotations列表里每个元素包含id、image_id、category_id、bbox、area,有的还会带segmentation和iscrowd;categories列表里通常有supercategory、id、name。

再看一眼类别是怎么定义的:

for cat in coco["categories"]: print(cat)

这一步非常关键。很多工业数据集的category_id并不是0、1、2连续编号,可能是从1直接跳到5,甚至把“背景”也定义成了一个类别。如果你后面直接把category_id当YOLO的class_id用,训练时大概率会报类别数不匹配,或者更隐蔽地出现“铁棍被识别成垃圾”这种错位。我拿到任何COCO标注的第一件事就是打印这份categories列表。

这段结构和COCO2017数据集结构完全一致,只是类别数量和id顺序不同。理解这本书,后面转YOLO格式时才不会凭感觉写映射。

2.2 用Python把COCO JSON解析成DataFrame:3个关键字段

转格式之前,我习惯把标注文件整理成一份DataFrame,方便统计每个类别的数量、bbox宽度和高度分布。用到的关键字段有三个:image_id、category_id、bbox。

import pandas as pd from collections import defaultdict cat_id2name = {c["id"]: c["name"] for c in coco["categories"]} rows = [] for ann in coco["annotations"]: rows.append({ "image_id": ann["image_id"], "category_id": ann["category_id"], "category_name": cat_id2name.get(ann["category_id"], "unknown"), "bbox": ann["bbox"], # [x, y, width, height],单位是像素 "area": ann["area"], "iscrowd": ann.get("iscrowd", 0) }) df = pd.DataFrame(rows) print(df.groupby("category_name").size()) print(df["bbox"].apply(lambda b: b[2] * b[3] < 100).sum())

逻辑说明:这里给每个标注补上类别名,后面所有统计都以这个DataFrame为基础。area字段是标注工具算好的像素面积,但它不一定可靠,我一般用bbox反算。最后一行统计那些面积小于100像素的框,如果数量很多,说明这批标注里有大量极小的目标,后面训练时imgsz就得往大了设,否则这些小异物在缩略图里直接消失。

参数说明:bbox是[x, y, width, height]的四元组列表,不是中心点坐标。这个语义一定要记牢,否则第3章的转换脚本会写成另一套公式。

建议你再算一下bbox宽高比分布,用numpy一行就能出:

import numpy as np wh = np.array([ann["bbox"][2:] for ann in coco["annotations"]]) print("宽高比中位数:", np.median(wh[:, 0] / wh[:, 1]))

传送带上的铁棍通常是长条,宽高比中位数如果大于3,说明数据里有大量细长目标,之后训练和推理都要按小目标、极端宽高比来对待。

2.3 不画框看不出标注质量:用OpenCV可视化标注

把标注直接画在图片上,是检查数据质量最值钱的一步。这一步能发现类别标反、框偏、框没贴住目标等肉眼问题。代码里我直接遍历前5张图,画好框后存成文件。

import cv2 import os img_id2file = {img["id"]: img["file_name"] for img in coco["images"]} anns_by_img = defaultdict(list) for ann in coco["annotations"]: anns_by_img[ann["image_id"]].append(ann) def draw_boxes(image_id, out_path="vis/"): os.makedirs(out_path, exist_ok=True) img_path = os.path.join("images", img_id2file[image_id]) img = cv2.imread(img_path) if img is None: print(f"图片读取失败: {img_path}") return for ann in anns_by_img[image_id]: x, y, w, h = [int(v) for v in ann["bbox"]] name = cat_id2name.get(ann["category_id"], "?") cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(img, name, (x, max(0, y - 6)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.imwrite(f"{out_path}/{image_id}.jpg", img) for aid in list(img_id2file)[:5]: draw_boxes(aid)

逻辑说明:img_id2file把图片id映射到文件名,anns_by_img按图片id聚合标注。draw_boxes里用OpenCV画矩形时,用的还是COCO的左上角坐标公式,直接(x, y)到(x+w, y+h),没有做任何转换。

参数说明:os.path.join("images", img_id2file[image_id]) 里的"images"是图片所在目录,如果你的标注里file_name带了子目录,比如train/a.jpg,这里就要改成os.path.join("images", os.path.dirname(img_id2file[image_id])),否则读取会失败。

如果画出来的框整体往右上角偏半个身位,先别急着怀疑标注质量,检查一下图片是不是带了Exif旋转信息,OpenCV默认不处理这个,读进来就是旋转后的图,但有旋转信息的原图宽高和标注宽高是反的。这个问题我在第5章会专门展开写。

3. 把COCO转成YOLO格式:转换脚本与四个边界坑

转格式本身不复杂,复杂的是那些一眼看不到的边界条件。这里给出一个能直接跑的转换脚本,然后把最容易出问题的四个点单独拎出来讲清楚。

3.1 为什么不能直接把category_id当YOLO类别号

YOLO的标签是每个txt文件一行一条,格式为class_id cx cy w h,其中class_id必须是从0开始的连续整数。COCO数据集里的category_id是标注平台生成的,经常出现1、3、5这种跳号,有时还会把背景类放进categories里充数。

我在上一章已经让你打印过categories,现在继续说映射怎么写:

cat_ids = [c["id"] for c in coco["categories"]] cat_id2label = {cid: i for i, cid in enumerate(cat_ids)} print(cat_id2label)

注意,这里不是按id大小排序,而是按categories列表里出现的顺序重新编号。比如categories里铁棍的id是3、垃圾的id是5,那映射后铁棍就是0、垃圾就是1。如果categories列表里混着一个背景类,你要先把它过滤掉再建立映射,否则类别编号会多出一位,训练时数据加载就会出问题。

3.2 转换脚本:COCO的xywh到YOLO的xywh

COCO的bbox是[x, y, width, height],x和y是左上角坐标,单位是像素。YOLO需要的是归一化后的中心点坐标和宽高。转换公式是把左上角转换成中心点,再分别除以图片宽高。

import json import os def coco_to_yolo(json_path, img_dir, out_dir): with open(json_path, "r", encoding="utf-8") as f: coco = json.load(f) # 类别重新映射:COCO的category_id -> 从0开始的连续整数 cat_ids = [c["id"] for c in coco["categories"]] cat_id2label = {cid: i for i, cid in enumerate(cat_ids)} # 图片信息索引 img_id2info = {} for img in coco["images"]: img_id2info[img["id"]] = img # 按图片聚合标注,同时过滤掉iscrowd的群体标注 anns_by_img = {} for ann in coco["annotations"]: if ann.get("iscrowd", 0) == 1: continue anns_by_img.setdefault(ann["image_id"], []).append(ann) os.makedirs(out_dir, exist_ok=True) for img_id, img in img_id2info.items(): w, h = img["width"], img["height"] if w == 0 or h == 0: continue name = os.path.splitext(img["file_name"])[0] txt_path = os.path.join(out_dir, name + ".txt") lines = [] for ann in anns_by_img.get(img_id, []): label = cat_id2label[ann["category_id"]] x, y, bw, bh = ann["bbox"] if bw <= 0 or bh <= 0: continue cx = (x + bw / 2) / w cy = (y + bh / 2) / h nw = bw / w nh = bh / h # 越界截断,防止归一化后坐标小于0或大于1 cx = min(max(cx, 0.0), 1.0) cy = min(max(cy, 0.0), 1.0) nw = min(nw, 1.0) nh = min(nh, 1.0) lines.append(f"{label} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}") with open(txt_path, "w", encoding="utf-8") as f: f.write("\n".join(lines)) coco_to_yolo("annotations.json", "images", "labels")

逻辑说明:脚本先建立图片信息索引和标注聚合,再逐张图处理。关键点有两个:一是iscrowd的群体标注直接跳过,因为工业异物检测里这类标注多半是大面积遮挡,训练时反而干扰;二是越界截断,部分标注平台会导出超出图片边界的框,如果不截断,YOLO在训练时会用不存在的背景区域去拟合,严重拖慢收敛。

参数说明:bw和bh是bbox里的宽度和高度,不是右下角坐标。cx和cy算的是中心点归一化坐标,取值范围在0到1之间。这里保留了6位小数,对于1280分辨率的图已经足够,完全没必要再往高了写。txt文件名只取了file_name的主干部分,如果你的file_name带子目录,记得在out_dir里按同样的目录结构创建子目录。

3.3 四个坐标归一化的边界坑

坑1是图片宽高和COCO记录不一致。有些采集端先呢缩放再标注,有些是先标注后裁剪,导致JSON里的width/height和实际图片对不上。转格式前用cv2读一遍所有图片的实际尺寸,如果发现有偏差,以实际尺寸为准重新归一化,否则画出来的框整体偏移。

坑2是bbox坐标语义被混用。COCO的bbox是左上角(x, y),但有些标注工具导出时字段名也叫bbox,存的却是中心点坐标。这种问题光看数值发现不了,只有可视化才能看出“偏移了半个框”。所以我每转完一批数据,都会挑三张图重新可视化一遍。

坑3是文件名相同、目录不同。COCO的file_name允许带子目录,比如train/001.jpg和val/001.jpg同时存在,如果转换脚本只取文件名主干,两个txt会互相覆盖。处理方式是os.path.jp在out_dir下保留相对目录,用os.path.splitext之前先取os.path.dirname。

坑4是全景大图特写混排。传送带场景常有大全景和局部特写混在一起,虽然归一化坐标不受影响,但resize后小目标会被抹掉,大目标会占满整个画面。我一般会先把长边超过1920的图按比例缩到1280以下再训练,缩放后归一化坐标不需要变,只需要同步更新图片尺寸和训练配置里的img_size就行。

4. 用YOLOv8训练传送带异物检测:数据集划分与参数设置

转好格式只是第一步,训练配置才是决定模型能不能用的关键。这一章基于YOLOv8来讲,如果你用yolov5,逻辑基本一致,只是命令行参数名略有差别。

4.1 数据集划分:train/val的比例与随机种子

工业场景下数据量通常不多,几百张到几千张都算正常。划分时固定随机种子,保证每次跑出来的结果可复现。

import os import random import shutil random.seed(42) img_dir = "images" label_dir = "labels" out_base = "dataset" train_img = f"{out_base}/train/images" train_lbl = f"{out_base}/train/labels" val_img = f"{out_base}/val/images" val_lbl = f"{out_base}/val/labels" for d in [train_img, train_lbl, val_img, val_lbl]: os.makedirs(d, exist_ok=True) files = [f for f in os.listdir(img_dir) if f.lower().endswith((".jpg", ".png", ".jpeg"))] random.shuffle(files) val_num = int(len(files) * 0.15) val_files = files[:val_num] train_files = files[val_num:] def copy_set(file_list, img_dst, lbl_dst): for f in file_list: shutil.copy(os.path.join(img_dir, f), os.path.join(img_dst, f)) lbl = os.path.splitext(f)[0] + ".txt" src_lbl = os.path.join(label_dir, lbl) if os.path.exists(src_lbl): shutil.copy(src_lbl, os.path.join(lbl_dst, lbl)) copy_set(train_files, train_img, train_lbl) copy_set(val_files, val_img, val_lbl) print(f"train: {len(train_files)}, val: {len(val_files)}")

逻辑说明:copy_set会同时复制图片和对应的txt标签。如果一张图没有对应的txt,说明它是空图或标签缺失,脚本会跳过标签复制,不会让文件对不上。

参数说明:val占比15%是我在工业质检项目里的常用值。如果数据量只有两三百张,验证集不要超过20%,不然训练集太薄模型学不到足够的纹理特征。另外千万不要按按时间顺序划分,传送带在不同班次光线差异很大,随机打散能把这种光照差异均匀分到两边。

空图也要参与训练,让模型学会“没有异物”的场景。如果你这份数据集里大量图片确实没有异物,建议在划分时保留一部分空图作为负样本。负样本能把误检率压下来,实际部署时感受特别明显。

4.2 data.yaml怎么写:类别名要和转换结果对应

YOLOv8(同样适用yolov5)训练时需要一份data.yaml文件,里面指定图片路径和类别名称。最容易翻车的就是names索引和转换脚本里cat_id2label映射不一致,一旦对不上,训练不报错但结果全是错位。

path: dataset train: train/images val: val/images names: 0: iron_bar 1: trash

写法说明:names的键不是COCO的category_id,而是你重新映射后的label编号。转换脚本里铁棍映射成0,这里names就得把iron_bar放在第0行。写完这份yaml之后,我建议在Python里再校验一遍:

label2name_yolo = {0: "iron_bar", 1: "trash"} print(label2name_yolo) # 手动对比cat_id2label的输出,确认类别顺序完全一致

这一步花不了十秒钟,却能杜绝“训练三天白干”的血泪事故。类别名用英文或拼音都可以,中文名在终端显示会乱码,字体文件也匹配不上,不推荐。

4.3 训练命令与三个必调参数

划分好数据集、写好配置,训练命令就很简单了。

yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ patience=20

跑之前先看这三项参数,它们基本决定了这个模型能不能用在传送带场景里:

参数建议值说明
epochs先30验证全流程,再100以上数据量小但mAP没到阈值,就继续加上去;别一上来就300
imgsz640起步,目标小就1280传送带画面往往是宽幅全景,imgsz太小会让小目标直接消失
batch显存一半,OOM就减半8G显存跑yolov8n建议batch=16,换成yolov8l就直接砍到4

逻辑说明:model用yolov8n预训练权重,不是随机初始化,这是训练收敛速度快很多的关键。如果你的数据类别只有铁棍和垃圾两类,且样本量不大,yolov8s就够了,yolov8x那种大模型不仅慢,在小数据集上还容易过拟合。patience是早停参数,连续20个epoch验证集mAP没有提升就自动停,能省不少电费。

训练日志里重点关注两个时间点:第一个epoch结束后看loss是不是明显下降,如果loss纹丝不动,多半是标签文件没配对;前30个epoch结束后看precision和recall曲线,如果两条线差得特别远,说明模型要么漏检严重,要么误检严重,要回头检查数据而不是继续加epoch。

4.4 传送带小目标:为什么细长铁棍容易漏检

细长物体是目标检测的硬伤。铁棍在传送带全景图上往往只有3到6像素宽、几十像素长,经过resize后宽度只剩一两个像素,卷积核扫过时特征直接糊掉。垃圾这类团状目标还好,细铁棍是真真切切的重灾区。

遇到这种情况,先看一下这个位置:

yolo detect train ... # 训练日志里会自动显示Best anchors,倒着往上翻几行能看到

如果Best anchors里找不到宽高比大于5的锚框,说明默认anchor和你的数据几何不匹配。这时候不要手动硬改anchor,最有效的做法是把imgsz提高到1280,让铁棍在图上多占几个像素;推理阶段再用SAHI切片放大,效果立竿见影。

训练增强方面,YOLOv8默认开Mosaic,它对小目标并不友好,因为拼接后目标会变得更小。如果你发现铁棍漏检率高,可以先关掉Mosaic试一轮对比,用mosaic=0.0这个超参控制。数据量只有几百张时,迁移学习加小幅增强比堆增强更稳。

5. 传送带异物检测常见问题与避坑:5条实测记录

这一章写过锅记录,都是工业数据上真实出现过的场景。每条按现象、原因、解决三步写,新朋友过一遍,比自己踩完再复盘省几天时间。

5.1 训练loss不下降、检测不到任何物体

现象:训练前几十个epoch loss一直高位徘徊,跑完一个完整epoch验证集mAP常年0。

原因:最常见的是标签文件没生成或生成到了错误位置。COCO的file_name带了子目录,而转换脚本直接用os.path.splitext取主干,txt全部堆在out_dir根目录,图片却按子目录读取,结果一张图都匹配不上标签。

解决:训练前先数一下图片数量、标签数量和匹配数。一条命令的事:

find images -name "*.jpg" | wc -l find labels -name "*.txt" | wc -l

对不上的时候,回到转换脚本,在os.path.join(out_dir, name + ".txt")前补上dir = os.path.dirname(img["file_name"]),在out_dir下重建相对目录。

5.2 验证时所有目标都被标成“垃圾”

现象:训练结束,mAP看着还行,但混淆矩阵上对角线铁棍那一格是0,垃圾那格几乎全亮,也就是真铁棍全被预测成垃圾。

原因:类别映射错位。COCO里铁棍是2、垃圾是5,但转换脚本直接拿category_id当class_id。YOLO读到class_id=5时,会去data.yaml里找索引为5的类别,如果moooooth数据集只有两个类,越界或者串位就不可避免。

解决:转换脚本里把cat_id2label打印出来,再对照data.yaml里的names逐个看一遍。每个新数据集我都手动做一遍这个确认,这个习惯能挡掉百分之八十的玄学问题。

5.3 可视化时框是歪的或位置偏左上

现象:转出来的txt坐标看起来正常,但画图时框整体偏左上,偏移量还和目标大小相关,目标越大偏得越多。

原因:COCO的bbox是左上角坐标,但下载到的数据集内部其实混用了另一种标注,bbox字段存的是中心点坐标。转换脚本仍按左上角公式处理,中心点被当成了左上角,偏差正好是半个框。

解决:转格式前后各挑三张相同图片做可视化对比,如果偏移模式是“固定的半个框”,把所有标注当做中心点格式重新归一化。有些标注是半自动生成的,你不能完全相信标注工具的选型描述。

5.4 YOLO报错 number of classes does not match

现象:训练脚本跑到中途报错,提示类别数量不匹配,或者标签索引溢出了names范围。

原因:COCO数据集把“background”也放进了categories,id占用了0号位;又或者iscrowd人群标注没有被过滤,转换成txt后混入了无效类别号。

解决:转换脚本里对categories先做一次过滤,只保留真正要训练的类别:

# 默认过滤掉名字是background、bg、fill之类的类别 filtered_cats = [c for c in coco["categories"] if c["name"].lower() not in ["background", "bg"]] cat_ids = [c["id"] for c in filtered_cats]

同时跳过iscrowd为1的标注。过滤完再重新检查一遍cat_id2label和names长度,确保一一对应。

5.5 细长铁棍在resize后变成1像素宽

现象:imgsz=640训练后,长铁棍漏检率很高,短铁棍能检出,铁棍越长反而越漏。

原因:传送带全景图上铁棍宽度可能只有10来个像素,resize到640后宽度只剩2到3像素。这根线的语义信息在卷积下采样两轮之后就彻底没了。验证集困惑矩阵上的漏检基本都是这种细长目标。

解决:imgsz拉到1280是最直接的手段,代价是训练慢一倍。推理阶段用SAHI切片,256到320的切片尺寸能让细铁棍恢复出足够宽度;如果你嫌切片慢,就先把图像超分再走检测,但现场部署一般没这个算力,不如直接用切片。

6. 验证技巧:用混淆矩阵和PR曲线确认模型真的能抓铁棍

6.1 跑一次验证,看confusion_matrix.png

训练结束后,用best权重跑一次验证命令:

yolo detect val \ model=runs/detect/train/weights/best.pt \ data=data.yaml \ imgsz=640 \ batch=16

运行输出在runs/detect/val目录,重点看两个文件:confusion_matrix.png和PR_curve.png。看混淆矩阵时先看对角线亮度。如果只有铁棍和垃圾两类,对角线应该非常亮,铁棍预测成垃圾那一格最好接近0。工业场景里漏检比误检带来的损失大,宁可垃圾里混点铁棍的预测,也不能让铁棍漏过。

6.2 PR曲线怎么看

PR曲线横轴是召回率,纵轴是精确率。关注曲线下的AP@0.5那个数字,报出来如果低于0.8,基本直接部署会出问题。但曲线只代表统计意义上的好坏,我更建议按现场工况做一次烟囱验证:挑20张传送带实拍图,手动塞几根铁棍和垃圾,让模型跑一遍,肉眼数一下漏检和误检。比任何指标都直白。

6.3 进阶:用SAHI做切片推理,专治细长小目标

细长铁棍只靠imgsz可能还不够,推理阶段用SAHI把全景图切片后逐块检测,效果更稳。

from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model = AutoDetectionModel.from_pretrained( model_type="yolov8", model_path="runs/detect/train/weights/best.pt", confidence_threshold=0.25, image_size=640, ) result = get_sliced_prediction( "scene.jpg", model, slice_height=256, slice_width=256, overlap_height_ratio=0.2, overlap_width_ratio=0.2, ) result.export_visuals(export_dir="sahi_out/")

逻辑说明:get_sliced_prediction会把全景图切成若干个256x256的切片,每个切片独立过模型,再把结果合并回原图坐标。切片尺寸不要调太小,256够了,再小会把长铁棍切成好几段,模型反而认不出。

参数说明:overlap重叠率设为0.2,是为了防止目标恰好卡在切片边缘被截断。这个值不用太高,高了会让同一个目标被检测多次,还得额外做去重。切片推理会让每张全景图跑多次模型,现场如果只有CPU会很吃力,至少得上张普通GPU卡。

最后说一个我个人的习惯:每拿到一份数据集,第一件事永远是打印类别、画三张框、统计宽高比,三件事做完才转格式。这个习惯是从一次“类别全错位,白训三天”的教训里逼出来的。数据集的格式坑往往比模型结构更难查,多花半小时的检查,能让你后面少熬三个通宵。希望帮到你。

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

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

人群密度目标检测数据集:8,000张图像 | 目标检测

人群密度目标检测数据集&#xff1a;8,000张图像 | 目标检测 源码数据分享 链接: https://pan.baidu.com/s/1O4OhWVQqKTHvONkQ7IpV7A?pwduv7c 提取码: uv7c 一、引言&#xff1a;人群密度检测的安全命题 在全球城市化进程中&#xff0c;大规模人群聚集已成为城市运行的常态场…

作者头像 李华
网站建设 2026/10/5 7:30:25

用Rust从零驱动彩色墨水屏:reTerminal E1002实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 7:30:10

DeepSeek回答导出全攻略:网页、API、本地部署与Harness场景实操

很多人聊到DeepSeek都会问“这东西回答得真不错&#xff0c;但怎么把内容好好存下来”。这是个特别实际的问题&#xff0c;尤其当你拿它整理行业报告、写代码、做会议纪要&#xff0c;甚至把多轮对话当成工作资料的时候。网页里说得再漂亮&#xff0c;关掉标签页全没了&#xf…

作者头像 李华
网站建设 2026/10/5 7:29:55

VS Code 从安装到配置:C/C++、Python、远程开发与AI助手完整指南

说实话&#xff0c;VS Code 这个编辑器火起来之后&#xff0c;我看到最多的求助帖不是“怎么下载”&#xff0c;而是“装好之后不知道怎么配&#xff0c;配完又各种报错”。很多朋友把它当成像 Office 一样的软件&#xff0c;装上就希望能直接用&#xff0c;结果打开一个 C 文件…

作者头像 李华
网站建设 2026/10/5 7:28:44

Word字体替换全攻略:数字字母一键改为Times New Roman

先说个我自己的踩坑经历。前两年帮一个师妹改毕业论文格式&#xff0c;学校的要求写得清清楚楚&#xff1a;中文用宋体&#xff0c;数字和字母用Times New Roman。我当时心想这还不简单&#xff0c;全选、改字体、完事。结果一抬头&#xff0c;整篇文档的中文全变成了Times New…

作者头像 李华
网站建设 2026/10/5 7:27:44

AI+少年成长陪伴平台:计算机毕设选题、系统设计与答辩全攻略

做计算机毕业设计最怕什么&#xff1f;不是代码写不出来&#xff0c;而是题目选得太空、工作量堆不够、答辩老师一追问就露馅。“人工智能”少年智慧成长陪伴平台&#xff0c;这个项目我前前后后带过好几轮学生&#xff0c;从选题、搭系统、写论文到录演示视频&#xff0c;每一…

作者头像 李华