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打包资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

修明pt

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

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

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

打赏作者

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

抵扣说明:

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

余额充值