新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv8目标检测实战:200类鸟类智能识别系统从训练到ONNX部署

发布时间:2026/10/2 9:02:06来源:尧图网络
YOLOv8目标检测实战:200类鸟类智能识别系统从训练到ONNX部署
简介基于YoloV8的200类鸟类智能检测与识别系统是一套可直接运行的深度学习项目资源面向计算机视觉开发者、生态科研人员及鸟类监测爱好者。系统集成Python源码、ONNX模型、评估指标曲线与精美GUI界面支持在Windows10Python3.8环境中部署可实现多种鸟类目标的快速检测与分类适用于野生动物保护、生物多样性观测等场景。压缩包共302个文件包含278张鸟类样本图片、YoloV8训练与推理脚本、ONNX权重文件、界面资源与评估结果图表整体约22.72MB文件结构清晰便于按需调用。目前已有412人学习下载。资源价值在于提供从模型推理到可视化交互的完整闭环用户可直接运行GUI进行检测也可借助ONNX模型跨框架部署评估曲线便于快速判断模型精度与召回表现附带的图片与XML标注数据还可用于二次训练或迁移学习特别适合需要快速搭建鸟类识别原型的中高级开发者。1. 这个 zip 里到底装的是什么一条从数据到界面的完整链路「基于yolov8的200鸟类智能检测与识别系统」这名字拆开看是四样东西被装进了一个压缩包Python源码、ONNX模型、评估指标曲线、GUI界面。这套东西解决的是野外鸟类调查里最常见的场景——一张照片里可能同时出现好几只鸟系统要做的不是简单分类而是把每只鸟的位置框出来、给出鸟种和置信度而且最好在没有NVIDIA显卡的电脑上也能快速跑起来。源码负责训练和验证链路ONNX模型让推理可以脱离PyTorch环境评估指标曲线回答「模型到底靠不靠谱」GUI则把整个流程收口成点一下按钮就能用的工具。适合三类人做生态样线调查的工程师、想把YOLOv8完整落地一遍的开发者、需要离线演示识别效果的项目组。这个方向能不能落地很大程度上不取决于你手里的模型权重有多好而取决于数据、阈值和部署链路这三个环节是否闭环。2. 先拆数据把200类鸟类数据集整理成YOLOv8能吃的标签格式2.1 CUB-200-2011 的文件结构四个 txt 配一个 images 目录标题里的「200鸟类」最常见的公开数据集是CUB-200-2011Caltech-UCSD Birds-200共11788张图片、200个鸟种。如果你拿到的zip里自带训练集但不是这个结构转换思路也完全一样关键是明白YOLOv8要的是什么每一张图对应一个同名txt里面每一行是「类别ID、归一化中心x、归一化中心y、归一化宽、归一化高」。CUB原始目录长这样CUB_200_2011/ ├── images/ # 200个类别子目录 │ ├── 001.Black_footed_Albatross/ │ ├── 002.Laysan_Albatross/ │ └── ... ├── images.txt # 图片ID 相对路径 ├── labels.txt # 图片ID 类别ID(1~200) ├── bounding_boxes.txt # 图片ID x y w h └── train_test_split.txt # 图片ID 是否为训练集这四个txt各管一件事但靠图片ID关联。images.txt里的路径带有类别子目录名不过不要用目录名去推类别ID因为CUB的类别编号是按它自己定义的顺序排的和目录字母序并不保证一致。labels.txt里给的数字才是真正的类别ID。另外训练集和验证集的划分要看train_test_split.txt里面标记1的是训练集0是验证集这个文件本身已经帮你分好了不需要自己按比例随机切。2.2 坐标转换脚本从左上角宽高到归一化中心点拿到原始CUB之后直接训练YOLOv8是跑不起来的必须写一个转换脚本。我一般把它放在数据集目录的外层输出一个独立的bird_yolo目录尽量不动原始数据。脚本如下import cv2 from pathlib import Path CUB Path(CUB_200_2011) OUT Path(bird_yolo) # 图片ID - 相对路径 img_path {} with open(CUB / images.txt) as f: for line in f: iid, rel line.strip().split() img_path[int(iid)] rel # 图片ID - 类别IDCUB从1开始YOLO从0开始这里直接减1 cls_of {} with open(CUB / labels.txt) as f: for line in f: iid, cid line.strip().split() cls_of[int(iid)] int(cid) - 1 # 图片ID - 左上角框 [x, y, w, h] box_of {} with open(CUB / bounding_boxes.txt) as f: for line in f: parts line.strip().split() iid int(parts[0]) box_of[iid] [float(v) for v in parts[1:]] # 图片ID - 训练/验证标记 split_of {} with open(CUB / train_test_split.txt) as f: for line in f: iid, is_train line.strip().split() split_of[int(iid)] int(is_train) # 逐图转换并写YOLO标签 for iid, rel in img_path.items(): sub train if split_of[iid] 1 else val img cv2.imread(str(CUB / images / rel)) H, W img.shape[:2] x, y, w, h box_of[iid] # 左上角 - 中心点再归一化到[0,1] cx (x w / 2) / W cy (y h / 2) / H nw w / W nh h / H # 防止部分标注框越界 cx min(max(cx, 0.0), 1.0) cy min(max(cy, 0.0), 1.0) nw min(max(nw, 0.0), 1.0) nh min(max(nh, 0.0), 1.0) out_img_dir OUT / images / sub out_lbl_dir OUT / labels / sub out_img_dir.mkdir(parentsTrue, exist_okTrue) out_lbl_dir.mkdir(parentsTrue, exist_okTrue) name Path(rel).name cv2.imwrite(str(out_img_dir / name), img) with open(out_lbl_dir / (Path(rel).stem .txt), w) as f: f.write(f{cls_of[iid]} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n)这个脚本里有三个关键参数不能省一是类别ID减1CUB的labels.txt从1开始而YOLO的class_id从0开始二是clip到[0,1]CUB部分框标得比较松xw偶尔会超出图片宽度不处理的话训练时会刷警告严重时会让损失直接变成NaN三是归一化精度保留6位小数精度太低会让小目标框抖动。如果某一框的w或h归一化后小于0.003也就是大约2像素建议直接跳过这种框对检测训练基本只有噪声。转换完以后bird_yolo/data.yaml按下面的样子写names顺序必须和cls_of里减1之后的编号对应不能靠目录名猜path: ./bird_yolo train: images/train val: images/val nc: 200 names: 0: Black_footed_Albatross 1: Laysan_Albatross 2: Sooty_Albatross # 后续直到199共200类2.3 类别映射与 train/val 划分三个容易错的地方转换完成之后还有三个地方需要逐个确认不然训练阶段会以各种奇怪方式报错。第一个坑是CUB的目录名和类别编号不一致。images/下的子目录是字母序但labels.txt的编号按CUB自定义顺序排列两者不对齐。如果你靠目录名的先后顺序去生成类别映射训练出来的模型在GUI里显示的类名会张冠李戴。正确做法是只信labels.txtclasses.txt可以拿来核对名字不要自己重新编号。第二个坑是train_test_split.txt里1到底是训练还是验证。YOLOv5时代有些人习惯把1当成验证集一顺手就写反了结果训练集和验证集对调mAP曲线整个是镜像的。上面代码里flag1写的是train不要改反。第三个坑是CUB单张图只有一个框而YOLO标签格式天然支持多框。如果你后续用LabelMe补标注导出JSON后再转YOLO格式时注意class_id要从0开始、文件名要和图片名完全一致LabelMe导出的JSON文件名常常带.json后缀转换脚本里要剥掉。如果这个zip里自带的数据集已经是你整理好的YOLO格式目录那第2章的转换可以跳过直接看data.yaml的路径有没有写对。如果拿到的是VOC XML或COCO JSON格式先把它们统一转成YOLO txt再进训练。标签格式是整个项目的地基地基偏了后面所有曲线都是假的。3. YOLOv8 训练先看显卡再谈参数的选型清单3.1 选 n 还是选 m6G 显存与 24G 显存是两条路YOLOv8按规模分成n、s、m、l、x五档n最轻x最重。200类输出头的参数量比COCO的80类大不少同样一张图显存占用会比微调80类模型更高。我的经验线是6G显存GTX 1660 Ti、RTX 2060用yolov8n起步imgsz640batch从8开始12G显存RTX 3060、4070用s或m24G显存3090、4090才建议直接上m并加大imgsz。选型可以参考下面这张表模型参数量6G显存12G显存CPU推理体验yolov8n约3M推荐推荐较快勉强流畅yolov8s约11M勉强推荐偏慢10秒级yolov8m约26M不建议可用卡顿不推荐桌面端模型不是越大越好200类鸟类里很多目标在画面中占比很小大模型提升的精度有限但推理时间翻倍。这个zip如果自称带「精美GUI界面」大概率是要在普通电脑上跑ONNX的训练时选n或s反而更贴近最终部署目标。用m训练完再导出ONNX到CPU跑桌面应用会卡到没法接受。3.2 训练命令与参数含义epochs、batch、imgsz、patience训练命令用Ultralytics官方CLI即可核心是data.yaml路径和一组针对200类小样本调过的参数yolo detect train \ modelyolov8n.pt \ databird_yolo/data.yaml \ epochs150 \ batch16 \ imgsz640 \ patience30 \ optimizerAdamW \ lr00.0005 \ cos_lrTrue \ ampTrue \ device0 \ projectruns \ namebird200各参数含义和取值理由如下参数默认值200类鸟类建议为什么这样调epochs100150每个类别样本只有30张左右要多轮次才能收敛batch168~166G显存用812G以上用16imgsz640640640够用对小型鸟可以试960但显存翻倍patience10030早停mAP不再上升就省时间lr00.010.0005微调预训练权重时学习率要压低cos_lrFalseTrue余弦衰减让后期收敛更稳ampTrueTrue混合精度显存占用几乎减半model用yolov8n.pt它本身是COCO 80类预训练权重加载时YOLOv8会自动把检测头替换成nc200你不用手动改网络结构。但data.yaml里的names列表一旦写错训练不会报错最后推理出来的类别名全是乱的。如果你用的是随机初始化的权重而不是yolov8n.pt200类、每类30张图基本训不出来所以预训练权重这件事不要省。训练过程中每个epoch会打印P、R、mAP50、mAP50-95这几列。如果到第80个epoch还在稳步上升说明patience30设得合理如果40轮就一动不动说明学习率太低或模型容量不够不用硬等150轮。batch16报OOM时不要急着把imgsz降到480那会直接拉低小目标检测率。正确顺序是先降batch到8保持imgsz640还不行再考虑imgsz544。3.3 中断恢复与数据增强两个省时间的设置训练到一半断电、蓝屏、被系统重启都是常事。YOLOv8会在runs/bird200/weights里存last.pt恢复命令是yolo detect train resume modelruns/bird200/weights/last.pt这里有个容易翻车的点resume时命令行不要再传data、epochs这些参数它从last.pt的ckpt里恢复。如果你改了数据集路径再resume加载会直接报错。另外第一次训练会在bird_yolo目录生成labels.cache文件第二次训练明显变快。如果你改了标签文件或者新增了图片必须删掉这个cache再训练否则加载的还是旧缓存的标签你改的东西不生效。数据增强方面YOLOv8默认开了mosaic、fliplr、hsv等。对200类细粒度识别fliplr0.5的左右翻转增强是安全的但如果你发现某个类别训练集里全是朝左的鸟、验证集全是朝右的就不要关它。mosaic默认1.0对鸟类这种画面中有多目标、目标占比小的场景建议保持。flipud默认0不要乱开鸟类的上下翻转会对姿态识别产生误导。另外复现实验时建议固定seedCLI里没有就直接加一个seed0不然每次跑出来的mAP都有小浮动你没法判断参数改动到底有没有用。训练完成后runs/bird200/weights/best.pt就是后面的主力模型刚才所有曲线数据也都在runs/bird200/目录里躺着。4. 评估指标曲线与避坑怎么判断训练结果能不能用4.1 results.png 里的十张图先看 mAP50 再看 loss训练结束后runs/bird200/里会生成results.png和confusion_matrix.png。results.png从上到下依次是train/box_loss、train/cls_loss、train/dfl_loss、val/box_loss、val/cls_loss、val/dfl_loss、metrics/precision、metrics/recall、metrics/mAP50、metrics/mAP50-95。十张图挤在一张大图里很多人扫一眼mAP50就关了其实顺序有讲究。判断顺序应该这样先看metrics/mAP50曲线200类能做到0.6以上基本能上线做辅助识别。再对比mAP50和mAP50-95两者差得多说明边框质量不行框的位置不够贴目标这在鸟类这种细长体型上很常见很多鸟的尾巴和身体分界不明显框稍微大一点mAP50-95就往下掉。最后看val/loss在最后阶段有没有往上翘翘了就是过拟合应该回到更早的epoch取权重而不是用最后一个epoch。「评估指标曲线」在Ultralytics里其实不只是图所有数值都存在results.csv里。你可以用pandas读出来自己画更直观的图import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/bird200/results.csv) mAP50 df.filter(likemAP50).iloc[:, 0] mAP50_95 df.filter(likemAP50-95).iloc[:, 0] plt.plot(mAP50, labelmAP50) plt.plot(mAP50_95, labelmAP50-95) plt.legend() plt.xlabel(epoch) plt.savefig(bird_map.png)results.csv的列名在不同版本里格式略有差异甚至带前导空格用filter(likemAP50)去筛选比写死列名更稳。zip里如果自带评估指标曲线图多半就是从这里二次绘制的。4.2 混淆矩阵与 PR 曲线200 类里哪些鸟容易互认confusion_matrix.png是一张200x200的热力图对角线越亮越好。看非对角线就能发现哪些鸟种互相混淆比如两种海鸥、两种啄木鸟外观接近混淆高是正常的不代表模型坏了如果明显不同科的鸟混在一起就要回去查标签。val结束之后runs/bird200里还会生成val_batch0_pred.jpg这类可视化图网格中每张图同时带预测框和GT框预测框和真值框颜色不同一眼扫过去就能看到漏检和误检比看数字直观得多。如果某一只鸟在每张测试图里都被漏检多半是训练集里这个类别的样本视角太单一。PR曲线precision-recall curve在yolo val之后会生成它告诉你置信度阈值该设多少曲线右上角拐点附近的置信度就是「既不漏报也不误报」的平衡点这个值后面要直接写进GUI的默认阈值。4.3 训练期三大坑标签越界、类别数对不上、显存不够坑一训练时刷大量warning甚至loss为NaN。现象是终端滚动一堆「WARNING」或训练曲线突然出现断崖。原因是标签里的cx、cy、w、h有小于0或大于1的值常见是转换脚本没做clip或者手工标注时把框拉出了画面边界。解决回到2.2节的脚本加上clip过滤宽高小于2像素的框重转一遍然后删掉labels.cache再训练。坑二训练跑完mAP一直是0。现象是命令行打印的mAP50全是0或者训练时显示类别数不对。原因通常是data.yaml的names顺序和训练图里的class_id对不上或者类别ID不是从0开始连续。比如labels.txt里是1到200转换时忘了减1class_id200就超界了训练端会静默丢掉这些样本。解决写一段检查脚本统计所有label文件里的class idimport os from collections import Counter cnt Counter() for sub in [train, val]: d fbird_yolo/labels/{sub} for fn in os.listdir(d): with open(os.path.join(d, fn)) as f: for line in f: cid int(line.split()[0]) cnt[cid] 1 print(类别数:, len(cnt), 最大ID:, max(cnt))只要max不是199说明转换错了。类别数不等于200说明有类别没有样本这类别在训练时会被忽略但推理时永远不会输出。坑三batch16训练直接OOM。现象是torch.cuda.OutOfMemoryError中断训练。原因不只是显存200类分类头的梯度比80类大会额外吃显存。解决6G显存用n模型、batch8、ampTrue减少其他占用显存的程序。再不行就imgsz544但要做好小目标精度下降的心理准备。5. 从 PyTorch 到 ONNX导出、简化与 onnxruntime 推理5.1 模型导出export 命令与 opset 选择训练完的best.pt在runs/bird200/weights/。导出ONNX阶段推荐用固定shape、opset 12、开启simplifyyolo export modelruns/bird200/weights/best.pt formatonnx opset12 imgsz640 dynamicFalse simplifyTrueopset选12是兼容性最稳的选择13以上在部分推理框架里偶发算子兼容问题。dynamicFalse让输入shape固定为(1,3,640,640)CPU推理和NPU部署都更友好。simplifyTrue需要先装onnxsim它能合并掉一部分冗余算子让ONNX文件变小、推理稍微变快。如果你后续要部署到RK3588这类NPU导出时会先转成RKNN格式那种场景下ONNX一般也要保持固定shape所以这里从一开始就固定省得后面后悔。如果导出报错先检查onnx和onnxsim装了没有报「No module named onnx」就执行pip install onnx onnxsim。导出完成后runs/bird200/weights/best.onnx就是zip里那个onnx模型的来源。注意不要在命令行里改imgsz导出用的imgsz必须和训练一致否则输出张量的空间尺寸全对不上。5.2 onnxruntime 推理从输出张量到目标框的完整后处理ONNX模型不依赖PyTorchCPU上装个onnxruntime就能跑这正是zip里同时放onnx模型和GUI的原因。onnxruntime是推理引擎onnx是模型文件格式两者是两回事。推理代码核心是预处理、做一次前向、把输出张量解码成目标框import cv2 import numpy as np import onnxruntime as ort session ort.InferenceSession(best.onnx, providers[CPUExecutionProvider]) input_name session.get_inputs()[0].name def letterbox(img, size640): h, w img.shape[:2] r min(size / h, size / w) new_w, new_h int(round(w * r)), int(round(h * r)) dw, dh (size - new_w) / 2, (size - new_h) / 2 img cv2.resize(img, (new_w, new_h)) img cv2.copyMakeBorder(img, int(dh), int(dh), int(dw), int(dw), cv2.BORDER_CONSTANT, value(114, 114, 114)) return img, r, dw, dh img0 cv2.imread(bird.jpg) img, r, dw, dh letterbox(img0, 640) blob img[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 blob blob[None] out session.run(None, {input_name: blob})[0] # YOLOv8不同版本导出结果布局可能相反这里做兼容 if out.shape[1] 204 and out.shape[2] 8400: out out.transpose(0, 2, 1) # 变成 (1, 8400, 204) pred out[0] # (8400, 204) cx, cy, w, h 200类置信度 boxes pred[:, :4] scores pred[:, 4:] cls_id scores.argmax(-1) conf scores.max(-1) mask conf 0.35 boxes, conf, cls_id boxes[mask], conf[mask], cls_id[mask] # cxcywh - xyxy xyxy np.concatenate([boxes[:, :2] - boxes[:, 2:] / 2, boxes[:, :2] boxes[:, 2:] / 2], axis1) # 还原letterbox回到原图坐标系 xyxy (xyxy - [dw, dh, dw, dh]) / r # NMScv2.dnn.NMSBoxes需要(x, y, w, h) xywh np.concatenate([(xyxy[:, :2] xyxy[:, 2:]) / 2, xyxy[:, 2:] - xyxy[:, :2]], axis1) keep cv2.dnn.NMSBoxes(xywh.astype(float).tolist(), conf.astype(float).tolist(), 0.35, 0.45) keep np.array(keep).flatten() if len(keep) else []输出8400来自三个尺度特征图80x80加40x40加20x20。204等于4个框坐标加200个类别得分所以这里的204就是类别数加4如果你换数据集改了这个数后面所有代码里的204都要跟着改。置信度阈值0.35比训练时的0.25更保守因为GUI场景里误报比漏报更影响观感。最后NMS的IoU阈值0.45比较常规框特别密集的鸟类场景可以降到0.4减少同一只鸟被框两次的情况。5.3 导出后验证PyTorch 和 ONNX 的结果能不能对齐导出完不要直接塞进GUI先用同一张图做一次对比验证from ultralytics import YOLO pt_model YOLO(runs/bird200/weights/best.pt) r1 pt_model.predict(bird.jpg, conf0.35, imgsz640)[0] # r2 来自上一节onnx推理的结果对比每个框的坐标和置信度误差在2像素以内就算通过。如果发现同一张图ONNX比PyTorch少了几个目标先看NMS实现是否一致cv2.dnn.NMSBoxes和PyTorch的NMS阈值必须统一再看预处理letterbox不能一边用640一边用480。浮点误差导致框偏移一两像素是正常的不用怀疑导出过程。如果输出完全错乱大概率是导出和推理的尺寸不一致或者class名文件没对齐。6. GUI 界面与验收一个把评估曲线落到界面上的技巧6.1 PyQt5 加载 ONNX 的最小骨架这类系统的GUI通常用PyQt5搭一个图片显示区、一个结果列表、两个按钮打开图片、保存结果。核心逻辑很简单推理部分直接复用5.2节的代码from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog from PyQt5.QtGui import QPixmap, QImage import cv2 app QApplication([]) win QMainWindow() win.setWindowTitle(200鸟类检测识别) def open_and_infer(): path, _ QFileDialog.getOpenFileName(win, 选择图片) img cv2.imread(path) dets infer_onnx(img) # 复用5.2节推理函数返回框、类别、置信度 for (x1, y1, x2, y2, cid, conf) in dets: cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(img, f{names[cid]} {conf:.2f}, (int(x1), int(y1)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) qimg QImage(rgb.data, rgb.shape[1], rgb.shape[0], QImage.Format_RGB888) label.setPixmap(QPixmap.fromImage(qimg))GUI的「精美」主要靠QSS样式表实现给按钮加圆角边框、给图片显示区加阴影、结果列表里用不同颜色区分置信度高低。但界面再好看模型不准也没人用。6.2 用评估曲线定 GUI 的默认置信度一个平时容易漏掉的经验GUI的置信度滑块默认值不要拍脑袋。打开第4章说的results.csv找到metrics/precision和metrics/recall两条曲线它们交点对应的置信度就是最佳平衡点。比如交点是0.42GUI里置信度默认就设0.45略高于交点压制误报。如果某类鸟mAP50不到0.5在GUI里把它的最低置信度调到0.6宁可少显示也不要乱报。如果后面要把ONNX部署到NPU做int8量化量化完必须重新看一眼mAP曲线掉点超过2%就得换回FP16这是量化部署里的常见翻车点。每次改完GUI我会拿一张难图验收画面里两只鸟叠在一起、背景杂乱、鸟在画面边缘。这种图能框对系统才算真正能用。训练一个项目后我习惯把所有评估曲线和GUI截图放到同一个目录留档下次改模型直接从曲线对比效果而不是凭感觉调阈值。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

GitHub热搜背后的开发实战:访问优化、项目评估与AI辅助全指南 2026/10/2 11:26:50

GitHub热搜背后的开发实战:访问优化、项目评估与AI辅助全指南

我前些天刷 GitHub 日榜,注意到热搜词里“github打不开”“github下载”“github 加速”“github学生认证会过期吗”这些词又扎堆出现了。作为一个每天要在 GitHub 上看 Issue、提 PR、拉代码的重度用户,我太清楚这些词背后到底意味着什么了:…

阅读更多 →
同花顺数据自动导入Excel:Python清洗+VBA刷新全流程解析 2026/10/2 11:26:50

同花顺数据自动导入Excel:Python清洗+VBA刷新全流程解析

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

阅读更多 →
MFC DataGrid 实战:ADO 绑定、列格式与排序避坑指南 2026/10/2 11:26:50

MFC DataGrid 实战:ADO 绑定、列格式与排序避坑指南

简介:这份资源面向使用 VC/MFC 进行桌面开发的程序员,尤其是需要在对话框或文档视图程序中嵌入表格控件、展示数据库查询结果的开发者。内容围绕 MFC 中 DataGrid 控件的实际用法展开,涵盖将 ADO 记录集绑定为数据源以显示查询结果、通过 CCo…

阅读更多 →
claude-desktop-buddy GIF 角色包压缩指南:用 prep_character.py 与 gifsicle 轻松压到 1.8MB 2026/10/2 11:26:43

claude-desktop-buddy GIF 角色包压缩指南:用 prep_character.py 与 gifsicle 轻松压到 1.8MB

claude-desktop-buddy GIF 角色包压缩指南:用 prep_character.py 与 gifsicle 轻松压到 1.8MB 【免费下载链接】claude-desktop-buddy Reference and an example for the Bluetooth API for makers in Claude Cowork & Claude Code Desktop 项目地址: https:/…

阅读更多 →
openrig:用YAML统一编排claude code与codex的AI编程工具配置 2026/10/2 11:26:43

openrig:用YAML统一编排claude code与codex的AI编程工具配置

1. openrig 到底是个什么东西第一次看到 openrig 这个名字,很多人会以为是某个硬件外设或者机械臂项目,毕竟 rig 这个词在工程领域通常指“装配、搭建、索具”。但结合 claude code、codex、yaml、node.js 这几个热搜词一起看,方向就很清楚了…

阅读更多 →
Eclipse CDT+MinGW搭建C语言开发环境完整教程 2026/10/2 11:26:43

Eclipse CDT+MinGW搭建C语言开发环境完整教程

简介:这是一份详细介绍使用 EclipseCDTMinGW 搭建 C 语言开发环境的操作指南,适合希望在 Eclipse 下进行 C/C 开发、但对工具链配置不熟悉的初学者。文档从软件下载开始,逐步讲解 Eclipse SDK、CDT 与 MinGW 的安装方法,并给出了 …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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