源起:
当在做数据标注时,由于有多个目标物的时候,很难弄清楚对应标记的标签,所以在此基础上增加标签显示在对应的框或者对应的点上。
魔改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文件,也可以直接运行