You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

YOLOv8分割预测图像的目标颜色修改及标注颜色保留技术咨询

YOLOv8分割预测图像的目标颜色修改及标注颜色保留技术咨询

嗨,我来帮你搞定这个YOLOv8预测颜色的问题~ 先说说你遇到的核心问题:YOLOv8默认的调色板不一定和你LabelStudio标注时的颜色一致,而且你现在已经生成了10万+预测图,需要调整颜色对吧?咱们逐个解决你的问题:


问题1:怎么把检测目标的白色改成其他颜色?

这里分两种情况:还没跑预测已经生成了所有预测图,对应不同的解决方法:

情况1:重新跑预测时指定颜色(推荐,更准确)

YOLOv8的Python API在预测时可以直接指定每个类别的颜色,或者通过数据集配置文件固定调色板:

方法A:预测时直接传入颜色参数

ultralytics库调用模型时,给predict方法传colors参数,这个参数是一个列表,每个元素对应一个类别的RGB颜色元组:

from ultralytics import YOLO

# 加载训练好的模型
model = YOLO('best.pt')

# 定义每个类别的目标颜色(按类别顺序对应)
class_colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]  # 红、绿、蓝

# 执行预测并保存结果,指定颜色
results = model.predict(
    source='your_image_directory/',  # 你的输入图片路径
    save=True,  # 自动保存预测结果
    colors=class_colors,  # 使用自定义颜色
    project='custom_pred_results'  # 保存到新目录,避免覆盖旧图
)
方法B:修改数据集YAML文件固定调色板

找到你训练时用的数据集yaml文件,添加palette字段,把每个类别的颜色按顺序填进去,这样每次预测都会自动用这个调色板:

train: path/to/train/images
val: path/to/val/images

names:
  0: class1
  1: class2
  2: class3
palette: [[255, 0, 0], [0, 255, 0], [0, 0, 255]]  # 对应每个类别的RGB颜色

情况2:批量修改已生成的10万+预测图

你之前的OpenCV代码效果不好,是因为它只检测矩形白色框,但YOLOv8的分割预测是不规则的掩膜填充区域,不是标准矩形!下面是精准的批量替换方案:

import cv2
import os
from pathlib import Path

def batch_replace_segment_color(input_dir, output_dir, original_white=(255,255,255), target_color=(0,255,0)):
    # 创建输出目录,不存在则自动生成
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    # 遍历输入目录下所有图片
    for img_file in os.listdir(input_dir):
        img_path = os.path.join(input_dir, img_file)
        # 只处理常见图片格式
        if not img_file.lower().endswith(('.jpg', '.jpeg', '.png')):
            continue
        
        # 读取图片
        img = cv2.imread(img_path)
        if img is None:
            print(f"跳过无法读取的图片: {img_file}")
            continue
        
        # 生成白色区域的掩码(精准定位所有白色像素)
        mask = cv2.inRange(img, original_white, original_white)
        # 将掩码区域的像素替换为目标颜色
        img[mask != 0] = target_color
        
        # 保存修改后的图片
        output_path = os.path.join(output_dir, img_file)
        cv2.imwrite(output_path, img)
    
    print("所有图片批量处理完成!")

# 调用示例:把旧预测图里的白色分割区域换成绿色,保存到新目录
batch_replace_segment_color(
    input_dir="path/to/your/existing_predicted_images",
    output_dir="path/to/modified_predicted_images",
    target_color=(0,255,0)  # 注意:OpenCV用BGR格式,绿色是(0,255,0)
)

提示:如果要换成红色,BGR格式是(0,0,255);蓝色是(255,0,0)


问题2:怎么让LabelStudio标注时的颜色保留到预测结果里?

LabelStudio里每个标签的颜色可以提取并复用,步骤如下:

  1. 提取LabelStudio的标签颜色

    • 打开你的LabelStudio项目,进入「设置」→「标签」,可以看到每个标签对应的十六进制颜色(比如#ff0000对应红色)。
    • 或者导出标注为JSON格式,在标注文件的label字段下的color属性就是十六进制颜色值。
  2. 十六进制颜色转RGB格式
    可以用小工具或代码转换,比如:

    def hex_to_rgb(hex_color):
        hex_color = hex_color.lstrip('#')
        return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
    

    比如#ff0000转成RGB是(255,0,0)

  3. 将颜色写入数据集YAML文件
    按照问题1的方法B,把转换后的RGB颜色按类别顺序放到yaml的palette字段里,比如:

    names:
      0: red_symbol
      1: blue_symbol
      2: green_symbol
    palette: [[255,0,0], [0,0,255], [0,255,0]]  # 对应LabelStudio的标注颜色
    
  4. 重新跑预测
    用这个更新后的yaml文件配合模型预测,YOLOv8就会自动使用你LabelStudio里的原始标注颜色了~


为什么你之前的OpenCV代码效果不好?

你写的代码是通过轮廓检测找矩形白色框,但YOLOv8的分割预测结果是不规则的填充掩膜(比如多边形区域),不是标准的矩形框,所以这个方法只能检测到画面里的白色矩形背景,没法覆盖到分割的目标区域,才会出现“随机替换”的情况。改用上面的像素级替换方法就能精准命中所有白色分割区域啦~


备注:内容来源于stack exchange,提问作者Izzy

火山引擎 最新活动