YOLO11 目标检测 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签

本文分享使用YOLO11进行目标检测时,实现模型推理预标注自动标注标签格式转换、以及使用Labelme手动校正标签等功能。

目录

1、预训练权重

 2、生成预标注

3、分析YOLO11的目标检测格式

4、分析Labelme标注工具的格式

5、生成json标注文件

6、手动校正标签

7、Labelme的json转为YOLO的txt

8、迭代优化模型(可选)


1、预训练权重

首先我们去官网下载,YOLO11目标检测的预训练权重,如下表格式所示:

下载地址:https://github.com/ultralytics/ultralytics

Modelsize
(pixels)
mAPval
50-95
Speed
CPU ONNX
(ms)
Speed
T4 TensorRT10
(ms)
params
(M)
FLOPs
(B)
YOLO11n64039.556.1 ± 0.81.5 ± 0.02.66.5
YOLO11s64047.090.0 ± 1.22.5 ± 0.09.421.5
YOLO11m64051.5183.2 ± 2.04.7 ± 0.120.168.0
YOLO11l64053.4238.6 ± 1.46.2 ± 0.125.386.9
YOLO11x64054.7462.8 ± 6.711.3 ± 0.256.9194.9

然后基于预训练权重,准备自己的数据集,进行模型训练

最终,得到效果更好的模型权重(xxx.pt或xxx.onnx)

 2、生成预标注

前面得到了效果更好的模型权重,这里用它来对新的图片进行推理,同时生成目标检测的信息。

模型推理的代码,如下所示:

from ultralytics import YOLO
 
# 加载训练的模型
model = YOLO(r"runs/detect/train/weights/best.pt")
 
# 对指定的图像文件夹进行推理,并设置各种参数
results = model.predict(
    source="datasets/det_20241020/images/",   # 新的图片,待标注的图片
    conf=0.45,                      # 置信度阈值
    iou=0.6,                        # IoU 阈值
    imgsz=640,                      # 图像大小
    half=False,                     # 使用半精度推理
    device=None,                    # 使用设备,None 表示自动选择,比如'cpu','0'
    max_det=300,                    # 最大检测数量
    vid_stride=1,                   # 视频帧跳跃设置
    stream_buffer=False,            # 视频流缓冲
    visualize=False,                # 可视化模型特征
    augment=False,                  # 启用推理时增强
    agnostic_nms=False,             # 启用类无关的NMS
    classes=None,                   # 指定要检测的类别
    retina_masks=False,             # 使用高分辨率分割掩码
    embed=None,                     # 提取特征向量层
    show=False,                     # 是否显示推理图像
    save=True,                      # 保存推理结果
    save_frames=False,              # 保存视频的帧作为图像
    save_txt=True,                  # 保存检测结果到文本文件
    save_conf=False,                # 保存置信度到文本文件
    save_crop=False,                # 保存裁剪的检测对象图像
    show_labels=True,               # 显示检测的标签
    show_conf=True,                 # 显示检测置信度
    show_boxes=True,                # 显示检测框
    line_width=None                 # 设置边界框的线条宽度,比如2,4
)
  • 需要修改model = YOLO(r"runs/detect/train/weights/best.pt")中的权重路径,替换为自己训练的
  • 同时需要修改source="datasets/det_20241020/images/", 这里是指新的图片,即待标注的图片
  • 其他推理参数,根据任务情况,自行修改了;比如:置信度conf、iou、图像大小imgsz等等。

推理完成后,会保留目标检测的结果图像、标签信息文件夹(labels),它们是同一级文件夹的

- runs/detect/predict/

        - labels(这个文件夹是存放YOLO11推理结果,作为预标注的标签信息)

        - picture1.jpg

        - picture2.jpg

                .....

        - pictureN.jpg

3、分析YOLO11的目标检测格式

YOLO11的标签文件是一个包含每行一个标签的txt文件。

每一行的格式是:<object-class> <x_center> <y_center> <width> <height>。其中:

  • <object-class>是类别索引。
  • <x_center><y_center>是目标的中心点坐标(归一化到0-1)。
  • <width><height>是目标的宽度高度(归一化到0-1)。

txt标签示例数据,表示有两个物体:

0 0.5192 0.4512 0.3985 0.7572
3 0.5061 0.5921 0.2631 0.4561

  • 第一行表示物体1,类别为0,0.5192是中心点x坐标,0.4512是中心点y坐标,0.3985是宽度, 0.7572是高度。
  • 第二行表示物体2,类别为3,0.5061是中心点x坐标,0.5921是中心点y坐标,0.2631是宽度, 0.4561是高度。

4、分析Labelme标注工具的格式

在目标检测中,我们使用Labelme工具进行标注,选择“创建矩形”,对物体进行标注。

  • 标注后点击保存,会生成JSON标注文件;
  • 这样能使用Labelme,可视化检查预标注的结果,方便人工手动修正标签

LabelMe使用的是JSON格式,每个标签是一个形状(shape)对象,包含以下信息: 

  • label: 标签的名称。
  • points: 多边形的点列表(包含多边形顶点的坐标)。
  • group_id: (可选)用于将不同形状分组的ID。
  • shape_type: 形状类型(例如rectangle, circle等)。
  • flags: (可选)一些额外的标记信息。

5、生成json标注文件

编写程序,遍历该文件夹中的所有txt文件,然后将生成的Labelme的JSON文件保存到指定的输出文件夹中

  • 定义类别映射:创建一个字典,将YOLO11类别ID映射到相应的类名。

  • 转换函数:定义yolo_to_labelme函数,接收YOLO11格式的txt文件路径和图像尺寸,读取标注数据,计算绝对坐标,并格式化为LabelMe的JSON结构。

  • 主函数实现

    • 指定输入图像和标签文件夹路径,以及输出JSON文件的路径。
    • 检查输出目录是否存在,如不存在则创建。
    • 遍历标签文件夹中的所有.txt文件,读取相应的图像文件。
    • 使用OpenCV读取图像以获取其高度和宽度。
    • 调用转换函数生成标注数据。
    • 将生成的LabelMe格式数据写入新的JSON文件。

这里会提供源代码,需要根据我们的数据修改以下部分:

import os
import json
import cv2

# 自定义类别映射
class_map = {
    0: 'class_name1',   # 类别 0 对应的名称
    1: 'class_name2',   # 类别 1 对应的名称
    2: 'class_name3'    # 类别 2 对应的名称
}

# YOLO11的txt标签,转为Labelme的json文件
def yolo_to_labelme(txt_path, img_width, img_height):
    with open(txt_path, 'r') as file:
        lines = file.readlines()

    shapes = []
    for line in lines:
        parts = line.strip().split()
        class_id = int(parts[0])
        x_center = float(parts[1])
        y_center = float(parts[2])
        width = float(parts[3])
        height = float(parts[4])

        # 转换为绝对坐标
        x_center *= img_width
        y_center *= img_height
        width *= img_width
        height *= img_height

        # 计算矩形的四个顶点
        x1 = x_center - width / 2
        y1 = y_center - height / 2
        x2 = x_center + width / 2
        y2 = y_center + height / 2

        shapes.append({
            'label': class_map[class_id],
            'points': [[x1, y1], [x2, y2]],
            'group_id': None,
            'shape_type': 'rectangle',
            'flags': {}
        })

    return shapes

def main():
    # 文件夹路径
    image_folder_path = r"./datasets/seg-datasetsv2/images"     # 这里指定图片的文件夹路径
    txt_folder_path = r"./datasets/seg-datasetsv2/labels"       # 这里指定YOLO的txt_labels的文件夹路径
    json_output_path = r"./datasets/seg-datasetsv2/json_labels" # 这里指定待会生成Labelme的json_labels的文件夹路径

    # 检查输出文件夹是否存在,不存在则创建
    if not os.path.exists(json_output_path):
        os.makedirs(json_output_path)

    # 遍历所有txt文件并转换
    for txt_file in os.listdir(txt_folder_path):
        if txt_file.endswith('.txt'):
            txt_path = os.path.join(txt_folder_path, txt_file)

            # 获取与txt文件同名的图片路径
            img_file = txt_file.replace('.txt', '.jpg')  # 假设图片是jpg格式
            img_path = os.path.join(image_folder_path, img_file)

            try:
                # 使用OpenCV读取图片分辨率
                img = cv2.imread(img_path)
                if img is None:
                    raise FileNotFoundError(f"Image file not found: {img_path}")

                img_height, img_width, _ = img.shape

                shapes = yolo_to_labelme(txt_path, img_width, img_height)

                # 创建LabelMe格式的json文件
                labelme_data = {
                    'version': '4.5.6',
                    'flags': {},
                    'shapes': shapes,
                    'imagePath': img_file,
                    'imageData': None,
                    'imageHeight': img_height,
                    'imageWidth': img_width
                }

                json_path = os.path.join(json_output_path, txt_file.replace('.txt', '.json'))
                with open(json_path, 'w') as json_file:
                    json.dump(labelme_data, json_file, indent=2)

            except Exception as e:
                print(f"Error processing {img_file}: {e}")

# 主函数入口
if __name__ == "__main__":
    main()

 首先修改类别映射,比如:

# 定义类别标签映射
class_map = {
    0: 'person',    # 类别 0 对应的名称是person
    1: 'bicycle',   # 类别 1 对应的名称是bicycle
    2: 'car'        # 类别 2 对应的名称是car
}

然后修改一下代码中的参数:

    image_folder_path = r"./datasets/seg-datasetsv2/images"     # 这里指定图片的文件夹路径
    txt_folder_path = r"./datasets/seg-datasetsv2/labels"       # 这里指定YOLO的txt_labels的文件夹路径
    json_output_path = r"./datasets/seg-datasetsv2/json_labels" # 这里指定待会生成Labelme的json_labels的文件夹路径

运行代码,会生成用于YOLO11目标检测的JSON标签文件。

6、手动校正标签

生成了JSON文件后,把图像JSON文件放在同一个文件夹中

然后打开Labelme工具,选择“编辑多边形”,对物体进行标注信息修改

修改完成后,点击“Save"保存修正后的标注信息

7、Labelme的json转为YOLO的txt

这里把Labelme的json转为YOLO的txt,是因为用修正后数据,作为新的数据,加入旧数据中;

重新训练之前的模型权重,这样模型会学得更好,迭代优化模型。

通过下面代码,把Labelme的json转为YOLO的txt

 方案1——单个文件转换

该代码用于将LabelMe格式的JSON标注文件,转换为YOLO11格式的标注文件,函数解析:

convert_labelme_to_yolo(json_path, output_dir):

  • 功能: 将单个LabelMe格式的JSON文件转换为YOLO11格式。
  • 参数:
    • json_path (str): 输入的LabelMe格式JSON文件路径。
    • output_dir (str): 输出的YOLO11格式标注文件夹路径。
  • 操作:
    • 读取JSON文件,获取图像宽度和高度。
    • 遍历所有标注形状,提取标签和坐标,计算YOLO11所需的中心点和宽高。
    • 将结果写入以相同文件名命名的TXT文件中。

示例代码如下所示:

import json
import os

# 定义标签映射,将类别名称映射为ID
label_map = {
    "car": 0,  # 汽车
    "bus": 1   # 公交车
}

def convert_labelme_to_yolo(json_path, output_dir):
    """
    将LabelMe格式的JSON文件转换为YOLO11格式的标注文件。

    参数:
    json_path (str): 输入的LabelMe格式JSON文件路径。
    output_dir (str): 输出的YOLO11格式标注文件夹路径。
    """
    # 打开LabelMe格式的JSON文件
    with open(json_path, 'r') as f:
        labelme_data = json.load(f)  # 读取JSON数据

    # 获取图像的宽度和高度
    image_width = labelme_data['imageWidth']
    image_height = labelme_data['imageHeight']

    yolo_annotations = []  # 存储YOLO11格式的标注

    # 遍历所有的标注形状
    for shape in labelme_data['shapes']:
        label = shape['label']  # 获取标签名称
        if label not in label_map:
            continue  # 如果标签未定义,则忽略

        class_id = label_map[label]  # 获取对应的类别ID

        points = shape['points']  # 获取标注的坐标点
        if shape['shape_type'] == 'rectangle':  # 如果是矩形
            (x1, y1), (x2, y2) = points  # 获取矩形的两个顶点
        elif shape['shape_type'] == 'polygon':  # 如果是多边形
            x1, y1 = min(point[0] for point in points), min(point[1] for point in points)  # 计算多边形的左上角
            x2, y2 = max(point[0] for point in points), max(point[1] for point in points)  # 计算多边形的右下角
        else:
            continue  # 其他类型不处理

        # 计算YOLO11格式所需的中心点和宽高
        x_center = (x1 + x2) / 2.0 / image_width  # 计算中心点x坐标
        y_center = (y1 + y2) / 2.0 / image_height  # 计算中心点y坐标
        width = (x2 - x1) / image_width  # 计算宽度
        height = (y2 - y1) / image_height  # 计算高度

        # 添加YOLO11格式的标注到列表中
        yolo_annotations.append(f"{class_id} {x_center} {y_center} {width} {height}")

    # 构建输出文件的路径
    output_file = os.path.join(output_dir, os.path.splitext(os.path.basename(json_path))[0] + '.txt')
    # 将YOLO11格式的标注写入输出文件
    with open(output_file, 'w') as f:
        f.write('\n'.join(yolo_annotations))

# 示例使用
convert_labelme_to_yolo('/path/to/labelme_file.json', '/path/to/output_dir')

方案2——多个标签文件转换

读取一个文件夹下所有json文件,然后转为YOLO11的txt标签格

process_folder(input_folder, output_folder):

  • 功能: 处理输入文件夹中的所有JSON文件,转换为YOLO11格式。
  • 参数:
    • input_folder (str): 包含LabelMe格式JSON文件的输入文件夹路径。
    • output_folder (str): 用于保存YOLO11格式标注文件的输出文件夹路径。
  • 操作:
    • 创建输出文件夹(如果不存在)。
    • 遍历输入文件夹,调用转换函数处理每个以.json结尾的文件。

 示例代码如下所示:

import json
import os

# 定义标签映射,将类别名称映射为ID
label_map = {
    "car": 0,  # 汽车
    "bus": 1   # 公交车
}

def convert_labelme_to_yolo(json_path, output_dir):
    """
    将LabelMe格式的JSON文件转换为YOLO11格式的标注文件。

    参数:
    json_path (str): 输入的LabelMe格式JSON文件路径。
    output_dir (str): 输出的YOLO11格式标注文件夹路径。
    """
    # 打开LabelMe格式的JSON文件
    with open(json_path, 'r') as f:
        labelme_data = json.load(f)  # 读取JSON数据

    # 获取图像的宽度和高度
    image_width = labelme_data['imageWidth']
    image_height = labelme_data['imageHeight']

    yolo_annotations = []  # 存储YOLO11格式的标注

    # 遍历所有的标注形状
    for shape in labelme_data['shapes']:
        label = shape['label']  # 获取标签名称
        if label not in label_map:
            continue  # 如果标签未定义,则忽略

        class_id = label_map[label]  # 获取对应的类别ID

        points = shape['points']  # 获取标注的坐标点
        if shape['shape_type'] == 'rectangle':  # 如果是矩形
            (x1, y1), (x2, y2) = points  # 获取矩形的两个顶点
        elif shape['shape_type'] == 'polygon':  # 如果是多边形
            x1, y1 = min(point[0] for point in points), min(point[1] for point in points)  # 计算多边形的左上角
            x2, y2 = max(point[0] for point in points), max(point[1] for point in points)  # 计算多边形的右下角
        else:
            continue  # 其他类型不处理

        # 计算YOLO11格式所需的中心点和宽高
        x_center = (x1 + x2) / 2.0 / image_width  # 计算中心点x坐标
        y_center = (y1 + y2) / 2.0 / image_height  # 计算中心点y坐标
        width = (x2 - x1) / image_width  # 计算宽度
        height = (y2 - y1) / image_height  # 计算高度

        # 添加YOLO11格式的标注到列表中
        yolo_annotations.append(f"{class_id} {x_center} {y_center} {width} {height}")

    # 构建输出文件的路径
    output_file = os.path.join(output_dir, os.path.splitext(os.path.basename(json_path))[0] + '.txt')
    # 将YOLO11格式的标注写入输出文件
    with open(output_file, 'w') as f:
        f.write('\n'.join(yolo_annotations))

def process_folder(input_folder, output_folder):
    """
    处理输入文件夹中的所有JSON文件,并将其转换为YOLO11格式的标注文件。

    参数:
    input_folder (str): 输入文件夹路径,包含LabelMe格式的JSON文件。
    output_folder (str): 输出文件夹路径,用于保存YOLO11格式的标注文件。
    """
    # 创建输出文件夹(如果不存在)
    os.makedirs(output_folder, exist_ok=True)
    
    # 处理输入文件夹中的每个 JSON 文件
    for filename in os.listdir(input_folder):
        if filename.endswith(".json"):  # 只处理以 .json 结尾的文件
            json_path = os.path.join(input_folder, filename)  # 获取完整的JSON文件路径
            convert_labelme_to_yolo(json_path, output_folder)  # 调用转换函数

# 示例使用
input_folder = "/mnt/data/json_labels"  # 输入json_labels文件夹路径
output_folder = "/mnt/data/yolo11_txt_labels"  # 输出txt_labels文件夹路径

process_folder(input_folder, output_folder)  # 处理文件夹中的所有JSON文件

# 列出输出文件夹中的文件以确认
os.listdir(output_folder)  # 打印输出文件夹中的文件列表

我们使用上面代码时,需要设置输入的json_labels文件夹路径输出txt_labels文件夹路径

input_folder = "/mnt/data/json_labels"  # 输入json_labels文件夹路径
output_folder = "/mnt/data/yolo11_txt_labels"  # 输出txt_labels文件夹路径

8、迭代优化模型(可选)

然后,可以迭代优化模型。用修正后数据,作为新的数据,加入旧数据中;

重新训练之前的模型权重,这样模型会学得更好,迭代优化模型。

YOLO11目标检测-训练模型参考我这篇文章:

https://blog.csdn.net/qq_41204464/article/details/142826049?spm=1001.2014.3001.5501

  YOLO11相关文章推荐:

一篇文章快速认识YOLO11 | 关键改进点 | 安装使用 | 模型训练和推理-CSDN博客

一篇文章快速认识 YOLO11 | 实例分割 | 模型训练 | 自定义数据集-CSDN博客

YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测-CSDN博客

YOLO11模型训练 | 目标检测与跟踪 | 实例分割 | 关键点姿态估计-CSDN博客

YOLO11 实例分割 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签-CSDN博客

YOLO11 实例分割 | 导出ONNX模型 | ONNX模型推理-CSDN博客

YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理-CSDN博客

分享完成,欢迎大家多多点赞收藏,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server-导入和导出excel数据-注意事项

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 之前写过的放在这里&#xff1a; SqlServer_陆沙的博客-CSDN博客 https://blog.csdn.net/pxy7896/category_12704205.html 最近重启ASP.NET项目&#xff0c;在使用sql server导出和导入数据时遇到一些问题&#xff0c;特…

Qt键盘按下事件和定时器事件及事件的接收和忽略

定时器事件 //设置多少毫秒调用一次 1s1000timerId this->startTimer(1000);timerId2 this->startTimer(500);void MyWidget::timerEvent(QTimerEvent* t) {static int sec 0;//通过判断当前ID来实现不同定时器的调用时间if(t->timerId() this->timerId){//隔一…

AtCoder Beginner Contest 375 A-E 题解

我的老师让我先做最后再交&#xff0c;看正确率&#xff08;即以OI赛制打abc&#xff09; 所以我用的小号&#xff08;… …&#xff09; C 卡了老半天才出来&#xff0c;我把题读错了 难度&#xff1a; A. Seats 题意 给你一个字符串 S S S&#xff0c;仅包含 . 和 #&…

kubernets(二)

集群操作 查看集群信息 kubectl get查看各组件信息 格式&#xff1a;kubectl get 资源类型 【资源名】 【选项】 events #查看集群中的所有日志信息 -o wide # 显示资源详细信息&#xff0c;包括节点、地址... -o yaml/json #将当前资源对象输出至 yaml/json 格式文…

2024.10.20 进制转换 删除根节点为x的整个子树

进制转换 十进制转换为任意进制 #include <stdio.h> int main(){char res [32] {0};int num;int index;scanf("%d %d",&num,&index);char table[] "0123456789ABCDEF";int i 0;if(num0) res[0] 0;else if(num!0){while(num>0){res[i…

Java重修笔记 UDP 网络通信

UDP 网络通信原理 1. 类 DatagramSocket 和 DatagramPacket [数据包/数据报] 实现了基于 UDP协议网络程序。 2. UDP 数据报通过数据报套接字 DatagramSocket 发送和接收&#xff0c;系统不保证UDP数据报一定能够安全送到目的地&#xff0c;也不能确定什么时候可以抵达&#…

【机器学习】决策树算法

目录 一、决策树算法的基本原理 二、决策树算法的关键概念 三、决策树算法的应用场景 四、决策树算法的优化策略 五、代码实现 代码解释&#xff1a; 在机器学习领域&#xff0c;决策树算法是一种简单直观且易于理解的分类和回归方法。它通过学习数据特征和决策规则&#…

电力系统IEC-101报文主要常用详解

文章目录 1️⃣ IEC-1011.1 前言1.2 101规约简述1.3 固定帧格式1.4 可变帧格式1.5 ASDU1.5.1 常见类型标识1.5.2 常见结构限定词1.5.3 常见传送原因1.5.4 信息体地址 1.6 常用功能报文1.6.1 初始化链路报文1.6.2 总召报文1.6.3 复位进程1.8.4 对时1.8.4.1时钟读取1.8.4.2时钟写…

R语言医学数据分析实践-R编程环境的搭建

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 R语言对编程环境的要求不高&#xff0c;可以在多种操作系统平台上…

数据结构——顺序表的基本操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建&#xff0c;并没有使用顺序表指针的方法&#xff0c;具体两个…

【Linux系列】查询nginx相关的进程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

推荐IDE中实用AI编程插件,目前无限次使用

插件介绍 一款字节跳动推出的“基于豆包大模型的智能开发工具” 以vscode介绍【pycharm等都可以啊】&#xff0c;这个插件提供智能补全、智能预测、智能问答等能力&#xff0c;节省开发时间 直接在IDE中使用&#xff0c;就不用在网页中来回切换了 感觉还可以&#xff0c;响应速…

欧盟 RED 网络安全法规 EN 18031

目录 1. &#x1f4c2; EN 18031 1.1 背景 1.2 专业术语 1.3 覆盖产品范围 1.4 EN 18031标准主要评估内容&#xff1a; 1.5 EN 18031标准主要评估项目&#xff1a; 1.6 EN 18031 与 ETSI EN 303 645 的主要差异 1.7 RED 网络安全法规解读研讨会 2. &#x1f531; EN 1…

LabVIEW示波器通信及应用

基于LabVIEW平台开发的罗德与施瓦茨示波器通信与应用系统实现了示波器的远程控制及波形数据的实时分析&#xff0c;通过TCP/IP或USB接口与计算机通信&#xff0c;利用VISA技术进行指令传输&#xff0c;从而实现高效的数据采集与处理功能。 项目背景 随着现代电子测试需求的日益…

【解决Docker无剩余存储磁盘空间问题】

【解决Docker无剩余存储磁盘空间问题】 目录 【解决Docker无剩余存储磁盘空间问题】一、问题概述二、问题原因三、解决方案1、方案一&#xff1a;清除Docker磁盘空间2、方案二&#xff1a;更换Docker磁盘存储目录 一、问题概述 执行Docker build -t [镜像名] [源目录] 命令报错…

2.1 HTML5 - Canvas标签

文章目录 引言Canvas标签概述定义实例&#xff1a;创建画布 理解Canvas坐标系概述实例&#xff1a;获取Canvas坐标 获取Canvas环境上下文概述实例&#xff1a;获取Canvas上下文设置渐变色效果 结语 引言 大家好&#xff0c;今天我们要一起探索HTML5中一个非常有趣且强大的特性…

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南

文章简介&#xff1a; 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中&#xff0c;我将详细介绍如何将本地的 Node.js 服务通过宝塔面板&#xff08;BT 面板&#xff09;上线。宝塔面板是一个强大的服务器管理工具&#xff0c;具有简洁的…

基于SSM党务政务服务热线管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;部门管理&#xff0c;办事信息管理&#xff0c;信息记录管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;部门&#xff0c;信息…

金融信创基金行业案例:某基金公司AD信创替代方案建设分享

缺失国产域控统一认证&#xff0c;导致业务信创升级受阻 某基金管理公司在办公场景拟建设信创 OA 系统、信创邮件系统以及信创服务器、桌面终端。但原有的 AD 域既无法接管新购的信创资产&#xff0c;亦不符合全栈信创建设要求。因此&#xff0c;该基金单位必须选择一套稳定可…

H-TCP 的效率和公平性

昨晚带安孩楼下玩耍&#xff0c;用手机 desmos 作了一组 response curve 置于双对数坐标系&#xff1a; 长肥管道的优化思路都很类似&#xff0c;cwnd 增长快一点&#xff1a; BIC TCP&#xff1a;二分查找逼近 capacity&#xff1b;CUBIC TCP&#xff1a;上凸曲线逼近 capa…