功能添加

This commit is contained in:
yatenglg 2023-04-24 21:45:38 +08:00
parent ab122e91a5
commit 42096a19d9
20 changed files with 2054 additions and 1693 deletions

View File

@ -3,6 +3,10 @@
集成[segment anything](https://github.com/facebookresearch/segment-anything),实现图片分割快速标注。
**项目持续更新中,[更新日志](./UpdateLog.md),欢迎大家提出建议**
演示视频https://www.bilibili.com/video/BV1Lk4y1J7uB/
[中文](README.md) [English](README-en.md)
## 特点
1. 集成segment anything快速进行图像分割标注

10
UpdateLog.md Normal file
View File

@ -0,0 +1,10 @@
# 20240424
- 添加了对labelme格式json的支持只支持标注的多边形
**在进行修改之前,先备份一份!!!**
现在可以打开并编辑之前用labeme生成的标注文件了记得通过图层高低调整遮挡关系。
但最终保存还会以ISAT格式的json保存。
- 添加了显示/隐藏按钮快捷键V用于显示或隐藏所有多边形
- 添加了

View File

@ -38,24 +38,46 @@ class Annotation:
with open(self.label_path, 'r') as f:
dataset = load(f)
info = dataset.get('info', {})
objects = dataset.get('objects', [])
self.img_name = info.get('name', '')
self.width = info.get('width', 0)
self.height = info.get('height', 0)
self.depth = info.get('depth', 0)
self.note = info.get('note', '')
for obj in objects:
category = obj.get('category', 'unknow')
group = obj.get('group', '')
segmentation = obj.get('segmentation', [])
iscrowd = obj.get('iscrowd', 0)
note = obj.get('note', '')
area = obj.get('area', 0)
layer = obj.get('layer', 1)
bbox = obj.get('bbox', [])
obj = Object(category, group, segmentation, area, layer, bbox, iscrowd, note)
self.objects.append(obj)
description = info.get('description', '')
if description == 'ISAT':
# ISAT格式json
objects = dataset.get('objects', [])
self.img_name = info.get('name', '')
self.width = info.get('width', 0)
self.height = info.get('height', 0)
self.depth = info.get('depth', 0)
self.note = info.get('note', '')
for obj in objects:
category = obj.get('category', 'unknow')
group = obj.get('group', 0)
if group is None: group = 0
segmentation = obj.get('segmentation', [])
iscrowd = obj.get('iscrowd', 0)
note = obj.get('note', '')
area = obj.get('area', 0)
layer = obj.get('layer', 2)
bbox = obj.get('bbox', [])
obj = Object(category, group, segmentation, area, layer, bbox, iscrowd, note)
self.objects.append(obj)
else:
# labelme格式json
shapes = dataset.get('shapes', {})
for shape in shapes:
# 只加载多边形
is_polygon = shape.get('shape_type', '') == 'polygon'
if not is_polygon:
continue
category = shape.get('label', 'unknow')
group = shape.get('group_id', 0)
if group is None: group = 0
segmentation = shape.get('points', [])
iscrowd = shape.get('iscrowd', 0)
note = shape.get('note', '')
area = shape.get('area', 0)
layer = shape.get('layer', 2)
bbox = shape.get('bbox', [])
obj = Object(category, group, segmentation, area, layer, bbox, iscrowd, note)
self.objects.append(obj)
def save_annotation(self):
dataset = {}

View File

@ -1,5 +1,6 @@
<RCC>
<qresource prefix="icon">
<file>icons/眼睛_eyes.svg</file>
<file>icons/semantic.png</file>
<file>icons/M_Favicon.ico</file>
<file>icons/instance.png</file>

File diff suppressed because it is too large Load Diff

View File

@ -19,4 +19,4 @@ label:
name: cake
- color: '#5c3566'
name: fence
language: zh
language: en

View File

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# @Author : LG
from PyQt5.QtCore import QThread, pyqtSignal
import os
class GPUResource_Thread(QThread):
message = pyqtSignal(str)
def __init__(self):
super(GPUResource_Thread, self).__init__()
self.gpu_id = None
self.callback = None
self.keep = True
try:
r = os.popen('nvidia-smi -q -d MEMORY -i 0 | grep Total').readline()
self.total = r.split(':')[-1].strip().split(' ')[0]
except Exception as e:
print(e)
self.total = 'none'
def run(self):
while True:
r = os.popen('nvidia-smi -q -d MEMORY -i 0 | grep Used').readline()
used = r.split(':')[-1].strip().split(' ')[0]
self.message.emit("cuda: {}/{}MiB".format(used, self.total))
def __del__(self):
self.message.emit("Ground filter thread | Wait for thread to exit.")
self.wait()
self.message.emit("Ground filter thread | Thread exited.")
def set_callback(self, callback):
self.callback = callback

View File

@ -17,18 +17,20 @@ class SegAny:
else:
raise ValueError('The checkpoint named {} is not supported.'.format(checkpoint))
device = 'cuda' if torch.cuda.is_available() else 'cpu'
self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
sam = sam_model_registry[model_type](checkpoint=checkpoint)
sam.to(device=device)
sam.to(device=self.device)
self.predictor = SamPredictor(sam)
self.image = None
def set_image(self, image):
self.predictor.set_image(image)
def reset_image(self):
self.predictor.reset_image()
self.image = None
torch.cuda.empty_cache()
def predict(self, input_point, input_label):
input_point = np.array(input_point)
@ -46,5 +48,5 @@ class SegAny:
mask_input=mask_input[None, :, :],
multimask_output=False,
)
print('masks: {}'.format(masks))
torch.cuda.empty_cache()
return masks

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/MainWindow.ui'
# Form implementation generated from reading ui file 'MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
@ -32,7 +32,7 @@ class Ui_MainWindow(object):
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setEnabled(True)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 24))
self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 25))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
@ -93,7 +93,7 @@ class Ui_MainWindow(object):
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.info_dock = QtWidgets.QDockWidget(MainWindow)
self.info_dock.setMinimumSize(QtCore.QSize(80, 38))
self.info_dock.setMinimumSize(QtCore.QSize(85, 43))
self.info_dock.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
self.info_dock.setObjectName("info_dock")
self.dockWidgetContents_2 = QtWidgets.QWidget()
@ -101,7 +101,7 @@ class Ui_MainWindow(object):
self.info_dock.setWidget(self.dockWidgetContents_2)
MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.info_dock)
self.labels_dock = QtWidgets.QDockWidget(MainWindow)
self.labels_dock.setMinimumSize(QtCore.QSize(80, 38))
self.labels_dock.setMinimumSize(QtCore.QSize(85, 43))
self.labels_dock.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
self.labels_dock.setObjectName("labels_dock")
self.dockWidgetContents_3 = QtWidgets.QWidget()
@ -250,6 +250,11 @@ class Ui_MainWindow(object):
icon23.addPixmap(QtGui.QPixmap(":/icon/icons/锚点_anchor.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actionPolygon.setIcon(icon23)
self.actionPolygon.setObjectName("actionPolygon")
self.actionVisible = QtWidgets.QAction(MainWindow)
icon24 = QtGui.QIcon()
icon24.addPixmap(QtGui.QPixmap(":/icon/icons/眼睛_eyes.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actionVisible.setIcon(icon24)
self.actionVisible.setObjectName("actionVisible")
self.menuFile.addAction(self.actionOpen_dir)
self.menuFile.addAction(self.actionSave_dir)
self.menuFile.addSeparator()
@ -308,6 +313,7 @@ class Ui_MainWindow(object):
self.toolBar.addAction(self.actionZoom_out)
self.toolBar.addAction(self.actionFit_wiondow)
self.toolBar.addAction(self.actionBit_map)
self.toolBar.addAction(self.actionVisible)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@ -397,4 +403,7 @@ class Ui_MainWindow(object):
self.actionPolygon.setToolTip(_translate("MainWindow", "Draw polygon"))
self.actionPolygon.setStatusTip(_translate("MainWindow", "Accurately annotate by drawing polygon. "))
self.actionPolygon.setShortcut(_translate("MainWindow", "C"))
self.actionVisible.setText(_translate("MainWindow", "Visible"))
self.actionVisible.setStatusTip(_translate("MainWindow", "Visible"))
self.actionVisible.setShortcut(_translate("MainWindow", "V"))
import icons_rc

View File

@ -57,7 +57,7 @@
<x>0</x>
<y>0</y>
<width>1280</width>
<height>24</height>
<height>25</height>
</rect>
</property>
<property name="font">
@ -234,12 +234,13 @@
<addaction name="actionZoom_out"/>
<addaction name="actionFit_wiondow"/>
<addaction name="actionBit_map"/>
<addaction name="actionVisible"/>
</widget>
<widget class="QDockWidget" name="info_dock">
<property name="minimumSize">
<size>
<width>80</width>
<height>38</height>
<width>85</width>
<height>43</height>
</size>
</property>
<property name="features">
@ -256,8 +257,8 @@
<widget class="QDockWidget" name="labels_dock">
<property name="minimumSize">
<size>
<width>80</width>
<height>38</height>
<width>85</width>
<height>43</height>
</size>
</property>
<property name="features">
@ -683,6 +684,21 @@
<string>C</string>
</property>
</action>
<action name="actionVisible">
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icon/icons/眼睛_eyes.svg</normaloff>:/icon/icons/眼睛_eyes.svg</iconset>
</property>
<property name="text">
<string>Visible</string>
</property>
<property name="statusTip">
<string>Visible</string>
</property>
<property name="shortcut">
<string>V</string>
</property>
</action>
</widget>
<resources>
<include location="../icons.qrc"/>

238
ui/en.ts
View File

@ -94,72 +94,72 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="242"/>
<location filename="shortcut_dialog.py" line="262"/>
<source>help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="265"/>
<location filename="shortcut_dialog.py" line="285"/>
<source>E</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="260"/>
<location filename="shortcut_dialog.py" line="280"/>
<source>Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="245"/>
<location filename="shortcut_dialog.py" line="265"/>
<source>S</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="250"/>
<location filename="shortcut_dialog.py" line="270"/>
<source>Save annotation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="247"/>
<location filename="shortcut_dialog.py" line="267"/>
<source>T</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="259"/>
<location filename="shortcut_dialog.py" line="279"/>
<source>Delete polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="244"/>
<location filename="shortcut_dialog.py" line="264"/>
<source>B</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="262"/>
<location filename="shortcut_dialog.py" line="282"/>
<source>Next image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="246"/>
<location filename="shortcut_dialog.py" line="266"/>
<source>D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="248"/>
<location filename="shortcut_dialog.py" line="268"/>
<source>A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="253"/>
<location filename="shortcut_dialog.py" line="273"/>
<source>Bit map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="254"/>
<location filename="shortcut_dialog.py" line="274"/>
<source>Space</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="256"/>
<location filename="shortcut_dialog.py" line="276"/>
<source>F</source>
<translation type="unfinished"></translation>
</message>
@ -225,75 +225,90 @@ http://www.yatenglg.cn/isat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="243"/>
<location filename="shortcut_dialog.py" line="263"/>
<source>Shortcut</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="249"/>
<location filename="shortcut_dialog.py" line="269"/>
<source>Prior image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="269"/>
<location filename="shortcut_dialog.py" line="289"/>
<source>To top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="258"/>
<location filename="shortcut_dialog.py" line="278"/>
<source>To bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="255"/>
<location filename="shortcut_dialog.py" line="275"/>
<source>Zoom fit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="252"/>
<location filename="shortcut_dialog.py" line="272"/>
<source>Draw polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="257"/>
<location filename="shortcut_dialog.py" line="277"/>
<source>Segment anything</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="261"/>
<location filename="shortcut_dialog.py" line="281"/>
<source>Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="263"/>
<location filename="shortcut_dialog.py" line="283"/>
<source>Backspace</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="264"/>
<location filename="shortcut_dialog.py" line="284"/>
<source>Z</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="266"/>
<location filename="shortcut_dialog.py" line="286"/>
<source>Annotate finish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="267"/>
<location filename="shortcut_dialog.py" line="287"/>
<source>Annotate cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="268"/>
<location filename="shortcut_dialog.py" line="288"/>
<source>Esc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="271"/>
<source>C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="290"/>
<source>Polygons Visible</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="291"/>
<source>V</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Form</name>
<message>
<location filename="label_dock.py" line="31"/>
<location filename="label_dock.py" line="40"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
@ -337,388 +352,403 @@ http://www.yatenglg.cn/isat</source>
<source>Jump to the image.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="label_dock.py" line="41"/>
<source>Visible</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="MainWindow.py" line="317"/>
<location filename="MainWindow.py" line="320"/>
<source>ISAT</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="318"/>
<location filename="MainWindow.py" line="321"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="319"/>
<location filename="MainWindow.py" line="322"/>
<source>View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="320"/>
<location filename="MainWindow.py" line="323"/>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="322"/>
<location filename="MainWindow.py" line="325"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="369"/>
<location filename="MainWindow.py" line="372"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="324"/>
<location filename="MainWindow.py" line="327"/>
<source>toolBar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="325"/>
<location filename="MainWindow.py" line="328"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="326"/>
<location filename="MainWindow.py" line="329"/>
<source>Labels</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="327"/>
<location filename="MainWindow.py" line="330"/>
<source>Files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="330"/>
<location filename="MainWindow.py" line="333"/>
<source>Zoom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="332"/>
<location filename="MainWindow.py" line="335"/>
<source>Zoom out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="335"/>
<location filename="MainWindow.py" line="338"/>
<source>Fit window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="337"/>
<location filename="MainWindow.py" line="340"/>
<source>F</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="338"/>
<location filename="MainWindow.py" line="341"/>
<source>Setting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="341"/>
<location filename="MainWindow.py" line="344"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="345"/>
<location filename="MainWindow.py" line="348"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="347"/>
<location filename="MainWindow.py" line="350"/>
<source>S</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="349"/>
<location filename="MainWindow.py" line="352"/>
<source>Prev image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="351"/>
<location filename="MainWindow.py" line="354"/>
<source>A</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="353"/>
<location filename="MainWindow.py" line="356"/>
<source>Next image</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="355"/>
<location filename="MainWindow.py" line="358"/>
<source>D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="357"/>
<location filename="MainWindow.py" line="360"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="399"/>
<location filename="MainWindow.py" line="402"/>
<source>C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="362"/>
<location filename="MainWindow.py" line="365"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="363"/>
<location filename="MainWindow.py" line="366"/>
<source>Delete polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="365"/>
<location filename="MainWindow.py" line="368"/>
<source>Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="366"/>
<location filename="MainWindow.py" line="369"/>
<source>Bit map</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="368"/>
<location filename="MainWindow.py" line="371"/>
<source>Space</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="370"/>
<location filename="MainWindow.py" line="373"/>
<source>Edit polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="395"/>
<location filename="MainWindow.py" line="398"/>
<source>E</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="372"/>
<location filename="MainWindow.py" line="375"/>
<source>To top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="373"/>
<location filename="MainWindow.py" line="376"/>
<source>Move polygon to top layer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="375"/>
<location filename="MainWindow.py" line="378"/>
<source>T</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="376"/>
<location filename="MainWindow.py" line="379"/>
<source>To bottom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="377"/>
<location filename="MainWindow.py" line="380"/>
<source>Move polygon to bottom layer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="379"/>
<location filename="MainWindow.py" line="382"/>
<source>B</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="380"/>
<location filename="MainWindow.py" line="383"/>
<source>Label converter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="381"/>
<location filename="MainWindow.py" line="384"/>
<source>Convert annotations to png image.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="321"/>
<location filename="MainWindow.py" line="324"/>
<source>Laguage</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="328"/>
<location filename="MainWindow.py" line="331"/>
<source>Images dir</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="329"/>
<location filename="MainWindow.py" line="332"/>
<source>Open images dir.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="331"/>
<location filename="MainWindow.py" line="334"/>
<source>Zoom in.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="333"/>
<location filename="MainWindow.py" line="336"/>
<source>Zoom out.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="336"/>
<location filename="MainWindow.py" line="339"/>
<source>Fit window.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="339"/>
<location filename="MainWindow.py" line="342"/>
<source>Setting.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="342"/>
<location filename="MainWindow.py" line="345"/>
<source>Exit.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="343"/>
<location filename="MainWindow.py" line="346"/>
<source>Label dir</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="344"/>
<location filename="MainWindow.py" line="347"/>
<source>Open label dir.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="346"/>
<location filename="MainWindow.py" line="349"/>
<source>Save annotation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="350"/>
<location filename="MainWindow.py" line="353"/>
<source>Prev image.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="354"/>
<location filename="MainWindow.py" line="357"/>
<source>Next image.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="356"/>
<location filename="MainWindow.py" line="359"/>
<source>Shortcut</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="359"/>
<location filename="MainWindow.py" line="362"/>
<source>Segment anything</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="360"/>
<location filename="MainWindow.py" line="363"/>
<source>Quick annotate using Segment anything.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="361"/>
<location filename="MainWindow.py" line="364"/>
<source>Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="364"/>
<location filename="MainWindow.py" line="367"/>
<source>Delete polygon.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="367"/>
<location filename="MainWindow.py" line="370"/>
<source>Show instance or segmeent state.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="371"/>
<location filename="MainWindow.py" line="374"/>
<source>Edit polygon attribute.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="374"/>
<location filename="MainWindow.py" line="377"/>
<source>Move polygon to top layer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="378"/>
<location filename="MainWindow.py" line="381"/>
<source>Move polygon to bottom layer.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="382"/>
<location filename="MainWindow.py" line="385"/>
<source></source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="383"/>
<location filename="MainWindow.py" line="386"/>
<source>English</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="385"/>
<location filename="MainWindow.py" line="388"/>
<source>Backspace</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="386"/>
<location filename="MainWindow.py" line="389"/>
<source>Backspace.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="387"/>
<location filename="MainWindow.py" line="390"/>
<source>Z</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="388"/>
<location filename="MainWindow.py" line="391"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="389"/>
<location filename="MainWindow.py" line="392"/>
<source>Annotate canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="390"/>
<location filename="MainWindow.py" line="393"/>
<source>Annotate canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="391"/>
<location filename="MainWindow.py" line="394"/>
<source>Esc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="392"/>
<location filename="MainWindow.py" line="395"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="393"/>
<location filename="MainWindow.py" line="396"/>
<source>Annotate finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="394"/>
<location filename="MainWindow.py" line="397"/>
<source>Annotate finished.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="396"/>
<location filename="MainWindow.py" line="399"/>
<source>Polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="397"/>
<location filename="MainWindow.py" line="400"/>
<source>Draw polygon</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="398"/>
<location filename="MainWindow.py" line="401"/>
<source>Accurately annotate by drawing polygon. </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="403"/>
<source>Visible</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="MainWindow.py" line="404"/>
<source>V</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT/ui/label_dock.ui'
# Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/label_dock.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
@ -14,11 +14,20 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(250, 304)
Form.resize(250, 302)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setContentsMargins(2, 2, 2, 2)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.widget = QtWidgets.QWidget(Form)
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setContentsMargins(-1, -1, -1, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.checkBox_visible = QtWidgets.QCheckBox(self.widget)
self.checkBox_visible.setObjectName("checkBox_visible")
self.horizontalLayout.addWidget(self.checkBox_visible)
self.verticalLayout.addWidget(self.widget)
self.listWidget = QtWidgets.QListWidget(Form)
self.listWidget.setObjectName("listWidget")
self.verticalLayout.addWidget(self.listWidget)
@ -29,3 +38,4 @@ class Ui_Form(object):
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.checkBox_visible.setText(_translate("Form", "Visible"))

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>250</width>
<height>304</height>
<height>302</height>
</rect>
</property>
<property name="windowTitle">
@ -29,6 +29,22 @@
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="checkBox_visible">
<property name="text">
<string>Visible</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QListWidget" name="listWidget"/>
</item>

View File

@ -56,6 +56,7 @@ class Ui_Dialog(object):
self.label_20 = QtWidgets.QLabel(self.widget_2)
self.label_20.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_20.setFont(font)
self.label_20.setStyleSheet("color: rgb(133, 0, 0);")
@ -64,6 +65,7 @@ class Ui_Dialog(object):
self.label_19 = QtWidgets.QLabel(self.widget_2)
self.label_19.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_19.setFont(font)
self.label_19.setStyleSheet("color: rgb(133, 0, 0);")
@ -72,6 +74,7 @@ class Ui_Dialog(object):
self.label_17 = QtWidgets.QLabel(self.widget_2)
self.label_17.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_17.setFont(font)
self.label_17.setStyleSheet("color: rgb(133, 0, 0);")
@ -80,6 +83,7 @@ class Ui_Dialog(object):
self.label_15 = QtWidgets.QLabel(self.widget_2)
self.label_15.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_15.setFont(font)
self.label_15.setStyleSheet("color: rgb(133, 0, 0);")
@ -88,6 +92,7 @@ class Ui_Dialog(object):
self.label_7 = QtWidgets.QLabel(self.widget_2)
self.label_7.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_7.setFont(font)
self.label_7.setStyleSheet("color: rgb(133, 0, 0);")
@ -108,6 +113,7 @@ class Ui_Dialog(object):
self.label_18 = QtWidgets.QLabel(self.widget_2)
self.label_18.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_18.setFont(font)
self.label_18.setStyleSheet("color: rgb(133, 0, 0);")
@ -128,6 +134,7 @@ class Ui_Dialog(object):
self.label_16 = QtWidgets.QLabel(self.widget_2)
self.label_16.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_16.setFont(font)
self.label_16.setStyleSheet("color: rgb(133, 0, 0);")
@ -142,6 +149,7 @@ class Ui_Dialog(object):
self.label_21 = QtWidgets.QLabel(self.widget_2)
self.label_21.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_21.setFont(font)
self.label_21.setStyleSheet("color: rgb(133, 0, 0);")
@ -168,6 +176,7 @@ class Ui_Dialog(object):
self.label_13 = QtWidgets.QLabel(self.widget_2)
self.label_13.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_13.setFont(font)
self.label_13.setStyleSheet("color: rgb(133, 0, 0);")
@ -176,6 +185,7 @@ class Ui_Dialog(object):
self.label_12 = QtWidgets.QLabel(self.widget_2)
self.label_12.setMaximumSize(QtCore.QSize(80, 16777215))
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_12.setFont(font)
self.label_12.setStyleSheet("color: rgb(133, 0, 0);")
@ -195,6 +205,7 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.label_22, 2, 0, 1, 1)
self.label_23 = QtWidgets.QLabel(self.widget_2)
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_23.setFont(font)
self.label_23.setStyleSheet("color: rgb(133, 0, 0);")
@ -202,6 +213,7 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.label_23, 2, 1, 1, 1)
self.label_25 = QtWidgets.QLabel(self.widget_2)
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_25.setFont(font)
self.label_25.setStyleSheet("color: rgb(133, 0, 0);")
@ -221,6 +233,7 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.label_26, 3, 0, 1, 1)
self.label_27 = QtWidgets.QLabel(self.widget_2)
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.label_27.setFont(font)
self.label_27.setStyleSheet("color: rgb(133, 0, 0);")
@ -232,6 +245,13 @@ class Ui_Dialog(object):
self.label_8.setFont(font)
self.label_8.setObjectName("label_8")
self.gridLayout.addWidget(self.label_8, 5, 0, 1, 1)
self.label_28 = QtWidgets.QLabel(self.widget_2)
self.label_28.setObjectName("label_28")
self.gridLayout.addWidget(self.label_28, 3, 2, 1, 1)
self.label_29 = QtWidgets.QLabel(self.widget_2)
self.label_29.setStyleSheet("color: rgb(133, 0, 0);")
self.label_29.setObjectName("label_29")
self.gridLayout.addWidget(self.label_29, 3, 3, 1, 1)
self.verticalLayout.addWidget(self.widget_2)
self.retranslateUi(Dialog)
@ -248,7 +268,7 @@ class Ui_Dialog(object):
self.label_7.setText(_translate("Dialog", "A"))
self.label_2.setText(_translate("Dialog", "Prior image"))
self.label_10.setText(_translate("Dialog", "Save annotation"))
self.label_18.setText(_translate("Dialog", "E"))
self.label_18.setText(_translate("Dialog", "C"))
self.label_5.setText(_translate("Dialog", "Draw polygon"))
self.label_14.setText(_translate("Dialog", "Bit map"))
self.label_16.setText(_translate("Dialog", "Space"))
@ -267,4 +287,6 @@ class Ui_Dialog(object):
self.label_26.setText(_translate("Dialog", "Annotate cancel"))
self.label_27.setText(_translate("Dialog", "Esc"))
self.label_8.setText(_translate("Dialog", "To top"))
self.label_28.setText(_translate("Dialog", "Polygons Visible"))
self.label_29.setText(_translate("Dialog", "V"))
import icons_rc

View File

@ -93,6 +93,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -114,6 +115,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -135,6 +137,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -156,6 +159,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -177,6 +181,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -222,6 +227,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -229,7 +235,7 @@
<string notr="true">color: rgb(133, 0, 0);</string>
</property>
<property name="text">
<string>E</string>
<string>C</string>
</property>
</widget>
</item>
@ -267,6 +273,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -300,6 +307,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -357,6 +365,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -378,6 +387,7 @@
</property>
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -417,6 +427,7 @@
<widget class="QLabel" name="label_23">
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -432,6 +443,7 @@
<widget class="QLabel" name="label_25">
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -471,6 +483,7 @@
<widget class="QLabel" name="label_27">
<property name="font">
<font>
<family>Times New Roman</family>
<pointsize>12</pointsize>
</font>
</property>
@ -494,6 +507,23 @@
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_28">
<property name="text">
<string>Polygons Visible</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QLabel" name="label_29">
<property name="styleSheet">
<string notr="true">color: rgb(133, 0, 0);</string>
</property>
<property name="text">
<string>V</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

Binary file not shown.

View File

@ -99,7 +99,7 @@
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="242"/>
<location filename="shortcut_dialog.py" line="262"/>
<source>help</source>
<translation></translation>
</message>
@ -119,7 +119,7 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="265"/>
<location filename="shortcut_dialog.py" line="285"/>
<source>E</source>
<translation></translation>
</message>
@ -134,27 +134,27 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="260"/>
<location filename="shortcut_dialog.py" line="280"/>
<source>Del</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="245"/>
<location filename="shortcut_dialog.py" line="265"/>
<source>S</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="250"/>
<location filename="shortcut_dialog.py" line="270"/>
<source>Save annotation</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="247"/>
<location filename="shortcut_dialog.py" line="267"/>
<source>T</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="259"/>
<location filename="shortcut_dialog.py" line="279"/>
<source>Delete polygon</source>
<translation></translation>
</message>
@ -164,7 +164,7 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="244"/>
<location filename="shortcut_dialog.py" line="264"/>
<source>B</source>
<translation></translation>
</message>
@ -174,12 +174,12 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="262"/>
<location filename="shortcut_dialog.py" line="282"/>
<source>Next image</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="246"/>
<location filename="shortcut_dialog.py" line="266"/>
<source>D</source>
<translation></translation>
</message>
@ -189,7 +189,7 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="248"/>
<location filename="shortcut_dialog.py" line="268"/>
<source>A</source>
<translation></translation>
</message>
@ -214,17 +214,17 @@
<translation type="obsolete"></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="253"/>
<location filename="shortcut_dialog.py" line="273"/>
<source>Bit map</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="254"/>
<location filename="shortcut_dialog.py" line="274"/>
<source>Space</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="256"/>
<location filename="shortcut_dialog.py" line="276"/>
<source>F</source>
<translation></translation>
</message>
@ -336,7 +336,7 @@
<message>
<location filename="about_dialog.py" line="74"/>
<source>ISAT with Segment anything.</source>
<translation type="unfinished">ISAT集成Segment anything.</translation>
<translation>ISAT集成Segment anything.</translation>
</message>
<message>
<location filename="about_dialog.py" line="75"/>
@ -350,75 +350,90 @@ http://www.yatenglg.cn/isat</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="243"/>
<location filename="shortcut_dialog.py" line="263"/>
<source>Shortcut</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="249"/>
<location filename="shortcut_dialog.py" line="269"/>
<source>Prior image</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="269"/>
<location filename="shortcut_dialog.py" line="289"/>
<source>To top</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="258"/>
<location filename="shortcut_dialog.py" line="278"/>
<source>To bottom</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="255"/>
<location filename="shortcut_dialog.py" line="275"/>
<source>Zoom fit</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="252"/>
<location filename="shortcut_dialog.py" line="272"/>
<source>Draw polygon</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="257"/>
<location filename="shortcut_dialog.py" line="277"/>
<source>Segment anything</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="261"/>
<location filename="shortcut_dialog.py" line="281"/>
<source>Q</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="263"/>
<location filename="shortcut_dialog.py" line="283"/>
<source>Backspace</source>
<translation>退</translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="264"/>
<location filename="shortcut_dialog.py" line="284"/>
<source>Z</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="266"/>
<location filename="shortcut_dialog.py" line="286"/>
<source>Annotate finish</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="267"/>
<location filename="shortcut_dialog.py" line="287"/>
<source>Annotate cancel</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="268"/>
<location filename="shortcut_dialog.py" line="288"/>
<source>Esc</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="271"/>
<source>C</source>
<translation></translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="290"/>
<source>Polygons Visible</source>
<translation>/</translation>
</message>
<message>
<location filename="shortcut_dialog.py" line="291"/>
<source>V</source>
<translation></translation>
</message>
</context>
<context>
<name>Form</name>
<message>
<location filename="label_dock.py" line="31"/>
<location filename="label_dock.py" line="40"/>
<source>Form</source>
<translation></translation>
</message>
@ -462,56 +477,61 @@ http://www.yatenglg.cn/isat</source>
<source>Jump to the image.</source>
<translation>.</translation>
</message>
<message>
<location filename="label_dock.py" line="41"/>
<source>Visible</source>
<translation>/</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="MainWindow.py" line="317"/>
<location filename="MainWindow.py" line="320"/>
<source>ISAT</source>
<translation>ISAT </translation>
</message>
<message>
<location filename="MainWindow.py" line="318"/>
<location filename="MainWindow.py" line="321"/>
<source>File</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="319"/>
<location filename="MainWindow.py" line="322"/>
<source>View</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="320"/>
<location filename="MainWindow.py" line="323"/>
<source>Help</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="322"/>
<location filename="MainWindow.py" line="325"/>
<source>Tools</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="369"/>
<location filename="MainWindow.py" line="372"/>
<source>Edit</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="324"/>
<location filename="MainWindow.py" line="327"/>
<source>toolBar</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="325"/>
<location filename="MainWindow.py" line="328"/>
<source>Info</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="326"/>
<location filename="MainWindow.py" line="329"/>
<source>Labels</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="327"/>
<location filename="MainWindow.py" line="330"/>
<source>Files</source>
<translation></translation>
</message>
@ -526,32 +546,32 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="330"/>
<location filename="MainWindow.py" line="333"/>
<source>Zoom in</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="332"/>
<location filename="MainWindow.py" line="335"/>
<source>Zoom out</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="335"/>
<location filename="MainWindow.py" line="338"/>
<source>Fit window</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="337"/>
<location filename="MainWindow.py" line="340"/>
<source>F</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="338"/>
<location filename="MainWindow.py" line="341"/>
<source>Setting</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="341"/>
<location filename="MainWindow.py" line="344"/>
<source>Exit</source>
<translation>退</translation>
</message>
@ -561,12 +581,12 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="345"/>
<location filename="MainWindow.py" line="348"/>
<source>Save</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="347"/>
<location filename="MainWindow.py" line="350"/>
<source>S</source>
<translation></translation>
</message>
@ -576,12 +596,12 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="349"/>
<location filename="MainWindow.py" line="352"/>
<source>Prev image</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="351"/>
<location filename="MainWindow.py" line="354"/>
<source>A</source>
<translation></translation>
</message>
@ -591,17 +611,17 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="353"/>
<location filename="MainWindow.py" line="356"/>
<source>Next image</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="355"/>
<location filename="MainWindow.py" line="358"/>
<source>D</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="357"/>
<location filename="MainWindow.py" line="360"/>
<source>About</source>
<translation></translation>
</message>
@ -616,92 +636,92 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="399"/>
<location filename="MainWindow.py" line="402"/>
<source>C</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="362"/>
<location filename="MainWindow.py" line="365"/>
<source>Delete</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="363"/>
<location filename="MainWindow.py" line="366"/>
<source>Delete polygon</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="365"/>
<location filename="MainWindow.py" line="368"/>
<source>Del</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="366"/>
<location filename="MainWindow.py" line="369"/>
<source>Bit map</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="368"/>
<location filename="MainWindow.py" line="371"/>
<source>Space</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="370"/>
<location filename="MainWindow.py" line="373"/>
<source>Edit polygon</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="395"/>
<location filename="MainWindow.py" line="398"/>
<source>E</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="372"/>
<location filename="MainWindow.py" line="375"/>
<source>To top</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="373"/>
<location filename="MainWindow.py" line="376"/>
<source>Move polygon to top layer</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="375"/>
<location filename="MainWindow.py" line="378"/>
<source>T</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="376"/>
<location filename="MainWindow.py" line="379"/>
<source>To bottom</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="377"/>
<location filename="MainWindow.py" line="380"/>
<source>Move polygon to bottom layer</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="379"/>
<location filename="MainWindow.py" line="382"/>
<source>B</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="380"/>
<location filename="MainWindow.py" line="383"/>
<source>Label converter</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="381"/>
<location filename="MainWindow.py" line="384"/>
<source>Convert annotations to png image.</source>
<translation>ISAT标注文件转换为png图片.</translation>
</message>
<message>
<location filename="MainWindow.py" line="321"/>
<location filename="MainWindow.py" line="324"/>
<source>Laguage</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="356"/>
<location filename="MainWindow.py" line="359"/>
<source>Shortcut</source>
<translation></translation>
</message>
@ -711,52 +731,52 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="MainWindow.py" line="383"/>
<location filename="MainWindow.py" line="386"/>
<source>English</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="382"/>
<location filename="MainWindow.py" line="385"/>
<source></source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="328"/>
<location filename="MainWindow.py" line="331"/>
<source>Images dir</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="329"/>
<location filename="MainWindow.py" line="332"/>
<source>Open images dir.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="331"/>
<location filename="MainWindow.py" line="334"/>
<source>Zoom in.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="333"/>
<location filename="MainWindow.py" line="336"/>
<source>Zoom out.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="336"/>
<location filename="MainWindow.py" line="339"/>
<source>Fit window.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="343"/>
<location filename="MainWindow.py" line="346"/>
<source>Label dir</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="344"/>
<location filename="MainWindow.py" line="347"/>
<source>Open label dir.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="346"/>
<location filename="MainWindow.py" line="349"/>
<source>Save annotation.</source>
<translation>.</translation>
</message>
@ -771,7 +791,7 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete">.</translation>
</message>
<message>
<location filename="MainWindow.py" line="354"/>
<location filename="MainWindow.py" line="357"/>
<source>Next image.</source>
<translation>.</translation>
</message>
@ -781,124 +801,134 @@ http://www.yatenglg.cn/isat</source>
<translation type="obsolete">.</translation>
</message>
<message>
<location filename="MainWindow.py" line="364"/>
<location filename="MainWindow.py" line="367"/>
<source>Delete polygon.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="367"/>
<location filename="MainWindow.py" line="370"/>
<source>Show instance or segmeent state.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="371"/>
<location filename="MainWindow.py" line="374"/>
<source>Edit polygon attribute.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="374"/>
<location filename="MainWindow.py" line="377"/>
<source>Move polygon to top layer.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="378"/>
<location filename="MainWindow.py" line="381"/>
<source>Move polygon to bottom layer.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="339"/>
<location filename="MainWindow.py" line="342"/>
<source>Setting.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="342"/>
<location filename="MainWindow.py" line="345"/>
<source>Exit.</source>
<translation>退.</translation>
</message>
<message>
<location filename="MainWindow.py" line="350"/>
<location filename="MainWindow.py" line="353"/>
<source>Prev image.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="359"/>
<location filename="MainWindow.py" line="362"/>
<source>Segment anything</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="360"/>
<location filename="MainWindow.py" line="363"/>
<source>Quick annotate using Segment anything.</source>
<translation>使Segment anything进行快速标注.</translation>
</message>
<message>
<location filename="MainWindow.py" line="361"/>
<location filename="MainWindow.py" line="364"/>
<source>Q</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="385"/>
<location filename="MainWindow.py" line="388"/>
<source>Backspace</source>
<translation>退</translation>
</message>
<message>
<location filename="MainWindow.py" line="386"/>
<location filename="MainWindow.py" line="389"/>
<source>Backspace.</source>
<translation>退.</translation>
</message>
<message>
<location filename="MainWindow.py" line="387"/>
<location filename="MainWindow.py" line="390"/>
<source>Z</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="388"/>
<location filename="MainWindow.py" line="391"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="389"/>
<location filename="MainWindow.py" line="392"/>
<source>Annotate canceled</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="390"/>
<location filename="MainWindow.py" line="393"/>
<source>Annotate canceled.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="391"/>
<location filename="MainWindow.py" line="394"/>
<source>Esc</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="392"/>
<location filename="MainWindow.py" line="395"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="393"/>
<location filename="MainWindow.py" line="396"/>
<source>Annotate finished</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="394"/>
<location filename="MainWindow.py" line="397"/>
<source>Annotate finished.</source>
<translation>.</translation>
</message>
<message>
<location filename="MainWindow.py" line="396"/>
<location filename="MainWindow.py" line="399"/>
<source>Polygon</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="397"/>
<location filename="MainWindow.py" line="400"/>
<source>Draw polygon</source>
<translation></translation>
</message>
<message>
<location filename="MainWindow.py" line="398"/>
<location filename="MainWindow.py" line="401"/>
<source>Accurately annotate by drawing polygon. </source>
<translation>,. </translation>
</message>
<message>
<location filename="MainWindow.py" line="403"/>
<source>Visible</source>
<translation>/</translation>
</message>
<message>
<location filename="MainWindow.py" line="404"/>
<source>V</source>
<translation></translation>
</message>
</context>
</TS>

View File

@ -342,7 +342,17 @@ class AnnotationScene(QtWidgets.QGraphicsScene):
# 状态栏,显示当前坐标
if self.image_data is not None:
x, y = round(pos.x()), round(pos.y())
self.mainwindow.labelCoordinates.setText('({}, {}) [{}]'.format(x, y, self.image_data[y-1][x-1]))
self.mainwindow.labelCoord.setText('xy: ({:>4d},{:>4d})'.format(x, y))
data = self.image_data[y-1][x-1]
if self.image_data.ndim == 2:
self.mainwindow.labelData.setText('pix: [{:^3d}]'.format(data))
elif self.image_data.ndim == 3:
if len(data) == 3:
self.mainwindow.labelData.setText('rgb: [{:>3d},{:>3d},{:>3d}]'.format(data[0], data[1], data[2]))
else:
self.mainwindow.labelData.setText('pix: [{}]'.format(data))
super(AnnotationScene, self).mouseMoveEvent(event)
def update_mask(self):

View File

@ -14,6 +14,7 @@ class LabelsDockWidget(QtWidgets.QWidget, Ui_Form):
self.polygon_item_dict = {}
self.listWidget.itemSelectionChanged.connect(self.set_polygon_selected)
self.checkBox_visible.stateChanged.connect(self.set_all_polygon_visible)
self.listWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu)
self.listWidget.customContextMenuRequested.connect(
@ -32,6 +33,7 @@ class LabelsDockWidget(QtWidgets.QWidget, Ui_Form):
check_box = QtWidgets.QCheckBox()
check_box.setFixedWidth(20)
check_box.setChecked(polygon.isVisible())
check_box.setObjectName('check_box')
check_box.stateChanged.connect(functools.partial(self.set_polygon_show, polygon))
layout.addWidget(check_box)
@ -62,6 +64,7 @@ class LabelsDockWidget(QtWidgets.QWidget, Ui_Form):
def update_listwidget(self):
self.listWidget.clear()
self.polygon_item_dict.clear()
self.checkBox_visible.setChecked(True)
for polygon in self.mainwindow.polygons:
item, item_widget = self.generate_item_and_itemwidget(polygon)
@ -102,3 +105,12 @@ class LabelsDockWidget(QtWidgets.QWidget, Ui_Form):
for vertex in polygon.vertexs:
vertex.setVisible(self.sender().checkState())
polygon.setVisible(self.sender().checkState())
def set_all_polygon_visible(self, visible:bool=None):
visible = self.checkBox_visible.isChecked() if visible is None else visible
for index in range(self.listWidget.count()):
item = self.listWidget.item(index)
widget = self.listWidget.itemWidget(item)
check_box = widget.findChild(QtWidgets.QCheckBox, 'check_box')
check_box.setChecked(visible)
self.checkBox_visible.setChecked(visible)

View File

@ -19,6 +19,7 @@ from annotation import Object, Annotation
from widgets.polygon import Polygon
import os
from PIL import Image
import functools
import imgviz
from segment_any.segment_any import SegAny
import icons_rc
@ -70,6 +71,17 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
QtWidgets.QMessageBox.warning(self, 'Warning', 'The checkpoint of [Segment anything] not existed. If you want use quick annotate, please download from {}'.format('https://github.com/facebookresearch/segment-anything#model-checkpoints'))
self.use_segment_anything = False
if self.use_segment_anything:
if self.segany.device != 'cpu':
from segment_any.gpu_resource import GPUResource_Thread
self.gpu_resource_thread = GPUResource_Thread()
self.gpu_resource_thread.message.connect(self.labelGPUResource.setText)
self.gpu_resource_thread.start()
else:
self.labelGPUResource.setText('cpu')
else:
self.labelGPUResource.setText('segment anything unused.')
def init_ui(self):
self.setting_dialog = SettingDialog(parent=self, mainwindow=self)
@ -100,8 +112,20 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.shortcut_dialog = ShortcutDialog(self)
self.about_dialog = AboutDialog(self)
self.labelCoordinates = QtWidgets.QLabel('')
self.statusbar.addPermanentWidget(self.labelCoordinates)
self.labelGPUResource = QtWidgets.QLabel('')
self.labelGPUResource.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight)
self.labelGPUResource.setFixedWidth(180)
self.statusbar.addPermanentWidget(self.labelGPUResource)
self.labelCoord = QtWidgets.QLabel('')
self.labelCoord.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight)
self.labelCoord.setFixedWidth(150)
self.statusbar.addPermanentWidget(self.labelCoord)
self.labelData = QtWidgets.QLabel('')
self.labelData.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight)
self.labelData.setFixedWidth(150)
self.statusbar.addPermanentWidget(self.labelData)
self.trans = QtCore.QTranslator()
@ -347,6 +371,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
del self.current_label.objects[index]
def change_bit_map(self):
self.set_labels_visible(True)
if self.scene.mode == STATUSMode.CREATE:
self.scene.cancel_draw()
if self.map_mode == MAPMode.LABEL:
@ -359,8 +384,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
polygon.color.setAlpha(255)
polygon.setBrush(polygon.color)
self.labels_dock_widget.listWidget.setEnabled(False)
self.labels_dock_widget.checkBox_visible.setEnabled(False)
self.actionSegment_anything.setEnabled(False)
self.actionPolygon.setEnabled(False)
self.actionVisible.setEnabled(False)
self.map_mode = MAPMode.SEMANTIC
semantic_icon = QtGui.QIcon()
semantic_icon.addPixmap(QtGui.QPixmap(":/icon/icons/semantic.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@ -380,8 +407,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
polygon.color.setAlpha(255)
polygon.setBrush(polygon.color)
self.labels_dock_widget.listWidget.setEnabled(False)
self.labels_dock_widget.checkBox_visible.setEnabled(False)
self.actionSegment_anything.setEnabled(False)
self.actionPolygon.setEnabled(False)
self.actionVisible.setEnabled(False)
self.map_mode = MAPMode.INSTANCE
instance_icon = QtGui.QIcon()
instance_icon.addPixmap(QtGui.QPixmap(":/icon/icons/instance.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@ -398,8 +427,10 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
polygon.color.setAlpha(polygon.nohover_alpha)
polygon.setBrush(polygon.color)
self.labels_dock_widget.listWidget.setEnabled(True)
self.labels_dock_widget.checkBox_visible.setEnabled(True)
self.actionSegment_anything.setEnabled(self.use_segment_anything)
self.actionPolygon.setEnabled(True)
self.actionVisible.setEnabled(True)
self.map_mode = MAPMode.LABEL
label_icon = QtGui.QIcon()
label_icon.addPixmap(QtGui.QPixmap(":/icon/icons/照片_pic.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
@ -407,6 +438,12 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
else:
pass
def set_labels_visible(self, visible=None):
if visible is None:
visible = not self.labels_dock_widget.checkBox_visible.isChecked()
self.labels_dock_widget.checkBox_visible.setChecked(visible)
self.labels_dock_widget.set_all_polygon_visible(visible)
def label_converter(self):
self.convert_dialog.reset_gui()
self.convert_dialog.show()
@ -450,6 +487,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
self.actionZoom_out.triggered.connect(self.view.zoom_out)
self.actionFit_wiondow.triggered.connect(self.view.zoomfit)
self.actionBit_map.triggered.connect(self.change_bit_map)
self.actionVisible.triggered.connect(functools.partial(self.set_labels_visible, None))
self.actionConverter.triggered.connect(self.label_converter)