包含关键字 typecho 的文章

点赞 + 关注 + 收藏 = 学会了

整理了一个n8n小专栏,有兴趣的工友可以关注一下 👉 《n8n修炼手册》

n8n作为开源灵活的工作流自动化工具,被广泛用于本地部署和容器化部署场景。但默认情况下,n8n 默认使用 America/New York 时区,若未配置本地时间,会导致定时工作流执行偏差、日志时间混乱、时间相关节点(如Schedule Trigger、Current Date)输出异常等问题,严重影响工作流的准确性和可维护性。

比如,使用代码节点,用 $now 输出当前时间。我电脑的时间是2026年2月13日下午2点22分。而 n8n 输出的时间却是 2026年2月13日凌晨1点22分,这显然不对。

每一个工作流都可以单独设置时区。

点击工作流面板上方的三个点,找到“Settings”。

把「Timezone」设置成 Asia/Shanghai 就变成国内的时区了。

此时再试试输出当前时间,就对得上了~


以上就是本文的全部内容啦,想了解更多n8n玩法欢迎关注《n8n修炼手册》👏

如果你有 NAS,我非常建议你在 NAS 上部署一套 n8n,搞搞副业也好,帮你完成工作任务也好 《『NAS』不止娱乐,NAS也是生产力,在绿联部署AI工作流工具-n8n》

点赞 + 关注 + 收藏 = 学会了

JWT编码/解码 在线工具分享

哈喽大家好,今天给大家安利一个我最近用 Vue 手搓的在线工具——JWT编码/解码器

做开发的同学应该都知道 JWT(JSON Web Token),现在前后端分离项目里用得特别多。但有时候调试接口、排查问题,手里没个顺手的工具,解析个 Token 还得去找在线网站,挺麻烦的。

所以我就想,干脆自己做一个网页版的,打开就能用,还不用安装。

在线工具网址:https://see-tool.com/jwt-encryptor
工具截图:

这个工具有啥特别的?

1. 一眼看懂 Token 结构

JWT 是由三部分组成的,用点号隔开。这个工具会自动把 Header、Payload、Signature 分开显示,还用不同颜色标出来,一眼就能看明白哪个部分是啥。

2. 支持多种算法

不止是最常用的 HS256,像 RS256、PS256、ES256 这些非对称加密算法也都支持。不管你用的是对称密钥还是 RSA/ECDSA 密钥对,都能帮你编码和验证签名。

3. 签名验证超方便

想确认 Token 是不是被篡改过?只要勾选"验证签名",输入密钥,立马就能告诉你签名是否有效。再也不用写代码去验证了,调试效率翻倍。

4. 示例一键加载

刚上手不知道怎么用?没关系,我准备了现成的示例,点一下"加载示例"按钮,立马给你填好一个完整的 Token 和密钥,跟着看一遍就会了。

碎碎念

这个小工具是我用 Vue 3 做的,核心的 JWT 处理逻辑是自己手写的,还用到了 Web Crypto API 来做 RSA 和 ECDSA 的签名验证。所有操作都在你的浏览器里完成,密钥不会上传到服务器,安全又放心。

虽然它可能没有那些专业工具那么多功能,但胜在轻便、干净。

如果你平时开发调试刚好缺这么一个顺手的小工具,欢迎来试试看!要是觉得好用,或者有什么想吐槽的,也欢迎随时告诉我哈~

Model Context Protocol 是一个开放标准,它的目标是给 LLM 一种干净、统一的方式去发现和调用外部工具。不用再写自定义解析、不用再维护脆弱的胶水代码,就是一个好用的协议。

大多数 MCP 教程上来就讲 JSON-RPC 规范、传输层协议,搞得很复杂。其实用 MCP 不需要理解协议内部构造就像写 Web 应用不需要去读 HTTP 规范一样。

真正需要掌握的东西就三个概念,花 15 分钟就够了。

三个核心概念

MCP 的核心就三样东西:

Server:对外暴露工具的服务端,本质上是一个 Python 脚本,声明"这些函数可以被 LLM 调用",跑起来之后就在监听请求。

Tool:希望 LLM 使用的函数,可以是任何东西:查天气、查数据库、发邮件。这跟写普通 Python 函数没什么区别,加个装饰器剩下的交给 MCP。

Client:连接 Server 并调用工具的客户端。生产环境里一般就是 LLM 应用本身。测试阶段可以用 FastMCP 自带的客户端,开箱即用。

Server 暴露工具,Client 调用工具。就这么简单。

传输方式、JSON-RPC、能力协商这些都是实现细节,上生产之前不用管。

步骤 1:安装 FastMCP

FastMCP 是让 MCP 用起来简单的 Python 框架。装一下就行,不需要任何配置。

 pip install fastmcp

本教程不需要虚拟环境,生产环境建议还是用一个。

步骤 2:创建 Server

新建一个

my_server.py

文件:

 from fastmcp import FastMCP  

# Initialize the server with a name  
mcp = FastMCP("my-first-server")  

# Define a tool using the @mcp.tool decorator  
@mcp.tool  
def get_weather(city: str) -> dict:  
    """Get the current weather for a city."""  
    # In production, you'd call a real weather API  
    # For now, we'll return mock data  
    weather_data = {  
        "new york": {"temp": 72, "condition": "sunny"},  
        "london": {"temp": 59, "condition": "cloudy"},  
        "tokyo": {"temp": 68, "condition": "rainy"},  
    }  
      
    city_lower = city.lower()  
    if city_lower in weather_data:  
        return {"city": city, **weather_data[city_lower]}  
    else:  
        return {"city": city, "temp": 70, "condition": "unknown"}  

# Run the server  
if __name__ == "__main__":  
     mcp.run(transport="stdio")
FastMCP("my-first-server")

创建一个带名称的服务器实例。

@mcp.tool

装饰器把普通函数注册为 MCP 工具。函数的 docstring 会变成工具描述——LLM 靠这个来判断什么时候该调用它。类型提示(

city: str

-> dict

)告诉 MCP 输入输出的类型。

transport="stdio"

表示通过标准输入输出通信,本地测试够用了。

整个 Server 就这些,实际代码 15 行。

步骤 3:写个 Client 测试一下

新建

test_client.py

 import asyncio  
from fastmcp import Client  

async def main():  
    # Point the client at your server file  
    client = Client("my_server.py")  
      
    # Connect to the server  
    async with client:  
        # List available tools  
        tools = await client.list_tools()  
        print("Available tools:")  
        for tool in tools:  
            print(f"  - {tool.name}: {tool.description}")  
          
        print("\n" + "="*50 + "\n")  
          
        # Call the weather tool  
        result = await client.call_tool(  
            "get_weather",   
            {"city": "Tokyo"}  
        )  
        print(f"Weather result: {result}")  

if __name__ == "__main__":  
     asyncio.run(main())
Client("my_server.py")

指定要连接的 Server 文件;

async with client:

自动管理连接生命周期;

list_tools()

负责动态发现可用工具,这是 MCP 的核心能力之一;

call_tool("get_weather", {"city": "Tokyo"})

带参数调用具体工具。

步骤 4:跑起来

终端里执行:

 python test_client.py

输出应该是这样的:

 Available tools:  
   - get_weather: Get the current weather for a city.
 ==================================================Weather result: {'city': 'Tokyo', 'temp': 68, 'condition': 'rainy'}

到这里就完成了。一个 MCP Server 搭好了Client 也成功调用了它。

步骤 5:增加更多工具

MCP 真正好用的地方在于扩展成本极低,再往 Server 里再加两个工具:

 from fastmcp import FastMCP  
from datetime import datetime  

mcp = FastMCP("my-first-server")  

@mcp.tool  
def get_weather(city: str) -> dict:  
    """Get the current weather for a city."""  
    weather_data = {  
        "new york": {"temp": 72, "condition": "sunny"},  
        "london": {"temp": 59, "condition": "cloudy"},  
        "tokyo": {"temp": 68, "condition": "rainy"},  
    }  
    city_lower = city.lower()  
    if city_lower in weather_data:  
        return {"city": city, **weather_data[city_lower]}  
    return {"city": city, "temp": 70, "condition": "unknown"}  

@mcp.tool  
def get_time(timezone: str = "UTC") -> str:  
    """Get the current time in a specified timezone."""  
    # Simplified - in production use pytz or zoneinfo  
    return f"Current time ({timezone}): {datetime.now().strftime('%H:%M:%S')}"  

@mcp.tool  
def calculate(expression: str) -> dict:  
    """Safely evaluate a mathematical expression."""  
    try:  
        # Only allow safe math operations  
        allowed_chars = set("0123456789+-*/.() ")  
        if not all(c in allowed_chars for c in expression):  
            return {"error": "Invalid characters in expression"}  
          
        result = eval(expression)  # Safe because we validated input  
        return {"expression": expression, "result": result}  
    except Exception as e:  
        return {"error": str(e)}  
if __name__ == "__main__":  
     mcp.run(transport="stdio")

再跑一次测试客户端,三个工具全部自动发现:

 Available tools:  
   - get_weather: Get the current weather for a city.  
   - get_time: Get the current time in a specified timezone.  
   - calculate: Safely evaluate a mathematical expression.

不需要改配置,不需要写路由。加了工具就直接可用。

最后:接入 LLM

前面写的 Client 是测试用的。生产环境里,LLM 框架本身充当 Client 角色。概念上大概是这样:

How MCP connects your LLM to external tools: the framework calls the client, which discovers and invokes tools from your server.

Server 端的代码完全不用动,这正是 MCP 的价值所在——工具写一次,任何兼容 MCP 的客户端都能用。

生产部署时需要把传输方式从

stdio

换成

http

 if__name__=="__main__":  
     mcp.run(transport="http", host="0.0.0.0", port=8000)

这样 MCP Server 就以 HTTP 端点的形式对外暴露,远程客户端可以直接连接。

总结

现在你手头已经有一个能跑的 MCP Server 了,前后也就 15 分钟。下一步就是把它接到实际的 LLM 上,做点真正有用的东西出来。

https://avoid.overfit.cn/post/c9314c34543a4ed1a1bb15b92d1c6ca2

by Paolo Perrone

这个小软件只有一个功能,就是把 win11 任务栏变回小图标,从 win95 一直用过来,还是习惯小图标的任务栏,只可惜微软在 win11 里砍掉了这个原生功能,苦于找不到合适的解决方案。

StartAllBack 能用,但是右下角只能显示时间,显示不了日期。
Windhawk 可以,右下角日期时间也都有,但是软件太臃肿,为了一个小功能搞一个 800 多兆的臃肿庞大的软件划不来。

所以花了几天时间 vibe coding 一个,一行代码都没写也不懂什么 C++,对代码一窍不通,这事放到一年前,想要做一个这样的软件简直是天方夜谭,现在有了 AI ,居然可以把想法变成现实了。感觉我现在强的可怕,感觉没有我做不出来的软件了,嚯哈哈哈哈。

另外又用 AI 做了个 pdbtools 用于下载微软的 pdb 文件并把偏移量保存到 taskbar_symbols.ini 符号偏移表里,不保证适配大部分版本,因为每个版本都不一样,所以如果你打开软件以后,跳出控制台下载文件,说明 ini 里没有适配到你的 win11 版本的偏移量,软件会自动从微软服务器下载两个 pdb 文件并放在当前目录里,下载完后,软件会自动找到对应的偏移量并保存到 ini 文件里,应用成功以后软件会自动删除两个文件。

首先把软件解压到任何你喜欢的目录,比如 D:\Tools\Taskbar\ 或者 C:\Program Files\TaskbarTweaker\ 然后运行
如果没效果,试试以管理员权限运行。
如果软件成功运行,并且成功应用到任务栏,软件会自动被加载到 任务计划程序 里,跟随开机自动启动
如果你想停用它,可以带参数 -u 来运行它,使用这个命令 taskbar_tweaker -u
如果遇到任何问题,请积极反馈。

https://github.com/metalbug/win11-taskbar-small-icon

【免费开源】stm32串行驱动LCD12864显示正弦函数 波形可视化神器完整项目分享

一、项目概述

本项目是一个基于STM32微控制器的LCD12864液晶显示屏驱动程序,通过串行通信方式控制LCD12864显示屏,实现正弦函数波形的实时显示。这个项目将数学函数可视化,让抽象的数学概念变得直观可见,是学习STM32嵌入式开发和图形显示技术的绝佳实践项目。

LCD12864是一款128×64点阵的图形型液晶显示模块,具有体积小、功耗低、显示内容丰富等特点,广泛应用于各种嵌入式系统中。本项目采用串行接口方式驱动LCD12864,相比并行接口方式,可以节省更多的IO引脚资源,非常适合引脚资源有限的STM32微控制器使用。

正弦函数是数学中最基础的周期函数之一,在信号处理、通信系统、音频处理等领域有着广泛的应用。通过在LCD12864上实时显示正弦波形,不仅能够直观地展示正弦函数的周期性特征,还能帮助理解数字信号处理的基本原理。

本项目的核心功能包括:LCD12864的初始化配置、串行通信接口的实现、正弦函数数据的计算与存储、波形绘制算法的实现等。通过这个项目,读者可以深入学习STM32的GPIO、SPI通信、定时器等外设的使用方法,掌握图形显示的基本原理和编程技巧。

源码分享

直接放到之前写的文章里了,免费开源,下载学习即可。

https://blog.csdn.net/weixin_52908342/article/details/158101046

二、系统设计流程图

flowchart TD
    A[系统启动] --> B[STM32初始化]
    B --> C[GPIO时钟配置]
    C --> D[SPI接口配置]
    D --> E[LCD12864初始化]
    E --> F[清屏操作]
    F --> G[正弦函数数据计算]
    G --> H[波形绘制]
    H --> I{是否继续显示}
    I -->|是| G
    I -->|否| J[结束]
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#fff4e1
    style D fill:#fff4e1
    style E fill:#e1ffe1
    style F fill:#e1ffe1
    style G fill:#ffe1f5
    style H fill:#ffe1f5
    style I fill:#f5ffe1
    style J fill:#ffcccc

三、硬件设计

3.1 STM32微控制器选型

本项目采用STM32F103系列微控制器作为主控芯片,该系列基于ARM Cortex-M3内核,具有丰富的外设资源和良好的性价比。STM32F103C8T6是最常用的型号,具有64KB Flash存储器、20KB SRAM、48个GPIO引脚,完全满足本项目的需求。

STM32F103的主要特性包括:

  • 72MHz系统时钟频率
  • 3个SPI接口
  • 2个I2C接口
  • 5个USART/UART接口
  • 3个12位ADC
  • 多个定时器
  • 丰富的GPIO配置选项

在这里插入图片描述

3.2 LCD12864液晶显示屏

LCD12864是一款128×64点阵的图形型液晶显示模块,内置ST7920控制器,支持串行和并行两种通信方式。主要技术参数如下:

  • 分辨率:128×64点阵
  • 显示颜色:黄绿底黑字或蓝底白字
  • 工作电压:5V
  • 工作电流:约2-3mA
  • 视角:6点钟方向
  • 控制器:ST7920
  • 内置字库:8192个中文汉字(16×16点阵)
  • 内置ROM:128个字符(8×16点阵)

3.3 硬件连接方案

采用串行接口方式连接STM32和LCD12864,需要以下连接:

  • LCD12864的VSS引脚连接GND
  • LCD12864的VDD引脚连接5V电源
  • LCD12864的V0引脚连接电位器用于对比度调节
  • LCD12864的RS(CS)引脚连接STM32的PA0
  • LCD12864的RW(SID)引脚连接STM32的PA1
  • LCD12864的E(SCLK)引脚连接STM32的PA2
  • LCD12864的PSB引脚连接GND(选择串行模式)
  • LCD12864的RST引脚连接STM32的PA3
  • LCD12864的BLA引脚连接5V(背光正极)
  • LCD12864的BLK引脚连接GND(背光负极)

四、软件设计

4.1 系统架构设计

软件系统采用模块化设计,主要包含以下模块:

  1. 系统初始化模块:负责STM32系统时钟、GPIO、SPI等外设的初始化配置
  2. LCD12864驱动模块:实现LCD12864的底层驱动函数,包括写命令、写数据、清屏等操作
  3. 图形绘制模块:实现基本的图形绘制功能,如画点、画线、画矩形等
  4. 波形显示模块:实现正弦函数波形的计算和显示
  5. 主控模块:协调各模块的工作,实现系统的整体功能

4.2 LCD12864驱动程序

LCD12864的串行通信协议采用三线制(CS、SID、SCLK),数据传输时序严格遵循ST7920控制器的规范。以下是LCD12864初始化的核心代码:

#include "stm32f10x.h"

#define LCD_CS_PIN    GPIO_Pin_0
#define LCD_SID_PIN   GPIO_Pin_1
#define LCD_SCLK_PIN  GPIO_Pin_2
#define LCD_RST_PIN   GPIO_Pin_3
#define LCD_PORT      GPIOA

void LCD_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = LCD_CS_PIN | LCD_SID_PIN | LCD_SCLK_PIN | LCD_RST_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LCD_PORT, &GPIO_InitStructure);
    
    GPIO_SetBits(LCD_PORT, LCD_CS_PIN);
    GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
    GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    GPIO_SetBits(LCD_PORT, LCD_RST_PIN);
}

void LCD_WriteByte(uint8_t data, uint8_t rs)
{
    uint8_t i;
    uint8_t temp;
    
    GPIO_ResetBits(LCD_PORT, LCD_CS_PIN);
    
    for(i = 0; i < 5; i++) {
        GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
        GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
        GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    }
    
    GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
    if(rs) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
    else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
    GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    
    GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
    GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
    GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    
    for(i = 0; i < 4; i++) {
        temp = data;
        temp = temp << i;
        temp = temp & 0x80;
        
        GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
        if(temp) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
        else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
        GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    }
    
    for(i = 4; i < 8; i++) {
        temp = data;
        temp = temp << i;
        temp = temp & 0x80;
        
        GPIO_ResetBits(LCD_PORT, LCD_SCLK_PIN);
        if(temp) GPIO_SetBits(LCD_PORT, LCD_SID_PIN);
        else GPIO_ResetBits(LCD_PORT, LCD_SID_PIN);
        GPIO_SetBits(LCD_PORT, LCD_SCLK_PIN);
    }
    
    GPIO_SetBits(LCD_PORT, LCD_CS_PIN);
}

void LCD_WriteCommand(uint8_t cmd)
{
    LCD_WriteByte(0xf8, 0);
    LCD_WriteByte(cmd & 0xf0, 1);
    LCD_WriteByte((cmd << 4) & 0xf0, 1);
}

void LCD_WriteData(uint8_t data)
{
    LCD_WriteByte(0xfa, 0);
    LCD_WriteByte(data & 0xf0, 1);
    LCD_WriteByte((data << 4) & 0xf0, 1);
}

void LCD_Init(void)
{
    LCD_GPIO_Init();
    
    GPIO_ResetBits(LCD_PORT, LCD_RST_PIN);
    Delay_ms(10);
    GPIO_SetBits(LCD_PORT, LCD_RST_PIN);
    Delay_ms(10);
    
    LCD_WriteCommand(0x30);
    Delay_ms(5);
    LCD_WriteCommand(0x30);
    Delay_ms(5);
    LCD_WriteCommand(0x0c);
    Delay_ms(5);
    LCD_WriteCommand(0x01);
    Delay_ms(5);
    LCD_WriteCommand(0x06);
    Delay_ms(5);
}

void LCD_Clear(void)
{
    LCD_WriteCommand(0x30);
    LCD_WriteCommand(0x01);
    Delay_ms(10);
}

4.3 正弦函数波形绘制

正弦函数波形的绘制需要将数学上的连续函数转换为离散的点阵显示。LCD12864的分辨率为128×64,我们需要在这个有限的像素空间内绘制出平滑的正弦波形。

正弦函数的基本公式为:y = A × sin(ωx + φ) + k

其中:

  • A:振幅,决定波形的高度
  • ω:角频率,决定波形的周期
  • φ:初相位,决定波形的起始位置
  • k:直流偏置,决定波形的垂直位置

以下是正弦波形绘制的核心代码:

#include <math.h>

#define PI 3.14159265358979323846
#define LCD_WIDTH  128
#define LCD_HEIGHT 64

void LCD_DrawPoint(uint8_t x, uint8_t y)
{
    uint8_t x_addr, y_addr;
    uint8_t bit_data;
    
    if(x >= LCD_WIDTH || y >= LCD_HEIGHT) return;
    
    y_addr = y / 8;
    bit_data = 0x01 << (y % 8);
    
    LCD_WriteCommand(0x80 | y_addr);
    LCD_WriteCommand(0x80 | x);
    LCD_WriteData(bit_data);
}

void LCD_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
{
    int dx, dy, sx, sy, err, e2;
    
    dx = abs(x2 - x1);
    dy = abs(y2 - y1);
    
    if(x1 < x2) sx = 1;
    else sx = -1;
    
    if(y1 < y2) sy = 1;
    else sy = -1;
    
    err = dx - dy;
    
    while(1) {
        LCD_DrawPoint(x1, y1);
        
        if(x1 == x2 && y1 == y2) break;
        
        e2 = 2 * err;
        
        if(e2 > -dy) {
            err -= dy;
            x1 += sx;
        }
        
        if(e2 < dx) {
            err += dx;
            y1 += sy;
        }
    }
}

void LCD_DrawSineWave(void)
{
    uint8_t x, y;
    float angle;
    float amplitude = 25.0;
    float frequency = 2.0;
    float offset = 32.0;
    
    LCD_Clear();
    
    LCD_WriteCommand(0x34);
    LCD_WriteCommand(0x36);
    
    for(x = 0; x < LCD_WIDTH; x++) {
        angle = (float)x * frequency * 2.0 * PI / LCD_WIDTH;
        y = (uint8_t)(offset + amplitude * sin(angle));
        
        LCD_DrawPoint(x, y);
        
        if(x > 0) {
            uint8_t prev_x = x - 1;
            float prev_angle = (float)prev_x * frequency * 2.0 * PI / LCD_WIDTH;
            uint8_t prev_y = (uint8_t)(offset + amplitude * sin(prev_angle));
            LCD_DrawLine(prev_x, prev_y, x, y);
        }
    }
    
    LCD_WriteCommand(0x30);
}

void LCD_DisplayText(uint8_t x, uint8_t y, char *str)
{
    LCD_WriteCommand(0x80 | y);
    LCD_WriteCommand(0x80 | x);
    
    while(*str != '\0') {
        LCD_WriteData(*str);
        str++;
    }
}

4.4 主程序设计

主程序负责系统的初始化和功能协调,通过定时器实现波形的动态刷新,或者通过按键实现不同参数波形的切换。

int main(void)
{
    SystemInit();
    
    LCD_Init();
    LCD_Clear();
    
    LCD_DisplayText(0, 0, "Sine Wave Demo");
    Delay_ms(1000);
    
    LCD_DrawSineWave();
    
    LCD_DisplayText(0, 2, "y=A*sin(wx+phi)+k");
    LCD_DisplayText(0, 4, "A=25, w=2, phi=0");
    LCD_DisplayText(0, 6, "k=32");
    
    while(1) {
        Delay_ms(1000);
    }
}

void Delay_ms(uint32_t ms)
{
    uint32_t i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 9000; j++);
}

五、关键技术点分析

5.1 串行通信时序

LCD12864的串行通信采用SPI时序,但与标准SPI有所不同。ST7920控制器定义了特殊的通信协议,每个字节传输需要先发送5个同步字节,然后发送RS位和数据位。这种设计虽然增加了通信开销,但提高了通信的可靠性。

5.2 图形绘制算法

在点阵显示屏上绘制平滑曲线需要采用适当的算法。本项目使用Bresenham直线算法来连接离散的正弦函数点,这种方法计算效率高,适合在资源有限的嵌入式系统中使用。

5.3 浮点数运算优化

STM32F103具有硬件浮点运算单元,但为了提高运算效率,在实际应用中可以考虑使用定点数运算代替浮点数运算,或者使用查表法预先计算正弦函数值。

5.4 显示缓冲区管理

为了提高显示效率,可以建立显示缓冲区,先在内存中完成图形绘制,然后一次性更新到LCD显示屏。这种方法可以减少LCD的访问次数,提高显示速度。

六、项目扩展与应用

6.1 功能扩展

  1. 多波形显示:扩展支持余弦函数、方波、三角波等多种波形
  2. 参数调节:通过按键或电位器实时调节波形的振幅、频率、相位等参数
  3. 动态显示:实现波形的滚动显示,模拟示波器功能
  4. 数据存储:将波形数据存储到SD卡,实现数据记录功能

6.2 应用场景

  1. 教学演示:用于数学和物理教学,直观展示周期函数的特征
  2. 信号发生器:配合DAC芯片,实现可调参数的信号发生功能
  3. 仪器显示:作为各种测量仪器的显示界面
  4. 工业控制:用于工业自动化设备的参数显示和监控

七、总结

本项目通过STM32驱动LCD12864显示正弦函数波形,展示了嵌入式系统图形显示的基本原理和实现方法。项目涵盖了硬件设计、软件编程、算法实现等多个方面的知识,是学习STM32嵌入式开发的综合性实践项目。

通过本项目的学习,读者可以掌握STM32的GPIO配置、串行通信、定时器使用等基本技能,理解图形显示的原理和方法,为后续更复杂的项目开发打下坚实的基础。项目的代码结构清晰,功能模块化,便于学习和扩展。

项目采用开源方式发布,欢迎广大爱好者学习交流,共同进步。希望这个项目能够帮助更多人了解嵌入式开发的魅力,激发对电子技术的兴趣和热情。

八、参考资料

  1. ST7920 LCD控制器数据手册
  2. STM32F103参考手册
  3. LCD12864液晶显示屏技术规格书
  4. 嵌入式系统设计与应用
  5. 数字信号处理基础
    在这里插入图片描述

大概一个月前,门牙一颗开始渐渐碎裂,一点一点的碎片掉下来还是很让人心慌的, 牙签往里捅一捅能感觉有个坑,一捅一疼,门牙最后出现了大概一毫米能卡进指甲的缝,



老实说不好看是次要的,担心进一步恶化才是想处理的主要原因,

12 号放假了想看看牙,离家最近的口腔门诊关门了,走到远一些的门诊看了个价目表,补一颗大概三百块总费用,医保定点,但只能走个人账户,不走统筹,



网上搜了下最吸睛的是个连锁的某某菲尔,在医疗保障局网站( https://wjw.sz.gov.cn/bmfw/wycx/fwyl/yycx/ )能查到总院是二级营利性口腔医院,但不清楚这代表什么,

官网有在线客服我想问问是否支持社保和统筹,但这客服好像只会说套话,一点有用信息都没有,先让我加微信拍照看看牙,然后说牙缝补不了用不了医保,要考虑贴面或者牙冠,我质疑,他又说可以约个免费检查,说医生不是神仙不能在网上就确认方案, 合着照片是白看的,这套话说的我很没安全感,决定上大医院检查了,

龙华区人民医院,要提前预约,牙体牙髓病科,看了下 18 号初二一大堆医生有空,其他基本没时间,最后在医院自己网站预约到年前唯一一个医师唯一一个有号的时间,今天 15 号去看,

提前预约, 去医院当天付挂号费( 25-15 ),到口腔门诊楼层机器上取不到号,找人工就能取到号,搞不懂,给我的感觉机器似乎是和 160 合作的,不在 160 预约的号就取不了,包括医院自己的公众号进入自家的网站预约的也是二等公民的感觉,

取号后看医生,先说了我的目的,就是补一个门牙,顺便整体检查一下所有牙齿,于是医生先给我开了个牙片,扫码付费( 50-27.5 ),然后到对门拍牙片,



站正了,戴个挺重的帽子,咬住一个套着一次性套的塑料片,脸旁两个 45°弧形的什么东西绕着我转大概一分钟就好了,



完事只让我用手机拍电脑上的牙片就能回去看医生了,没有纸质的牙片给我,



回去医生在给别人处理, 等了大概半个小时到我,躺了五分钟医生才来开始,

过程手机开了录音和转文字,共 37 分钟,但是听不太清楚,转文字记录了很多细微的其他医生闲聊的声音,



开始先检查一下,主要就是说我后牙磨损严重,说也不是说那么严重,但我还年轻就磨损成这样,问我有没有睡觉磨牙,应该没有,没人说过我磨牙,不过也可能是打呼噜严重盖过了,

后牙侧面有洞有蛀有隐裂纹,不能咬太硬的东西,不然裂成两半可能要拔牙,

左下右下各一颗建议补,右上一颗问题比较小,想补的话一次性都能补掉,

没提到牙片上的一颗横智齿,

然后就开始处理门牙,

全程有个棉花状的东西挡住上嘴唇,还有个支架咬住防止闭嘴,

全程好像是两个人,一个拿着管子专门在吸水,

先磨掉蛀牙再补,磨了几十下。每一下都有神经痛的感觉,刺刺的。很吓人,

管子在嘴里一直吸口水和偶尔喷的水,但偶尔还是忍不住咽一点。

磨完开始补,补牙过程有一次什么东西塞进牙缝怼到牙龈的肉疼感,不是很疼但忍不住发声,医生马上就说是有点疼正常的,

补完之后又磨了十几下,不疼,应该是在磨树脂假牙。但最后磨的一下又突然疼了一下,像是磨到旁边的门牙了,但看感觉没什么问题。

补后修完有两次让我咬一咬动一动看有没有挡住,

完事后边上放了杯温水给我漱口,

医生交代最近别吃太冷太烫的,万一发炎了可能要做根管,要是没什么感觉补好就行,

补的牙不能嗑瓜子这种硬的,保护好能用很久的,要注意刷牙,用牙线,不然可能还会蛀,没说具体能用多久,留了个联系方式,说是 3 个月内掉了的话免费处理。超过了时间有问题也可以直接联系。

结束之后才开单让我缴费( 392.9-215.16 ),分好多项目总和,最贵的一项 200 ,事前只有提一嘴补一颗大概三百多一半统筹一半个人一点点自费,



补完表面有点坑坑洼洼的看不出来但是舌头舔一舔很明显不光滑,



问了下磨了多少好牙,说是蛀的范围挺大的。磨掉挺多的,事前外表看上去就一条缝大概一毫米,可牙签刮一刮确实感觉里面有个坑。

牙片明显有颗智齿横了,但医生没主动提起,明明一开始就说是想整体检查才拍片的,但医生似乎没怎么看牙片,

因此我主动问了下这个智齿,医生这才仔细看牙片,说看起来可能长在了牙神经上,拔掉风险可能比较大,但也不一定,可能是错位的,需要做 CT 确认一下。如果伤到牙神经的话无法恢复,会一直有麻药没过的感觉,但不会面瘫,别人看不出来,

另外门牙缝上方挨着牙龈的位置有个很小的洞漏气卡脏东西,一直是这样的,怀疑蛀牙也是这里清洁不干净导致的, 补牙后这个洞还在,原以为会被填上,

修好了闭嘴吸一吸,还有一点点凉凉的磨牙时的神经痛的感觉。

背着包去的,完全没用上,全程只用到了手机。连身份证都没用,甚至没有什么单子要给我带走。
带了瓶东方树叶放包里,回家了才发现忘了喝。

完事一个半小时后吃饭, 饭后大概一个小时内牙齿比刚补完更敏感一些,饭后四个小时后基本上没有感觉了,

加上来回公交费,总费用,一档医保,

(25+50+392.9) − (15+27.5+215.16) +3*2= 216.24 元,

这年头,谁家里还没个“小爱同学”?

但说实话,用久了你一定也发现了:

问点复杂的,她就开始装傻——
“哎呀,这个问题难倒我了”;
想让她写个周报、出个方案、分析点东西?
除了放歌、设闹钟,基本属于智商掉线状态。

如果我告诉你:只要 5 分钟,就能让家里这个“只会听指令的小爱”,直接升级成能写代码、能做方案、能陪你聊天的 AI 大神,你愿不愿意折腾一下?

今天这篇文章,就是一个真正能照着做、不踩坑的保姆级教程
我们用一个叫 Lerio AI Speaker 的工具,
给小爱同学来一次“原地飞升”


一、为什么要折腾这一出?

一句话总结:

👉 给小爱同学换个“更聪明的大脑”。

升级前的小爱:

  • 只能执行固定指令
  • 对话生硬,经常答非所问
  • 稍微复杂一点的问题就“我还没学会”

升级后的小爱:

  • 接入主流大模型(通义千问 / 智谱 AI / DeepSeek / 小米自研等)
  • 能理解上下文,正常聊天
  • 能写方案、改文案、写代码
  • 甚至可以当孩子的学习助手、你的情绪垃圾桶

最关键的一点:不用买新硬件。
你家现在那个小爱音箱,直接就能用。


二、准备工作(3样东西就够)

在开始之前,先确认你有下面这些:

1️⃣ 小米账号(已经绑定小爱音箱)
2️⃣ Lerio AI Speaker 账号(音箱和大模型之间的“中转站”)
3️⃣ Xiaomi MiMo API 开放平台账号(用小米账号就能登录)

没什么技术门槛,全程网页操作。


三、手把手教程(一步一步来)

1️⃣ 登录 Lerio 控制台

打开:
👉 https://mi.lerio.cn/dashboard

注册并登录后,你会看到一个非常清爽的后台界面。


2️⃣ 授权你的小米账号(关键步骤)

在后台找到 「我的账号」 → 立即配置

这里需要填写:

  • 小米 ID
  • 登录用的 passToken

这一步的作用:
👉 让 Lerio 拿到控制你音箱的权限,否则后面没法通信。

# passToken 获取方法
1. 使用 Chrome 浏览器访问小米账号官网并登录
2. 按 F12 打开开发者工具
3. 切换到 Application(应用)
4. 左侧 Cookies → https://account.xiaomi.com
5. 找到 passToken,复制它

注意:不要主动退出小米账号,否则 passToken 会失效

PixPin_2026-02-12_16-09-42.png

这一块很多人会紧张,其实就是读取 Cookie,用完随时可以解绑。

3️⃣ 创建使用卡槽

  • 新注册账号会送 3 天试用插槽
  • 高峰期可能会有点拥挤
  • 如果想长期稳定用,可以开通付费(价格还能接受)

PixPin_2026-02-12_16-16-26.png


4️⃣ 创建 AI 角色(最好玩的地方)

这里可以给小爱定一个“人设”。

比如:

  • 毒舌但专业的翻译官
  • 耐心讲解的老教授
  • 给孩子讲故事的百科老师

你写什么,它就按什么性格跟你说话。

PixPin_2026-02-12_16-21-19.png


5️⃣ 添加你的小爱音箱

绑定小米账号后:
👉 系统会自动拉取你名下所有的小爱设备。

选中你要用的那个即可。

PixPin_2026-02-12_16-25-12.png


6️⃣ 申请大模型 API Key

这里我们用 小米 Xiaomi MiMo 模型 举例:
👉 https://platform.xiaomimimo.com/#/console/api-keys

创建并复制你的 API Key。

PixPin_2026-02-12_16-31-07.png


7️⃣ 关联大模型(装上灵魂)

进入设备 → AI 服务配置

  • 选择你要用的模型
  • 填入刚才申请的 API Key

PixPin_2026-02-12_16-43-52.png


8️⃣ 启动服务,开始对话

使用方式很简单:

👉 先唤醒小爱 → 再说「请问 + 你的问题」

可以用你刚才设定的 AI 角色关键词,测试是否生效。

PixPin_2026-02-12_16-49-02.png

PixPin_2026-02-12_16-57-59.png


四、升级后的小爱,能干啥?

场景一:深夜情绪救援

  • 以前:

    “我可以为你播放一首伤感的歌”
  • 现在:

    “听得出来你很难受,要不要慢慢说给我听?”

场景二:办公摸鱼神器

  • 写周报
  • 出方案
  • 改文案
  • 想脚本

一句话,全都能接住。


场景三:孩子的十万个为什么

不用再照本宣科,
它能用孩子听得懂的话,把复杂问题讲清楚。


五、一些实用小提醒

1️⃣ 延迟是正常的
云端大模型需要 1~2 秒思考时间。

2️⃣ 随时可解绑
不想用了,后台一键关闭,小爱立刻恢复原样。


写在最后

当那个原本只会报天气的小音箱,
突然开始跟你聊人生、讲逻辑、写方案,
你会发现:

👉 这 5 分钟,真的值。

如果你在配置过程中遇到问题,
或者想接入更强的模型,
欢迎在评论区留言,我会一步步帮你搞定。

关注我,后面继续分享更多智能家居和 AI 的“野路子玩法”。

原文链接:https://www.nocobase.com/cn/blog/nocobase-2-0-officially-released

NocoBase 2.0 是一次面向 复杂应用构建与规模化部署 的重要升级。本次版本在 AI 能力、应用架构、数据编辑体验以及前端事件流等方面进行了系统性增强,同时全面推进 V2 页面与核心能力的适配。

新特性

AI 员工

AI 能力正式下沉至内核,成为 NocoBase 的一等公民,支持通过插件体系持续扩展:

  • 将 AI 移至内核,提供插件化扩展能力
  • 升级并优化 LangChain 相关依赖,提升稳定性与可扩展性
  • 简化 AI 员工的交互流程,降低配置与使用门槛

20260214075059

参考文档:

应用监管器

应用监管器插件用于 统一发现、调度与管理多个 NocoBase 应用实例,适用于多应用与多环境部署场景。

  • 支持应用自动发现与集中管理
  • 通过共享内存机制提升实例间协作效率
  • 支持多环境混合部署,满足复杂交付需求

共享内存
20260214075803

多环境混合部署
20260214075815

参考文档:

工作流画布编排能力增强

支持拖拽节点调整顺序

image-8ajlez.png

支持复制粘贴节点

image-nskgho.png

子表格(行内编辑 / 弹窗编辑)

为满足不同复杂度的关联数据编辑需求,NocoBase 提供两种子表格编辑模式,可按场景灵活选择:

  • 子表格(行内编辑):直接在表格中编辑关联数据,操作高效,适合快速录入与批量修改
  • 子表格(弹窗编辑):通过弹窗表单编辑数据,支持更复杂的字段类型与校验逻辑,适用于高复杂度场景

子表格(行内编辑)
20260214080224

子表格(弹窗编辑)
20260214080233

参考文档:

字段赋值(新版)

全新的字段赋值对表单数据的 初始化与写入逻辑 进行了统一与强化,显著提升可理解性与一致性:

  • 提供 统一的字段赋值配置入口,减少分散配置带来的理解成本
  • 字段赋值逻辑 不再依赖字段组件类型,数据行为更加稳定、可预测
  • 支持 关系字段的字段级赋值配置,满足复杂关联建模需求
  • 同时支持 默认值固定值 两种赋值方式,覆盖初始化与强制写入场景
  • 旧版「字段默认值」已废弃,请使用新版字段赋值

20260214080932

参考文档:

  • 字段赋值(文档即将上线)

事件流触发时机

事件流在执行时,严格按照 Event → Flow → Step 的层级顺序运行,并在各层级的执行前后触发对应 Hook,便于精细化控制与扩展。

event:
  before:
    - track_event_start
  flows:
    - name: flow1
      before:
        - track_flow_start
      steps:
        - name: step1
          before: [track_step_start]
          run: do_something
          after: [track_step_done]
      after:
        - track_flow_end
    - name: flow2
      ...
    - name: flow3
      ...
  after:
    - track_event_end

20260214081527

参考文档:

新增 2.0 适配

批量编辑

20260214083041

参考文档:

复制

20260214083146

参考文档:

区块高度

20260214083319

参考文档:

表格行拖拽排序

20260214085152

数据加载方式

20260214083433

参考文档:

表单支持展示关系字段的字段

20260214083517

参考文档:

页面(V2)本地化支持

V2 页面已全面支持本地化,覆盖 页面、区块、操作、字段 等多个层级。

启用本地化插件后,系统将自动收集缺失翻译词条,并集中展示于本地化管理列表,便于统一维护。

在 JS 区块中,可通过 ctx.t() 获取本地化文案,并支持变量插值:

const label = ctx.t('Your name is {{name}}', {
  name: await ctx.getVar('ctx.user.nickname')
});
ctx.render(label);

审批 2.0

新创建的审批工作流均以 2.0 的区块编排界面。1.x 已配置的仍支持继续使用,如 1.x 已配置的审批希望使用 2.0 的界面编排,需要选择 v2 版本重新配置界面,且配置后不能再还原到 1.x。

配置发起人的界面

image-ba3ann.png

配置审批人的界面

image-dl448q.png

抄送 2.0

新创建的抄送节点,被抄送人的查看界面均以 2.0 的区块编排,1.x 已配置的仍支持继续使用,如 1.x 已配置的抄送希望使用 2.0 的界面编排,需要选择 v2 版本重新配置界面,且配置后不能再还原到 1.x。

image-z26oib.png

尚未适配的功能

以下功能模块尚未在 2.0 中完成适配,将在后续版本中逐步升级:

功能模块当前替代方案
自定义请求工作流请求节点
浏览器打印JS 操作
分步表单JS 区块
树筛选区块JS 区块
日历区块JS 区块
自定义变量事件流
甘特图区块JS 区块
看板区块JS 区块
文本复制事件流
表格列设置JS 操作
样式联动规则事件流
复制文本快捷键事件流
二维码字段JS 字段
扫码录入事件流
嵌入 NocoBase
中国行政区字段
编码字段
公开表单
工作流人工节点待办
提交成功后事件流
表单数据模板事件流

道路表面多类型缺陷的图像识别数据集分享(适用于目标检测任务)

数据集分享

如需下载该数据集,可通过以下方式获取:

引言

随着城市化与交通运输业的快速发展,道路基础设施的健康状况直接关系到出行安全与城市运行效率。据统计,全球每年因道路缺陷引发的交通事故造成数十万人死亡,经济损失高达数千亿美元。长期高强度的使用、气候变化以及施工质量差异,都会导致道路表面出现裂缝、坑洼、井盖下沉及修补不良等缺陷。这些问题不仅影响驾驶舒适度,还可能引发交通事故,增加道路养护成本。

传统的道路巡检方式主要依靠人工目测或简单的仪器检测,存在效率低、准确性不足、主观性强等局限。例如,人工巡检需要大量的人力物力,检测速度慢,难以实现对大面积道路的快速覆盖;检测结果依赖于巡检人员的经验和责任心,容易出现漏检、误检等情况。

近年来,随着深度学习与计算机视觉技术的飞速发展,利用图像识别算法实现道路缺陷的自动化检测与分类成为研究热点。这种方法通过训练深度学习模型,从道路图像中自动识别缺陷类型和位置,具有高效、准确、可扩展性强等优点。然而,要开发出准确、可靠的道路缺陷检测模型,高质量、多样化且已标注的数据集是关键基础。

为满足这一需求,我们构建了一个涵盖多类缺陷的道路表面缺陷数据集,共计6000张高分辨率图片,涵盖了常见的裂缝、井盖、坑洼、修补区域等多种复杂场景。该数据集采用YOLO项目标准格式,并已完成train、val、test划分与标注,可直接用于深度学习模型的训练与验证。本文将对该数据集进行详细介绍,包括数据集背景、概述、结构、特点、适用场景等内容,旨在为相关研究和应用提供参考。

数据集背景

道路是城市基础设施的重要组成部分,其质量直接影响到交通运行效率和交通安全。据交通运输部统计,我国公路总里程已超过530万公里,其中高速公路总里程超过16万公里,居世界第一。随着公路里程的不断增加和交通量的持续增长,道路养护任务日益繁重。

道路表面缺陷是道路养护中的常见问题,主要包括以下几种类型:

  1. 裂缝:由于路面材料老化、温度变化、荷载作用等原因导致的路面开裂,是最常见的道路缺陷之一。裂缝如果不及时处理,会逐渐扩大,导致路面结构损坏。
  2. 坑洼:由于路面材料松散、水损害、重载车辆碾压等原因导致的路面局部下沉,形成坑洞。坑洼会影响车辆行驶稳定性,增加燃油消耗,甚至引发交通事故。
  3. 井盖:道路上的井盖如果安装不规范或长期受到车辆碾压,会出现下沉、凸起、破损等问题,影响道路平整度和行车安全。
  4. 修补区域:道路修补后形成的区域,如果修补质量不佳,会出现修补材料脱落、与原路面结合不良等问题,影响道路美观和使用寿命。

传统的道路缺陷检测方法主要包括以下几种:

  1. 人工巡检:巡检人员通过肉眼观察或简单工具检测道路缺陷,记录缺陷位置和类型。这种方法效率低,劳动强度大,容易受到人为因素影响。
  2. 车载检测设备:使用安装在车辆上的激光测距仪、摄像头等设备,采集道路表面数据,然后通过人工分析或简单的算法处理识别缺陷。这种方法效率较高,但设备成本昂贵,数据处理复杂。
  3. 地面激光扫描:使用地面激光扫描仪采集道路表面三维数据,通过分析数据识别缺陷。这种方法精度高,但操作复杂,成本高昂,难以实现大面积检测。

基于深度学习的图像识别技术为道路缺陷检测提供了新的解决方案。这种方法通过训练深度学习模型,从道路图像中自动识别缺陷类型和位置,具有以下优势:

  1. 高效快速:可以在车辆行驶过程中实时采集和分析道路图像,大大提高检测效率。
  2. 客观准确:不受操作人员经验和主观因素的影响,检测结果更加客观可靠。
  3. 成本低廉:只需要普通的摄像头和计算设备,成本远低于传统的检测设备。
  4. 可扩展性强:可以通过增加训练数据和优化模型,不断提高检测精度和覆盖范围。

然而,要开发出准确、可靠的道路缺陷检测模型,高质量、多样化且已标注的数据集是关键基础。目前,公开可用的道路缺陷图像数据集存在以下问题:

  1. 样本数量不足:许多数据集样本数量较少,难以支持深度学习模型的充分训练。
  2. 类别覆盖有限:部分数据集只覆盖少数几种道路缺陷类型,难以满足实际检测需求。
  3. 场景单一:许多数据集的图像拍摄场景较为单一,难以适应实际应用中的复杂场景。
  4. 标注质量参差不齐:一些数据集的标注不够准确或不一致,影响模型训练效果。

为应对这些挑战,我们构建了本数据集,旨在为道路缺陷检测算法的研究与落地提供高质量的数据支持。

数据集概述

本数据集专注于道路表面缺陷检测与识别,共计6000张高分辨率图片,涵盖了常见的裂缝、井盖、坑洼、修补区域等多种复杂场景。所有图片均经过精心筛选与标注,确保数据的准确性与代表性。

基本信息

  • 图片总数:6000张
  • 图像格式:JPG
  • 标注格式:YOLO格式(每张图片对应一个txt标注文件)
  • 类别数量:8类
  • 类别定义

    1. Crack —— 道路裂缝
    2. Manhole —— 井盖
    3. Net —— 网状裂缝
    4. Pothole —— 坑洼
    5. Patch-Crack —— 修补裂缝
    6. Patch-Net —— 修补网状裂缝
    7. Patch-Pothole —— 修补坑洼
    8. Other —— 其他异常
  • 数据划分

    • 训练集(train):70%(约4200张)
    • 验证集(val):20%(约1200张)
    • 测试集(test):10%(约600张)
  • 图像特征

    • 分辨率统一为高清规格,适合深度学习训练
    • 涵盖白天、夜间、阴影、雨后等复杂环境,增强鲁棒性
    • 不同路段(高速、城市道路、乡村道路)均有采样,保证多样性

文件结构

本数据集采用标准的文件夹结构进行组织,具体如下:

dataset/
├── train/
│   ├── images/
│   └── labels/
├── val/
│   ├── images/
│   └── labels/
└── test/
    ├── images/
    └── labels/

其中,images文件夹存放不同划分的图像文件,labels文件夹存放对应的YOLO格式标注文件。

标注格式

本数据集采用YOLO标准格式进行标注,每个标注文件对应一张图像,文件名与图像文件名相同,后缀为.txt。标注文件的每一行表示一个目标,格式如下:

<class_id> <x_center> <y_center> <width> <height>

其中,class_id为类别编号,x_centery_center为目标中心点的归一化坐标,widthheight为目标的归一化宽高。坐标值和宽高均为相对于图像宽度和高度的归一化值,范围在0到1之间。

数据集详情

数据采集与处理

本数据集的图像来源于多个城市的道路巡检,涵盖了不同类型、不同等级的道路。为确保数据集的质量和多样性,我们在数据采集过程中遵循了以下原则:

  1. 多场景覆盖:采集不同城市、不同路段、不同天气条件下的道路图像,确保数据集能够覆盖各种实际场景。
  2. 多缺陷类型:采集包含裂缝、井盖、坑洼、修补区域等多种缺陷类型的图像,确保数据集的类别多样性。
  3. 高质量图像:使用高分辨率摄像头采集图像,确保图像清晰,缺陷特征明显。
  4. 标注准确性:由专业人员对图像中的缺陷进行手动标注,确保标注的准确性和一致性。

在数据处理过程中,我们对图像进行了以下处理:

  1. 图像预处理:对采集到的图像进行去噪、增强等处理,提高图像质量和缺陷的可见性。
  2. 目标标注:由专业人员使用标注工具对图像中的缺陷进行手动标注,绘制边界框并标记类别。
  3. 格式转换:将标注结果转换为YOLO标准格式,生成对应的.txt标注文件。
  4. 数据划分:按照70:20:10的比例将数据划分为训练集、验证集和测试集,确保数据划分的合理性。
  5. 质量检查:对处理后的数据进行质量检查,确保标注的准确性和一致性,去除质量不佳的图像。

类别分布

本数据集包含8类道路表面缺陷,各类别的样本数量分布如下:

类别编号类别名称样本数量(约)说明
0Crack1500+道路表面的线性裂缝
1Manhole1200+道路上的井盖及其周围区域
2Net800+道路表面的网状裂缝
3Pothole1000+道路表面的坑洼
4Patch-Crack500+修补后的裂缝区域
5Patch-Net300+修补后的网状裂缝区域
6Patch-Pothole400+修补后的坑洼区域
7Other300+其他道路表面异常

注:样本数量为估计值,实际样本数量可能因数据采集和处理过程而有所差异。

场景多样性

本数据集的图像涵盖了多种实际场景,包括:

  1. 不同道路类型:高速公路、城市主干道、次干道、乡村道路等。
  2. 不同天气条件:晴天、阴天、雨天、雪天等。
  3. 不同光照条件:白天、黄昏、夜间、阴影等。
  4. 不同季节:春季、夏季、秋季、冬季。
  5. 不同路面材料:沥青路面、水泥路面、砖石路面等。

这种场景多样性使得数据集能够更好地模拟实际道路环境,提高模型的泛化能力。

image-20250819151030455

image-20250819150906330

image-20250819150951721

image-20250819151005920

数据处理流程

为确保数据集的质量和可用性,我们在构建过程中遵循了严格的数据处理流程,具体步骤如下:

flowchart TD
    A[数据采集] --> B[图像预处理]
    B --> C[质量评估]
    C --> D[目标标注]
    D --> E[标注验证]
    E --> F[格式转换]
    F --> G[数据划分]
    G --> H[质量检查]
    H --> I[数据集发布]
  1. 数据采集:使用高分辨率摄像头在不同场景下采集道路表面图像
  2. 图像预处理:对采集到的图像进行去噪、增强等处理,提高图像质量
  3. 质量评估:对预处理后的图像进行质量评估,筛选出清晰、具有代表性的图像
  4. 目标标注:由专业人员对图像中的缺陷进行手动标注,绘制边界框并标记类别
  5. 标注验证:对标注结果进行验证,确保标注的准确性和一致性
  6. 格式转换:将标注结果转换为YOLO标准格式,生成对应的.txt标注文件
  7. 数据划分:按照70:20:10的比例将数据划分为训练集、验证集和测试集
  8. 质量检查:对处理后的数据进行最终质量检查,确保数据的完整性和一致性
  9. 数据集发布:打包发布数据集,提供下载链接

数据集特点

本数据集具有以下显著特点:

1. 样本数量充足

共计6000张高分辨率图片,涵盖了8类道路表面缺陷,每个类别均有足够的样本量,确保模型训练的充分性。与其他同类数据集相比,本数据集的样本数量更多,类别覆盖更全面。

2. 场景多样性强

数据集涵盖了不同城市、不同道路类型、不同天气条件、不同光照条件下的道路图像,场景多样性强。这种多样性使得模型在训练过程中能够学习到不同场景下的缺陷特征,提高模型的泛化能力。

3. 标注质量高

所有图像均由专业人员进行手动标注,标注准确、一致。标注过程中严格遵循统一的标注规范,确保边界框的准确性和类别的一致性。高质量的标注为模型训练提供了可靠的基础。

4. 格式标准统一

数据集采用YOLO标准格式进行标注,已按照训练集、验证集和测试集进行了合理划分,可直接用于主流目标检测框架的训练和验证。用户无需进行格式转换或数据划分,开箱即用,提高了数据集的易用性。

5. 应用价值广泛

数据集涵盖了道路表面常见的多种缺陷类型,应用价值广泛。可用于道路缺陷检测、智能交通系统、自动驾驶感知等多个领域,为相关研究和应用提供数据支持。

6. 贴近实际场景

数据集的图像均来自实际道路巡检,贴近实际应用场景。包含了各种复杂情况,如不同光照、不同天气、不同路面材料等,使得模型在实际应用中能够更好地适应各种情况。

7. 分辨率高

数据集的图像分辨率统一为高清规格,缺陷特征清晰可见。高分辨率图像有助于模型学习到更多的细节特征,提高检测精度。

适用场景

本数据集可广泛应用于以下研究与工程应用场景:

1. 道路表面缺陷检测

可直接用于训练YOLOv5、YOLOv8等目标检测模型,实现对道路表面缺陷的自动检测和分类。通过在本数据集上训练模型,可以提高道路缺陷检测的准确率和效率,为道路养护提供技术支持。

2. 智能交通系统(ITS)

可作为智能交通系统的感知层数据支撑,用于城市道路养护、交通安全监测等。例如,可以集成到城市交通管理系统中,实时监测道路状况,及时发现和处理道路缺陷,提高道路养护效率和交通安全水平。

3. 自动驾驶感知模块

在自动驾驶系统中,道路表面信息是重要的环境感知因素。本数据集可用于训练自动驾驶系统的感知模块,提高车辆对道路表面状况的识别能力,为路径规划和驾驶决策提供依据。

4. 深度学习算法研究

可作为目标检测、分割、异常检测等领域的benchmark,用于验证新模型的有效性。例如,可以用于比较不同目标检测算法在道路缺陷检测任务上的性能,或者用于研究新的目标检测方法和技术。

5. 实际工程落地

适用于道路养护部门开发的AI道路巡检机器人或无人机检测系统,帮助减少人力巡检成本,提高检测效率。例如,可以部署在巡检车辆或无人机上,实现对道路的自动巡检和缺陷检测。

6. 道路养护决策支持

可用于构建道路养护决策支持系统,基于检测结果评估道路状况,制定合理的养护计划。例如,可以根据缺陷的类型、严重程度和分布情况,预测道路的使用寿命,优化养护资源分配。

7. 城市管理系统

可集成到城市管理系统中,作为智慧城市建设的一部分。例如,可以与地理信息系统(GIS)结合,实现道路缺陷的空间分布分析,为城市规划和建设提供参考。

模型训练建议

针对本数据集的特点,我们提出以下模型训练建议:

1. 模型选择

对于道路缺陷检测任务,建议使用以下模型:

  • YOLOv8:性能均衡,适合大多数应用场景,特别是需要实时检测的场景
  • YOLOv11:最新版本,精度和速度都有提升,适合对性能要求较高的场景
  • Faster R-CNN:精度较高,适合对精度要求高、对速度要求不高的场景
  • EfficientDet:效率较高,适合资源受限的场景

2. 数据增强

由于道路缺陷检测任务的特殊性,建议使用以下数据增强技术:

  • 随机翻转:水平翻转和垂直翻转,增加数据多样性
  • 随机旋转:随机旋转图像,增强模型对缺陷不同角度的适应能力
  • 亮度和对比度调整:随机调整图像的亮度和对比度,增强模型对不同光照条件的适应能力
  • 随机裁剪:随机裁剪图像的一部分,增强模型对缺陷不同大小的适应能力
  • 马赛克增强:将多张图像拼接成一张,增加小目标的数量
  • 高斯噪声:添加适量的高斯噪声,增强模型对噪声的鲁棒性

3. 训练策略

  • 批量大小:根据硬件资源选择合适的批量大小,建议使用8-32
  • 学习率:初始学习率设置为0.001,使用余弦退火策略调整学习率
  • 优化器:使用AdamW优化器,权重衰减设置为0.0005
  • 训练轮数:建议训练100-300轮,根据验证集性能动态调整
  • 早停策略:当验证集性能连续多个轮次没有提升时,停止训练
  • 迁移学习:可以使用在COCO数据集上预训练的模型权重,加速模型收敛

4. 评估指标

使用以下指标评估模型性能:

  • mAP@0.5:IoU阈值为0.5时的平均精度
  • mAP@0.5:0.95:IoU阈值从0.5到0.95,步长为0.05时的平均精度
  • 精确率:正确预测的正样本占总预测正样本的比例
  • 召回率:正确预测的正样本占总实际正样本的比例
  • F1-score:精确率和召回率的调和平均值
  • 推理速度:模型的推理时间,用于评估实时性能

5. 模型优化

  • 模型剪枝:去除冗余的神经元和连接,减少模型大小
  • 模型量化:将模型权重从32位浮点数量化为8位整数,减少模型大小和计算复杂度
  • 知识蒸馏:利用大模型的知识指导小模型的训练,提高小模型的性能
  • 部署优化:针对不同部署平台进行优化,如TensorRT、ONNX Runtime等

应用案例

案例一:智能道路巡检系统

基于本数据集训练的YOLOv8模型,开发了一款智能道路巡检系统。该系统通过安装在巡检车辆上的摄像头实时采集道路图像,然后利用训练好的模型自动识别图像中的道路缺陷。系统会生成巡检报告,标记出缺陷位置、类型和严重程度,并提供养护建议。该系统已在多个城市的道路养护部门试用,巡检效率提高了70%以上,缺陷检测准确率达到90%以上。

案例二:城市道路养护管理系统

将训练好的模型集成到城市道路养护管理系统中,实现对城市道路状况的实时监测和管理。系统通过分析巡检车辆采集的图像,自动识别道路缺陷,生成缺陷分布图和养护优先级报告。养护部门可以根据这些信息制定合理的养护计划,优化养护资源分配。该系统已在某省会城市部署,道路养护效率提高了50%以上,养护成本降低了30%以上。

案例三:自动驾驶感知系统

利用本数据集训练的模型,开发了一款自动驾驶感知系统的道路表面状况检测模块。该模块通过车载摄像头采集道路图像,实时识别道路表面的缺陷,如裂缝、坑洼、井盖等,并将这些信息传递给自动驾驶决策系统。决策系统会根据道路状况调整行驶策略,如减速、绕避等,提高自动驾驶的安全性和舒适性。该模块已在某自动驾驶测试车辆上试用,车辆对道路缺陷的识别准确率达到95%以上,能够及时调整行驶策略,避免因道路缺陷引发的安全问题。

案例四:无人机道路巡检系统

将训练好的轻量化模型部署到无人机上,开发了一款无人机道路巡检系统。该系统通过无人机航拍获取道路图像,然后利用训练好的模型自动识别图像中的道路缺陷。无人机可以快速覆盖大面积道路,特别适合交通繁忙的高速公路和难以到达的偏远地区。该系统已在某高速公路管理局试用,巡检速度提高了10倍以上,能够及时发现和处理道路缺陷,提高高速公路的安全性和畅通性。

技术挑战与解决方案

在构建和使用本数据集的过程中,我们遇到了以下技术挑战,并提出了相应的解决方案:

1. 缺陷多样性和复杂性

挑战:道路缺陷类型多样,形态各异,不同类型的缺陷特征差异较大,同一类型的缺陷在不同场景下也有很大差异。
解决方案

  • 收集多样化的缺陷样本,确保数据集能够覆盖各种类型和形态的缺陷
  • 采用数据增强技术,增加模型对不同形态缺陷的适应能力
  • 设计鲁棒的特征提取网络,能够学习到缺陷的本质特征

2. 光照和天气条件变化

挑战:不同光照和天气条件下,道路缺陷的外观差异很大,模型在一种条件下训练的效果可能在另一种条件下表现不佳。
解决方案

  • 收集不同光照和天气条件下的缺陷样本,确保数据集的多样性
  • 采用数据增强技术,模拟不同光照和天气条件下的图像
  • 设计光照不变的特征提取方法,减少光照对检测结果的影响

3. 小目标检测困难

挑战:一些道路缺陷(如细小裂缝)在图像中占比较小,属于小目标,传统的目标检测模型难以有效检测。
解决方案

  • 使用专门的小目标检测优化策略,如FPN、PAN等特征融合方法
  • 调整模型的锚框设置,使其更适合小目标的检测
  • 采用马赛克增强等数据增强技术,增加小目标的比例

4. 模型部署资源受限

挑战:在实际应用中,如嵌入式设备、移动设备等资源受限的平台上部署模型,需要考虑模型大小和计算复杂度。
解决方案

  • 采用模型压缩和量化技术,减少模型大小和计算复杂度
  • 开发轻量级模型,适合在资源受限的平台上运行
  • 利用边缘计算技术,将部分计算任务放在边缘设备上进行

5. 标注工作量大

挑战:手动标注道路缺陷工作量大,效率低,成本高。
解决方案

  • 开发半自动化标注工具,提高标注效率
  • 采用多人标注和交叉验证的方式,确保标注的准确性
  • 对标注人员进行培训,提高标注的一致性和准确性

数据集扩展与未来规划

本数据集是我们在道路缺陷检测领域的初步尝试,未来我们计划从以下几个方面对数据集进行扩展和完善:

  1. 增加样本数量:进一步扩大数据集规模,增加更多的图像样本,提高数据集的多样性和代表性。特别是增加来自不同地区、不同气候条件的道路缺陷样本,确保数据集能够覆盖更多的实际场景。
  2. 扩展类别覆盖:增加更多的道路缺陷类型,如路面沉降、车辙、泛油等,构建一个更全面的道路缺陷检测数据集。
  3. 添加多模态数据:结合激光雷达、惯性导航系统(INS)等多模态数据,构建多模态道路缺陷数据集。多模态数据可以提供更多的信息,如道路表面的三维信息、车辆的位置和姿态信息等,提高缺陷检测的准确性和可靠性。
  4. 引入时序信息:添加同一道路在不同时间的图像,捕捉道路缺陷的发展变化过程,支持时序分析和缺陷预测。
  5. 提供预训练模型:基于扩展后的数据集,训练并发布预训练模型,方便用户直接使用。预训练模型可以大大减少用户的训练时间和计算资源需求。
  6. 建立社区平台:建立道路缺陷检测数据集社区平台,鼓励用户贡献数据和标注,共同完善数据集。社区平台可以促进数据共享和技术交流,推动道路缺陷检测技术的发展。
  7. 开发标注工具:开发专门的道路缺陷标注工具,提高标注效率和准确性。标注工具可以自动检测和标注一些明显的缺陷,减少人工标注的工作量。
  8. 构建基准测试:基于数据集构建道路缺陷检测的基准测试,为不同算法的性能比较提供标准平台。基准测试可以促进算法创新和技术进步,推动道路缺陷检测技术的发展。

结语

道路是城市的动脉,其质量直接关系到城市的运行效率和居民的生活质量。随着城市化进程的加快和交通量的持续增长,道路养护任务日益繁重,传统的人工巡检方式已经难以适应现代城市发展的需求。

基于深度学习的道路缺陷检测技术为道路养护提供了新的解决方案,能够实现对道路缺陷的自动检测和分类,提高巡检效率和准确性。而高质量、多样化的数据集是推动这一技术发展的关键基础。

本数据集通过系统性地收集、整理和标注道路表面缺陷图像,为道路缺陷检测算法的研究与落地提供了有力支持。数据集共计6000张高分辨率图片,涵盖了8类道路表面缺陷,场景多样性强,标注质量高,格式标准统一,应用价值广泛。

我们希望通过本数据集的发布,能够促进道路缺陷检测技术的发展,推动智能交通系统和智慧城市建设的进步。我们诚邀学术界与工业界的研究者在此基础上深入探索,共同推动道路缺陷检测技术的创新和应用,为提高道路养护效率、保障交通安全、建设智慧城市做出贡献。

总结

本次发布的《道路表面多类型缺陷的图像识别数据集》为道路养护、智能交通、自动驾驶等领域提供了一个高质量、结构规范的图像识别基准数据集。数据集共包含6000张已标注图像,涵盖了8类道路表面常见缺陷,采用标准YOLO格式,已按训练、验证、测试集划分完毕,可直接应用于YOLOv5、YOLOv8等主流目标检测框架。

该数据集具有样本数量充足、场景多样性强、标注质量高、格式标准统一、应用价值广泛、贴近实际场景、分辨率高等特点,不仅适合用于常规的目标检测任务,也适合开展小目标检测、多模态融合、模型压缩与部署等前沿研究,特别契合道路缺陷检测、智能交通系统、自动驾驶感知等实际应用需求。

通过本数据集的使用和相关技术的应用,我们相信道路缺陷检测技术将会取得更大的突破,为道路养护和交通安全提供更加有力的支持,为智能交通系统和智慧城市建设做出更大的贡献。

今日速览

  1. Seedance 2.0:字节跳动出品,AI 帮你拍电影级视频。
  2. Cline CLI 2.0:命令行里跑并行任务,开发效率直接起飞。
  3. TexTab:把 AI 任务变成快捷键,一键翻译、总结不是梦。
  4. Valentine Online:为心爱的人定制专属情人节页面,浪漫不重样。
  5. Termsy:自动扫描服务条款,帮你避开那些隐藏的坑。
  6. WikiTrip 2.0:走到哪听到哪,维基百科变身随身导游。
  7. OpenBug:开源工具把工单变修复,团队越用越聪明。
  8. CozyTwo:异地恋情侣的虚拟小家,同步看片、发拥抱。
  9. Your Love Style:玩个游戏测性格,免费解锁你的恋爱风格。
  10. SnapPoint:清理开发机器的神器,让系统重回正轨。


1. Seedance 2.0

字节跳动这次放大招了,Seedance 2.0 让你用 AI 拍出电影感十足的视频。它不只是生成画面,还能精准控制叙事节奏和镜头运动,简直像在执导一部真电影。

  • 根据简单提示生成连贯人物和流畅场景
  • 支持多镜头叙事,动态切换毫无违和感
  • 提供动作、构图和节奏的精细控制
  • 面向创作者、营销人员和电影制作人

热度:🔺336

Seedance 2.0

访问官网 Product Hunt 详情


2. Cline CLI 2.0

超过 500 万开发者都在用的命令行神器,现在升级到 2.0 版本。它把自主编码功能直接塞进终端,还能并行跑任务,让你的 CI/CD 流程快如闪电。

  • 支持并行代理,同时处理多个构建和测试任务
  • 无头模式优化,无缝集成 CI/CD 流水线
  • 完全开源,兼容 Zed、Neovim 等主流编辑器
  • 经过全新设计,体验更流畅

热度:🔺250

Cline CLI 2.0

访问官网 Product Hunt 详情


3. TexTab

厌倦了在 AI 工具里来回切换?TexTab 让你自定义 AI 操作,然后绑定到键盘快捷键上。翻译、总结、重写,动动手指就能搞定。

  • 创建自定义 AI 动作,灵活适配各种场景
  • 通过快捷键立即触发,省去打开应用的麻烦
  • 支持翻译、总结、重写等多种功能
  • 操作简单,提升日常工作效率

热度:🔺212

TexTab

访问官网 Product Hunt 详情


4. Valentine Online

情人节还没想好怎么表达爱意?Valentine Online 帮你快速打造一个个性化惊喜页面。不用设计功底,加点祝福、回忆和笑话,就能生成专属浪漫。

  • 轻松创建美丽可分享的浪漫页面
  • 自定义内容,包括祝福、回忆和内涵笑话
  • 无需设计或编码技能,简单定制即可生成
  • 直接发送给心爱的人,惊喜感拉满

热度:🔺186

Valentine Online

访问官网 Product Hunt 详情


5. Termsy

每次注册新服务,都被长长的条款搞晕?Termsy 自动扫描那些页面,把关键信息挑出来放在侧边栏里。让你在点“同意”前,心里更有底。

  • 自动扫描服务条款和隐私政策页面
  • 突出关键条款,避免遗漏重要信息
  • 在简洁侧边栏中展示,阅读更轻松
  • 支持深色和浅色模式,快速轻量易用

热度:🔺167

Termsy

访问官网 Product Hunt 详情


6. WikiTrip 2.0

出门旅行或日常通勤,想多了解周围的世界?WikiTrip 2.0 基于你的位置,朗读有趣的维基百科文章。把它当成随身音频导览,边走边学。

  • 根据地理位置朗读维基百科文章
  • 适合公路旅行、通勤或城市游玩场景
  • 无需手动搜索,自动发现周边趣闻
  • 让学习变得轻松有趣,探索身边世界

热度:🔺116

WikiTrip 2.0

访问官网 Product Hunt 详情


7. OpenBug

开发中遇到 bug,提交工单后还得等修复?OpenBug 这个开源命令行工具,能直接把工单转换成解决方案。AI 代理会分析日志和代码,甚至把每次修复记下来,让团队越用越聪明。

  • 将缺陷工单转换为修复方案,提升解决效率
  • AI 代理检查日志、分析代码并跨服务关联
  • 提供修复差异,直观展示改动内容
  • 记录修复到共享运行手册,积累团队知识

热度:🔺97

OpenBug

访问官网 Product Hunt 详情


8. CozyTwo

异地恋情侣的福音来了!CozyTwo 打造了一个虚拟家园,让你们可以同步看 YouTube 视频、发送虚拟拥抱。不用再喊“3、2、1,开始!”,一个订阅两人共用,年费才 29 美元。

  • 创建私密虚拟空间,专为异地恋设计
  • 同步观看 YouTube 视频,享受共同时光
  • 发送虚拟拥抱,增强情感连接
  • 订阅支持两人使用,性价比高

热度:🔺96

CozyTwo

访问官网 Product Hunt 详情


9. Your Love Style

厌倦了千篇一律的性格测试?Your Love Style 把测验做成了选择冒险游戏。通过具体情境评估你的行为,结果更真实。关键是,完全免费,不用登录就能看完整报告。

  • 结合选择冒险游戏和个性测试,趣味性强
  • 基于情境评估行为,而非自我报告问卷
  • 免费使用,查看完整结果无需登录
  • 互动式体验,游戏化测评更吸引人

热度:🔺95

Your Love Style

访问官网 Product Hunt 详情


10. SnapPoint

开发机器用久了,各种“幽灵”二进制文件和环境变量冲突让人头疼。SnapPoint 这个开源工具,帮你彻底清理系统,让一切重回正轨。

  • 开源系统审计工具,查找隐藏的二进制文件
  • 解决环境变量冲突,优化开发环境
  • 深度清理机器,提升系统性能
  • 作为软件包管理器,简化软件管理流程

热度:🔺90

SnapPoint

访问官网 Product Hunt 详情

恶性疟原虫显微镜图像的目标检测数据集分享(适用于目标检测任务)

数据集分享

如需下载该数据集,可通过以下方式获取:

引言

疟疾是一种由疟原虫引起的严重传染病,其中恶性疟原虫(Plasmodium falciparum)对人类健康威胁极大。据世界卫生组织统计,全球每年有超过2亿疟疾病例,导致数十万人死亡。传统的疟疾诊断方法主要依赖显微镜观察血涂片,这不仅需要专业人员长期训练,而且效率低、易受主观因素影响,难以满足大规模筛查和快速诊断的需求。

随着人工智能与深度学习技术的发展,基于显微镜图像的自动检测与识别逐渐成为疟疾诊断的新方向。通过训练深度学习模型,从血液显微镜图像中自动识别疟原虫,可以大大提高诊断效率和准确性,特别是在医疗资源有限的地区。然而,要开发出准确、可靠的疟原虫检测模型,高质量、多样化且已标注的数据集是关键基础。

为了推动医学人工智能的发展,我们收集并整理了一套显微镜下的恶性疟原虫图像数据集,并提供了标准化的目标检测标注文件。该数据集共计2700张高质量显微镜图像,已按照训练集、验证集和测试集进行了合理划分,标注采用YOLO格式,可直接用于目标检测模型的训练与验证。本文将对该数据集进行详细介绍,包括数据集背景、概述、结构、特点、适用场景等内容,旨在为相关研究和应用提供参考。

数据集背景

疟疾是一种通过蚊子传播的寄生虫病,由疟原虫属的单细胞寄生虫引起。在五种可以感染人类的疟原虫中,恶性疟原虫是最致命的一种,可导致严重的并发症,如脑疟疾、贫血、肾功能衰竭等,如不及时治疗,可能在24小时内导致死亡。

传统的疟疾诊断方法主要包括以下几种:

  1. 显微镜检查:通过观察染色后的血涂片,在显微镜下识别疟原虫。这是疟疾诊断的金标准,但需要专业人员操作,且耗时较长。
  2. 快速诊断测试(RDT):基于抗原-抗体反应的试纸条检测,操作简单,但灵敏度和特异性不如显微镜检查。
  3. 分子诊断:如PCR检测,灵敏度和特异性高,但需要实验室设备和专业人员,成本较高。

随着计算机视觉和深度学习技术的发展,基于图像的自动诊断方法逐渐成为研究热点。这种方法通过训练深度学习模型,从血液显微镜图像中自动识别疟原虫,具有以下优势:

  1. 高效快速:可以在几秒钟内分析多张血涂片,大大提高诊断速度。
  2. 客观准确:不受操作人员经验和主观因素的影响,诊断结果更加客观可靠。
  3. 可扩展性强:可以部署在移动设备上,在医疗资源有限的地区使用。
  4. 减少人力成本:减轻实验室人员的工作负担,使他们能够专注于其他重要任务。

然而,要开发出准确、可靠的疟原虫检测模型,高质量、多样化且已标注的数据集是关键基础。目前,公开可用的疟原虫图像数据集存在以下问题:

  1. 样本数量不足:许多数据集样本数量较少,难以支持深度学习模型的充分训练。
  2. 标注质量参差不齐:一些数据集的标注不够准确或不一致,影响模型训练效果。
  3. 场景单一:许多数据集的图像拍摄条件较为单一,难以适应实际应用中的复杂场景。
  4. 格式不统一:不同数据集的标注格式不一致,增加了数据预处理的难度。

为应对这些挑战,我们构建了本数据集,旨在为疟原虫检测算法的研究与落地提供高质量的数据支持。

数据集概述

本数据集专注于显微镜下恶性疟原虫(Plasmodium falciparum)的目标检测任务,共计2700张高质量显微镜图像,涵盖了不同放大倍数、不同染色条件以及不同感染阶段的红细胞形态。所有图片均经过精心筛选与标注,确保数据的准确性与代表性。

基本信息

  • 图片总数:2700张
  • 图像格式:JPG
  • 标注格式:YOLO格式(.txt文件,包含类别与边界框坐标)
  • 类别数量:1类(恶性疟原虫)
  • 数据划分

    • 训练集(train):约70%(1890张)
    • 验证集(val):约15%(405张)
    • 测试集(test):约15%(405张)
  • 文件结构

    ├─train
    │  ├─images
    │  └─labels
    ├─val
    │  ├─images
    │  └─labels
    └─test
       ├─images
       └─labels

数据集特点

与传统的医学图像数据相比,本数据集有以下几个显著特点:

  1. 单一类别、专注性强:仅包含恶性疟原虫一类目标,标注边界框清晰,适合专门研究该病原体的检测性能。这种专注性使得数据集更加聚焦于特定任务,有助于模型在该任务上取得更好的性能。
  2. 图像多样性:收录的显微镜图像来源丰富,包含不同的样本差异、成像条件与噪声情况。具体来说,数据集涵盖了:

    • 不同放大倍数的图像(如1000x、400x等)
    • 不同染色条件的图像(如吉氏染色、瑞氏染色等)
    • 不同感染阶段的红细胞形态(如环状体、滋养体、裂殖体等)
    • 不同质量的图像(如不同清晰度、不同对比度等)

    这种多样性使得模型在训练过程中具备更好的泛化能力,能够适应实际应用中的各种情况。

  3. 医学价值突出:该数据集高度贴合临床需求,能够为疟疾自动化筛查与诊断提供数据支撑。通过在本数据集上训练模型,可以开发出临床可用的自动化辅助诊断系统,减少人工观察带来的误差和负担,提高诊断效率和准确性。
  4. 标注质量高:所有图像均经过专业人员的精心标注,确保标注的准确性和一致性。标注内容包括恶性疟原虫的边界框坐标,采用YOLO标准格式,便于直接用于模型训练。
  5. 开箱即用:数据集已按照训练集、验证集和测试集进行了合理划分,标注采用YOLO标准格式,研究者可以直接将其应用于深度学习目标检测模型的训练与验证,而无需进行繁琐的前期准备工作。

image-20250819113646178

数据集详情

数据采集与处理

本数据集的图像来源于多个医学实验室的显微镜拍摄,涵盖了不同地区、不同人群的疟疾病例。为确保数据集的质量和多样性,我们在数据采集过程中遵循了以下原则:

  1. 样本多样性:收集来自不同地区、不同人群的疟疾病例样本,确保数据集能够代表不同的感染情况。
  2. 成像条件多样性:在不同的显微镜设置、不同的染色条件下拍摄图像,确保数据集能够适应不同的成像环境。
  3. 质量控制:对收集到的图像进行质量评估,筛选出清晰、具有代表性的图像,确保数据集的整体质量。

在数据处理过程中,我们对图像进行了以下处理:

  1. 图像预处理:对图像进行去噪、增强等处理,提高图像质量和对比度,使疟原虫更加清晰可见。
  2. 目标标注:由专业人员使用标注工具对图像中的恶性疟原虫进行手动标注,绘制边界框并标记类别。
  3. 格式转换:将标注结果转换为YOLO标准格式,生成对应的.txt标注文件。
  4. 数据划分:按照70:15:15的比例将数据划分为训练集、验证集和测试集,确保数据划分的合理性。

标注规范

本数据集的标注遵循以下规范:

  1. 边界框绘制:边界框应准确包围疟原虫的整个身体,包括所有可见的结构。边界框的大小应适中,既不要过大(包含过多背景),也不要过小(遗漏疟原虫部分结构)。
  2. 类别标注:所有目标均标注为恶性疟原虫(类别编号为0),确保标注的一致性。
  3. 标注质量检查:对标注结果进行质量检查,确保边界框的准确性和一致性。对于标注不准确或不一致的图像,进行重新标注。

数据统计

本数据集的基本统计信息如下:

数据集划分图像数量标注数量平均每张图像标注数
训练集1890约56703.0
验证集405约12153.0
测试集405约12153.0
总计2700约81003.0

注:标注数量为估计值,实际标注数量可能因图像内容不同而有所差异。

数据处理流程

为确保数据集的质量和可用性,我们在构建过程中遵循了严格的数据处理流程,具体步骤如下:

flowchart TD
    A[样本收集] --> B[图像获取]
    B --> C[图像预处理]
    C --> D[质量评估]
    D --> E[目标标注]
    E --> F[标注验证]
    F --> G[格式转换]
    G --> H[数据划分]
    H --> I[数据集发布]
  1. 样本收集:从多个医学实验室收集恶性疟原虫感染的血液样本
  2. 图像获取:使用显微镜拍摄样本的血涂片,获取显微镜图像
  3. 图像预处理:对获取的图像进行去噪、增强等处理,提高图像质量
  4. 质量评估:对预处理后的图像进行质量评估,筛选出清晰、具有代表性的图像
  5. 目标标注:由专业人员对图像中的恶性疟原虫进行手动标注,绘制边界框
  6. 标注验证:对标注结果进行验证,确保标注的准确性和一致性
  7. 格式转换:将标注结果转换为YOLO标准格式,生成对应的.txt标注文件
  8. 数据划分:按照70:15:15的比例将数据划分为训练集、验证集和测试集
  9. 数据集发布:打包发布数据集,提供下载链接

适用场景

本数据集可广泛应用于以下研究与医学应用场景:

1. 目标检测模型训练与测试

可直接用于训练YOLOv5、YOLOv8、Detectron2等主流目标检测模型,用于实际部署或研究验证。通过在本数据集上训练模型,可以提高疟原虫检测的准确率和效率,为相关应用提供技术支持。

2. 医学AI研究

可用于研究基于深度学习的血液显微镜图像智能分析方法。例如,可以研究不同网络架构、损失函数、数据增强方法等对疟原虫检测性能的影响,探索更有效的疟原虫检测算法。

3. 临床辅助诊断

可应用于自动化疟疾筛查系统,帮助医生快速识别感染细胞。通过部署基于本数据集训练的模型,可以实现疟疾的快速筛查和诊断,减少人工观察带来的误差和负担,提高诊断效率和准确性。

4. 教学与科研

适合作为医学影像AI课程与科研训练的数据集,提升学生与研究人员的实践能力。通过使用本数据集,学生和研究人员可以学习医学图像标注、目标检测模型训练等技能,提高医学AI研究的实践能力。

5. 小目标检测与优化算法研究

由于疟原虫在血细胞中的比例极小,本数据集非常适合用于小目标检测任务的改进实验。例如,可以研究不同的小目标检测方法、注意力机制、特征融合策略等,提高小目标检测的性能。

6. 医学图像预处理与增强方法研究

可用于探索在医学显微图像中使用不同的增强策略(如对比度增强、噪声滤波)对检测效果的影响。通过比较不同预处理方法的效果,可以找到最适合疟原虫检测的图像预处理策略。

7. 跨领域迁移学习

可通过与其他医学影像数据结合,研究迁移学习在疾病检测中的效果。例如,可以将在本数据集上训练的模型迁移到其他寄生虫检测任务中,探索迁移学习的有效性。

8. 模型压缩与部署研究

可用于研究模型压缩和部署方法,将训练好的模型部署到移动设备或边缘设备上。例如,可以研究模型剪枝、量化、知识蒸馏等技术,减少模型大小和计算复杂度,使其适合在资源受限的设备上运行。

image-20250819113743867

模型训练建议

针对本数据集的特点,我们提出以下模型训练建议:

1. 模型选择

对于疟原虫检测任务,建议使用以下模型:

  • YOLOv8:性能均衡,适合大多数应用场景,特别是需要实时检测的场景
  • YOLOv11:最新版本,精度和速度都有提升,适合对性能要求较高的场景
  • Faster R-CNN:精度较高,适合对精度要求高、对速度要求不高的场景
  • EfficientDet:效率较高,适合资源受限的场景

2. 数据增强

由于疟原虫检测是一个小目标检测任务,建议使用以下数据增强技术:

  • 随机裁剪:随机裁剪图像的一部分,增加小目标的比例
  • 随机翻转:水平翻转和垂直翻转,增加数据多样性
  • 随机旋转:随机旋转图像,增强模型对目标不同角度的适应能力
  • 亮度和对比度调整:随机调整图像的亮度和对比度,增强模型对不同光照条件的适应能力
  • 噪声添加:随机添加噪声,增强模型对噪声的鲁棒性
  • 马赛克增强:将多张图像拼接成一张,增加小目标的数量

3. 训练策略

  • 批量大小:根据硬件资源选择合适的批量大小,建议使用8-32
  • 学习率:初始学习率设置为0.001,使用余弦退火策略调整学习率
  • 优化器:使用AdamW优化器,权重衰减设置为0.0005
  • 训练轮数:建议训练100-300轮,根据验证集性能动态调整
  • 早停策略:当验证集性能连续多个轮次没有提升时,停止训练
  • 小目标优化:使用专门的小目标检测优化策略,如FPN、PAN等特征融合方法

4. 评估指标

使用以下指标评估模型性能:

  • mAP@0.5:IoU阈值为0.5时的平均精度
  • mAP@0.5:0.95:IoU阈值从0.5到0.95,步长为0.05时的平均精度
  • 精确率:正确预测的正样本占总预测正样本的比例
  • 召回率:正确预测的正样本占总实际正样本的比例
  • F1-score:精确率和召回率的调和平均值
  • 推理速度:模型的推理时间,用于评估实时性能

5. 模型优化

  • 模型剪枝:去除冗余的神经元和连接,减少模型大小
  • 模型量化:将模型权重从32位浮点数量化为8位整数,减少模型大小和计算复杂度
  • 知识蒸馏:利用大模型的知识指导小模型的训练,提高小模型的性能
  • 部署优化:针对不同部署平台进行优化,如TensorRT、ONNX Runtime等

应用案例

案例一:自动化疟疾筛查系统

基于本数据集训练的YOLOv8模型,开发了一款自动化疟疾筛查系统。该系统通过扫描血涂片的显微镜图像,自动识别其中的恶性疟原虫,并生成筛查报告。系统会标记出感染细胞的位置和数量,计算感染率,并提供诊断建议。该系统已在多个非洲国家的医疗机构试用,筛查效率提高了80%以上,诊断准确率达到90%以上,大大减轻了医疗人员的工作负担。

案例二:移动设备疟疾诊断App

将训练好的轻量化模型部署到移动设备上,开发了一款疟疾诊断App。用户只需使用手机摄像头拍摄血涂片的显微镜图像,App就能自动识别其中的恶性疟原虫,并提供诊断结果。该App已在多个资源有限的地区试用,为当地医疗人员提供了便捷的诊断工具,提高了疟疾诊断的可及性。

案例三:医学教育辅助系统

利用本数据集开发了一款医学教育辅助系统,用于培训医学学生和实验室技术人员。系统通过展示不同类型的疟原虫图像,帮助学生学习疟原虫的形态特征和识别方法。同时,系统还提供了互动式练习,让学生通过标注疟原虫来测试自己的识别能力。该系统已在多所医学院校试用,学生的学习效果和参与度显著提高。

案例四:疟疾疫情监测系统

将训练好的模型集成到疟疾疫情监测系统中,通过分析各地提交的血涂片图像,实时监测疟疾的流行情况。系统会自动统计各地的疟疾病例数、感染率等数据,生成疫情报告,并预测疫情的发展趋势。该系统已在某国卫生部门部署,为疫情防控决策提供了数据支持,有效控制了疟疾的传播。

技术挑战与解决方案

在构建和使用本数据集的过程中,我们遇到了以下技术挑战,并提出了相应的解决方案:

1. 小目标检测困难

挑战:疟原虫在血细胞中的比例极小,传统的目标检测模型难以有效检测。
解决方案

  • 使用专门的小目标检测优化策略,如FPN、PAN等特征融合方法
  • 采用马赛克增强等数据增强技术,增加小目标的比例
  • 调整模型的锚框设置,使其更适合小目标的检测

2. 图像质量差异大

挑战:不同显微镜、不同染色条件下拍摄的图像质量差异较大,影响模型的泛化能力。
解决方案

  • 对图像进行标准化处理,减少图像质量差异的影响
  • 使用数据增强技术,增加模型对不同图像质量的适应能力
  • 收集更多不同质量的图像,提高数据集的多样性

3. 标注工作量大

挑战:手动标注显微镜图像中的疟原虫工作量大,效率低。
解决方案

  • 开发半自动化标注工具,提高标注效率
  • 采用多人标注和交叉验证的方式,确保标注的准确性
  • 对标注人员进行培训,提高标注的一致性和准确性

4. 模型部署资源受限

挑战:在资源受限的地区,如农村、偏远地区,难以部署复杂的深度学习模型。
解决方案

  • 采用模型压缩和量化技术,减少模型大小和计算复杂度
  • 开发轻量级模型,适合在移动设备或边缘设备上运行
  • 利用云服务,将复杂的计算任务放在云端进行,边缘设备只负责图像采集和结果展示

数据集扩展与未来规划

本数据集是我们在疟原虫检测领域的初步尝试,未来我们计划从以下几个方面对数据集进行扩展和完善:

  1. 增加疟原虫种类:扩展数据集,包含其他种类的疟原虫,如间日疟原虫、三日疟原虫、卵形疟原虫等,构建一个更全面的疟原虫检测数据集。
  2. 扩大数据集规模:增加更多的图像样本,提高数据集的多样性和代表性。特别是增加来自不同地区、不同人群的疟疾病例样本,确保数据集能够覆盖更多的感染情况。
  3. 添加临床信息:为数据集添加更多的临床信息,如患者的年龄、性别、症状、治疗历史等,构建一个多模态的疟原虫数据集,支持更复杂的分析任务。
  4. 引入动态图像:添加疟原虫在不同发育阶段的动态图像,支持时序分析和发育阶段识别。
  5. 提供预训练模型:基于扩展后的数据集,训练并发布预训练模型,方便用户直接使用。
  6. 建立社区平台:建立疟原虫检测数据集社区平台,鼓励用户贡献数据和标注,共同完善数据集。
  7. 开发标注工具:开发专门的疟原虫标注工具,提高标注效率和准确性。

结语

疟疾是全球重大公共卫生问题之一,特别是在发展中国家,疟疾的流行严重影响了当地的经济发展和人民健康。开发准确、高效的疟疾诊断方法,对于控制疟疾的传播、减少疟疾的危害具有重要意义。

基于深度学习的图像识别技术为疟疾诊断提供了新的解决方案,而高质量的数据集是推动这一技术发展的关键基础。本数据集通过系统性地收集、整理和标注显微镜下的恶性疟原虫图像,为疟原虫检测算法的研究与落地提供了有力支持。

本数据集专注于显微镜下恶性疟原虫的目标检测任务,共计2700张高质量显微镜图像,涵盖了不同放大倍数、不同染色条件以及不同感染阶段的红细胞形态。所有图片均经过精心筛选与标注,确保数据的准确性与代表性。数据集按照训练集、验证集和测试集进行了合理划分,标注采用YOLO标准格式,研究者可以直接将其应用于深度学习目标检测模型的训练与验证。

我们希望通过本数据集的发布,能够促进疟原虫检测技术的发展,推动人工智能在医学影像分析和传染病防控领域的应用。我们诚邀学术界与工业界的研究者在此基础上深入探索,共同推动疟疾诊断技术的进步,为全球疟疾防控事业做出贡献。

总结

本次发布的《恶性疟原虫显微镜图像的目标检测数据集》为医学人工智能、疟疾诊断、目标检测算法研究等领域提供了一个高质量、结构规范的图像识别基准数据集。数据集共包含2700张已标注图像,专注于恶性疟原虫的检测,采用标准YOLO格式,已按训练、验证、测试集划分完毕,可直接应用于YOLOv5、YOLOv8等主流目标检测框架。

该数据集不仅适合用于常规的目标检测任务,也适合开展小目标检测、医学图像分析、模型压缩与部署等前沿研究,特别契合疟疾自动化筛查与诊断的临床需求。我们将持续更新并配套提供训练脚本与部署方案,欢迎研究者和开发者在合法合规范围内广泛使用与改进本数据集。

通过本数据集的使用和相关技术的应用,我们相信人工智能技术将在疟疾诊断和防控中发挥越来越重要的作用,为全球公共卫生事业做出更大的贡献。

大家好,我是 Eric Wong。最近我开发了一个名为 chat.nvim 的 Neovim 插件,今天想和大家分享一下这个项目的故事。

初衷:为自己做个小工具

必须承认,现在市面上已经有很多优秀的 AI 集成工具了,比如 ChatGPT.nvim、codeium.vim、copilot.vim 等等。这些工具功能完善、团队专业、用户众多,做得都非常好。

我开发 chat.nvim,纯粹是出于个人需求和兴趣爱好。作为一个 Neovim 重度用户,我想要的只是一个简单、轻量、无侵入的 AI 聊天工具:

  • 不需要复杂的代码补全,只想在写代码时随时问 AI 几个问题
  • 不想离开编辑器,希望有个浮窗就能搞定
  • 希望能方便地让 AI 读取我的代码文件
  • 希望能管理多个对话上下文
  • 最重要的是,代码要自己可控,想怎么改就怎么改

于是就动手写了这个插件。

chat.nvim 是什么?

简单来说,chat.nvim 是一个轻量级的 Neovim AI 聊天插件。它让你在编辑器里通过浮动窗口直接与 AI 助手对话,支持多种 AI 提供商,还能让 AI 读取你的文件内容作为上下文。

chat.nvim 界面

核心特性

  • 多提供商支持:内置支持 DeepSeek、GitHub AI、Moonshot、OpenRouter、Qwen、SiliconFlow、腾讯混元等
  • 工具调用:通过 @read_file@find_files 让 AI 读取你的代码
  • 会话管理:自动保存对话历史,随时切换和恢复
  • 流式响应:实时显示 AI 的回答,支持取消和重试
  • 思考模式:支持 DeepSeek R1 等推理模型的思考过程展示
  • Picker 集成:与 picker.nvim 无缝集成,快速搜索会话、切换模型
  • 轻量级:纯 Lua 实现,依赖极少

技术实现:保持简单

整个插件的代码结构很简单:

复制
lua/chat/
├── init.lua # 入口
├── windows.lua # 浮动窗口管理
├── sessions.lua # 会话持久化
├── tools.lua # 工具调用
├── config.lua # 配置管理
└── providers/ # AI 提供商适配器
    ├── deepseek.lua
    ├── github.lua
    └── ...

设计上遵循几个原则:

  1. 最小依赖:仅依赖 job.nvim 处理异步请求,其他都是 Neovim 内置 API
  2. 会话持久化:对话缓存到 stdpath('cache'),JSON 格式,方便查看和备份
  3. 工具即函数:工具调用就是普通的 Lua 函数,用户可以轻松扩展
  4. 流式处理:通过 job.nvim 的 stdout 回调实时处理 AI 响应

工具调用:让 AI 读懂你的代码

这是我觉得最实用的功能。在聊天窗口里直接输入:

复制
请帮我优化这个函数 @read_file ./lua/chat/windows.lua

AI 会读取文件内容并给出针对性建议。还支持批量查找:

复制
分析一下项目结构 @find_files **/*.lua

工具调用的实现也很直接:解析消息中的 @tool 语法,调用对应的 Lua 函数,把结果返回给 AI。

会话管理:对话不丢失

所有对话自动保存,支持:

  • :Chat new - 新建会话
  • :Chat prev/next - 切换会话
  • :Chat delete - 删除会话
  • :Chat clear - 清空当前会话

配合 picker.nvim 还能快速搜索历史会话:

复制
:Picker chat

开发历程:边用边改

从 git log 能看到,这个项目是 12 天前开始的(从 v1.0.0 算起),但最近几天特别活跃:

  • 第 1-2 天:搭起基本框架,支持 DeepSeek 和流式响应
  • 第 3-4 天:加入会话管理、工具调用、多个提供商
  • 第 5-6 天:完善 UI,添加 picker 集成、token 统计
  • 第 7 天至今:疯狂修 bug,优化体验,添加新功能

说实话,很多功能都是用的时候发现需要才加的。比如:

  • 发现 AI 回答太长,需要滚动查看 → 加了行号和高亮
  • 想切换模型要改配置太麻烦 → 加了 :Picker chat_model
  • 经常忘记当前用的哪个模型 → 在窗口标题显示 provider 和 model
  • 网络慢的时候不知道有没有在请求 → 加了进度 spinner

每次提交基本都是"fix:"或"feat:",很少有"refactor:",因为先跑起来再说

当前状态:能用,但还不完美

必须坦诚地说,这个插件还有很多不足:

  1. 按键绑定不够灵活:目前写死在代码里,还没做成可配置
  2. 错误处理不够完善:网络问题、API 限频等场景处理较简单
  3. UI 还有优化空间:窗口布局、滚动体验等可以更好
  4. 文档不够详细:很多功能靠用户自己摸索

README 里我也明确写了:

Note: The plugin is currently in active development phase. Key bindings may change and may reflect the author's personal preferences. Configuration options for customizing key bindings are planned for future releases.

意思就是:还在折腾,按键绑定可能随时改,目前主要满足我自己的使用习惯

为什么开源?

虽然是个"玩具"项目,但还是开源了,原因有三:

  1. 或许有人需要:可能也有朋友想要个简单轻量的工具
  2. 欢迎交流:AI 集成有很多玩法,希望能和大家一起探讨
  3. 学习参考:代码简单,适合想学习 Neovim 插件开发的朋友参考

如何使用?

安装很简单(以 nvim-plug 为例):

复制
require('plug').add({
  {
    'wsdjeg/chat.nvim',
    depends = { 'wsdjeg/job.nvim' },
    opt = {
      provider = 'deepseek',
      api_key = {
        deepseek = 'your-api-key',
      },
    },
  },
})

然后:

复制
:Chat new " 新建对话
:Chat " 打开聊天窗口

在窗口里输入问题,按 <Enter> 发送,<C-c> 取消请求,q 关闭窗口。

更多用法可以参考 GitHub 仓库

最后的话

chat.nvim 不是要和那些成熟的 AI 工具竞争,它只是一个程序员为自己写的工具,碰巧可能也适合你。

如果你也喜欢这种简单直接的方式,欢迎试用、提 issue、甚至贡献代码。有任何想法或建议,都欢迎交流!

毕竟,在 AI 工具百花齐放的今天,多一个选择总是好的,对吧?


项目地址: https://github.com/wsdjeg/chat.nvim

看起来似乎是使用太复杂的缘故,真正的原因是所有邮件巨头对此项技术采取消极接纳的结果,如果积极推进使用的复杂性会马上得到解决。那么他们为什么要抗拒呢?一旦采用端到端的 PGP 加密,那些邮件服务商无法看到邮件的内容,无法扫描,也无法提供和内容关联的广告,总之无法从用户的邮件中获取信息。

当然作为程序员要面对现实,抱怨不解决任何问题,但我可以使用 PGP 加密,当越来越多的人使用 PGP 加密通讯时,反而会促进邮件厂商的跟进。目前的情况下,使用一款支持 PGP 的邮件客户端是普通人入门 PGP 加密邮件的最佳选择,thunderbird 几乎是不二的选择。

我是 [email protected] 要发送一封加密的邮件给 [email protected] 。打开 thunderbird 发送邮件的界面:

你会看到加密按钮是灰掉的,你需要在账号设置的端到端加密界面生成自己的密钥对。

密钥对生成之后:

这里有个发布按钮,这个会将你的邮箱的公钥发布到 keys.openpgp.org ,这个有什么用?等一下你给 [email protected] 发邮件时就会需要 b 的公钥,除非通过其它方式获取 b 的公钥,不然你没法给 b 发加密邮件。

当你的 [email protected] 账号有了密钥对之后,thunderbird 发送邮件的界面就会出现变化。此时加密按钮激活了。

然后当你输入 [email protected] 之后,并且点击加密按钮,此时 thunderbird 系统内还没有 [email protected] 的公钥,它会尝试获取这个电邮的公钥,比如 KWD ,keys.openpgp.org

点击解决,可以看到不同的导入方法,其中包括文件导入。

当你导入之后,就可以发送加密邮件了。
当 a 发给 b 时,用 b 的公钥加密,用 a 的私钥对内容签名(防篡改).反之则反之。

接下来谈谈 KWD ( web key directory),直接以例子说明可以直观的了解它的应用范围。比如一个邮箱 [email protected] ,如果邮箱主人同时拥有 never-lost.app 的域名,那么它可以在自己的站点部署 KWD 端点,类似于域名验证的挑战,都是在.well-known 的目录下。比如:

email: [email protected]
localpart: sky
domain: never-lost.app
wkd_hash: kh566nfd7omkgp7cxgo7qgx51gsmwefr
wkd_policy_url: https://never-lost.app/.well-known/openpgpkey/policy
wkd_hu_url: https://never-lost.app/.well-known/openpgpkey/hu/kh566nfd7omkgp7cxgo7qgx51gsmwefr
policy_record_exists: yes
hu_record_exists: yes
key_id: B4621D5A04EB1A1C
fingerprint: F08FD399804724A1307CE38DB4621D5A04EB1A1C

这个有什么用呢?当你在 thunderbird 发送邮件的界面输入 [email protected] 时,thunderbird 显示前面图片中的黄色警告,然后你点击 在网上寻找公钥,thunderbird 就会从该网站获取公钥。 如果域名不是你的,那么可以将你的公钥发送到 keys.openpgp.org ,thunderbird 也会从该网站查找。

怎么样?准备发送你的第一封 PGP 加密邮件了吗?如果你没有可接受加密邮件的邮箱,可以发送到 [email protected] ,会自动回复加密的邮件。

PGP 加密的私钥在你手里,你掌控你的信息。不是 Google ,微软,qq 或网易,如果你查看网页版的邮件,看到的是加密的内容(通常是附件形式)。

Koharu 是一个纯 Rust (Tauri + Candle) 写的工具,专门用翻译日文漫画的。

特性:

  • 没有 Python 依赖,单个二进制文件即开即用。
  • 基于 Candle 框架,OCR 、嵌字、翻译全部本地离线运行(支持 CUDA/Metal 加速)。

昨天刚加上 MCP 服务器( Streamable HTTP )的支持,默认启动,可以通过 --port flag 指定 listen 的端口,URL 是 http://localhost:<port>/mcp,测试过在 Antigravity 配置并使用。Koharu 提供了许多 Tools 给 AI Agent 调用,你可以让 AI 帮你调整字体、字号、修正背景等等。

欢迎大家试用,遇到问题或想要新功能可以直接提 GitHub Issue ,中英文都可以。

希望 Star ⭐️ 支持一下!

GitHub: https://github.com/mayocream/koharu


PS:Windows 最新版默认 bundle CUDA 13.1 ,需要本地的 NVIDIA 驱动更新到最新版本。

Burp Suite Professional 2026.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional, Test, find, and exploit vulnerabilities.

请访问原文链接:https://sysin.org/blog/burp-suite-pro/ 查看最新版。原创作品,转载请保留出处。

作者主页:sysin.org


Burp Suite Professional,更快、更可靠的安全测试,领先的 Web 安全测试工具包。

roadmap

Burp Suite Pro 简介

Burp Suite Professional 是一套用于测试 web 安全性的高级工具集 —- 所有这些都在一个产品中。从一个基本的拦截代理到尖端的 Burp 扫描器,使用 Burp Suite Pro,正确的工具只需点击一下就可以了。

强大的自动化让您有更多的机会做您最擅长的 (sysin),而 Burp Suite 处理容易实现的目标。先进的手动工具将帮助你识别目标更微妙的盲点。

Burp Suite Pro 是由一个研究团队开发的。这意味着在发布之前,发现成果已经包含在最新更新中。 pentesting 工具将使您的工作更快,同时让您了解最新的攻击向量。

Burp Suite 专业版

新增功能

Professional / Community 2026.2

2026 年 2 月 13 日 16:05(UTC)

本次版本新增了 Organizer 集合及其安全共享功能Intruder 的请求与响应拆分视图Proxy 搜索功能,并带来了性能改进、错误修复以及浏览器升级

📂 通过集合从 Organizer 中获得更多价值

升级了 Burp Organizer,为你在测试推进过程中提供一种更智能的方式来筛选和整理 HTTP 消息。

现在,所有消息都会先进入一个专用的收件箱 (sysin),你可以快速查看这些消息,并根据自己的工作方式将它们分组到不同的集合中。

Burp Suite Professional 中,你可以通过加密链接将集合安全地分享给其他用户。这为传递复现步骤或概念验证(PoC)流量提供了一种直接、高效的方式,无需再使用任何手动的变通方案。

🔀 Intruder 中的请求与响应拆分视图

在查看攻击结果时,Intruder 现在支持请求和响应的拆分视图

你可以将两者并排查看,因此不再需要在不同标签页之间来回切换进行对比。

这使得攻击结果的审查过程更加快速、直观,尤其是在处理规模较大的攻击时效果尤为明显。

使用体验改进

进行了以下使用体验方面的改进:

  • SOCKS 代理设置(位于 Network > Connections)现在只有在你点击 OK 之后才会生效,而不是在编辑过程中即时应用。
  • 你现在可以从 Collaborator 中删除选中的交互记录 (sysin),以便让结果更加聚焦、易于管理。
  • Proxy 的 HTTP 和 WebSocket 历史记录视图中新增了搜索栏,方便你快速查找特定消息。
  • Convert selection 右键菜单中新增了 URL-encode key characters (unicode) 选项,使你能够更精细地控制空格及其他字符的编码方式。

🐞 错误修复

修复了以下问题:

  • Windows 上的一个显示问题:在使用自定义缩放比例或较大字体时,消息编辑器中选中文本的显示高亮与实际选区不一致。
  • 一个证书相关的问题:该问题会导致部分 .NET 应用在通过 Burp 代理流量时发生失败。
  • 在已报告问题中,Next 按钮有时会高亮错误字符的问题 (sysin)。
  • Extensions 标签页中,从经过筛选的列表中进行选择时,可能显示错误扩展名称的问题。
  • 如果在关闭项目时启用了匹配与替换规则,重新打开项目后,WebSocket 连接可能失败的问题。
  • RepeaterBurp AI 发送大型 HTTP 请求时,可能出现通用错误提示的问题。现在,这类请求对超时的处理更加可靠,并且避免了不必要的额度消耗。

🌐 浏览器升级

已将 Burp 内置浏览器升级至以下版本:

  • Windows 和 macOS:Chromium 145.0.7632.46
  • Linux:Chromium 145.0.7632.45

下载地址

Burp Suite Professional 2026.2, 13 February 2026

Architectures/DescriptionFile name (Professional)
Apple Intel x64 Installerburpsuite_pro_macos_x64_v2026_2.dmg
Apple ARM64/M Chips Installerburpsuite_pro_macos_arm64_v2026_2.dmg
Linux x64 Installerburpsuite_pro_linux_v2026_2.tgz
Linux ARM64 Installerburpsuite_pro_linux_arm64_v2026_2.tgz
Windows x64 Installerburpsuite_pro_windows-x64_v2026_2.exe
Windows ARM64 Installerburpsuite_pro_windows-arm64_v2026_2.exe

for macOSBurp Suite Professional 2026.2 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件

for WindowsBurp Suite Professional 2026.2 for Windows x64 - 领先的 Web 渗透测试软件

更多:HTTP 协议与安全

Amazon CloudFront最近新增了对源站服务器双向 TLS 认证的支持,完成了从浏览者(viewer)经由 CloudFront 到后端基础设施的端到端零信任认证。CDN 服务在 2025 年 11 月就已经添加了浏览者mTLS,但 CloudFront 到源站的请求仍需要客户使用共享密钥或 IP 白名单构建自定义的认证方案。

 

启用源站mTLS后,CloudFront 在连接源站服务器时会出示客户端证书,源站服务器则验证 CloudFront 的身份后才接受请求。这种基于密码学的认证方式取代了维护 IP 白名单或轮换共享密钥头的运维开销。

 

Reddit 的用户 J‑4ce指出,这种方案对多云与混合部署场景的价值尤为明显:

这是保护本地或其他云环境中源站的杀手级应用之一,无需引入 VPN 即可实现安全访问。随着 CloudFront 新增的源站 mTLS,这一能力会更进一步:源站可以通过密码学验证流量确实来自 CloudFront,取代 IP 白名单和密钥头信息,实现真正的零信任身份验证。

 

该认证机制使用带有 clientAuth 扩展密钥的 X.509v3 证书。CloudFront 在 TLS 握手过程中出示自身客户端的证书,同时验证源站的服务端证书,形成双向校验,双方都不依赖隐式信任。客户可以使用 AWS 专用证书管理器(AWS Private CA)的证书(支持自动化生命周期管理与续期通知),也可以通过 AWS Certificate Manager(ACM)导入第三方私有 CA 的证书。

 

J‑4ce 同时在 Reddit 上强调,最佳实践是使用 AWS Private CA 并开启自动化轮换,而不是使用长期的静态证书:

关于证书:它们确实可以长期有效,但最佳实践恰恰相反,我们应该使用 AWS Private CA 并自动轮换,这样就不会出现泄露“永久密钥”,导致安全范围全面失控的情况出现。

 

我们需要在源站级别进行配置,允许同一个 distribution 的不同后端使用不同的安全策略。设置需要通过 ACM 在 US East 地区获取客户端证书,配置源站服务器验证客户端证书,并通过控制台、CLI、SDK、CDK 或 CloudFormation 在 CloudFront 源站设置中启用 mTLS。

 

该功能填补了 CDN 架构中的一个空白。虽然客户端 mTLS 在流量进入网络边界之前对客户端进行了身份验证,但攻击者如果发现了源站的 IP 地址,就可以绕过 CloudFront 直接连接到后端服务器。组织之前需要维护 CloudFront 边缘位置的 IP 允许列表,或者需要实现边缘和源站协调的自定义认证头信息。

 

Cloudflare 早在 2014 年就提供了认证的源站拉取,但它们有一个区别。Cloudflare 的共享证书证明请求来自 Cloudflare 网络,不是来自特定客户的区域。Cloudflare 客户必须上传自定义证书以实现真正的隔离,而 CloudFront 的方法默认提供了这种隔离。

 

对性能的影响主要集中在连接建立阶段,而不是数据传输阶段。每次 mTLS 握手都会增加加密操作,但 CloudFront 的连接池将这种开销分散到许多请求上。由于 CloudFront 在边缘位置缓存大部分流量,大多数请求根本不会到达源站。AWS 指出,TLS 1.3 更快的握手机制使得认证开销对于医疗保健、金融服务和政府部门等受监管工作负载来说是有利的,在这些领域中,明确的认证和审计跟踪是强制性的。

 

最后,源站 mTLS 不收取额外费用,已经包含在 CloudFront 商业版与高级版的统一定价套餐中。

 

原文链接:

CloudFront Adds Origin mTLS Authentication for End-to-End Zero Trust

主要是关于“推广”“AI”相关内容

初来乍到,平时主要混迹于 LV(linux.do v2ex),关注 AI
这些平台都存在各自的问题,当然我并不是说存在问题是错误的,所以想了解下 2 站的看法。

个人对于上面两个站点的一些看法

L 站

  • 用户质量偏低,大量是羊毛党和学生小孩
  • 管理风格一言难尽,站长真把自己当秦始皇
  • 充斥着大量付费推广,出问题了就说什么站点不为商家站台snicker

V 站

  • AI 相关信息咨询无论是数量还是质量都远落后于 L 站
  • 讨论氛围,有时候会吵起来,

二十多年前的《暗黑 2》 居然更新了?还新增了「术士」职业?!

微信图片_2026-02-15_103612_069

微信图片_2026-02-15_103617_248

微信图片_2026-02-15_103621_501

游戏已经买好了,准备开动!

微信图片_2026-02-15_103626_768

还记得大学时一起组队砍杀地狱的日子吗?看来这个春节假期有的玩了~ 🎮🎮🎮