从零构建C与Python协作系统:6步打造稳定高效的嵌入式混合编程架构

第一章:嵌入式系统中 C 与 Python 的协作模式(C 扩展 + 进程通信)

在资源受限的嵌入式系统中,C 语言因其高效性和对硬件的直接控制能力被广泛使用,而 Python 则凭借其简洁语法和丰富生态适用于快速开发上层逻辑。为了兼顾性能与开发效率,常采用 C 扩展与进程间通信相结合的方式实现两者协同。

C 扩展:提升 Python 性能的关键手段

通过编写 C 扩展模块,可将高性能计算或底层驱动封装为 Python 可调用的模块。使用 Python.h 头文件提供的 API,定义方法表并实现函数绑定。

#include <Python.h>

static PyObject* example_func(PyObject* self, PyObject* args) {
    const char* input;
    if (!PyArg_ParseTuple(args, "s", &input)) return NULL;
    printf("Received from Python: %s\n", input);
    Py_RETURN_NONE;
}

static PyMethodDef methods[] = {
    {"call_c_func", example_func, METH_VARARGS, "Call a C function"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef module = {
    PyModuleDef_HEAD_INIT,
    "embed_module",
    NULL,
    -1,
    methods
};

PyMODINIT_FUNC PyInit_embed_module(void) {
    return PyModule_Create(&module);
}
编译后,在 Python 中导入:import embed_module 即可调用 call_c_func()

进程通信:分离关注点的安全协作

当功能模块需独立运行时,可通过 Unix 套接字、命名管道或共享内存实现 C 与 Python 进程间通信。
  • 使用 FIFO 实现双向通信,确保实时性要求高的任务由 C 处理
  • Python 负责数据解析、网络传输与用户界面
  • 信号量或互斥锁防止资源竞争
协作方式优点适用场景
C 扩展调用开销小,集成紧密高频数学运算、驱动封装
进程通信隔离性强,易于调试模块解耦、安全沙箱环境

第二章:C 扩展机制原理与实践

2.1 CPython API 基础与模块注册机制

CPython API 是 Python 解释器的核心接口,允许用 C 语言扩展 Python 功能。编写 C 扩展时,必须定义模块结构并实现初始化函数。
模块定义与方法映射
每个 C 扩展需声明一个 PyMethodDef 数组,指定暴露给 Python 的函数:

static PyMethodDef SpamMethods[] = {
    {"say_hello", spam_say_hello, METH_NOARGS, "Print a greeting."},
    {NULL, NULL, 0, NULL}  // Sentinel
};
该数组每项对应一个可调用函数,字段依次为 Python 名称、C 函数指针、调用方式和文档字符串。末尾以 NULL 结束。
模块注册流程
使用 PyModuleDef 结构体描述模块元信息,并通过 PyInit_ 开头的函数注册:

static struct PyModuleDef spammodule = {
    PyModuleDef_HEAD_INIT,
    "spam",
    "A simple example module.",
    -1,
    SpamMethods
};

PyMODINIT_FUNC PyInit_spam(void) {
    return PyModule_Create(&spammodule);
}
解释器导入模块时调用 PyInit_spam,创建模块对象并注入命名空间,完成注册。

2.2 封装 C 函数为 Python 可调用接口

在混合编程中,将 C 函数暴露给 Python 调用是性能优化的关键手段。Python 提供了多种方式实现这一目标,其中使用 `ctypes` 和 `Cython` 最为常见。
使用 ctypes 调用共享库
通过编译 C 代码为共享库(如 `.so` 或 `.dll`),可在 Python 中直接加载并调用函数:
// math_utils.c
double add(double a, double b) {
    return a + b;
}
编译为共享库:`gcc -fPIC -shared -o math_utils.so math_utils.c`
import ctypes
lib = ctypes.CDLL('./math_utils.so')
lib.add.argtypes = [ctypes.c_double, ctypes.c_double]
lib.add.restype = ctypes.c_double
result = lib.add(3.5, 4.2)
该方法无需额外依赖,适用于简单函数封装。`argtypes` 和 `restype` 明确指定参数与返回类型,确保类型安全。
数据类型映射
C 与 Python 间的数据转换需遵循对应规则:
C 类型ctypes 类型
intc_int
doublec_double
char*c_char_p

2.3 复杂数据类型在 C 与 Python 间的转换策略

在跨语言调用中,复杂数据类型的转换是性能与正确性的关键。C 语言使用栈或堆内存直接管理结构体,而 Python 则通过对象引用封装数据,二者需通过中间接口进行语义映射。
结构体与字典的双向映射
C 结构体可通过 ctypes 模块在 Python 中定义对应类,实现字段对齐与类型转换:

typedef struct {
    int id;
    char name[64];
    double values[3];
} DataPacket;

import ctypes

class DataPacket(ctypes.Structure):
    _fields_ = [
        ("id", ctypes.c_int),
        ("name", ctypes.c_char * 64),
        ("values", ctypes.c_double * 3)
    ]
该定义确保内存布局与 C 完全兼容,允许直接传递指针。字段名必须严格匹配,数组长度需预先固定。
内存生命周期管理
  • Python 对象由垃圾回收器管理,不可长期持有 C 端指针引用
  • 建议在 C 层使用 malloc/free 显式分配,通过 capsule 或 PyCapsule 封装释放逻辑
  • 避免返回指向栈内存的指针,防止悬空引用

2.4 构建高性能数学运算 C 扩展模块实战

在 Python 中调用 C 语言实现数学运算,可显著提升性能。本节通过构建一个计算向量平方和的 C 扩展模块,展示核心流程。
扩展模块代码实现

#include <Python.h>

static PyObject* math_ext_vector_square_sum(PyObject* self, PyObject* args) {
    PyObject *input_list;
    if (!PyArg_ParseTuple(args, "O", &input_list)) return NULL;

    Py_ssize_t size = PyObject_Length(input_list);
    double sum = 0.0;
    for (Py_ssize_t i = 0; i < size; i++) {
        PyObject *item = PyList_GetItem(input_list, i);
        double val = PyFloat_AsDouble(item);
        sum += val * val;
    }
    return PyFloat_FromDouble(sum);
}

static PyMethodDef MathExtMethods[] = {
    {"vector_square_sum", math_ext_vector_square_sum, METH_VARARGS, "Compute sum of squares"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef mathextmodule = {
    PyModuleDef_HEAD_INIT, "mathext", NULL, -1, MathExtMethods
};

PyMODINIT_FUNC PyInit_mathext(void) {
    return PyModule_Create(&mathextmodule);
}
上述代码定义了一个 Python 可调用函数 vector_square_sum,接收列表输入,逐项计算平方并累加返回。使用 PyArg_ParseTuple 解析参数,通过 PyList_GetItem 遍历元素。
编译与使用
通过 setuptools 配置构建脚本,编译后即可在 Python 中导入模块,实现高效数学运算。

2.5 内存管理与异常处理的跨语言协调

在混合语言开发环境中,内存管理机制的差异可能导致资源泄漏或非法访问。例如,Go 的垃圾回收机制与 C++ 手动内存管理并存时,需通过显式接口控制对象生命周期。
跨语言异常传递
当 Go 调用 C++ 代码时,C++ 抛出的异常不能直接被 Go 捕获。必须在边界处进行异常转译:

extern "C" int safe_cpp_function() {
    try {
        risky_operation();
        return 0;
    } catch (...) {
        return -1; // 返回错误码代替异常
    }
}
上述代码将 C++ 异常转换为整型错误码,供 Go 层解析。Go 通过返回值判断执行状态,实现异常语义的跨语言传递。
内存所有权协议
  • 由哪一方分配,就由哪一方释放
  • 跨语言指针传递时,禁止传递栈地址
  • 使用智能指针包装资源,确保析构安全

第三章:进程间通信机制选型与实现

3.1 Unix Domain Socket 与命名管道对比分析

通信机制差异
Unix Domain Socket(UDS)和命名管道(FIFO)均用于同一主机进程间通信(IPC),但底层实现不同。UDS基于套接字接口,支持流式(SOCK_STREAM)和数据报(SOCK_DGRAM)模式;命名管道仅提供字节流的单向通信。
性能与功能对比
  • UDS支持双向全双工通信,而命名管道需创建两个FIFO实现双向传输
  • UDS可传递文件描述符和凭证信息,命名管道不支持辅助数据传递
  • 命名管道可通过文件系统访问,权限管理更直观
特性Unix Domain Socket命名管道
通信方向双向单向
数据类型流或数据报字节流
文件描述符传递支持不支持

// 示例:创建Unix域套接字
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un addr = {0};
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, "/tmp/uds.sock");
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
上述代码创建一个基于文件路径的UDS端点,AF_UNIX指定本地通信域,SOCK_STREAM确保可靠字节流传输,适用于高性能本地服务间交互。

3.2 基于 FIFO 的轻量级 C-Python 数据交换实现

在跨语言系统集成中,C 与 Python 的高效数据交换至关重要。采用命名管道(FIFO)可实现进程间低延迟通信,无需依赖复杂框架。
通信机制设计
通过 mkfifo 创建命名管道,C 程序作为生产者写入结构化数据,Python 脚本作为消费者读取并解析。该方式避免了内存共享的复杂性,同时保证顺序传输。

// C端写入示例
#include <fcntl.h>
int fd = open("/tmp/data_pipe", O_WRONLY);
write(fd, &data, sizeof(DataStruct));
上述代码以只写模式打开 FIFO,将打包好的结构体数据写入管道,确保原子性操作。
数据格式约定
为提升解析效率,双方预定义二进制结构:
  • 固定头部:4 字节长度标识
  • 主体数据:按字节对齐的结构体
  • 校验机制:可选 CRC32 校验码

3.3 使用共享内存提升多进程协同效率

在多进程编程中,进程间通信(IPC)常成为性能瓶颈。共享内存作为一种高效的IPC机制,允许多个进程访问同一块物理内存区域,显著减少数据复制开销。
共享内存的基本使用流程
  • 创建或打开共享内存段
  • 将内存段映射到进程地址空间
  • 读写共享数据
  • 解除映射并清理资源
代码示例:Python中使用mmap实现共享内存

import mmap
import os

# 创建匿名共享内存映射
with mmap.mmap(-1, 1024, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE) as mem:
    mem.write(b"Hello from Process A")
    mem.seek(0)
    print(mem.read(28))  # 输出: Hello from Process A
该代码通过mmap创建了一个1024字节的共享内存区域,多个进程可映射同一区域实现数据共享。参数MAP_SHARED确保修改对其他进程可见,PROT_READ | PROT_WRITE设定读写权限。

第四章:混合编程架构设计与系统集成

4.1 系统分层设计:C 层驱动与 Python 应用层解耦

在嵌入式系统架构中,将底层硬件驱动与上层业务逻辑分离是提升可维护性的关键。通过 C 语言实现硬件交互层,确保执行效率与资源控制;Python 则负责应用逻辑,提升开发效率。
接口抽象设计
采用共享内存 + 消息队列机制实现跨语言通信。C 层封装设备操作为标准化 API:

// 驱动接口定义
int sensor_read(float *data) {
    // 硬件寄存器读取
    *data = adc_get_value();
    return 0; // 成功返回0
}
该函数由 Python 层通过 ctypes 调用,实现安全的数据获取。参数 data 为输出指针,用于返回传感器数值。
调用层绑定
  • C 动态库编译为 libsensor.so
  • Python 使用 ctypes.CDLL 加载并映射函数原型
  • 数据类型通过 argtypesrestype 明确声明

4.2 启动流程控制与跨语言进程生命周期管理

在分布式系统中,启动流程的有序控制是保障服务稳定的关键。通过协调多个语言编写的微服务进程,需实现统一的生命周期管理策略。
跨语言进程启动协调
采用主控脚本触发多语言子进程,确保依赖服务先行启动:

#!/bin/bash
# 启动Python数据服务
python3 data-service.py &
PYTHON_PID=$!

# 等待端口就绪
while ! nc -z localhost 8000; do sleep 1; done

# 启动Go业务模块
go run main.go
该脚本通过端口探测机制确保依赖服务初始化完成后再启动后续进程,避免因服务未就绪导致的连接失败。
生命周期同步机制
使用信号转发实现跨语言进程组的优雅终止:
  • SIGTERM 传递至所有子进程
  • 统一超时后强制终止(SIGKILL)
  • 日志通道集中输出便于调试

4.3 错误传播机制与日志统一收集方案

在分布式系统中,错误的准确传播与集中式日志管理是保障可观测性的核心环节。通过标准化错误码与上下文信息传递,可实现跨服务调用链的异常追踪。
错误传播设计原则
采用统一错误结构体,包含错误码、消息、堆栈及元数据:

type Error struct {
    Code    int                    `json:"code"`
    Message string                 `json:"message"`
    TraceID string                 `json:"trace_id"`
    Cause   error                  `json:"cause,omitempty"`
}
该结构确保服务间错误语义一致,便于网关聚合处理。
日志收集流程
  • 各服务通过Sidecar代理将日志输出至Kafka
  • Logstash消费并结构化日志,写入Elasticsearch
  • Kibana提供可视化查询界面
架构图:应用 → Fluent Bit → Kafka → Logstash → ES → Kibana

4.4 性能瓶颈分析与通信延迟优化技巧

在分布式系统中,性能瓶颈常源于网络通信延迟、序列化开销和线程阻塞。通过精细化分析调用链路,可定位高延迟环节。
关键性能指标监控
  • 端到端响应时间
  • 消息序列化耗时
  • 网络往返(RTT)波动
异步非阻塞通信优化

// 使用 Go 的 goroutine 实现异步请求聚合
func asyncRequest(nodes []string) []Response {
    results := make(chan Response, len(nodes))
    for _, node := range nodes {
        go func(addr string) {
            resp := httpRequest(addr)
            results <- resp
        }(node)
    }
    var all []Response
    for i := 0; i < cap(results); i++ {
        all = append(all, <-results)
    }
    return all
}
该模式将串行调用转为并行,显著降低整体等待时间。goroutine 轻量级特性避免线程资源耗尽。
数据压缩与批量传输对比
策略延迟降低CPU 开销
gzip 压缩35%↑ 18%
批量合并请求52%↑ 8%

第五章:总结与展望

技术演进中的实践挑战
在微服务架构的落地过程中,服务间通信的稳定性成为关键瓶颈。某电商平台在大促期间因服务雪崩导致订单系统瘫痪,最终通过引入熔断机制和限流策略恢复可用性。以下是基于 Go 实现的简单熔断器代码片段:

package main

import (
    "time"
    "golang.org/x/sync/singleflight"
)

type CircuitBreaker struct {
    failureCount int
    lastFailure  time.Time
}

func (cb *CircuitBreaker) Call(fn func() error) error {
    if cb.isTripped() {
        return ErrServiceUnavailable
    }
    if err := fn(); err != nil {
        cb.failureCount++
        cb.lastFailure = time.Now()
        return err
    }
    cb.failureCount = 0 // reset on success
    return nil
}
未来架构趋势的应对策略
企业正逐步从单体向云原生迁移,以下为某金融系统改造前后的部署对比:
指标传统架构云原生架构
部署周期2周15分钟
故障恢复时间45分钟30秒
资源利用率30%75%
  • 采用 Kubernetes 实现自动化扩缩容
  • 通过 Istio 实施细粒度流量控制
  • 日志与监控统一接入 OpenTelemetry 标准
架构演进路径: 单体应用 → 服务拆分 → 容器化部署 → 服务网格集成 → 智能运维闭环

相关推荐

C++Python混合编程构建高性能工业软件内核灵活外壳

在软件工程中,混合编程是一种结合不同语言优势以解决复杂问题的架构模式。其核心原理在于让每种语言专注于其最擅长的领域:C++凭借其成本抽象和直接内存操作能力,负责处理计算密集、对性能敏感的核心算法底层硬件交互;而Python则以其简洁语法和丰富生态,快速实现业务流程编排、用户交互数据可视化。这种关注点分离的技术价值在于,它能在保持系统核心计算性能的同时,极大地提升开发效率和迭代速度。在工业仿真、科学计算、量化交易等应用场景中,通过PyBind11等接口技术将C++高性能内核Python灵活外壳无缝结合

weixin_33326218的博客 211

嵌入式开发新范式】:CPython协同设计的5大核心模式揭秘

掌握嵌入式系统中CPython的协作模式,提升开发效率系统性能。本文详解5大协同设计方法,涵盖实时控制、脚本扩展、混合编程等场景,结合C的高效Python的灵活,实现软硬件无缝集成。实用方案值得收藏。

ProceNest的博客 1084

Python调用C++动态库实战:ctypes混合编程提升计算性能

在软件开发中,混合编程是一种常见的技术策略,旨在结合不同编程语言的优势以优化系统性能。其核心原理是通过定义清晰的应用程序二进制接口(ABI),实现跨语言函数调用数据交换。这种技术能显著提升计算密集型任务的执行效率,尤其适用于需要兼顾开发效率运行时性能的场景,如科学计算、高频交易和游戏引擎开发。Python凭借其简洁语法和丰富生态,在快速原型开发中表现出色,而C++则以接近硬件的执行效率著称。通过Python的ctypes模块调用C++编译的动态库,开发者可以在Python便捷的脚本环境中,无缝集成C++

weixin_42562079的博客 239

ccmusic-database音乐分类系统C语言接口开发

本文介绍了如何在星图GPU平台自动化部署🎵音乐流派分类Web应用ccmusic-database/music_genre镜像,实现高效的音乐流派识别功能。该镜像可应用于嵌入式音乐播放器、车载系统等场景,通过C语言接口实现轻量级、实时的音乐分类,提升智能设备的音频处理能力。

weixin_42128315的博客 93

工业软件C++Python融合架构实战:从设计到部署的完整指南

在工业软件高性能计算领域,跨语言混合编程是解决性能开发效率矛盾的关键技术。其核心原理在于利用不同编程语言的特长进行分工协作,例如C++负责底层高性能计算和实时控制,Python则专注于上层业务逻辑快速原型开发。这种架构的技术价值在于,它能将C++的执行效率、系统级控制能力Python的快速开发、丰富生态完美结合,从而构建出既稳定可靠又灵活易用的软件系统。在实际应用中,该技术广泛服务于工业自动化、CAD/CAE、机器视觉和物联网等场景,通过诸如pybind11等绑定工具实现无缝集成。本文以工业软件为背

ciya3282的博客 357

PythonC++混合开发实战:从AI助手到高性能应用架构设计

在现代软件开发中,混合编程已成为提升应用性能开发效率的关键技术。其核心原理在于充分发挥不同编程语言的优势,通过清晰的架构设计实现协同工作。Python以其简洁语法和丰富生态,适合快速构建界面和业务逻辑;而C++凭借其接近硬件的执行效率,擅长处理计算密集型任务。这种技术组合的价值在于平衡开发速度运行时性能,特别适用于AI推理、实时数据处理、游戏引擎等场景。通过pybind11等工具实现跨语言调用,开发者可以构建如本地AI助手、行情软件等高响应应用。本文以AI助手桌面APP为例,详解如何通过Python搭建

weixin_30390951的博客 231

TMS320 DSP实时内核设计:任务调度、中断响应确定性优化实践

嵌入式系统开发中,实时操作系统内核是协调复杂任务实时响应的核心组件。其工作原理基于高效的任务调度算法、快速的中断响应机制以及确定性的系统行为,确保在资源受限的硬件上满足严苛的时序要求。从技术价值看,一个优化的RTOS内核能显著提升系统可靠性和实时性,广泛应用于通信、工业控制、音频处理等对时效性敏感的领域。本文聚焦于在经典TMS320 DSP平台上,如何通过精妙的数据结构设计(如就绪位图差分链表)和C/汇编混合编程技术,实现任务调度器的高效查找中断上下文的快速保存,从而构建一个高性能、可预测的实时内核

weixin_33859844的博客 387

嵌入式Bootloader开发全解析:从启动原理到IAP实现避坑指南

嵌入式系统开发中,系统启动流程和固件更新是核心基础技术。其原理在于设备上电后,由一段初始化代码完成最基础的硬件配置,并引导加载主应用程序,这是所有嵌入式设备从“沉睡”到“运行”的必经之路。这项技术的核心价值在于为设备提供了可维护性和可升级性,是产品生命周期管理的关键。其应用场景广泛覆盖了从消费电子到工业控制、汽车电子等几乎所有嵌入式领域。本文聚焦于Bootloader产品开发,深入剖析其作为嵌入式系统“第一声心跳”的启动链机制在应用编程(IAP)实现细节,并系统总结了开发流程、调试技巧及常见问题排查方案

weixin_33755557的博客 398

企业级嵌入式操作系统:如何融合Linux生态硬实时能力应对工业挑战

在工业控制、智能电网和轨道交通等关键领域,嵌入式操作系统是连接物理世界数字世界的核心基础软件。其核心原理在于对硬件资源的调度管理,而实时操作系统(RTOS)通过确定性的任务调度和中断响应机制,确保了关键任务在严格时限内完成,这是工业自动化可靠运行的基石。随着工业互联网和边缘计算的兴起,操作系统的技术价值已从单一设备控制,扩展到支持海量数据接入、复杂协议解析和本地智能决策,成为实现设备互联智能化的关键载体。面对工业场景中苛刻的确定性实时响应、长期安全可靠丰富软件生态的多维需求,传统方案往往难以兼顾。本

weixin_34354173的博客 491

为什么顶尖工业软件都在用C++核心+Python扩展?真相来了

掌握工业软件的模块化开发(C++ 核心 + Python 脚本扩展),提升系统性能扩展性。适用于仿真、设计、控制等高要求场景,兼顾高效计算灵活定制。详解架构设计集成方法,助力企业级应用开发。值得收藏

VarPerch的博客 365

K210嵌入式AI开发实战:MicroPython环境搭建核心模块应用

嵌入式系统人工智能(AI)结合的应用场景中,开发效率和资源限制是核心挑战。MicroPython作为Python 3的精简实现,其解释执行机制和硬件抽象层为微控制器编程提供了高效解决方案。它通过提供交互式REPL环境和丰富的硬件控制模块,显著降低了嵌入式AI应用的原型开发门槛,尤其适合快速验证和教学场景。在K210这类集成神经网络处理器(KPU)的AIoT芯片上,MicroPython能够直接调用KPU模块执行预训练模型,结合sensor、image等模块处理摄像头数据,实现人脸识别、目标检测等视觉应用

weixin_29165725的博客 344

算法开发视频制作指南:从MATLAB实战到技术影响力构建

算法开发是将抽象逻辑转化为可执行程序的核心过程,其关键在于实现构思、验证调整的高效循环。在工程实践中,交互式探索即时可视化是理解算法原理、验证结果的重要手段,这直接关系到开发效率知识传递的有效性。从技术价值看,高质量的开发实录不仅能加速个人学习曲线,更是团队知识沉淀传承的关键载体。在众多应用场景中,算法原型设计、仿真验证以及特定领域的嵌入式开发对直观、动态的演示有着强烈需求。MATLAB凭借其强大的交互环境、丰富的内置工具箱(如信号处理、图像处理、控制系统)以及App Designer等GUI工具,

weixin_33985679的博客 325

MATLAB构建SLAM工作流:从算法原型到工程部署的实践指南

SLAM(即时定位地图构建)是机器人、自动驾驶等领域的核心技术,它使机器能够在未知环境中同时进行定位和建图。其原理涉及传感器数据处理、状态估计和优化算法,技术价值在于实现自主导航环境感知。在工程实践中,MATLAB凭借其强大的工具箱生态和代码生成能力,为SLAM开发提供了从快速原型设计到可靠部署的高效路径。通过计算机视觉、激光雷达和导航工具箱,开发者可以快速实现特征匹配、点云配准和传感器融合等关键模块,并利用MATLAB Coder将验证后的算法转换为可部署的C/C++代码。这种工作流特别适用于算法深度

weixin_30843605的博客 391

基于M5StackUIFlow的DJI Tello无人机智能控制平台开发实践

无人机控制技术是嵌入式系统物联网应用的重要领域,其核心在于通过编程实现对飞行器的精准指令交互自主决策。其工作原理通常涉及无线通信协议、传感器数据融合及飞行控制算法。该技术的价值在于将消费级硬件转化为可编程的机器人开发平台,极大地降低了STEAM教育、创客项目及算法原型验证的门槛。典型的应用场景包括自动化飞行任务执行、环境感知交互及多机协同控制等。本文聚焦于利用M5Stack硬件模块UIFlow图形化编程环境,深度开发DJI Tello无人机的控制潜能,通过封装库函数、解析遥测数据和集成扩展传感器,构建

weixin_33908217的博客 423

OpenFlux网络协议栈研究工具

网络协议栈研究工具。支持可插拔传输方式的 TCP 隧道

用 Three.js 造一架飞机、一群广告热气球和一片会流动的云海

云端巡航:用 Three.js 造一架飞机、一群广告热气球和一片会流动的云海,键盘控制飞行

ventoy启动盘主题以身为种

ventoy启动盘主题以身为种

19_EasyExcel表格读取工具类(Java企业级代码

一份可直接落地的 EasyExcel 表格读取工具类(JDK17 + Spring Boot3.x,依赖阿里 EasyExcel 3.x)。封装两类高频读取:按 sheet 名读取单个 sheet、读取全部 sheet(用 LinkedHashMap 保持原始顺序),调用方只需传文件、表头映射实体 Class、表头行数即可拿到 List 或 Map,无需每次手写 ReadListener。内部用 try-with-resources 释放 ExcelReader 资源,内置行收集监听器并支持丢弃整行空白数据,sheet 名匹配不到时会报出全部可用 sheet 名,入参逐项校验。final 类加私有构造、泛型方法、注释完整,md 中附 Maven 依赖完整源码。

目标检测海面原油泄漏检测数据集13838张YOLO+VOC格式.zip

数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:13838 Annotations文件夹中xml文件总计:13838 labels文件夹中txt文件总计:13838 标签种类数:2 标签名称:["normal","oil"] 每个标签的框数(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准): normal 框数 = 12 oil 框数 = 23706 总框数:23718 图片清晰度(分辨率:像素):清晰 图片是否增强:是 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注

上一篇: 【AI工程师必看】:掌握MCP AI-102与GPT-4集成的7个高阶技巧
下一篇: 【大模型微调数据清洗全攻略】:手把手教你用Python+Shell实现高效自动化处理
FuncWander
博客等级 码龄1年 153粉丝 1972原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值