当前位置: 首页 > news >正文

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章:计算机视觉中图像的基础认知
第二章:计算机视觉:卷积神经网络(CNN)基本概念(一)
第三章:计算机视觉:卷积神经网络(CNN)基本概念(二)
第四章:搭建一个经典的LeNet5神经网络(附代码)
第五章:计算机视觉:神经网络实战之手势识别(附代码)
第六章:计算机视觉:目标检测从简单到容易(附代码)
第七章:MTCNN 人脸检测技术揭秘:原理、实现与实战(附代码)
第八章:探索YOLO技术:目标检测的高效解决方案
第九章:计算机视觉:主流数据集整理
第十章:生成对抗网络(GAN):从概念到代码实践(附代码)
第十一章:计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)
第十二章:计算机视觉:YOLOv11遥感图像目标检测(附代码)

在计算机视觉(CV)领域,无论是进行目标检测、图像分类还是其他任务,理解如何处理不同格式的数据集以及掌握训练过程中涉及的关键指标至关重要。本文将探讨三种经典的数据格式(VOC、YOLO、COCO)

一、VOC 格式

VOC(Visual Object Classes)格式是一种广泛应用于目标检测任务的数据标注标准,尤其常见于PASCAL VOC挑战赛中。它使用XML文件来存储图像中的对象位置信息和类别信息。

文件结构与内容

每个图像对应一个XML文件,该文件包含了图像的基本信息以及图像中每个对象的位置和类别标签。以下是一个典型的VOC格式XML文件的内容示例:

<annotation><folder>images</folder><filename>000001.jpg</filename><size><width>500</width><height>375</height><depth>3</depth></size><object><name>dog</name><pose>Left</pose><truncated>1</truncated><difficult>0</difficult><bndbox><xmin>263</xmin><ymin>211</ymin><xmax>324</xmax><ymax>339</ymax></bndbox></object><object><name>person</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>159</xmin><ymin>59</ymin><xmax>281</xmax><ymax>287</ymax></bndbox></object>
</annotation>

关键元素说明

  • <folder>:包含图像的文件夹名称。
  • <filename>:图像文件名。
  • <size>:描述图像尺寸,包括宽度、高度和深度(通常是3表示RGB图像)。
  • <object>:每个对象的信息块,可以有多个,每个对象包含:
    • <name>:对象类别名称。
    • <pose>:拍摄时物体的姿态。
    • <truncated>:指示物体是否被裁剪(部分位于图像外)。
    • <difficult>:指示物体是否难以识别。
    • <bndbox>:边界框坐标,包括:
      • <xmin>, <ymin>:边界框左上角的绝对坐标(像素值)。
      • <xmax>, <ymax>:边界框右下角的绝对坐标(像素值)。

处理VOC数据的Python代码示例

下面是一个简单的例子,展示如何读取并解析VOC格式的XML文件,并提取其中的对象信息:

from xml.etree import ElementTreedef parse_voc_xml(file_path):tree = ElementTree.parse(file_path)root = tree.getroot()# 获取图像尺寸img_width = int(root.find("size/width").text)img_height = int(root.find("size/height").text)objects = []for obj in root.findall("object"):name = obj.find("name").textxmin = int(obj.find("bndbox/xmin").text)ymin = int(obj.find("bndbox/ymin").text)xmax = int(obj.find("bndbox/xmax").text)ymax = int(obj.find("bndbox/ymax").text)objects.append({"name": name,"bbox": [xmin, ymin, xmax, ymax]})return img_width, img_height, objects# 使用示例
file_path = "path/to/voc_annotation.xml"
width, height, objs = parse_voc_xml(file_path)
print(f"Image width: {width}, height: {height}")
for obj in objs:print(obj)

此代码段展示如何从给定的VOC格式XML文件中提取图像尺寸和每个对象的位置及类别信息。

二、YOLO 格式

YOLO(You Only Look Once)是一种流行的目标检测算法,它使用一种特定的数据标注格式来描述图像中的对象位置和类别信息。与VOC或COCO等其他数据格式不同,YOLO格式采用文本文件(.txt)存储每个图像的标注信息,这些信息包括对象的类别ID及其边界框的位置坐标。

文件结构与内容

对于每张图像,YOLO格式会有一个对应的文本文件,该文件中每一行代表一个对象,并且包含五个数值:

  1. 类别ID(cls_id
  2. 边界框中心点的x坐标(x_center
  3. 边界框中心点的y坐标(y_center
  4. 边界框的宽度(w
  5. 边界框的高度(h

所有坐标都是相对坐标,即相对于图像宽度和高度的比例值(0到1之间的小数),而不是绝对像素值。以下是YOLO格式的一个简单示例:

假设有一张分辨率为640x480的图片,其中包含两个对象:一只狗和一个人。相应的YOLO格式标注文件可能如下所示:

0 0.500000 0.600000 0.250000 0.300000 # 狗
1 0.300000 0.200000 0.100000 0.150000 # 人
  • 第一行表示“狗”的类别ID为0,其边界框中心位于图像宽度的50%、高度的60%,宽度占整个图像宽度的25%,高度占30%。
  • 第二行表示“人”的类别ID为1,其边界框中心位于图像宽度的30%、高度的20%,宽度占整个图像宽度的10%,高度占15%。
    在这里插入图片描述

处理YOLO数据的Python代码示例

以下是一个简单的例子,展示如何将VOC格式转换为YOLO格式,并读取YOLO格式的数据。

from xml.etree import ElementTreedef voc_to_yolo(voc_file_path, output_file_path, label2idx):tree = ElementTree.parse(voc_file_path)root = tree.getroot()img_width = int(root.find("size/width").text)img_height = int(root.find("size/height").text)with open(output_file_path, 'w') as f:for obj in root.findall("object"):name = obj.find("name").textcls_id = label2idx[name]xmin = int(obj.find("bndbox/xmin").text)ymin = int(obj.find("bndbox/ymin").text)xmax = int(obj.find("bndbox/xmax").text)ymax = int(obj.find("bndbox/ymax").text)# 这是计算边界框左上角和右下角的x坐标的平均值,即边界框中心点的x坐标(以像素为单位)。x_center = (xmin + xmax) / 2.0 / img_width# 这是计算边界框左上角和右下角的y坐标的平均值,即边界框中心点的y坐标(以像素为单位)。y_center = (ymin + ymax) / 2.0 / img_heightwidth = (xmax - xmin) / float(img_width)height = (ymax - ymin) / float(img_height)line = f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n"f.write(line)# 示例用法
label2idx = {"dog": 0, "person": 1}
voc_file_path = "path/to/voc_annotation.xml"
output_file_path = "path/to/output.txt"
voc_to_yolo(voc_file_path, output_file_path, label2idx)

在YOLO格式中,边界框的坐标是以相对坐标的形式表示的,而不是绝对像素值。具体来说,x_centery_center 分别代表边界框中心点相对于图像宽度和高度的比例值(范围从0到1),而 wh 分别代表边界框的宽度和高度相对于图像宽度和高度的比例值。

公式解释

x_center = (xmin + xmax) / 2.0 / img_width
y_center = (ymin + ymax) / 2.0 / img_height

计算边界框中心点的相对坐标

  1. 计算边界框中心点的绝对坐标

    • (xmin + xmax) / 2.0:这是计算边界框左上角和右下角的x坐标的平均值,即边界框中心点的x坐标(以像素为单位)。
    • (ymin + ymax) / 2.0:这是计算边界框左上角和右下角的y坐标的平均值,即边界框中心点的y坐标(以像素为单位)。
  2. 转换为相对坐标

    • / img_width:将边界框中心点的x坐标除以图像的宽度,得到一个比例值(范围从0到1)。例如,如果边界框中心点的x坐标是320像素,而图像的宽度是640像素,则 x_center 的值为 320 / 640 = 0.5
    • / img_height:将边界框中心点的y坐标除以图像的高度,得到一个比例值(范围从0到1)。例如,如果边界框中心点的y坐标是240像素,而图像的高度是480像素,则 y_center 的值为 240 / 480 = 0.5

示例

假设有一张分辨率为640x480的图片,其中有一个对象的边界框坐标如下:

  • xmin = 100
  • ymin = 150
  • xmax = 300
  • ymax = 350

根据上述公式计算:

  1. 计算边界框中心点的绝对坐标

    • x_center_abs = (100 + 300) / 2.0 = 200
    • y_center_abs = (150 + 350) / 2.0 = 250
  2. 转换为相对坐标

    • x_center_rel = 200 / 640 ≈ 0.3125
    • y_center_rel = 250 / 480 ≈ 0.5208

因此,在YOLO格式的标注文件中,该对象的标注信息可能如下所示:

0 0.3125 0.5208 0.3125 0.4167

其中:

  • 0 是类别ID。
  • 0.3125 是边界框中心点的x坐标相对于图像宽度的比例值。
  • 0.5208 是边界框中心点的y坐标相对于图像高度的比例值。
  • 0.3125 是边界框宽度相对于图像宽度的比例值((300 - 100) / 640 = 200 / 640 ≈ 0.3125)。
  • 0.4167 是边界框高度相对于图像高度的比例值((350 - 150) / 480 = 200 / 480 ≈ 0.4167)。

读取YOLO格式数据

def read_yolo_annotations(file_path):annotations = []with open(file_path, 'r') as f:lines = f.readlines()for line in lines:parts = line.strip().split()cls_id = int(parts[0])x_center, y_center, w, h = map(float, parts[1:])annotations.append({"cls_id": cls_id,"bbox": [x_center, y_center, w, h]})return annotations# 示例用法
file_path = "path/to/yolo_annotation.txt"
annotations = read_yolo_annotations(file_path)
for annotation in annotations:print(annotation)

通过上述示例,可以轻松地在VOC格式和YOLO格式之间进行转换,并读取YOLO格式的数据。这对于准备训练数据集或进行数据分析非常有用。

三、COCO 格式

COCO(Common Objects in Context)格式是一种广泛用于计算机视觉任务,特别是目标检测、分割和关键点检测的数据标注标准。它采用JSON文件来存储图像及其对应的注释信息,具有高度结构化的特点,支持复杂的多对象标注。

文件结构与内容

COCO格式的JSON文件通常包含以下几个主要部分:

  1. images: 包含图像的基本信息。
  2. annotations: 描述图像中的每个对象或区域的信息。
  3. categories: 定义所有可能的对象类别。

以下是一个简化的COCO格式JSON文件示例:

{"images": [{"id": 0,"width": 640,"height": 480,"file_name": "000000000009.jpg"}],"annotations": [{"id": 1,"image_id": 0,"category_id": 1,"bbox": [100, 150, 200, 200],"area": 40000,"iscrowd": 0},{"id": 2,"image_id": 0,"category_id": 2,"bbox": [300, 200, 100, 150],"area": 15000,"iscrowd": 0}],"categories": [{"id": 1,"name": "person","supercategory": "person"},{"id": 2,"name": "dog","supercategory": "animal"}]
}
  • images: 每个元素包含一个图像的信息,如ID、宽度、高度和文件名。
  • annotations: 每个元素描述一个对象的位置(通过边界框bbox)、面积area、是否为群体对象iscrowd等信息。
  • categories: 定义了所有可能的对象类别及其ID。

关键字段解释

  • bbox: 边界框的坐标,格式为 [x, y, width, height],其中xy是边界框左上角的绝对坐标(像素值),widthheight是边界框的宽度和高度(同样以像素为单位)。
  • area: 对象的面积,对于目标检测任务,这通常是边界框的面积(宽度乘以高度)。
  • iscrowd: 标记该对象是否为群体对象(例如一群人聚集在一起)。如果为1,则表示该对象是一个群体;如果为0,则表示单独的对象。

处理COCO数据的Python代码示例

下面是一个简单的例子,展示如何读取并解析COCO格式的JSON文件,并提取其中的对象信息:

import jsondef parse_coco_json(file_path):with open(file_path, 'r') as f:data = json.load(f)images = {img['id']: img for img in data['images']}categories = {cat['id']: cat for cat in data['categories']}annotations = []for ann in data['annotations']:image_info = images[ann['image_id']]category_info = categories[ann['category_id']]annotation = {"image_id": ann['image_id'],"filename": image_info['file_name'],"category_id": ann['category_id'],"category_name": category_info['name'],"bbox": ann['bbox'],"area": ann['area']}annotations.append(annotation)return annotations# 示例用法
file_path = "path/to/coco_annotation.json"
annotations = parse_coco_json(file_path)
for annotation in annotations:print(annotation)

输出结果:

{'image_id': 0, 'filename': '000000000009.jpg', 'category_id': 1, 'category_name': 'person', 'bbox': [100, 150, 200, 200], 'area': 40000}
{'image_id': 0, 'filename': '000000000009.jpg', 'category_id': 2, 'category_name': 'dog', 'bbox': [300, 200, 100, 150], 'area': 15000}

上述代码首先将imagescategories转换为字典以便快速查找,然后遍历所有的annotations,从中提取相关信息并打印出来。

相关文章:

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…...

FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器

本文使用 DDS 生成三个信号&#xff0c;并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号&#xff0c;并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分&#xff1a; 信号生成&#xff1a;展示如何使用DDS&am…...

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…...

【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机

一、计算机网络分层结构 计算机网络分层结构 指将计算机网络的功能划分为多个层次&#xff0c;每个层次都有其特定的功能和协议&#xff0c;并且层次之间通过接口进行通信。 分层设计的优势&#xff1a; 模块化&#xff1a;各层独立发展&#xff08;如IPv4→IPv6&#xff0c…...

正点原子[第三期]Arm(iMX6U)Linux系统移植和根文件系统构建-5.3 xxx_defconfig过程

前言&#xff1a; 本文是根据哔哩哔哩网站上“arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …...

250223-Linux/MacOS如何跳过Miniconda的条款阅读,直接安装Miniconda

你可以通过将 -b 参数传递给 Miniconda 的安装脚本&#xff0c;来跳过条款阅读并自动同意许可条款。这样安装会自动进行到下一步的选择项。下面是具体的安装命令&#xff1a; bash Miniconda3-latest-Linux-x86_64.sh -b这里的 -b 代表“批量模式”&#xff08;batch mode&…...

点云的几何特征

点云的几何特征是基于一个点周围的邻域对该点周围几何形状的描述。例如&#xff0c;位于墙面上的一个点将具有较高的平面度planarity。 基于局部点云的特征值 λ1、λ2 和 λ3 以及特征向量 e1、e2 和e3计算得到的一系列几何特征&#xff0c;这些特征用于描述点云中点的局部几…...

月之暗面新发布: MUON 在 LLM 训练中的可扩展性

MUON 在 LLM 训练中的可扩展性 摘要 最近&#xff0c;基于矩阵正交化的 Muon 优化器&#xff08;K. Jordan 等人&#xff0c;2024 年&#xff09;在训练小型语言模型方面表现出色&#xff0c;但其在更大规模模型上的可扩展性尚未得到验证。我们确定了 Muon 放大的两个关键技术…...

10.Docker 仓库管理

Docker 仓库管理 Docker 仓库管理 Docker 仓库管理 Docker 仓库&#xff0c;类似于 yum 仓库&#xff0c;是用来保存镜像的仓库。为了方便的管理和使用 docker 镜像,可以将镜像集中保存至 Docker 仓库中&#xff0c;将制作好的镜像 push 到仓库集中保存&#xff0c;在需要镜像…...

Deepseek存算分离安全部署手册

Deepseek大火后&#xff0c;很多文章教大家部署Dfiy和ollamadeepseek&#xff0c;但是大部分都忽略了数据安全问题&#xff0c;本文重点介绍Deepseek存算分裂安全架设&#xff0c;GPU云主机只负责计算、CPU本地主机负责数据存储&#xff0c;确保数据不上云&#xff0c;保证私有…...

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…...

Java——抽象类

在Java中&#xff0c;抽象类&#xff08;Abstract Class&#xff09; 是一种特殊的类&#xff0c;用于定义部分实现的类结构&#xff0c;同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性&#xff0c;而将具体的实现细节留给子类。 1. 抽象类的定义 语法&…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今&#xff0c;像 DeepSeek 这样的人工智能工具正在改变企业的运营方式&#xff0c;优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高&#xff0c;组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

java开发——为什么要使用动态代理?

举个例子&#xff1a;假如有一个杀手专杀男的&#xff0c;不杀女的。代码如下&#xff1a; public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...

c++中,什么时候应该使用mutable关键字?

在 C 中&#xff0c;mutable 关键字用于修饰类的成员变量&#xff0c;允许在 const 成员函数中修改这些变量。它的核心作用是区分 物理常量性&#xff08;对象内存不可修改&#xff09;和 逻辑常量性&#xff08;对象对外表现的状态不变&#xff09;。以下是详细解析&#xff1…...

deepseek本地部署,ragflow,docker

先下载ollama 1.官网下载 deepseek-r1:14bhttps://ollama.com/library/deepseek-r1:14b 2.GitHub下载GitHub - ollama/ollama: Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 2, and other large language models. 两种方式 安装完后&#xff0c;cmd-&g…...

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法&#xff08;Lotus flower algorithm&#xff0c;LFA&#xff09;是一种受自然启发的优化算法&#xff0c;其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性&#xff0c;即所谓的“莲花效应”&#xff0c;是由其叶片表面的微纳…...

通过AI辅助生成PPT (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2025-02-23 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件&#xff0c;我在想是…...

P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; chmax ⁡ ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...

nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典

向 doubao.com/chat/ 提问&#xff1a; node.js js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;编写在线查询英汉词典 后端部分&#xff08;express js-mdict &#xff09; 详见上一篇&#xff1a;nodejs&#xff1a;express js-mdict 作为后端&#xff…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...