Labelme 最新版魔改——增加标签可视化

Labelme 最新版魔改——增加标签可视化

在这里插入图片描述

源起:

当在做数据标注时,由于有多个目标物的时候,很难弄清楚对应标记的标签,所以在此基础上增加标签显示在对应的框或者对应的点上。

魔改labelme版本号:5.4.0a0

思路

目前我涉及的目标物主要是两个,一个是目标物检测,需要矩形框进行标注。另外一个则是关键点检测,需要对应的点进行标记。所以我在第一个点上进行显示标签。

修改代码

方法一源码修改:

labelme官网请直接跳转 ===> labelme 官网
拿到labelme源码,在labelme/widgets/canvas.py文件中添加导入相应的包,忘记导入的是哪个了,这个是我的头文件,大家可以对照一下

import gdown
import imgviz
from qtpy import QtCore
from qtpy import QtGui
from qtpy import QtWidgets

import labelme.ai
from labelme.logger import logger
from labelme import QT5
from labelme.shape import Shape
import labelme.utils

from PyQt5.QtCore import Qt, QPointF
from PyQt5.QtGui import QPainter, QColor, QFont

找到paintEvent函数添加以下代码

shape.fill = shape.selected or shape == self.hShape
shape.paint(p)
p.setPen(QColor(0,255,0))
p.setFont(QFont('Decorative', 20))
p.drawText(QPointF(shape.points[0].x(), shape.points[0].y() - 10), shape.label)

为了方便对照,下面是我修改后的paintEvent函数,大家可以相互对照一下

def paintEvent(self, event):
    if not self.pixmap:
        return super(Canvas, self).paintEvent(event)

    p = self._painter
    p.begin(self)
    p.setRenderHint(QtGui.QPainter.Antialiasing)
    p.setRenderHint(QtGui.QPainter.HighQualityAntialiasing)
    p.setRenderHint(QtGui.QPainter.SmoothPixmapTransform)

    p.scale(self.scale, self.scale)
    p.translate(self.offsetToCenter())

    p.drawPixmap(0, 0, self.pixmap)

    # draw crosshair
    if (
        self._crosshair[self._createMode]
        and self.drawing()
        and self.prevMovePoint
        and not self.outOfPixmap(self.prevMovePoint)
    ):
        p.setPen(QtGui.QColor(0, 0, 0))
        p.drawLine(
            0,
            int(self.prevMovePoint.y()),
            self.width() - 1,
            int(self.prevMovePoint.y()),
        )
        p.drawLine(
            int(self.prevMovePoint.x()),
            0,
            int(self.prevMovePoint.x()),
            self.height() - 1,
        )

    Shape.scale = self.scale
    for shape in self.shapes:
        if (shape.selected or not self._hideBackround) and self.isVisible(
            shape
        ):
            shape.fill = shape.selected or shape == self.hShape
            shape.paint(p)
            p.setPen(QColor(0,255,0))
            p.setFont(QFont('Decorative', 20))
            p.drawText(QPointF(shape.points[0].x(), shape.points[0].y() - 10), shape.label)

    if self.current:
        self.current.paint(p)
        assert len(self.line.points) == len(self.line.point_labels)
        self.line.paint(p)
    if self.selectedShapesCopy:
        for s in self.selectedShapesCopy:
            s.paint(p)

    if (
        self.fillDrawing()
        and self.createMode == "polygon"
        and self.current is not None
        and len(self.current.points) >= 2
    ):
        drawing_shape = self.current.copy()
        if drawing_shape.fill_color.getRgb()[3] == 0:
            logger.warning(
                "fill_drawing=true, but fill_color is transparent,"
                " so forcing to be opaque."
            )
            drawing_shape.fill_color.setAlpha(64)
        drawing_shape.addPoint(self.line[1])
        drawing_shape.fill = True
        drawing_shape.paint(p)
    elif self.createMode == "ai_polygon" and self.current is not None:
        drawing_shape = self.current.copy()
        drawing_shape.addPoint(
            point=self.line.points[1],
            label=self.line.point_labels[1],
        )
        points = self._ai_model.predict_polygon_from_points(
            points=[
                [point.x(), point.y()] for point in drawing_shape.points
            ],
            point_labels=drawing_shape.point_labels,
        )
        if len(points) > 2:
            drawing_shape.setShapeRefined(
                shape_type="polygon",
                points=[
                    QtCore.QPointF(point[0], point[1]) for point in points
                ],
                point_labels=[1] * len(points),
            )
            drawing_shape.fill = self.fillDrawing()
            drawing_shape.selected = True
            drawing_shape.paint(p)
    elif self.createMode == "ai_mask" and self.current is not None:
        drawing_shape = self.current.copy()
        drawing_shape.addPoint(
            point=self.line.points[1],
            label=self.line.point_labels[1],
        )
        mask = self._ai_model.predict_mask_from_points(
            points=[
                [point.x(), point.y()] for point in drawing_shape.points
            ],
            point_labels=drawing_shape.point_labels,
        )
        y1, x1, y2, x2 = imgviz.instances.mask_to_bbox([mask])[0].astype(
            int
        )
        drawing_shape.setShapeRefined(
            shape_type="mask",
            points=[QtCore.QPointF(x1, y1), QtCore.QPointF(x2, y2)],
            point_labels=[1, 1],
            mask=mask[y1:y2, x1:x2],
        )
        drawing_shape.selected = True
        drawing_shape.paint(p)

    p.end()

然后安装源码中相关依赖即可

pip install -r requirements-dev.txt

在这里插入图片描述
之后运行代码安装

python setup.py install

之后,直接在命令行中运行labelme即可打开软件

方法二安装后修改:

首先直接pip安装labelme

pip install labelme

然后直接去安装路径修改源码即可
地址为:python路径\Lib\site-packages\labelme
例如我的地址为

E:\Anaconda3\envs\selenium\Lib\site-packages\labelme

至于后面修改的信息,与方法一一样即可

若不想修改,我这里打包了exe文件,也可以直接运行

lableme打包资源

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要批量可视化 LabelMe 的 JSON 标注文件,你可以按照以下步骤进行操作: 1. 确保你已经安装了 labelme 包。你可以使用以下命令来安装: ``` pip install labelme ``` 2. 创建一个 Python 脚本,导入所需的库: ```python import os import cv2 import labelme import numpy as np ``` 3. 指定包含 JSON 文件的目录路径: ```python json_dir = 'path/to/your/json/files' ``` 4. 遍历 JSON 文件目录中的每个文件,加载 JSON 数据并可视化: ```python for json_file in os.listdir(json_dir): if json_file.endswith('.json'): json_path = os.path.join(json_dir, json_file) label_data = labelme.LabelFile(json_path) image_data = label_data.imageData annotations = label_data.shapes image = np.frombuffer(image_data, dtype=np.uint8) image = cv2.imdecode(image, cv2.IMREAD_COLOR) for annotation in annotations: shape_type = annotation['shape_type'] points = annotation['points'] if shape_type == 'rectangle': x, y, w, h = cv2.boundingRect(np.array(points)) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) elif shape_type == 'polygon': pts = np.array(points, np.int32) cv2.polylines(image, [pts], True, (0, 255, 0), 2) cv2.imshow("Annotated Image", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 通过以上步骤,你可以批量读取 LabelMe 的 JSON 标注文件,并将其中的图像和标注信息可视化显示出来。请确保已正确安装所需的包,并将代码中的文件路径替换为实际的 JSON 文件目录路径。注意,该代码会逐个显示每张图像的可视化结果,按任意键继续到下一张图像。如果你希望自动化处理所有图像,可以相应地修改代码逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修明pt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值