update
							
								
								
									
										2
									
								
								.idea/ISAT_with_segment_anything.iml
									
									
									
										generated
									
									
									
								
							
							
						
						| @ -2,7 +2,7 @@ | ||||
| <module type="PYTHON_MODULE" version="4"> | ||||
|   <component name="NewModuleRootManager"> | ||||
|     <content url="file://$MODULE_DIR$" /> | ||||
|     <orderEntry type="inheritedJdk" /> | ||||
|     <orderEntry type="jdk" jdkName="Python 3.8 (ISAT_with_segment_anything)" jdkType="Python SDK" /> | ||||
|     <orderEntry type="sourceFolder" forTests="false" /> | ||||
|   </component> | ||||
| </module> | ||||
							
								
								
									
										2
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						| @ -1,4 +1,4 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (base) (2)" project-jdk-type="Python SDK" /> | ||||
|   <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (ISAT_with_segment_anything)" project-jdk-type="Python SDK" /> | ||||
| </project> | ||||
							
								
								
									
										6
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										16
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | ||||
| 
 | ||||
|    Copyright 2023 yatengLG | ||||
|     | ||||
|    https://github.com/yatengLG/ISAT_with_segment_anything | ||||
|     | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
							
								
								
									
										47
									
								
								README-CN.md
									
									
									
									
									
								
							
							
						
						| @ -12,9 +12,54 @@ | ||||
| 
 | ||||
|     segment anything只是协助生成目标掩码,最终标注以多边形呈现,通过拖拽多边形顶点,可快速修改标注区域。 | ||||
| 
 | ||||
| ## 安装 | ||||
| ### 1. 源码运行 | ||||
| ```shell | ||||
| # 创建虚拟环境 | ||||
| conda create -n ISAT_with_segment_anything python==3.8 | ||||
| conda activate ISAT_with_segment_anything | ||||
| ``` | ||||
| 
 | ||||
| ```shell | ||||
| # 安装Segment anything | ||||
| git clone git@github.com:facebookresearch/segment-anything.git | ||||
| cd segment-anything | ||||
| pip install -e . | ||||
| cd .. | ||||
| ``` | ||||
| 
 | ||||
| ```shell | ||||
| # 安装ISAT_with_segment_anything | ||||
| git clone https://github.com/yatengLG/ISAT_with_segment_anything.git | ||||
| cd ISAT_with_segment_anything | ||||
| pip install -r requirements.txt | ||||
| ``` | ||||
| 
 | ||||
| ```text | ||||
| # 下载Segment anything预训练模型 | ||||
| 下载任一模型,并将模型存放于ISAT_with_segment_anything/segment_any目录下 | ||||
| 模型链接: | ||||
|    https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth | ||||
|    https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth | ||||
|    https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth | ||||
| h模型最大,效果也最好; | ||||
| b模型最小,效果也最差; | ||||
| 请按照硬件下载合适的模型,h模型在示例样本上的显存需求约8G. | ||||
| ``` | ||||
| 
 | ||||
| ```shell | ||||
| # 运行软件 | ||||
| python main.py | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## 标注操作 | ||||
| 
 | ||||
| 1. 通过鼠标左键(或右键)提示感兴趣区域(或不感兴趣区域),自动形成目标分割掩码 | ||||
| 2. 可通过多次左右键提示,提升掩码质量 | ||||
| 3. 回车键确认掩码,选择类别,得到多边形标注区域 | ||||
| 3. E键结束标注,选择类别,得到多边形标注区域 | ||||
| 4. 拖拽多边形顶点,精细化调整标注 | ||||
| 
 | ||||
| ## 注意事项 | ||||
| 1. 自动分割效果受segment anything模型分割效果限制,如需更为精确的分割效果,可通过手动绘制多边形实现。 | ||||
| 2. 如只需要使用手动绘制多边形标注,推荐使用[ISAT](https://github.com/yatengLG/ISAT)。 | ||||
|  | ||||
							
								
								
									
										63
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,63 @@ | ||||
| # ISAT图像分割标注工具 | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| 基于多边形的图像分割标注工具,支持实例分割与语义分割。 | ||||
| 
 | ||||
| ## 特点 | ||||
| 主要对语义标注过程中存在标注重复部分进行优化。 | ||||
| 自己标注过分割样本,或者使用coco分割数据集的朋友,肯定遇到过标注多边形之间存在覆盖的问题。 | ||||
| 本项目通过引入多边形图层高低的方式,让上层的多边形覆盖下层多边形,从而保证每一个像素的类别都是单一的,降低数据的干扰。 | ||||
| 
 | ||||
| * 支持对多边形图层进行调整(图层置顶或置底)。 | ||||
| * 标注文件转png单通道图(支持实例与语义)。 | ||||
| * 支持滚轮缩放,左键拖动图片。 | ||||
| * 类别标签导入与导出,方便不同任务之间快速切换。 | ||||
| ## 安装 | ||||
| ### 1. 源码运行 | ||||
| ```shell | ||||
| git clone https://github.com/yatengLG/ISAT.git | ||||
| cd ISAT | ||||
| conda create -n ISAT python==3.8 | ||||
| conda activate ISAT | ||||
| pip install -r requirements.txt | ||||
| python main.py | ||||
| ``` | ||||
| ### 2. 下载打包好的exe | ||||
| - 2.1 点击[链接](https://github.com/yatengLG/ISAT/releases/download/v1.0.0/ISAT_windows.zip)下载ISAT_windows.zip | ||||
| - 2.2 解压 | ||||
| - 2.3 双击ISAT/main.exe运行 | ||||
| 
 | ||||
| ## 标注结果 | ||||
| 
 | ||||
| ### 标注文件与标签图片 | ||||
| ISAT提供了**json格式标注文件**,可以方便的进行传输与二次修改;同时,软件也提供将标注文件转换为**png单通道标签图片**的功能。 | ||||
| 
 | ||||
| #### 1. json格式标注文件 | ||||
| 主要用于传输、备份以及二次修改。但不方便直接参与模型训练等过程。 | ||||
| 
 | ||||
| 存储信息包括:图片名、图片尺寸、图片额外说明、标注目标类别、标注目标实例id、标注目标多边形顶点等。 | ||||
| 
 | ||||
| #### 2. png单通道标签图片 | ||||
| 主要用于模型的训练、测试等过程。 | ||||
| 
 | ||||
| 转换后的单通道标签图片具有与原图一致的分辨率,**参与模型训练时,直接读取像素值作为标签即可(图片为单通道图,像素值为单一的值,不是rgb)。** | ||||
| 
 | ||||
| > 部分软件查看png单通道图片时,存在对颜色边界处进行调整的情况。具体表现为,如  (0, 5, 0)到(0, 255, 0)过渡时,边缘会出现(0, 125, 0)的情况。https://github.com/yatengLG/ISAT/issues/2#issue-1662058434 | ||||
| 
 | ||||
| **最终的标签是图像的像素值,而非颜色值** | ||||
| 这种情况不会对标签图片造成影响,请放心使用。 | ||||
| 
 | ||||
| 
 | ||||
| ### 导出png单通道标签图片 | ||||
| 软件内置了,将json标注文件转换为png单通道标签图片的工具。 | ||||
| 
 | ||||
| 转换时,区分**语义分割**与**实例分割**: | ||||
| - 语义分割 | ||||
| 
 | ||||
|   转换后的语义分割png单通道标签图片中,每个像素值为对应的类别id,具体的类别含义与标注时类别设置相一致,同时在转换目录中也会留存一份classesition.txt,便于查看类别与id对应关系。 | ||||
| - 实例分割 | ||||
| 
 | ||||
|   转换后的实例分割png单通道标签图片中,每个像素值为对应的组id。 | ||||
|    | ||||
|  | ||||
							
								
								
									
										84
									
								
								annotation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,84 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| import os | ||||
| import cv2 | ||||
| from json import load, dump | ||||
| from typing import List | ||||
| 
 | ||||
| 
 | ||||
| class Object: | ||||
|     def __init__(self, category:str, group:int, segmentation, area, layer, bbox, iscrowd=0, note=''): | ||||
|         self.category = category | ||||
|         self.group = group | ||||
|         self.segmentation = segmentation | ||||
|         self.area = area | ||||
|         self.layer = layer | ||||
|         self.bbox = bbox | ||||
|         self.iscrowd = iscrowd | ||||
|         self.note = note | ||||
| 
 | ||||
| 
 | ||||
| class Annotation: | ||||
|     def __init__(self, image_path, label_path): | ||||
|         img_folder, img_name = os.path.split(image_path) | ||||
|         self.description = 'ISAT' | ||||
|         self.img_folder = img_folder | ||||
|         self.img_name = img_name | ||||
|         self.label_path = label_path | ||||
|         self.note = '' | ||||
|         image = cv2.imread(image_path) | ||||
|         self.height, self.width, self.depth = image.shape | ||||
|         del image | ||||
| 
 | ||||
|         self.objects:List[Object,...] = [] | ||||
| 
 | ||||
|     def load_annotation(self): | ||||
|         if os.path.exists(self.label_path): | ||||
|             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) | ||||
| 
 | ||||
|     def save_annotation(self): | ||||
|         dataset = {} | ||||
|         dataset['info'] = {} | ||||
|         dataset['info']['description'] = self.description | ||||
|         dataset['info']['folder'] = self.img_folder | ||||
|         dataset['info']['name'] = self.img_name | ||||
|         dataset['info']['width'] = self.width | ||||
|         dataset['info']['height'] = self.height | ||||
|         dataset['info']['depth'] = self.depth | ||||
|         dataset['info']['note'] = self.note | ||||
|         dataset['objects'] = [] | ||||
|         for obj in self.objects: | ||||
|             object = {} | ||||
|             object['category'] = obj.category | ||||
|             object['group'] = obj.group | ||||
|             object['segmentation'] = obj.segmentation | ||||
|             object['area'] = obj.area | ||||
|             object['layer'] = obj.layer | ||||
|             object['bbox'] = obj.bbox | ||||
|             object['iscrowd'] = obj.iscrowd | ||||
|             object['note'] = obj.note | ||||
|             dataset['objects'].append(object) | ||||
|         with open(self.label_path, 'w') as f: | ||||
|             dump(dataset, f, indent=4) | ||||
|         return True | ||||
							
								
								
									
										35
									
								
								configs.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,35 @@ | ||||
| import yaml | ||||
| from enum import Enum | ||||
| 
 | ||||
| 
 | ||||
| DEFAULT_CONFIG_FILE = 'default.yaml' | ||||
| CONFIG_FILE = 'isat.yaml' | ||||
| 
 | ||||
| def load_config(file): | ||||
|     with open(file, 'rb')as f: | ||||
|         cfg = yaml.load(f.read(), Loader=yaml.FullLoader) | ||||
|     return cfg | ||||
| 
 | ||||
| def save_config(cfg, file): | ||||
|     s = yaml.dump(cfg) | ||||
|     with open(file, 'w') as f: | ||||
|         f.write(s) | ||||
|     return True | ||||
| 
 | ||||
| class STATUSMode(Enum): | ||||
|     VIEW = 0 | ||||
|     CREATE = 1 | ||||
|     EDIT = 2 | ||||
| 
 | ||||
| class DRAWMode(Enum): | ||||
|     POLYGON = 0 | ||||
|     SEGMENTANYTHING = 1 | ||||
| 
 | ||||
| class CLICKMode(Enum): | ||||
|     POSITIVE = 0 | ||||
|     NEGATIVE = 1 | ||||
| 
 | ||||
| class MAPMode(Enum): | ||||
|     LABEL = 0 | ||||
|     SEMANTIC = 1 | ||||
|     INSTANCE = 2 | ||||
							
								
								
									
										3
									
								
								default.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,3 @@ | ||||
| label: | ||||
| - color: '#000000' | ||||
|   name: __background__ | ||||
							
								
								
									
										
											BIN
										
									
								
								example/images/000000000113.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 250 KiB | 
							
								
								
									
										2917
									
								
								example/images/000000000113.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								example/images/000000000144.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 220 KiB | 
							
								
								
									
										813
									
								
								example/images/000000000144.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,813 @@ | ||||
| { | ||||
|     "info": { | ||||
|         "description": "ISAT", | ||||
|         "folder": "C:/Users/lg/PycharmProjects/ISAT_with_segment_anything/example/images", | ||||
|         "name": "000000000144.jpg", | ||||
|         "width": 640, | ||||
|         "height": 480, | ||||
|         "depth": 3, | ||||
|         "note": "" | ||||
|     }, | ||||
|     "objects": [ | ||||
|         { | ||||
|             "category": "fence", | ||||
|             "group": "1", | ||||
|             "segmentation": [ | ||||
|                 [ | ||||
|                     20, | ||||
|                     239 | ||||
|                 ], | ||||
|                 [ | ||||
|                     17, | ||||
|                     240 | ||||
|                 ], | ||||
|                 [ | ||||
|                     15, | ||||
|                     241 | ||||
|                 ], | ||||
|                 [ | ||||
|                     13, | ||||
|                     242 | ||||
|                 ], | ||||
|                 [ | ||||
|                     11, | ||||
|                     244 | ||||
|                 ], | ||||
|                 [ | ||||
|                     10, | ||||
|                     244 | ||||
|                 ], | ||||
|                 [ | ||||
|                     9, | ||||
|                     245 | ||||
|                 ], | ||||
|                 [ | ||||
|                     6, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     5, | ||||
|                     251 | ||||
|                 ], | ||||
|                 [ | ||||
|                     4, | ||||
|                     255 | ||||
|                 ], | ||||
|                 [ | ||||
|                     0, | ||||
|                     261 | ||||
|                 ], | ||||
|                 [ | ||||
|                     0, | ||||
|                     280 | ||||
|                 ], | ||||
|                 [ | ||||
|                     1, | ||||
|                     277 | ||||
|                 ], | ||||
|                 [ | ||||
|                     6, | ||||
|                     268 | ||||
|                 ], | ||||
|                 [ | ||||
|                     9, | ||||
|                     259 | ||||
|                 ], | ||||
|                 [ | ||||
|                     13, | ||||
|                     254 | ||||
|                 ], | ||||
|                 [ | ||||
|                     13, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     15, | ||||
|                     250 | ||||
|                 ], | ||||
|                 [ | ||||
|                     18, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     20, | ||||
|                     247 | ||||
|                 ], | ||||
|                 [ | ||||
|                     24, | ||||
|                     247 | ||||
|                 ], | ||||
|                 [ | ||||
|                     26, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     30, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     33, | ||||
|                     256 | ||||
|                 ], | ||||
|                 [ | ||||
|                     35, | ||||
|                     260 | ||||
|                 ], | ||||
|                 [ | ||||
|                     38, | ||||
|                     266 | ||||
|                 ], | ||||
|                 [ | ||||
|                     41, | ||||
|                     273 | ||||
|                 ], | ||||
|                 [ | ||||
|                     43, | ||||
|                     280 | ||||
|                 ], | ||||
|                 [ | ||||
|                     50, | ||||
|                     294 | ||||
|                 ], | ||||
|                 [ | ||||
|                     53, | ||||
|                     297 | ||||
|                 ], | ||||
|                 [ | ||||
|                     54, | ||||
|                     297 | ||||
|                 ], | ||||
|                 [ | ||||
|                     59, | ||||
|                     301 | ||||
|                 ], | ||||
|                 [ | ||||
|                     61, | ||||
|                     303 | ||||
|                 ], | ||||
|                 [ | ||||
|                     62, | ||||
|                     316 | ||||
|                 ], | ||||
|                 [ | ||||
|                     63, | ||||
|                     341 | ||||
|                 ], | ||||
|                 [ | ||||
|                     63, | ||||
|                     382 | ||||
|                 ], | ||||
|                 [ | ||||
|                     64, | ||||
|                     405 | ||||
|                 ], | ||||
|                 [ | ||||
|                     66, | ||||
|                     414 | ||||
|                 ], | ||||
|                 [ | ||||
|                     71, | ||||
|                     413 | ||||
|                 ], | ||||
|                 [ | ||||
|                     72, | ||||
|                     402 | ||||
|                 ], | ||||
|                 [ | ||||
|                     72, | ||||
|                     399 | ||||
|                 ], | ||||
|                 [ | ||||
|                     71, | ||||
|                     359 | ||||
|                 ], | ||||
|                 [ | ||||
|                     69, | ||||
|                     324 | ||||
|                 ], | ||||
|                 [ | ||||
|                     70, | ||||
|                     300 | ||||
|                 ], | ||||
|                 [ | ||||
|                     73, | ||||
|                     299 | ||||
|                 ], | ||||
|                 [ | ||||
|                     78, | ||||
|                     294 | ||||
|                 ], | ||||
|                 [ | ||||
|                     80, | ||||
|                     291 | ||||
|                 ], | ||||
|                 [ | ||||
|                     81, | ||||
|                     289 | ||||
|                 ], | ||||
|                 [ | ||||
|                     83, | ||||
|                     283 | ||||
|                 ], | ||||
|                 [ | ||||
|                     85, | ||||
|                     278 | ||||
|                 ], | ||||
|                 [ | ||||
|                     86, | ||||
|                     272 | ||||
|                 ], | ||||
|                 [ | ||||
|                     91, | ||||
|                     258 | ||||
|                 ], | ||||
|                 [ | ||||
|                     94, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     98, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     105, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     107, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     111, | ||||
|                     253 | ||||
|                 ], | ||||
|                 [ | ||||
|                     116, | ||||
|                     261 | ||||
|                 ], | ||||
|                 [ | ||||
|                     118, | ||||
|                     265 | ||||
|                 ], | ||||
|                 [ | ||||
|                     121, | ||||
|                     271 | ||||
|                 ], | ||||
|                 [ | ||||
|                     128, | ||||
|                     288 | ||||
|                 ], | ||||
|                 [ | ||||
|                     130, | ||||
|                     291 | ||||
|                 ], | ||||
|                 [ | ||||
|                     135, | ||||
|                     296 | ||||
|                 ], | ||||
|                 [ | ||||
|                     138, | ||||
|                     298 | ||||
|                 ], | ||||
|                 [ | ||||
|                     140, | ||||
|                     299 | ||||
|                 ], | ||||
|                 [ | ||||
|                     143, | ||||
|                     300 | ||||
|                 ], | ||||
|                 [ | ||||
|                     148, | ||||
|                     300 | ||||
|                 ], | ||||
|                 [ | ||||
|                     151, | ||||
|                     299 | ||||
|                 ], | ||||
|                 [ | ||||
|                     153, | ||||
|                     298 | ||||
|                 ], | ||||
|                 [ | ||||
|                     156, | ||||
|                     296 | ||||
|                 ], | ||||
|                 [ | ||||
|                     159, | ||||
|                     293 | ||||
|                 ], | ||||
|                 [ | ||||
|                     161, | ||||
|                     290 | ||||
|                 ], | ||||
|                 [ | ||||
|                     164, | ||||
|                     284 | ||||
|                 ], | ||||
|                 [ | ||||
|                     179, | ||||
|                     255 | ||||
|                 ], | ||||
|                 [ | ||||
|                     180, | ||||
|                     253 | ||||
|                 ], | ||||
|                 [ | ||||
|                     180, | ||||
|                     251 | ||||
|                 ], | ||||
|                 [ | ||||
|                     181, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     183, | ||||
|                     247 | ||||
|                 ], | ||||
|                 [ | ||||
|                     186, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     187, | ||||
|                     259 | ||||
|                 ], | ||||
|                 [ | ||||
|                     188, | ||||
|                     282 | ||||
|                 ], | ||||
|                 [ | ||||
|                     188, | ||||
|                     303 | ||||
|                 ], | ||||
|                 [ | ||||
|                     190, | ||||
|                     320 | ||||
|                 ], | ||||
|                 [ | ||||
|                     190, | ||||
|                     343 | ||||
|                 ], | ||||
|                 [ | ||||
|                     191, | ||||
|                     355 | ||||
|                 ], | ||||
|                 [ | ||||
|                     192, | ||||
|                     357 | ||||
|                 ], | ||||
|                 [ | ||||
|                     196, | ||||
|                     358 | ||||
|                 ], | ||||
|                 [ | ||||
|                     198, | ||||
|                     357 | ||||
|                 ], | ||||
|                 [ | ||||
|                     200, | ||||
|                     353 | ||||
|                 ], | ||||
|                 [ | ||||
|                     200, | ||||
|                     341 | ||||
|                 ], | ||||
|                 [ | ||||
|                     198, | ||||
|                     321 | ||||
|                 ], | ||||
|                 [ | ||||
|                     197, | ||||
|                     300 | ||||
|                 ], | ||||
|                 [ | ||||
|                     196, | ||||
|                     279 | ||||
|                 ], | ||||
|                 [ | ||||
|                     195, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     195, | ||||
|                     250 | ||||
|                 ], | ||||
|                 [ | ||||
|                     196, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     200, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     200, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     202, | ||||
|                     251 | ||||
|                 ], | ||||
|                 [ | ||||
|                     207, | ||||
|                     260 | ||||
|                 ], | ||||
|                 [ | ||||
|                     208, | ||||
|                     262 | ||||
|                 ], | ||||
|                 [ | ||||
|                     208, | ||||
|                     264 | ||||
|                 ], | ||||
|                 [ | ||||
|                     210, | ||||
|                     266 | ||||
|                 ], | ||||
|                 [ | ||||
|                     212, | ||||
|                     273 | ||||
|                 ], | ||||
|                 [ | ||||
|                     215, | ||||
|                     279 | ||||
|                 ], | ||||
|                 [ | ||||
|                     217, | ||||
|                     281 | ||||
|                 ], | ||||
|                 [ | ||||
|                     218, | ||||
|                     283 | ||||
|                 ], | ||||
|                 [ | ||||
|                     219, | ||||
|                     287 | ||||
|                 ], | ||||
|                 [ | ||||
|                     221, | ||||
|                     290 | ||||
|                 ], | ||||
|                 [ | ||||
|                     225, | ||||
|                     294 | ||||
|                 ], | ||||
|                 [ | ||||
|                     227, | ||||
|                     295 | ||||
|                 ], | ||||
|                 [ | ||||
|                     230, | ||||
|                     296 | ||||
|                 ], | ||||
|                 [ | ||||
|                     235, | ||||
|                     296 | ||||
|                 ], | ||||
|                 [ | ||||
|                     239, | ||||
|                     295 | ||||
|                 ], | ||||
|                 [ | ||||
|                     241, | ||||
|                     294 | ||||
|                 ], | ||||
|                 [ | ||||
|                     245, | ||||
|                     290 | ||||
|                 ], | ||||
|                 [ | ||||
|                     246, | ||||
|                     288 | ||||
|                 ], | ||||
|                 [ | ||||
|                     247, | ||||
|                     286 | ||||
|                 ], | ||||
|                 [ | ||||
|                     248, | ||||
|                     283 | ||||
|                 ], | ||||
|                 [ | ||||
|                     248, | ||||
|                     279 | ||||
|                 ], | ||||
|                 [ | ||||
|                     245, | ||||
|                     281 | ||||
|                 ], | ||||
|                 [ | ||||
|                     244, | ||||
|                     283 | ||||
|                 ], | ||||
|                 [ | ||||
|                     244, | ||||
|                     285 | ||||
|                 ], | ||||
|                 [ | ||||
|                     243, | ||||
|                     287 | ||||
|                 ], | ||||
|                 [ | ||||
|                     238, | ||||
|                     292 | ||||
|                 ], | ||||
|                 [ | ||||
|                     230, | ||||
|                     292 | ||||
|                 ], | ||||
|                 [ | ||||
|                     228, | ||||
|                     291 | ||||
|                 ], | ||||
|                 [ | ||||
|                     224, | ||||
|                     287 | ||||
|                 ], | ||||
|                 [ | ||||
|                     222, | ||||
|                     284 | ||||
|                 ], | ||||
|                 [ | ||||
|                     219, | ||||
|                     278 | ||||
|                 ], | ||||
|                 [ | ||||
|                     214, | ||||
|                     268 | ||||
|                 ], | ||||
|                 [ | ||||
|                     214, | ||||
|                     266 | ||||
|                 ], | ||||
|                 [ | ||||
|                     207, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     205, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     201, | ||||
|                     245 | ||||
|                 ], | ||||
|                 [ | ||||
|                     198, | ||||
|                     243 | ||||
|                 ], | ||||
|                 [ | ||||
|                     194, | ||||
|                     242 | ||||
|                 ], | ||||
|                 [ | ||||
|                     188, | ||||
|                     242 | ||||
|                 ], | ||||
|                 [ | ||||
|                     183, | ||||
|                     243 | ||||
|                 ], | ||||
|                 [ | ||||
|                     180, | ||||
|                     244 | ||||
|                 ], | ||||
|                 [ | ||||
|                     176, | ||||
|                     246 | ||||
|                 ], | ||||
|                 [ | ||||
|                     174, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     172, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     170, | ||||
|                     256 | ||||
|                 ], | ||||
|                 [ | ||||
|                     169, | ||||
|                     260 | ||||
|                 ], | ||||
|                 [ | ||||
|                     168, | ||||
|                     262 | ||||
|                 ], | ||||
|                 [ | ||||
|                     166, | ||||
|                     264 | ||||
|                 ], | ||||
|                 [ | ||||
|                     165, | ||||
|                     266 | ||||
|                 ], | ||||
|                 [ | ||||
|                     164, | ||||
|                     268 | ||||
|                 ], | ||||
|                 [ | ||||
|                     161, | ||||
|                     276 | ||||
|                 ], | ||||
|                 [ | ||||
|                     156, | ||||
|                     286 | ||||
|                 ], | ||||
|                 [ | ||||
|                     153, | ||||
|                     290 | ||||
|                 ], | ||||
|                 [ | ||||
|                     152, | ||||
|                     291 | ||||
|                 ], | ||||
|                 [ | ||||
|                     151, | ||||
|                     291 | ||||
|                 ], | ||||
|                 [ | ||||
|                     149, | ||||
|                     293 | ||||
|                 ], | ||||
|                 [ | ||||
|                     147, | ||||
|                     293 | ||||
|                 ], | ||||
|                 [ | ||||
|                     144, | ||||
|                     293 | ||||
|                 ], | ||||
|                 [ | ||||
|                     142, | ||||
|                     293 | ||||
|                 ], | ||||
|                 [ | ||||
|                     140, | ||||
|                     292 | ||||
|                 ], | ||||
|                 [ | ||||
|                     138, | ||||
|                     290 | ||||
|                 ], | ||||
|                 [ | ||||
|                     136, | ||||
|                     287 | ||||
|                 ], | ||||
|                 [ | ||||
|                     133, | ||||
|                     281 | ||||
|                 ], | ||||
|                 [ | ||||
|                     125, | ||||
|                     263 | ||||
|                 ], | ||||
|                 [ | ||||
|                     123, | ||||
|                     259 | ||||
|                 ], | ||||
|                 [ | ||||
|                     120, | ||||
|                     253 | ||||
|                 ], | ||||
|                 [ | ||||
|                     117, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     112, | ||||
|                     243 | ||||
|                 ], | ||||
|                 [ | ||||
|                     110, | ||||
|                     242 | ||||
|                 ], | ||||
|                 [ | ||||
|                     107, | ||||
|                     241 | ||||
|                 ], | ||||
|                 [ | ||||
|                     98, | ||||
|                     241 | ||||
|                 ], | ||||
|                 [ | ||||
|                     96, | ||||
|                     242 | ||||
|                 ], | ||||
|                 [ | ||||
|                     94, | ||||
|                     243 | ||||
|                 ], | ||||
|                 [ | ||||
|                     89, | ||||
|                     248 | ||||
|                 ], | ||||
|                 [ | ||||
|                     85, | ||||
|                     256 | ||||
|                 ], | ||||
|                 [ | ||||
|                     83, | ||||
|                     261 | ||||
|                 ], | ||||
|                 [ | ||||
|                     81, | ||||
|                     269 | ||||
|                 ], | ||||
|                 [ | ||||
|                     78, | ||||
|                     274 | ||||
|                 ], | ||||
|                 [ | ||||
|                     76, | ||||
|                     282 | ||||
|                 ], | ||||
|                 [ | ||||
|                     74, | ||||
|                     287 | ||||
|                 ], | ||||
|                 [ | ||||
|                     73, | ||||
|                     289 | ||||
|                 ], | ||||
|                 [ | ||||
|                     67, | ||||
|                     295 | ||||
|                 ], | ||||
|                 [ | ||||
|                     63, | ||||
|                     295 | ||||
|                 ], | ||||
|                 [ | ||||
|                     61, | ||||
|                     294 | ||||
|                 ], | ||||
|                 [ | ||||
|                     55, | ||||
|                     288 | ||||
|                 ], | ||||
|                 [ | ||||
|                     53, | ||||
|                     284 | ||||
|                 ], | ||||
|                 [ | ||||
|                     50, | ||||
|                     278 | ||||
|                 ], | ||||
|                 [ | ||||
|                     49, | ||||
|                     273 | ||||
|                 ], | ||||
|                 [ | ||||
|                     41, | ||||
|                     254 | ||||
|                 ], | ||||
|                 [ | ||||
|                     40, | ||||
|                     252 | ||||
|                 ], | ||||
|                 [ | ||||
|                     38, | ||||
|                     249 | ||||
|                 ], | ||||
|                 [ | ||||
|                     35, | ||||
|                     246 | ||||
|                 ], | ||||
|                 [ | ||||
|                     35, | ||||
|                     245 | ||||
|                 ], | ||||
|                 [ | ||||
|                     33, | ||||
|                     243 | ||||
|                 ], | ||||
|                 [ | ||||
|                     30, | ||||
|                     241 | ||||
|                 ], | ||||
|                 [ | ||||
|                     28, | ||||
|                     240 | ||||
|                 ], | ||||
|                 [ | ||||
|                     24, | ||||
|                     239 | ||||
|                 ] | ||||
|             ], | ||||
|             "area": 4485.0, | ||||
|             "layer": 1.0, | ||||
|             "bbox": [ | ||||
|                 0.0, | ||||
|                 239.0, | ||||
|                 248.0, | ||||
|                 414.0 | ||||
|             ], | ||||
|             "iscrowd": 0, | ||||
|             "note": "" | ||||
|         } | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								example/images/000000000308.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 135 KiB | 
							
								
								
									
										1617
									
								
								example/images/000000000308.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								example/images/000000000872.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 310 KiB | 
							
								
								
									
										2341
									
								
								example/images/000000000872.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								example/images/000000002592.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 101 KiB | 
							
								
								
									
										1145
									
								
								example/images/000000002592.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								example/images/000000117425.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 92 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/instance/000000000113.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/instance/000000000144.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/instance/000000000308.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/instance/000000000872.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/instance/000000002592.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/segment/000000000113.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/segment/000000000144.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/segment/000000000308.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/segment/000000000872.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								example/segment/000000002592.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										10
									
								
								example/segment/classesition.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | ||||
| __background__ 0 | ||||
| person 1 | ||||
| knife 2 | ||||
| fork 3 | ||||
| cup 4 | ||||
| giraffe 5 | ||||
| plate 6 | ||||
| table 7 | ||||
| cake 8 | ||||
| fence 9 | ||||
							
								
								
									
										10
									
								
								icons.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT/icons.qrc' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										37
									
								
								icons.qrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,37 @@ | ||||
| <RCC> | ||||
|   <qresource prefix="icon"> | ||||
|     <file>icons/semantic.png</file> | ||||
|     <file>icons/M_Favicon.ico</file> | ||||
|     <file>icons/instance.png</file> | ||||
|     <file>icons/转换文件夹1_folder-conversion-one.svg</file> | ||||
|     <file>icons/转换文件1_file-conversion-one.svg</file> | ||||
|     <file>icons/照片_pic.svg</file> | ||||
|     <file>icons/一对一_one-to-one.svg</file> | ||||
|     <file>icons/校验_check-one.svg</file> | ||||
|     <file>icons/下一步_next.svg</file> | ||||
|     <file>icons/我的_me.svg</file> | ||||
|     <file>icons/文件夹-开_folder-open.svg</file> | ||||
|     <file>icons/缩小_zoom-out.svg</file> | ||||
|     <file>icons/设置_setting-two.svg</file> | ||||
|     <file>icons/上一步_back.svg</file> | ||||
|     <file>icons/删除_delete.svg</file> | ||||
|     <file>icons/删除_delete-two.svg</file> | ||||
|     <file>icons/全宽_fullwidth.svg</file> | ||||
|     <file>icons/去顶部_to-top.svg</file> | ||||
|     <file>icons/去底部_to-bottom.svg</file> | ||||
|     <file>icons/锚点_anchor.svg</file> | ||||
|     <file>icons/列表_list.svg</file> | ||||
|     <file>icons/列表_list-middle.svg</file> | ||||
|     <file>icons/开关_power.svg</file> | ||||
|     <file>icons/键盘_keyboard-one.svg</file> | ||||
|     <file>icons/关闭_close-one.svg</file> | ||||
|     <file>icons/放大_zoom-in.svg</file> | ||||
|     <file>icons/翻译_translate.svg</file> | ||||
|     <file>icons/传入3_afferent-three.svg</file> | ||||
|     <file>icons/传出3_efferent-three.svg</file> | ||||
|     <file>icons/编辑文件_file-editing.svg</file> | ||||
|     <file>icons/编辑_edit.svg</file> | ||||
|     <file>icons/保存硬盘_save-one.svg</file> | ||||
|     <file>icons/保存_save.svg</file> | ||||
|   </qresource> | ||||
| </RCC> | ||||
							
								
								
									
										1825
									
								
								icons_rc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										22
									
								
								isat.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,22 @@ | ||||
| label: | ||||
| - color: '#000000' | ||||
|   name: __background__ | ||||
| - color: '#ef2929' | ||||
|   name: person | ||||
| - color: '#fcaf3e' | ||||
|   name: knife | ||||
| - color: '#fce94f' | ||||
|   name: fork | ||||
| - color: '#8ae234' | ||||
|   name: cup | ||||
| - color: '#729fcf' | ||||
|   name: giraffe | ||||
| - color: '#ad7fa8' | ||||
|   name: plate | ||||
| - color: '#e9b96e' | ||||
|   name: table | ||||
| - color: '#a40000' | ||||
|   name: cake | ||||
| - color: '#5c3566' | ||||
|   name: fence | ||||
| language: zh | ||||
							
								
								
									
										22
									
								
								main.py
									
									
									
									
									
								
							
							
						
						| @ -1,16 +1,16 @@ | ||||
| # This is a sample Python script. | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| # import os | ||||
| 
 | ||||
| # Press Shift+F10 to execute it or replace it with your code. | ||||
| # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. | ||||
| from PyQt5 import QtWidgets | ||||
| from widgets.mainwindow import MainWindow | ||||
| import sys | ||||
| 
 | ||||
| 
 | ||||
| def print_hi(name): | ||||
|     # Use a breakpoint in the code line below to debug your script. | ||||
|     print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint. | ||||
| 
 | ||||
| 
 | ||||
| # Press the green button in the gutter to run the script. | ||||
| if __name__ == '__main__': | ||||
|     print_hi('PyCharm') | ||||
| 
 | ||||
| # See PyCharm help at https://www.jetbrains.com/help/pycharm/ | ||||
|     app = QtWidgets.QApplication(['']) | ||||
|     mainwindow = MainWindow() | ||||
|     mainwindow.show() | ||||
|     sys.exit(app.exec_()) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										9
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,9 @@ | ||||
| imgviz==1.2.6 | ||||
| mahotas==1.4.13 | ||||
| numpy==1.21.4 | ||||
| opencv_python_headless==4.5.3.56 | ||||
| Pillow==9.2.0 | ||||
| PyQt5==5.15.7 | ||||
| PyYAML==6.0 | ||||
| torch==1.8.1 | ||||
| torchvision==0.9.1 | ||||
							
								
								
									
										50
									
								
								segment_any/segment_any.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,50 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from segment_anything import sam_model_registry, SamPredictor | ||||
| import torch | ||||
| import numpy as np | ||||
| 
 | ||||
| 
 | ||||
| class SegAny: | ||||
|     def __init__(self, checkpoint): | ||||
|         if 'vit_b' in checkpoint: | ||||
|             model_type = "vit_b" | ||||
|         elif 'vit_l' in checkpoint: | ||||
|             model_type = "vit_l" | ||||
|         elif 'vit_h' in checkpoint: | ||||
|             model_type = "vit_h" | ||||
|         else: | ||||
|             raise ValueError('The checkpoint named {} is not supported.'.format(checkpoint)) | ||||
| 
 | ||||
|         device = 'cuda' if torch.cuda.is_available() else 'cpu' | ||||
|         sam = sam_model_registry[model_type](checkpoint=checkpoint) | ||||
|         sam.to(device=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 | ||||
| 
 | ||||
|     def predict(self, input_point, input_label): | ||||
|         input_point = np.array(input_point) | ||||
|         input_label = np.array(input_label) | ||||
| 
 | ||||
|         masks, scores, logits = self.predictor.predict( | ||||
|             point_coords=input_point, | ||||
|             point_labels=input_label, | ||||
|             multimask_output=True, | ||||
|         ) | ||||
|         mask_input = logits[np.argmax(scores), :, :]  # Choose the model's best mask | ||||
|         masks, _, _ = self.predictor.predict( | ||||
|             point_coords=input_point, | ||||
|             point_labels=input_label, | ||||
|             mask_input=mask_input[None, :, :], | ||||
|             multimask_output=False, | ||||
|         ) | ||||
|         print('masks: {}'.format(masks)) | ||||
|         return masks | ||||
							
								
								
									
										62
									
								
								tools/label_convert.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,62 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from json import load | ||||
| import numpy as np | ||||
| from PIL import Image, ImageDraw, ImageColor | ||||
| import mahotas | ||||
| import imgviz | ||||
| 
 | ||||
| class Converter: | ||||
|     def __init__(self, cfg, is_segmentation): | ||||
|         self.is_segmentation = is_segmentation | ||||
| 
 | ||||
|         labels = cfg.get('label', []) | ||||
|         self.category_dict = {} | ||||
|         if self.is_segmentation: | ||||
|             self.cmap = imgviz.label_colormap() | ||||
|         else: | ||||
|             self.cmap = np.zeros((len(labels), 3), dtype=np.uint8) | ||||
|             for index, label_dict in enumerate(labels): | ||||
|                 category = label_dict.get('name', 'unknow') | ||||
|                 color = label_dict.get('color', '#000000') | ||||
|                 self.category_dict[category] = {'index': index, 'color': color} | ||||
|                 self.cmap[index] = (ImageColor.getrgb(color)) | ||||
| 
 | ||||
|     def convert(self, from_path:str, to_path:str): | ||||
|         assert from_path.endswith('.json') | ||||
| 
 | ||||
|         with open(from_path, 'r') as f: | ||||
|             dataset = load(f) | ||||
|             info = dataset.get('info', {}) | ||||
|             objects = dataset.get('objects', []) | ||||
| 
 | ||||
|             img_name = info.get('name', '') | ||||
|             width = info.get('width', 0) | ||||
|             height = info.get('height', 0) | ||||
|             depth = info.get('depth', 0) | ||||
|             note = info.get('note', '') | ||||
|             img = np.zeros(shape=(height, width), dtype=np.uint8) | ||||
| 
 | ||||
|             objects = sorted(objects, key=lambda obj:obj.get('layer', 1)) | ||||
| 
 | ||||
|             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', []) | ||||
|                 segmentation = [(p[1], p[0]) for p in segmentation] | ||||
| 
 | ||||
|                 if self.is_segmentation and group != '': | ||||
|                     mahotas.polygon.fill_polygon(segmentation, img, color=int(group)) | ||||
|                 else: | ||||
|                     mahotas.polygon.fill_polygon(segmentation, img, color=self.category_dict.get(category, {}).get('index', 0)) | ||||
|         img = Image.fromarray(img.astype(np.uint8), mode='P') | ||||
|         img.putpalette(self.cmap.flatten()) | ||||
|         img.save(to_path) | ||||
|         return True | ||||
| 
 | ||||
							
								
								
									
										400
									
								
								ui/MainWindow.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,400 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/MainWindow.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_MainWindow(object): | ||||
|     def setupUi(self, MainWindow): | ||||
|         MainWindow.setObjectName("MainWindow") | ||||
|         MainWindow.resize(1280, 760) | ||||
|         MainWindow.setMinimumSize(QtCore.QSize(800, 600)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         MainWindow.setFont(font) | ||||
|         icon = QtGui.QIcon() | ||||
|         icon.addPixmap(QtGui.QPixmap(":/icons/icons/isat_bg_50x25.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         MainWindow.setWindowIcon(icon) | ||||
|         self.centralwidget = QtWidgets.QWidget(MainWindow) | ||||
|         self.centralwidget.setObjectName("centralwidget") | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) | ||||
|         self.verticalLayout.setContentsMargins(0, 0, 0, 0) | ||||
|         self.verticalLayout.setSpacing(0) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         MainWindow.setCentralWidget(self.centralwidget) | ||||
|         self.menubar = QtWidgets.QMenuBar(MainWindow) | ||||
|         self.menubar.setEnabled(True) | ||||
|         self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 24)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menubar.setFont(font) | ||||
|         self.menubar.setAutoFillBackground(False) | ||||
|         self.menubar.setDefaultUp(False) | ||||
|         self.menubar.setNativeMenuBar(True) | ||||
|         self.menubar.setObjectName("menubar") | ||||
|         self.menuFile = QtWidgets.QMenu(self.menubar) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menuFile.setFont(font) | ||||
|         self.menuFile.setObjectName("menuFile") | ||||
|         self.menuView = QtWidgets.QMenu(self.menubar) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menuView.setFont(font) | ||||
|         self.menuView.setObjectName("menuView") | ||||
|         self.menuAbout = QtWidgets.QMenu(self.menubar) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menuAbout.setFont(font) | ||||
|         self.menuAbout.setObjectName("menuAbout") | ||||
|         self.menuLaguage = QtWidgets.QMenu(self.menuAbout) | ||||
|         icon1 = QtGui.QIcon() | ||||
|         icon1.addPixmap(QtGui.QPixmap(":/icon/icons/翻译_translate.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.menuLaguage.setIcon(icon1) | ||||
|         self.menuLaguage.setObjectName("menuLaguage") | ||||
|         self.menuTools = QtWidgets.QMenu(self.menubar) | ||||
|         self.menuTools.setEnabled(True) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menuTools.setFont(font) | ||||
|         self.menuTools.setObjectName("menuTools") | ||||
|         self.menuEdit = QtWidgets.QMenu(self.menubar) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.menuEdit.setFont(font) | ||||
|         self.menuEdit.setObjectName("menuEdit") | ||||
|         MainWindow.setMenuBar(self.menubar) | ||||
|         self.statusbar = QtWidgets.QStatusBar(MainWindow) | ||||
|         self.statusbar.setLayoutDirection(QtCore.Qt.LeftToRight) | ||||
|         self.statusbar.setObjectName("statusbar") | ||||
|         MainWindow.setStatusBar(self.statusbar) | ||||
|         self.toolBar = QtWidgets.QToolBar(MainWindow) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.toolBar.setFont(font) | ||||
|         self.toolBar.setIconSize(QtCore.QSize(24, 24)) | ||||
|         self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) | ||||
|         self.toolBar.setFloatable(False) | ||||
|         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.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) | ||||
|         self.info_dock.setObjectName("info_dock") | ||||
|         self.dockWidgetContents_2 = QtWidgets.QWidget() | ||||
|         self.dockWidgetContents_2.setObjectName("dockWidgetContents_2") | ||||
|         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.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) | ||||
|         self.labels_dock.setObjectName("labels_dock") | ||||
|         self.dockWidgetContents_3 = QtWidgets.QWidget() | ||||
|         self.dockWidgetContents_3.setObjectName("dockWidgetContents_3") | ||||
|         self.labels_dock.setWidget(self.dockWidgetContents_3) | ||||
|         MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.labels_dock) | ||||
|         self.files_dock = QtWidgets.QDockWidget(MainWindow) | ||||
|         self.files_dock.setObjectName("files_dock") | ||||
|         self.dockWidgetContents = QtWidgets.QWidget() | ||||
|         self.dockWidgetContents.setObjectName("dockWidgetContents") | ||||
|         self.files_dock.setWidget(self.dockWidgetContents) | ||||
|         MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.files_dock) | ||||
|         self.actionOpen_dir = QtWidgets.QAction(MainWindow) | ||||
|         icon2 = QtGui.QIcon() | ||||
|         icon2.addPixmap(QtGui.QPixmap(":/icon/icons/照片_pic.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionOpen_dir.setIcon(icon2) | ||||
|         self.actionOpen_dir.setObjectName("actionOpen_dir") | ||||
|         self.actionZoom_in = QtWidgets.QAction(MainWindow) | ||||
|         icon3 = QtGui.QIcon() | ||||
|         icon3.addPixmap(QtGui.QPixmap(":/icon/icons/放大_zoom-in.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionZoom_in.setIcon(icon3) | ||||
|         self.actionZoom_in.setObjectName("actionZoom_in") | ||||
|         self.actionZoom_out = QtWidgets.QAction(MainWindow) | ||||
|         icon4 = QtGui.QIcon() | ||||
|         icon4.addPixmap(QtGui.QPixmap(":/icon/icons/缩小_zoom-out.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionZoom_out.setIcon(icon4) | ||||
|         self.actionZoom_out.setObjectName("actionZoom_out") | ||||
|         self.actionFit_wiondow = QtWidgets.QAction(MainWindow) | ||||
|         icon5 = QtGui.QIcon() | ||||
|         icon5.addPixmap(QtGui.QPixmap(":/icon/icons/全宽_fullwidth.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionFit_wiondow.setIcon(icon5) | ||||
|         self.actionFit_wiondow.setObjectName("actionFit_wiondow") | ||||
|         self.actionSetting = QtWidgets.QAction(MainWindow) | ||||
|         icon6 = QtGui.QIcon() | ||||
|         icon6.addPixmap(QtGui.QPixmap(":/icon/icons/设置_setting-two.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionSetting.setIcon(icon6) | ||||
|         self.actionSetting.setObjectName("actionSetting") | ||||
|         self.actionExit = QtWidgets.QAction(MainWindow) | ||||
|         icon7 = QtGui.QIcon() | ||||
|         icon7.addPixmap(QtGui.QPixmap(":/icon/icons/开关_power.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionExit.setIcon(icon7) | ||||
|         self.actionExit.setObjectName("actionExit") | ||||
|         self.actionSave_dir = QtWidgets.QAction(MainWindow) | ||||
|         icon8 = QtGui.QIcon() | ||||
|         icon8.addPixmap(QtGui.QPixmap(":/icon/icons/文件夹-开_folder-open.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionSave_dir.setIcon(icon8) | ||||
|         self.actionSave_dir.setObjectName("actionSave_dir") | ||||
|         self.actionSave = QtWidgets.QAction(MainWindow) | ||||
|         icon9 = QtGui.QIcon() | ||||
|         icon9.addPixmap(QtGui.QPixmap(":/icon/icons/保存_save.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionSave.setIcon(icon9) | ||||
|         self.actionSave.setObjectName("actionSave") | ||||
|         self.actionPrev = QtWidgets.QAction(MainWindow) | ||||
|         self.actionPrev.setCheckable(False) | ||||
|         icon10 = QtGui.QIcon() | ||||
|         icon10.addPixmap(QtGui.QPixmap(":/icon/icons/上一步_back.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionPrev.setIcon(icon10) | ||||
|         self.actionPrev.setMenuRole(QtWidgets.QAction.TextHeuristicRole) | ||||
|         self.actionPrev.setPriority(QtWidgets.QAction.NormalPriority) | ||||
|         self.actionPrev.setObjectName("actionPrev") | ||||
|         self.actionNext = QtWidgets.QAction(MainWindow) | ||||
|         icon11 = QtGui.QIcon() | ||||
|         icon11.addPixmap(QtGui.QPixmap(":/icon/icons/下一步_next.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionNext.setIcon(icon11) | ||||
|         self.actionNext.setObjectName("actionNext") | ||||
|         self.actionShortcut = QtWidgets.QAction(MainWindow) | ||||
|         icon12 = QtGui.QIcon() | ||||
|         icon12.addPixmap(QtGui.QPixmap(":/icon/icons/键盘_keyboard-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionShortcut.setIcon(icon12) | ||||
|         self.actionShortcut.setObjectName("actionShortcut") | ||||
|         self.actionAbout = QtWidgets.QAction(MainWindow) | ||||
|         icon13 = QtGui.QIcon() | ||||
|         icon13.addPixmap(QtGui.QPixmap(":/icon/icons/我的_me.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionAbout.setIcon(icon13) | ||||
|         self.actionAbout.setObjectName("actionAbout") | ||||
|         self.actionSegment_anything = QtWidgets.QAction(MainWindow) | ||||
|         icon14 = QtGui.QIcon() | ||||
|         icon14.addPixmap(QtGui.QPixmap(":/icon/icons/M_Favicon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionSegment_anything.setIcon(icon14) | ||||
|         self.actionSegment_anything.setObjectName("actionSegment_anything") | ||||
|         self.actionDelete = QtWidgets.QAction(MainWindow) | ||||
|         self.actionDelete.setEnabled(False) | ||||
|         icon15 = QtGui.QIcon() | ||||
|         icon15.addPixmap(QtGui.QPixmap(":/icon/icons/删除_delete.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionDelete.setIcon(icon15) | ||||
|         self.actionDelete.setObjectName("actionDelete") | ||||
|         self.actionBit_map = QtWidgets.QAction(MainWindow) | ||||
|         self.actionBit_map.setCheckable(False) | ||||
|         self.actionBit_map.setIcon(icon2) | ||||
|         self.actionBit_map.setObjectName("actionBit_map") | ||||
|         self.actionEdit = QtWidgets.QAction(MainWindow) | ||||
|         self.actionEdit.setEnabled(False) | ||||
|         icon16 = QtGui.QIcon() | ||||
|         icon16.addPixmap(QtGui.QPixmap(":/icon/icons/编辑_edit.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionEdit.setIcon(icon16) | ||||
|         self.actionEdit.setObjectName("actionEdit") | ||||
|         self.actionTo_top = QtWidgets.QAction(MainWindow) | ||||
|         self.actionTo_top.setEnabled(False) | ||||
|         icon17 = QtGui.QIcon() | ||||
|         icon17.addPixmap(QtGui.QPixmap(":/icon/icons/去顶部_to-top.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionTo_top.setIcon(icon17) | ||||
|         self.actionTo_top.setObjectName("actionTo_top") | ||||
|         self.actionTo_bottom = QtWidgets.QAction(MainWindow) | ||||
|         self.actionTo_bottom.setEnabled(False) | ||||
|         icon18 = QtGui.QIcon() | ||||
|         icon18.addPixmap(QtGui.QPixmap(":/icon/icons/去底部_to-bottom.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionTo_bottom.setIcon(icon18) | ||||
|         self.actionTo_bottom.setObjectName("actionTo_bottom") | ||||
|         self.actionConverter = QtWidgets.QAction(MainWindow) | ||||
|         icon19 = QtGui.QIcon() | ||||
|         icon19.addPixmap(QtGui.QPixmap(":/icon/icons/转换文件夹1_folder-conversion-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionConverter.setIcon(icon19) | ||||
|         self.actionConverter.setWhatsThis("") | ||||
|         self.actionConverter.setObjectName("actionConverter") | ||||
|         self.actionChinese = QtWidgets.QAction(MainWindow) | ||||
|         self.actionChinese.setCheckable(True) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.actionChinese.setFont(font) | ||||
|         self.actionChinese.setObjectName("actionChinese") | ||||
|         self.actionEnglish = QtWidgets.QAction(MainWindow) | ||||
|         self.actionEnglish.setCheckable(True) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.actionEnglish.setFont(font) | ||||
|         self.actionEnglish.setObjectName("actionEnglish") | ||||
|         self.actionBackspace = QtWidgets.QAction(MainWindow) | ||||
|         icon20 = QtGui.QIcon() | ||||
|         icon20.addPixmap(QtGui.QPixmap(":/icon/icons/删除_delete-two.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionBackspace.setIcon(icon20) | ||||
|         self.actionBackspace.setObjectName("actionBackspace") | ||||
|         self.actionCancel = QtWidgets.QAction(MainWindow) | ||||
|         icon21 = QtGui.QIcon() | ||||
|         icon21.addPixmap(QtGui.QPixmap(":/icon/icons/关闭_close-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionCancel.setIcon(icon21) | ||||
|         self.actionCancel.setObjectName("actionCancel") | ||||
|         self.actionFinish = QtWidgets.QAction(MainWindow) | ||||
|         icon22 = QtGui.QIcon() | ||||
|         icon22.addPixmap(QtGui.QPixmap(":/icon/icons/校验_check-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionFinish.setIcon(icon22) | ||||
|         self.actionFinish.setObjectName("actionFinish") | ||||
|         self.actionPolygon = QtWidgets.QAction(MainWindow) | ||||
|         icon23 = QtGui.QIcon() | ||||
|         icon23.addPixmap(QtGui.QPixmap(":/icon/icons/锚点_anchor.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.actionPolygon.setIcon(icon23) | ||||
|         self.actionPolygon.setObjectName("actionPolygon") | ||||
|         self.menuFile.addAction(self.actionOpen_dir) | ||||
|         self.menuFile.addAction(self.actionSave_dir) | ||||
|         self.menuFile.addSeparator() | ||||
|         self.menuFile.addAction(self.actionPrev) | ||||
|         self.menuFile.addAction(self.actionNext) | ||||
|         self.menuFile.addSeparator() | ||||
|         self.menuFile.addAction(self.actionSetting) | ||||
|         self.menuFile.addAction(self.actionExit) | ||||
|         self.menuView.addSeparator() | ||||
|         self.menuView.addAction(self.actionZoom_in) | ||||
|         self.menuView.addAction(self.actionZoom_out) | ||||
|         self.menuView.addAction(self.actionFit_wiondow) | ||||
|         self.menuView.addSeparator() | ||||
|         self.menuView.addAction(self.actionBit_map) | ||||
|         self.menuView.addSeparator() | ||||
|         self.menuLaguage.addAction(self.actionChinese) | ||||
|         self.menuLaguage.addAction(self.actionEnglish) | ||||
|         self.menuAbout.addAction(self.menuLaguage.menuAction()) | ||||
|         self.menuAbout.addAction(self.actionShortcut) | ||||
|         self.menuAbout.addAction(self.actionAbout) | ||||
|         self.menuTools.addAction(self.actionConverter) | ||||
|         self.menuEdit.addAction(self.actionSegment_anything) | ||||
|         self.menuEdit.addAction(self.actionPolygon) | ||||
|         self.menuEdit.addAction(self.actionBackspace) | ||||
|         self.menuEdit.addAction(self.actionFinish) | ||||
|         self.menuEdit.addAction(self.actionCancel) | ||||
|         self.menuEdit.addSeparator() | ||||
|         self.menuEdit.addAction(self.actionTo_top) | ||||
|         self.menuEdit.addAction(self.actionTo_bottom) | ||||
|         self.menuEdit.addSeparator() | ||||
|         self.menuEdit.addAction(self.actionEdit) | ||||
|         self.menuEdit.addAction(self.actionDelete) | ||||
|         self.menuEdit.addAction(self.actionSave) | ||||
|         self.menubar.addAction(self.menuFile.menuAction()) | ||||
|         self.menubar.addAction(self.menuEdit.menuAction()) | ||||
|         self.menubar.addAction(self.menuView.menuAction()) | ||||
|         self.menubar.addAction(self.menuTools.menuAction()) | ||||
|         self.menubar.addAction(self.menuAbout.menuAction()) | ||||
|         self.toolBar.addAction(self.actionPrev) | ||||
|         self.toolBar.addAction(self.actionNext) | ||||
|         self.toolBar.addSeparator() | ||||
|         self.toolBar.addSeparator() | ||||
|         self.toolBar.addAction(self.actionSegment_anything) | ||||
|         self.toolBar.addAction(self.actionPolygon) | ||||
|         self.toolBar.addAction(self.actionBackspace) | ||||
|         self.toolBar.addAction(self.actionFinish) | ||||
|         self.toolBar.addAction(self.actionCancel) | ||||
|         self.toolBar.addSeparator() | ||||
|         self.toolBar.addAction(self.actionTo_top) | ||||
|         self.toolBar.addAction(self.actionTo_bottom) | ||||
|         self.toolBar.addAction(self.actionEdit) | ||||
|         self.toolBar.addAction(self.actionDelete) | ||||
|         self.toolBar.addAction(self.actionSave) | ||||
|         self.toolBar.addSeparator() | ||||
|         self.toolBar.addAction(self.actionZoom_in) | ||||
|         self.toolBar.addAction(self.actionZoom_out) | ||||
|         self.toolBar.addAction(self.actionFit_wiondow) | ||||
|         self.toolBar.addAction(self.actionBit_map) | ||||
| 
 | ||||
|         self.retranslateUi(MainWindow) | ||||
|         QtCore.QMetaObject.connectSlotsByName(MainWindow) | ||||
| 
 | ||||
|     def retranslateUi(self, MainWindow): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         MainWindow.setWindowTitle(_translate("MainWindow", "ISAT")) | ||||
|         self.menuFile.setTitle(_translate("MainWindow", "File")) | ||||
|         self.menuView.setTitle(_translate("MainWindow", "View")) | ||||
|         self.menuAbout.setTitle(_translate("MainWindow", "Help")) | ||||
|         self.menuLaguage.setTitle(_translate("MainWindow", "Laguage")) | ||||
|         self.menuTools.setTitle(_translate("MainWindow", "Tools")) | ||||
|         self.menuEdit.setTitle(_translate("MainWindow", "Edit")) | ||||
|         self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) | ||||
|         self.info_dock.setWindowTitle(_translate("MainWindow", "Info")) | ||||
|         self.labels_dock.setWindowTitle(_translate("MainWindow", "Labels")) | ||||
|         self.files_dock.setWindowTitle(_translate("MainWindow", "Files")) | ||||
|         self.actionOpen_dir.setText(_translate("MainWindow", "Images dir")) | ||||
|         self.actionOpen_dir.setStatusTip(_translate("MainWindow", "Open images dir.")) | ||||
|         self.actionZoom_in.setText(_translate("MainWindow", "Zoom in")) | ||||
|         self.actionZoom_in.setStatusTip(_translate("MainWindow", "Zoom in.")) | ||||
|         self.actionZoom_out.setText(_translate("MainWindow", "Zoom out")) | ||||
|         self.actionZoom_out.setStatusTip(_translate("MainWindow", "Zoom out.")) | ||||
|         self.actionFit_wiondow.setText(_translate("MainWindow", "Fit window")) | ||||
|         self.actionFit_wiondow.setToolTip(_translate("MainWindow", "Fit window")) | ||||
|         self.actionFit_wiondow.setStatusTip(_translate("MainWindow", "Fit window.")) | ||||
|         self.actionFit_wiondow.setShortcut(_translate("MainWindow", "F")) | ||||
|         self.actionSetting.setText(_translate("MainWindow", "Setting")) | ||||
|         self.actionSetting.setStatusTip(_translate("MainWindow", "Setting.")) | ||||
|         self.actionExit.setText(_translate("MainWindow", "Exit")) | ||||
|         self.actionExit.setToolTip(_translate("MainWindow", "Exit")) | ||||
|         self.actionExit.setStatusTip(_translate("MainWindow", "Exit.")) | ||||
|         self.actionSave_dir.setText(_translate("MainWindow", "Label dir")) | ||||
|         self.actionSave_dir.setStatusTip(_translate("MainWindow", "Open label dir.")) | ||||
|         self.actionSave.setText(_translate("MainWindow", "Save")) | ||||
|         self.actionSave.setStatusTip(_translate("MainWindow", "Save annotation.")) | ||||
|         self.actionSave.setShortcut(_translate("MainWindow", "S")) | ||||
|         self.actionPrev.setText(_translate("MainWindow", "Prev image")) | ||||
|         self.actionPrev.setToolTip(_translate("MainWindow", "Prev image")) | ||||
|         self.actionPrev.setStatusTip(_translate("MainWindow", "Prev image.")) | ||||
|         self.actionPrev.setShortcut(_translate("MainWindow", "A")) | ||||
|         self.actionNext.setText(_translate("MainWindow", "Next image")) | ||||
|         self.actionNext.setToolTip(_translate("MainWindow", "Next image")) | ||||
|         self.actionNext.setStatusTip(_translate("MainWindow", "Next image.")) | ||||
|         self.actionNext.setShortcut(_translate("MainWindow", "D")) | ||||
|         self.actionShortcut.setText(_translate("MainWindow", "Shortcut")) | ||||
|         self.actionAbout.setText(_translate("MainWindow", "About")) | ||||
|         self.actionSegment_anything.setText(_translate("MainWindow", "Segment anything")) | ||||
|         self.actionSegment_anything.setToolTip(_translate("MainWindow", "Segment anything")) | ||||
|         self.actionSegment_anything.setStatusTip(_translate("MainWindow", "Quick annotate using Segment anything.")) | ||||
|         self.actionSegment_anything.setShortcut(_translate("MainWindow", "Q")) | ||||
|         self.actionDelete.setText(_translate("MainWindow", "Delete")) | ||||
|         self.actionDelete.setToolTip(_translate("MainWindow", "Delete polygon")) | ||||
|         self.actionDelete.setStatusTip(_translate("MainWindow", "Delete polygon.")) | ||||
|         self.actionDelete.setShortcut(_translate("MainWindow", "Del")) | ||||
|         self.actionBit_map.setText(_translate("MainWindow", "Bit map")) | ||||
|         self.actionBit_map.setStatusTip(_translate("MainWindow", "Show instance or segmeent state.")) | ||||
|         self.actionBit_map.setShortcut(_translate("MainWindow", "Space")) | ||||
|         self.actionEdit.setText(_translate("MainWindow", "Edit")) | ||||
|         self.actionEdit.setToolTip(_translate("MainWindow", "Edit polygon")) | ||||
|         self.actionEdit.setStatusTip(_translate("MainWindow", "Edit polygon attribute.")) | ||||
|         self.actionTo_top.setText(_translate("MainWindow", "To top")) | ||||
|         self.actionTo_top.setToolTip(_translate("MainWindow", "Move polygon to top layer")) | ||||
|         self.actionTo_top.setStatusTip(_translate("MainWindow", "Move polygon to top layer.")) | ||||
|         self.actionTo_top.setShortcut(_translate("MainWindow", "T")) | ||||
|         self.actionTo_bottom.setText(_translate("MainWindow", "To bottom")) | ||||
|         self.actionTo_bottom.setToolTip(_translate("MainWindow", "Move polygon to bottom layer")) | ||||
|         self.actionTo_bottom.setStatusTip(_translate("MainWindow", "Move polygon to bottom layer.")) | ||||
|         self.actionTo_bottom.setShortcut(_translate("MainWindow", "B")) | ||||
|         self.actionConverter.setText(_translate("MainWindow", "Label converter")) | ||||
|         self.actionConverter.setStatusTip(_translate("MainWindow", "Convert annotations to png image.")) | ||||
|         self.actionChinese.setText(_translate("MainWindow", "中文")) | ||||
|         self.actionEnglish.setText(_translate("MainWindow", "English")) | ||||
|         self.actionBackspace.setText(_translate("MainWindow", "Backspace")) | ||||
|         self.actionBackspace.setToolTip(_translate("MainWindow", "Backspace")) | ||||
|         self.actionBackspace.setStatusTip(_translate("MainWindow", "Backspace.")) | ||||
|         self.actionBackspace.setShortcut(_translate("MainWindow", "Z")) | ||||
|         self.actionCancel.setText(_translate("MainWindow", "Cancel")) | ||||
|         self.actionCancel.setToolTip(_translate("MainWindow", "Annotate canceled")) | ||||
|         self.actionCancel.setStatusTip(_translate("MainWindow", "Annotate canceled.")) | ||||
|         self.actionCancel.setShortcut(_translate("MainWindow", "Esc")) | ||||
|         self.actionFinish.setText(_translate("MainWindow", "Finish")) | ||||
|         self.actionFinish.setToolTip(_translate("MainWindow", "Annotate finished")) | ||||
|         self.actionFinish.setStatusTip(_translate("MainWindow", "Annotate finished.")) | ||||
|         self.actionFinish.setShortcut(_translate("MainWindow", "E")) | ||||
|         self.actionPolygon.setText(_translate("MainWindow", "Polygon")) | ||||
|         self.actionPolygon.setToolTip(_translate("MainWindow", "Draw polygon")) | ||||
|         self.actionPolygon.setStatusTip(_translate("MainWindow", "Accurately annotate by drawing polygon. ")) | ||||
|         self.actionPolygon.setShortcut(_translate("MainWindow", "C")) | ||||
| import icons_rc | ||||
							
								
								
									
										691
									
								
								ui/MainWindow.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,691 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>MainWindow</class> | ||||
|  <widget class="QMainWindow" name="MainWindow"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>1280</width> | ||||
|     <height>760</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="minimumSize"> | ||||
|    <size> | ||||
|     <width>800</width> | ||||
|     <height>600</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <family>Times New Roman</family> | ||||
|     <pointsize>12</pointsize> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>ISAT</string> | ||||
|   </property> | ||||
|   <property name="windowIcon"> | ||||
|    <iconset> | ||||
|     <normaloff>:/icons/icons/isat_bg_50x25.png</normaloff>:/icons/icons/isat_bg_50x25.png</iconset> | ||||
|   </property> | ||||
|   <widget class="QWidget" name="centralwidget"> | ||||
|    <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|     <property name="spacing"> | ||||
|      <number>0</number> | ||||
|     </property> | ||||
|     <property name="leftMargin"> | ||||
|      <number>0</number> | ||||
|     </property> | ||||
|     <property name="topMargin"> | ||||
|      <number>0</number> | ||||
|     </property> | ||||
|     <property name="rightMargin"> | ||||
|      <number>0</number> | ||||
|     </property> | ||||
|     <property name="bottomMargin"> | ||||
|      <number>0</number> | ||||
|     </property> | ||||
|    </layout> | ||||
|   </widget> | ||||
|   <widget class="QMenuBar" name="menubar"> | ||||
|    <property name="enabled"> | ||||
|     <bool>true</bool> | ||||
|    </property> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>0</x> | ||||
|      <y>0</y> | ||||
|      <width>1280</width> | ||||
|      <height>24</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="font"> | ||||
|     <font> | ||||
|      <family>Times New Roman</family> | ||||
|      <pointsize>12</pointsize> | ||||
|     </font> | ||||
|    </property> | ||||
|    <property name="autoFillBackground"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="defaultUp"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="nativeMenuBar"> | ||||
|     <bool>true</bool> | ||||
|    </property> | ||||
|    <widget class="QMenu" name="menuFile"> | ||||
|     <property name="font"> | ||||
|      <font> | ||||
|       <family>Times New Roman</family> | ||||
|       <pointsize>12</pointsize> | ||||
|      </font> | ||||
|     </property> | ||||
|     <property name="title"> | ||||
|      <string>File</string> | ||||
|     </property> | ||||
|     <addaction name="actionOpen_dir"/> | ||||
|     <addaction name="actionSave_dir"/> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionPrev"/> | ||||
|     <addaction name="actionNext"/> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionSetting"/> | ||||
|     <addaction name="actionExit"/> | ||||
|    </widget> | ||||
|    <widget class="QMenu" name="menuView"> | ||||
|     <property name="font"> | ||||
|      <font> | ||||
|       <family>Times New Roman</family> | ||||
|       <pointsize>12</pointsize> | ||||
|      </font> | ||||
|     </property> | ||||
|     <property name="title"> | ||||
|      <string>View</string> | ||||
|     </property> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionZoom_in"/> | ||||
|     <addaction name="actionZoom_out"/> | ||||
|     <addaction name="actionFit_wiondow"/> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionBit_map"/> | ||||
|     <addaction name="separator"/> | ||||
|    </widget> | ||||
|    <widget class="QMenu" name="menuAbout"> | ||||
|     <property name="font"> | ||||
|      <font> | ||||
|       <family>Times New Roman</family> | ||||
|       <pointsize>12</pointsize> | ||||
|      </font> | ||||
|     </property> | ||||
|     <property name="title"> | ||||
|      <string>Help</string> | ||||
|     </property> | ||||
|     <widget class="QMenu" name="menuLaguage"> | ||||
|      <property name="title"> | ||||
|       <string>Laguage</string> | ||||
|      </property> | ||||
|      <property name="icon"> | ||||
|       <iconset resource="../icons.qrc"> | ||||
|        <normaloff>:/icon/icons/翻译_translate.svg</normaloff>:/icon/icons/翻译_translate.svg</iconset> | ||||
|      </property> | ||||
|      <addaction name="actionChinese"/> | ||||
|      <addaction name="actionEnglish"/> | ||||
|     </widget> | ||||
|     <addaction name="menuLaguage"/> | ||||
|     <addaction name="actionShortcut"/> | ||||
|     <addaction name="actionAbout"/> | ||||
|    </widget> | ||||
|    <widget class="QMenu" name="menuTools"> | ||||
|     <property name="enabled"> | ||||
|      <bool>true</bool> | ||||
|     </property> | ||||
|     <property name="font"> | ||||
|      <font> | ||||
|       <family>Times New Roman</family> | ||||
|       <pointsize>12</pointsize> | ||||
|      </font> | ||||
|     </property> | ||||
|     <property name="title"> | ||||
|      <string>Tools</string> | ||||
|     </property> | ||||
|     <addaction name="actionConverter"/> | ||||
|    </widget> | ||||
|    <widget class="QMenu" name="menuEdit"> | ||||
|     <property name="font"> | ||||
|      <font> | ||||
|       <family>Times New Roman</family> | ||||
|       <pointsize>12</pointsize> | ||||
|      </font> | ||||
|     </property> | ||||
|     <property name="title"> | ||||
|      <string>Edit</string> | ||||
|     </property> | ||||
|     <addaction name="actionSegment_anything"/> | ||||
|     <addaction name="actionPolygon"/> | ||||
|     <addaction name="actionBackspace"/> | ||||
|     <addaction name="actionFinish"/> | ||||
|     <addaction name="actionCancel"/> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionTo_top"/> | ||||
|     <addaction name="actionTo_bottom"/> | ||||
|     <addaction name="separator"/> | ||||
|     <addaction name="actionEdit"/> | ||||
|     <addaction name="actionDelete"/> | ||||
|     <addaction name="actionSave"/> | ||||
|    </widget> | ||||
|    <addaction name="menuFile"/> | ||||
|    <addaction name="menuEdit"/> | ||||
|    <addaction name="menuView"/> | ||||
|    <addaction name="menuTools"/> | ||||
|    <addaction name="menuAbout"/> | ||||
|   </widget> | ||||
|   <widget class="QStatusBar" name="statusbar"> | ||||
|    <property name="layoutDirection"> | ||||
|     <enum>Qt::LeftToRight</enum> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QToolBar" name="toolBar"> | ||||
|    <property name="font"> | ||||
|     <font> | ||||
|      <family>Times New Roman</family> | ||||
|      <pointsize>12</pointsize> | ||||
|     </font> | ||||
|    </property> | ||||
|    <property name="windowTitle"> | ||||
|     <string>toolBar</string> | ||||
|    </property> | ||||
|    <property name="iconSize"> | ||||
|     <size> | ||||
|      <width>24</width> | ||||
|      <height>24</height> | ||||
|     </size> | ||||
|    </property> | ||||
|    <property name="toolButtonStyle"> | ||||
|     <enum>Qt::ToolButtonIconOnly</enum> | ||||
|    </property> | ||||
|    <property name="floatable"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <attribute name="toolBarArea"> | ||||
|     <enum>TopToolBarArea</enum> | ||||
|    </attribute> | ||||
|    <attribute name="toolBarBreak"> | ||||
|     <bool>false</bool> | ||||
|    </attribute> | ||||
|    <addaction name="actionPrev"/> | ||||
|    <addaction name="actionNext"/> | ||||
|    <addaction name="separator"/> | ||||
|    <addaction name="separator"/> | ||||
|    <addaction name="actionSegment_anything"/> | ||||
|    <addaction name="actionPolygon"/> | ||||
|    <addaction name="actionBackspace"/> | ||||
|    <addaction name="actionFinish"/> | ||||
|    <addaction name="actionCancel"/> | ||||
|    <addaction name="separator"/> | ||||
|    <addaction name="actionTo_top"/> | ||||
|    <addaction name="actionTo_bottom"/> | ||||
|    <addaction name="actionEdit"/> | ||||
|    <addaction name="actionDelete"/> | ||||
|    <addaction name="actionSave"/> | ||||
|    <addaction name="separator"/> | ||||
|    <addaction name="actionZoom_in"/> | ||||
|    <addaction name="actionZoom_out"/> | ||||
|    <addaction name="actionFit_wiondow"/> | ||||
|    <addaction name="actionBit_map"/> | ||||
|   </widget> | ||||
|   <widget class="QDockWidget" name="info_dock"> | ||||
|    <property name="minimumSize"> | ||||
|     <size> | ||||
|      <width>80</width> | ||||
|      <height>38</height> | ||||
|     </size> | ||||
|    </property> | ||||
|    <property name="features"> | ||||
|     <set>QDockWidget::AllDockWidgetFeatures</set> | ||||
|    </property> | ||||
|    <property name="windowTitle"> | ||||
|     <string>Info</string> | ||||
|    </property> | ||||
|    <attribute name="dockWidgetArea"> | ||||
|     <number>2</number> | ||||
|    </attribute> | ||||
|    <widget class="QWidget" name="dockWidgetContents_2"/> | ||||
|   </widget> | ||||
|   <widget class="QDockWidget" name="labels_dock"> | ||||
|    <property name="minimumSize"> | ||||
|     <size> | ||||
|      <width>80</width> | ||||
|      <height>38</height> | ||||
|     </size> | ||||
|    </property> | ||||
|    <property name="features"> | ||||
|     <set>QDockWidget::AllDockWidgetFeatures</set> | ||||
|    </property> | ||||
|    <property name="windowTitle"> | ||||
|     <string>Labels</string> | ||||
|    </property> | ||||
|    <attribute name="dockWidgetArea"> | ||||
|     <number>2</number> | ||||
|    </attribute> | ||||
|    <widget class="QWidget" name="dockWidgetContents_3"/> | ||||
|   </widget> | ||||
|   <widget class="QDockWidget" name="files_dock"> | ||||
|    <property name="windowTitle"> | ||||
|     <string>Files</string> | ||||
|    </property> | ||||
|    <attribute name="dockWidgetArea"> | ||||
|     <number>2</number> | ||||
|    </attribute> | ||||
|    <widget class="QWidget" name="dockWidgetContents"/> | ||||
|   </widget> | ||||
|   <action name="actionOpen_dir"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/照片_pic.svg</normaloff>:/icon/icons/照片_pic.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Images dir</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Open images dir.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionZoom_in"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/放大_zoom-in.svg</normaloff>:/icon/icons/放大_zoom-in.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Zoom in</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Zoom in.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionZoom_out"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/缩小_zoom-out.svg</normaloff>:/icon/icons/缩小_zoom-out.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Zoom out</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Zoom out.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionFit_wiondow"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/全宽_fullwidth.svg</normaloff>:/icon/icons/全宽_fullwidth.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Fit window</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Fit window</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Fit window.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>F</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionSetting"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/设置_setting-two.svg</normaloff>:/icon/icons/设置_setting-two.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Setting</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Setting.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionExit"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/开关_power.svg</normaloff>:/icon/icons/开关_power.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Exit</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Exit</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Exit.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionSave_dir"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/文件夹-开_folder-open.svg</normaloff>:/icon/icons/文件夹-开_folder-open.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Label dir</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Open label dir.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionSave"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/保存_save.svg</normaloff>:/icon/icons/保存_save.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Save</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Save annotation.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>S</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionPrev"> | ||||
|    <property name="checkable"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/上一步_back.svg</normaloff>:/icon/icons/上一步_back.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Prev image</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Prev image</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Prev image.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>A</string> | ||||
|    </property> | ||||
|    <property name="menuRole"> | ||||
|     <enum>QAction::TextHeuristicRole</enum> | ||||
|    </property> | ||||
|    <property name="priority"> | ||||
|     <enum>QAction::NormalPriority</enum> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionNext"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/下一步_next.svg</normaloff>:/icon/icons/下一步_next.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Next image</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Next image</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Next image.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>D</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionShortcut"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/键盘_keyboard-one.svg</normaloff>:/icon/icons/键盘_keyboard-one.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Shortcut</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionAbout"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/我的_me.svg</normaloff>:/icon/icons/我的_me.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>About</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionSegment_anything"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/M_Favicon.ico</normaloff>:/icon/icons/M_Favicon.ico</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Segment anything</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Segment anything</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Quick annotate using Segment anything.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>Q</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionDelete"> | ||||
|    <property name="enabled"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/删除_delete.svg</normaloff>:/icon/icons/删除_delete.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Delete</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Delete polygon</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Delete polygon.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>Del</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionBit_map"> | ||||
|    <property name="checkable"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/照片_pic.svg</normaloff>:/icon/icons/照片_pic.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Bit map</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Show instance or segmeent state.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>Space</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionEdit"> | ||||
|    <property name="enabled"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/编辑_edit.svg</normaloff>:/icon/icons/编辑_edit.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Edit</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Edit polygon</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Edit polygon attribute.</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionTo_top"> | ||||
|    <property name="enabled"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/去顶部_to-top.svg</normaloff>:/icon/icons/去顶部_to-top.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>To top</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Move polygon to top layer</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Move polygon to top layer.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>T</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionTo_bottom"> | ||||
|    <property name="enabled"> | ||||
|     <bool>false</bool> | ||||
|    </property> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/去底部_to-bottom.svg</normaloff>:/icon/icons/去底部_to-bottom.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>To bottom</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Move polygon to bottom layer</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Move polygon to bottom layer.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>B</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionConverter"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/转换文件夹1_folder-conversion-one.svg</normaloff>:/icon/icons/转换文件夹1_folder-conversion-one.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Label converter</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Convert annotations to png image.</string> | ||||
|    </property> | ||||
|    <property name="whatsThis"> | ||||
|     <string/> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionChinese"> | ||||
|    <property name="checkable"> | ||||
|     <bool>true</bool> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>中文</string> | ||||
|    </property> | ||||
|    <property name="font"> | ||||
|     <font> | ||||
|      <family>Times New Roman</family> | ||||
|      <pointsize>12</pointsize> | ||||
|     </font> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionEnglish"> | ||||
|    <property name="checkable"> | ||||
|     <bool>true</bool> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>English</string> | ||||
|    </property> | ||||
|    <property name="font"> | ||||
|     <font> | ||||
|      <family>Times New Roman</family> | ||||
|      <pointsize>12</pointsize> | ||||
|     </font> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionBackspace"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/删除_delete-two.svg</normaloff>:/icon/icons/删除_delete-two.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Backspace</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Backspace</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Backspace.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>Z</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionCancel"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/关闭_close-one.svg</normaloff>:/icon/icons/关闭_close-one.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Cancel</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Annotate canceled</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Annotate canceled.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>Esc</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionFinish"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/校验_check-one.svg</normaloff>:/icon/icons/校验_check-one.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Finish</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Annotate finished</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Annotate finished.</string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>E</string> | ||||
|    </property> | ||||
|   </action> | ||||
|   <action name="actionPolygon"> | ||||
|    <property name="icon"> | ||||
|     <iconset resource="../icons.qrc"> | ||||
|      <normaloff>:/icon/icons/锚点_anchor.svg</normaloff>:/icon/icons/锚点_anchor.svg</iconset> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Polygon</string> | ||||
|    </property> | ||||
|    <property name="toolTip"> | ||||
|     <string>Draw polygon</string> | ||||
|    </property> | ||||
|    <property name="statusTip"> | ||||
|     <string>Accurately annotate by drawing polygon. </string> | ||||
|    </property> | ||||
|    <property name="shortcut"> | ||||
|     <string>C</string> | ||||
|    </property> | ||||
|   </action> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										77
									
								
								ui/about_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,77 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/about_dialog.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Dialog(object): | ||||
|     def setupUi(self, Dialog): | ||||
|         Dialog.setObjectName("Dialog") | ||||
|         Dialog.resize(550, 280) | ||||
|         Dialog.setMinimumSize(QtCore.QSize(550, 280)) | ||||
|         Dialog.setMaximumSize(QtCore.QSize(550, 280)) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.widget = QtWidgets.QWidget(Dialog) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget) | ||||
|         self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) | ||||
|         self.verticalLayout_2.setSpacing(0) | ||||
|         self.verticalLayout_2.setObjectName("verticalLayout_2") | ||||
|         self.widget_2 = QtWidgets.QWidget(self.widget) | ||||
|         self.widget_2.setMaximumSize(QtCore.QSize(16777215, 40)) | ||||
|         self.widget_2.setObjectName("widget_2") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_2) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.label = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label.setMaximumSize(QtCore.QSize(16777215, 50)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(20) | ||||
|         self.label.setFont(font) | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout.addWidget(self.label) | ||||
|         self.verticalLayout_2.addWidget(self.widget_2) | ||||
|         self.widget_3 = QtWidgets.QWidget(self.widget) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.widget_3.setFont(font) | ||||
|         self.widget_3.setObjectName("widget_3") | ||||
|         self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget_3) | ||||
|         self.verticalLayout_3.setObjectName("verticalLayout_3") | ||||
|         self.label_2 = QtWidgets.QLabel(self.widget_3) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(18) | ||||
|         self.label_2.setFont(font) | ||||
|         self.label_2.setAlignment(QtCore.Qt.AlignCenter) | ||||
|         self.label_2.setObjectName("label_2") | ||||
|         self.verticalLayout_3.addWidget(self.label_2) | ||||
|         self.label_4 = QtWidgets.QLabel(self.widget_3) | ||||
|         self.label_4.setMaximumSize(QtCore.QSize(16777215, 40)) | ||||
|         self.label_4.setLayoutDirection(QtCore.Qt.LeftToRight) | ||||
|         self.label_4.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) | ||||
|         self.label_4.setObjectName("label_4") | ||||
|         self.verticalLayout_3.addWidget(self.label_4) | ||||
|         self.verticalLayout_2.addWidget(self.widget_3) | ||||
|         self.verticalLayout.addWidget(self.widget) | ||||
| 
 | ||||
|         self.retranslateUi(Dialog) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Dialog) | ||||
| 
 | ||||
|     def retranslateUi(self, Dialog): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Dialog.setWindowTitle(_translate("Dialog", "about")) | ||||
|         self.label.setText(_translate("Dialog", "About")) | ||||
|         self.label_2.setText(_translate("Dialog", "ISAT with Segment anything.")) | ||||
|         self.label_4.setText(_translate("Dialog", "ISAT Copyright (C) 2022 yatengLG.\n" | ||||
| "http://www.yatenglg.cn/isat")) | ||||
| import icons_rc | ||||
							
								
								
									
										137
									
								
								ui/about_dialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,137 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Dialog</class> | ||||
|  <widget class="QDialog" name="Dialog"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>550</width> | ||||
|     <height>280</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="minimumSize"> | ||||
|    <size> | ||||
|     <width>550</width> | ||||
|     <height>280</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="maximumSize"> | ||||
|    <size> | ||||
|     <width>550</width> | ||||
|     <height>280</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>about</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||
|       <property name="spacing"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QWidget" name="widget_2" native="true"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>16777215</width> | ||||
|           <height>40</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|          <item> | ||||
|           <widget class="QLabel" name="label"> | ||||
|            <property name="maximumSize"> | ||||
|             <size> | ||||
|              <width>16777215</width> | ||||
|              <height>50</height> | ||||
|             </size> | ||||
|            </property> | ||||
|            <property name="font"> | ||||
|             <font> | ||||
|              <family>Times New Roman</family> | ||||
|              <pointsize>20</pointsize> | ||||
|             </font> | ||||
|            </property> | ||||
|            <property name="text"> | ||||
|             <string>About</string> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|         </layout> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QWidget" name="widget_3" native="true"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <family>Times New Roman</family> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <layout class="QVBoxLayout" name="verticalLayout_3"> | ||||
|          <item> | ||||
|           <widget class="QLabel" name="label_2"> | ||||
|            <property name="font"> | ||||
|             <font> | ||||
|              <pointsize>18</pointsize> | ||||
|             </font> | ||||
|            </property> | ||||
|            <property name="text"> | ||||
|             <string>ISAT with Segment anything.</string> | ||||
|            </property> | ||||
|            <property name="alignment"> | ||||
|             <set>Qt::AlignCenter</set> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|          <item> | ||||
|           <widget class="QLabel" name="label_4"> | ||||
|            <property name="maximumSize"> | ||||
|             <size> | ||||
|              <width>16777215</width> | ||||
|              <height>40</height> | ||||
|             </size> | ||||
|            </property> | ||||
|            <property name="layoutDirection"> | ||||
|             <enum>Qt::LeftToRight</enum> | ||||
|            </property> | ||||
|            <property name="styleSheet"> | ||||
|             <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|            </property> | ||||
|            <property name="text"> | ||||
|             <string>ISAT Copyright (C) 2022 yatengLG. | ||||
| http://www.yatenglg.cn/isat</string> | ||||
|            </property> | ||||
|            <property name="alignment"> | ||||
|             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </item> | ||||
|         </layout> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										128
									
								
								ui/category_choice.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,128 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/category_choice.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Dialog(object): | ||||
|     def setupUi(self, Dialog): | ||||
|         Dialog.setObjectName("Dialog") | ||||
|         Dialog.resize(350, 400) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         Dialog.setFont(font) | ||||
|         Dialog.setWindowTitle("") | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.listWidget = QtWidgets.QListWidget(Dialog) | ||||
|         self.listWidget.setObjectName("listWidget") | ||||
|         self.verticalLayout.addWidget(self.listWidget) | ||||
|         self.widget_3 = QtWidgets.QWidget(Dialog) | ||||
|         self.widget_3.setObjectName("widget_3") | ||||
|         self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget_3) | ||||
|         self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout_3.setObjectName("horizontalLayout_3") | ||||
|         self.label_2 = QtWidgets.QLabel(self.widget_3) | ||||
|         self.label_2.setMinimumSize(QtCore.QSize(60, 0)) | ||||
|         self.label_2.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label_2.setObjectName("label_2") | ||||
|         self.horizontalLayout_3.addWidget(self.label_2) | ||||
|         self.lineEdit_category = QtWidgets.QLineEdit(self.widget_3) | ||||
|         self.lineEdit_category.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) | ||||
|         self.lineEdit_category.setReadOnly(True) | ||||
|         self.lineEdit_category.setObjectName("lineEdit_category") | ||||
|         self.horizontalLayout_3.addWidget(self.lineEdit_category) | ||||
|         self.label = QtWidgets.QLabel(self.widget_3) | ||||
|         self.label.setMinimumSize(QtCore.QSize(50, 0)) | ||||
|         self.label.setMaximumSize(QtCore.QSize(50, 16777215)) | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout_3.addWidget(self.label) | ||||
|         self.lineEdit_group = QtWidgets.QLineEdit(self.widget_3) | ||||
|         self.lineEdit_group.setMinimumSize(QtCore.QSize(60, 0)) | ||||
|         self.lineEdit_group.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.lineEdit_group.setInputMethodHints(QtCore.Qt.ImhDigitsOnly) | ||||
|         self.lineEdit_group.setText("") | ||||
|         self.lineEdit_group.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) | ||||
|         self.lineEdit_group.setObjectName("lineEdit_group") | ||||
|         self.horizontalLayout_3.addWidget(self.lineEdit_group) | ||||
|         self.verticalLayout.addWidget(self.widget_3) | ||||
|         self.widget_5 = QtWidgets.QWidget(Dialog) | ||||
|         self.widget_5.setObjectName("widget_5") | ||||
|         self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.widget_5) | ||||
|         self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout_5.setObjectName("horizontalLayout_5") | ||||
|         self.label_3 = QtWidgets.QLabel(self.widget_5) | ||||
|         self.label_3.setMinimumSize(QtCore.QSize(60, 0)) | ||||
|         self.label_3.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label_3.setObjectName("label_3") | ||||
|         self.horizontalLayout_5.addWidget(self.label_3) | ||||
|         self.lineEdit_note = QtWidgets.QLineEdit(self.widget_5) | ||||
|         self.lineEdit_note.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) | ||||
|         self.lineEdit_note.setObjectName("lineEdit_note") | ||||
|         self.horizontalLayout_5.addWidget(self.lineEdit_note) | ||||
|         self.label_4 = QtWidgets.QLabel(self.widget_5) | ||||
|         self.label_4.setMinimumSize(QtCore.QSize(50, 0)) | ||||
|         self.label_4.setMaximumSize(QtCore.QSize(50, 16777215)) | ||||
|         self.label_4.setObjectName("label_4") | ||||
|         self.horizontalLayout_5.addWidget(self.label_4) | ||||
|         self.label_layer = QtWidgets.QLabel(self.widget_5) | ||||
|         self.label_layer.setMinimumSize(QtCore.QSize(60, 0)) | ||||
|         self.label_layer.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label_layer.setText("") | ||||
|         self.label_layer.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) | ||||
|         self.label_layer.setObjectName("label_layer") | ||||
|         self.horizontalLayout_5.addWidget(self.label_layer) | ||||
|         self.verticalLayout.addWidget(self.widget_5) | ||||
|         self.widget = QtWidgets.QWidget(Dialog) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) | ||||
|         self.horizontalLayout.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.verticalLayout.addWidget(self.widget) | ||||
|         self.widget_2 = QtWidgets.QWidget(Dialog) | ||||
|         self.widget_2.setObjectName("widget_2") | ||||
|         self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_2) | ||||
|         self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout_2.setObjectName("horizontalLayout_2") | ||||
|         self.checkBox_iscrowded = QtWidgets.QCheckBox(self.widget_2) | ||||
|         self.checkBox_iscrowded.setObjectName("checkBox_iscrowded") | ||||
|         self.horizontalLayout_2.addWidget(self.checkBox_iscrowded) | ||||
|         spacerItem = QtWidgets.QSpacerItem(97, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | ||||
|         self.horizontalLayout_2.addItem(spacerItem) | ||||
|         self.pushButton_cache = QtWidgets.QPushButton(self.widget_2) | ||||
|         icon = QtGui.QIcon() | ||||
|         icon.addPixmap(QtGui.QPixmap(":/icons/icons/关闭_close-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_cache.setIcon(icon) | ||||
|         self.pushButton_cache.setObjectName("pushButton_cache") | ||||
|         self.horizontalLayout_2.addWidget(self.pushButton_cache) | ||||
|         self.pushButton_apply = QtWidgets.QPushButton(self.widget_2) | ||||
|         icon1 = QtGui.QIcon() | ||||
|         icon1.addPixmap(QtGui.QPixmap(":/icons/icons/校验_check-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_apply.setIcon(icon1) | ||||
|         self.pushButton_apply.setObjectName("pushButton_apply") | ||||
|         self.horizontalLayout_2.addWidget(self.pushButton_apply) | ||||
|         self.verticalLayout.addWidget(self.widget_2) | ||||
| 
 | ||||
|         self.retranslateUi(Dialog) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Dialog) | ||||
| 
 | ||||
|     def retranslateUi(self, Dialog): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         self.label_2.setText(_translate("Dialog", "category:")) | ||||
|         self.label.setText(_translate("Dialog", "group:")) | ||||
|         self.lineEdit_group.setPlaceholderText(_translate("Dialog", "group id")) | ||||
|         self.label_3.setText(_translate("Dialog", "note:")) | ||||
|         self.lineEdit_note.setPlaceholderText(_translate("Dialog", "add extra note here")) | ||||
|         self.label_4.setText(_translate("Dialog", "layer:")) | ||||
|         self.checkBox_iscrowded.setText(_translate("Dialog", "is crowded")) | ||||
|         self.pushButton_cache.setText(_translate("Dialog", "cache")) | ||||
|         self.pushButton_apply.setText(_translate("Dialog", "apply")) | ||||
| import icons_rc | ||||
							
								
								
									
										292
									
								
								ui/category_choice.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,292 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Dialog</class> | ||||
|  <widget class="QDialog" name="Dialog"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>350</width> | ||||
|     <height>400</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <family>Times New Roman</family> | ||||
|     <pointsize>12</pointsize> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string/> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QListWidget" name="listWidget"/> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_3" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_2"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>category:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLineEdit" name="lineEdit_category"> | ||||
|         <property name="alignment"> | ||||
|          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||
|         </property> | ||||
|         <property name="readOnly"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>50</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>50</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>group:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLineEdit" name="lineEdit_group"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="inputMethodHints"> | ||||
|          <set>Qt::ImhDigitsOnly</set> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|         <property name="alignment"> | ||||
|          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>group id</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_5" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_5"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_3"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>note:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLineEdit" name="lineEdit_note"> | ||||
|         <property name="alignment"> | ||||
|          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>add extra note here</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_4"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>50</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>50</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>layer:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_layer"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|         <property name="alignment"> | ||||
|          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_2" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QCheckBox" name="checkBox_iscrowded"> | ||||
|         <property name="text"> | ||||
|          <string>is crowded</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <spacer name="horizontalSpacer_2"> | ||||
|         <property name="orientation"> | ||||
|          <enum>Qt::Horizontal</enum> | ||||
|         </property> | ||||
|         <property name="sizeHint" stdset="0"> | ||||
|          <size> | ||||
|           <width>97</width> | ||||
|           <height>20</height> | ||||
|          </size> | ||||
|         </property> | ||||
|        </spacer> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QPushButton" name="pushButton_cache"> | ||||
|         <property name="text"> | ||||
|          <string>cache</string> | ||||
|         </property> | ||||
|         <property name="icon"> | ||||
|          <iconset resource="../icons.qrc"> | ||||
|           <normaloff>:/icons/icons/关闭_close-one.svg</normaloff>:/icons/icons/关闭_close-one.svg</iconset> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QPushButton" name="pushButton_apply"> | ||||
|         <property name="text"> | ||||
|          <string>apply</string> | ||||
|         </property> | ||||
|         <property name="icon"> | ||||
|          <iconset resource="../icons.qrc"> | ||||
|           <normaloff>:/icons/icons/校验_check-one.svg</normaloff>:/icons/icons/校验_check-one.svg</iconset> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										117
									
								
								ui/convert_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,117 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/convert_dialog.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Dialog(object): | ||||
|     def setupUi(self, Dialog): | ||||
|         Dialog.setObjectName("Dialog") | ||||
|         Dialog.setWindowModality(QtCore.Qt.NonModal) | ||||
|         Dialog.resize(450, 175) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         Dialog.setFont(font) | ||||
|         Dialog.setSizeGripEnabled(False) | ||||
|         Dialog.setModal(False) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.widget = QtWidgets.QWidget(Dialog) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.gridLayout = QtWidgets.QGridLayout(self.widget) | ||||
|         self.gridLayout.setContentsMargins(0, 0, 0, 0) | ||||
|         self.gridLayout.setObjectName("gridLayout") | ||||
|         self.lineEdit_save_root = QtWidgets.QLineEdit(self.widget) | ||||
|         self.lineEdit_save_root.setEnabled(True) | ||||
|         self.lineEdit_save_root.setReadOnly(True) | ||||
|         self.lineEdit_save_root.setObjectName("lineEdit_save_root") | ||||
|         self.gridLayout.addWidget(self.lineEdit_save_root, 3, 0, 1, 1) | ||||
|         self.pushButton_save_root = QtWidgets.QPushButton(self.widget) | ||||
|         self.pushButton_save_root.setObjectName("pushButton_save_root") | ||||
|         self.gridLayout.addWidget(self.pushButton_save_root, 3, 1, 1, 1) | ||||
|         self.checkBox_is_instance = QtWidgets.QCheckBox(self.widget) | ||||
|         self.checkBox_is_instance.setToolTip("") | ||||
|         self.checkBox_is_instance.setAccessibleName("") | ||||
|         self.checkBox_is_instance.setAccessibleDescription("") | ||||
|         self.checkBox_is_instance.setObjectName("checkBox_is_instance") | ||||
|         self.gridLayout.addWidget(self.checkBox_is_instance, 4, 1, 1, 1) | ||||
|         self.lineEdit_label_root = QtWidgets.QLineEdit(self.widget) | ||||
|         self.lineEdit_label_root.setEnabled(True) | ||||
|         self.lineEdit_label_root.setReadOnly(True) | ||||
|         self.lineEdit_label_root.setObjectName("lineEdit_label_root") | ||||
|         self.gridLayout.addWidget(self.lineEdit_label_root, 2, 0, 1, 1) | ||||
|         self.pushButton_label_root = QtWidgets.QPushButton(self.widget) | ||||
|         self.pushButton_label_root.setObjectName("pushButton_label_root") | ||||
|         self.gridLayout.addWidget(self.pushButton_label_root, 2, 1, 1, 1) | ||||
|         self.verticalLayout.addWidget(self.widget) | ||||
|         self.widget_process = QtWidgets.QWidget(Dialog) | ||||
|         self.widget_process.setObjectName("widget_process") | ||||
|         self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_process) | ||||
|         self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout_2.setObjectName("horizontalLayout_2") | ||||
|         self.progressBar = QtWidgets.QProgressBar(self.widget_process) | ||||
|         self.progressBar.setProperty("value", 0) | ||||
|         self.progressBar.setObjectName("progressBar") | ||||
|         self.horizontalLayout_2.addWidget(self.progressBar) | ||||
|         self.current_num = QtWidgets.QLabel(self.widget_process) | ||||
|         self.current_num.setText("") | ||||
|         self.current_num.setObjectName("current_num") | ||||
|         self.horizontalLayout_2.addWidget(self.current_num) | ||||
|         self.label_3 = QtWidgets.QLabel(self.widget_process) | ||||
|         self.label_3.setObjectName("label_3") | ||||
|         self.horizontalLayout_2.addWidget(self.label_3) | ||||
|         self.all_num = QtWidgets.QLabel(self.widget_process) | ||||
|         self.all_num.setText("") | ||||
|         self.all_num.setObjectName("all_num") | ||||
|         self.horizontalLayout_2.addWidget(self.all_num) | ||||
|         self.verticalLayout.addWidget(self.widget_process) | ||||
|         self.widget_2 = QtWidgets.QWidget(Dialog) | ||||
|         self.widget_2.setObjectName("widget_2") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_2) | ||||
|         self.horizontalLayout.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.label = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label.setStyleSheet("color: rgb(255, 0, 0);") | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout.addWidget(self.label) | ||||
|         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | ||||
|         self.horizontalLayout.addItem(spacerItem) | ||||
|         self.pushButton_cache = QtWidgets.QPushButton(self.widget_2) | ||||
|         icon = QtGui.QIcon() | ||||
|         icon.addPixmap(QtGui.QPixmap(":/icons/icons/关闭_close-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_cache.setIcon(icon) | ||||
|         self.pushButton_cache.setObjectName("pushButton_cache") | ||||
|         self.horizontalLayout.addWidget(self.pushButton_cache) | ||||
|         self.pushButton_apply = QtWidgets.QPushButton(self.widget_2) | ||||
|         icon1 = QtGui.QIcon() | ||||
|         icon1.addPixmap(QtGui.QPixmap(":/icons/icons/校验_check-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_apply.setIcon(icon1) | ||||
|         self.pushButton_apply.setObjectName("pushButton_apply") | ||||
|         self.horizontalLayout.addWidget(self.pushButton_apply) | ||||
|         self.verticalLayout.addWidget(self.widget_2) | ||||
| 
 | ||||
|         self.retranslateUi(Dialog) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Dialog) | ||||
| 
 | ||||
|     def retranslateUi(self, Dialog): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Dialog.setWindowTitle(_translate("Dialog", "ISAT to png converter")) | ||||
|         self.lineEdit_save_root.setPlaceholderText(_translate("Dialog", "png save root")) | ||||
|         self.pushButton_save_root.setText(_translate("Dialog", "Save root")) | ||||
|         self.checkBox_is_instance.setText(_translate("Dialog", "Is Instance")) | ||||
|         self.lineEdit_label_root.setPlaceholderText(_translate("Dialog", "ISAT annotations root")) | ||||
|         self.pushButton_label_root.setText(_translate("Dialog", "Label root")) | ||||
|         self.label_3.setAccessibleName(_translate("Dialog", "aaa")) | ||||
|         self.label_3.setText(_translate("Dialog", "/")) | ||||
|         self.label.setText(_translate("Dialog", "Convert ISAT annotations to png.")) | ||||
|         self.pushButton_cache.setText(_translate("Dialog", "cache")) | ||||
|         self.pushButton_apply.setText(_translate("Dialog", "convert")) | ||||
| import icons_rc | ||||
							
								
								
									
										224
									
								
								ui/convert_dialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,224 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Dialog</class> | ||||
|  <widget class="QDialog" name="Dialog"> | ||||
|   <property name="windowModality"> | ||||
|    <enum>Qt::NonModal</enum> | ||||
|   </property> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>450</width> | ||||
|     <height>175</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <family>Times New Roman</family> | ||||
|     <pointsize>12</pointsize> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>ISAT to png converter</string> | ||||
|   </property> | ||||
|   <property name="sizeGripEnabled"> | ||||
|    <bool>false</bool> | ||||
|   </property> | ||||
|   <property name="modal"> | ||||
|    <bool>false</bool> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <layout class="QGridLayout" name="gridLayout"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item row="3" column="0"> | ||||
|        <widget class="QLineEdit" name="lineEdit_save_root"> | ||||
|         <property name="enabled"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|         <property name="readOnly"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>png save root</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="1"> | ||||
|        <widget class="QPushButton" name="pushButton_save_root"> | ||||
|         <property name="text"> | ||||
|          <string>Save root</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="1"> | ||||
|        <widget class="QCheckBox" name="checkBox_is_instance"> | ||||
|         <property name="toolTip"> | ||||
|          <string/> | ||||
|         </property> | ||||
|         <property name="accessibleName"> | ||||
|          <string/> | ||||
|         </property> | ||||
|         <property name="accessibleDescription"> | ||||
|          <string/> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Is Instance</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="0"> | ||||
|        <widget class="QLineEdit" name="lineEdit_label_root"> | ||||
|         <property name="enabled"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|         <property name="readOnly"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>ISAT annotations root</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="1"> | ||||
|        <widget class="QPushButton" name="pushButton_label_root"> | ||||
|         <property name="text"> | ||||
|          <string>Label root</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_process" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QProgressBar" name="progressBar"> | ||||
|         <property name="value"> | ||||
|          <number>0</number> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="current_num"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_3"> | ||||
|         <property name="accessibleName"> | ||||
|          <string>aaa</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>/</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="all_num"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_2" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(255, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Convert ISAT annotations to png.</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <spacer name="horizontalSpacer"> | ||||
|         <property name="orientation"> | ||||
|          <enum>Qt::Horizontal</enum> | ||||
|         </property> | ||||
|         <property name="sizeHint" stdset="0"> | ||||
|          <size> | ||||
|           <width>40</width> | ||||
|           <height>20</height> | ||||
|          </size> | ||||
|         </property> | ||||
|        </spacer> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QPushButton" name="pushButton_cache"> | ||||
|         <property name="text"> | ||||
|          <string>cache</string> | ||||
|         </property> | ||||
|         <property name="icon"> | ||||
|          <iconset resource="../icons.qrc"> | ||||
|           <normaloff>:/icons/icons/关闭_close-one.svg</normaloff>:/icons/icons/关闭_close-one.svg</iconset> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QPushButton" name="pushButton_apply"> | ||||
|         <property name="text"> | ||||
|          <string>convert</string> | ||||
|         </property> | ||||
|         <property name="icon"> | ||||
|          <iconset resource="../icons.qrc"> | ||||
|           <normaloff>:/icons/icons/校验_check-one.svg</normaloff>:/icons/icons/校验_check-one.svg</iconset> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										724
									
								
								ui/en.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,724 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1"> | ||||
| <context> | ||||
|     <name>Dialog</name> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="119"/> | ||||
|         <source>category:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="120"/> | ||||
|         <source>group:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="121"/> | ||||
|         <source>group id</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="122"/> | ||||
|         <source>note:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="123"/> | ||||
|         <source>add extra note here</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="125"/> | ||||
|         <source>is crowded</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="124"/> | ||||
|         <source>layer:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="115"/> | ||||
|         <source>cache</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="127"/> | ||||
|         <source>apply</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="106"/> | ||||
|         <source>ISAT to png converter</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="107"/> | ||||
|         <source>png save root</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="108"/> | ||||
|         <source>Save root</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="110"/> | ||||
|         <source>ISAT annotations root</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="111"/> | ||||
|         <source>Label root</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="112"/> | ||||
|         <source>aaa</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="113"/> | ||||
|         <source>/</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="114"/> | ||||
|         <source>Convert ISAT annotations to png.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="116"/> | ||||
|         <source>convert</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="242"/> | ||||
|         <source>help</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="265"/> | ||||
|         <source>E</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="260"/> | ||||
|         <source>Del</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="245"/> | ||||
|         <source>S</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="250"/> | ||||
|         <source>Save annotation</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="247"/> | ||||
|         <source>T</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="259"/> | ||||
|         <source>Delete polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="244"/> | ||||
|         <source>B</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="262"/> | ||||
|         <source>Next image</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="246"/> | ||||
|         <source>D</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="248"/> | ||||
|         <source>A</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="253"/> | ||||
|         <source>Bit map</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="254"/> | ||||
|         <source>Space</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="256"/> | ||||
|         <source>F</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="93"/> | ||||
|         <source>Label</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="98"/> | ||||
|         <source>Apply</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="97"/> | ||||
|         <source>Cache</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="72"/> | ||||
|         <source>about</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="73"/> | ||||
|         <source>About</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="74"/> | ||||
|         <source>ISAT with Segment anything.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="75"/> | ||||
|         <source>ISAT Copyright (C) 2022 yatengLG. | ||||
| http://www.yatenglg.cn/isat</source>
 | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="109"/> | ||||
|         <source>Is Instance</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="92"/> | ||||
|         <source>Setting</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="94"/> | ||||
|         <source>Add new label</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="95"/> | ||||
|         <source>Import</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="96"/> | ||||
|         <source>Export</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="243"/> | ||||
|         <source>Shortcut</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="249"/> | ||||
|         <source>Prior image</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="269"/> | ||||
|         <source>To top</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="258"/> | ||||
|         <source>To bottom</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="255"/> | ||||
|         <source>Zoom fit</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="252"/> | ||||
|         <source>Draw polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="257"/> | ||||
|         <source>Segment anything</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="261"/> | ||||
|         <source>Q</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="263"/> | ||||
|         <source>Backspace</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="264"/> | ||||
|         <source>Z</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="266"/> | ||||
|         <source>Annotate finish</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="267"/> | ||||
|         <source>Annotate cancel</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="268"/> | ||||
|         <source>Esc</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>Form</name> | ||||
|     <message> | ||||
|         <location filename="label_dock.py" line="31"/> | ||||
|         <source>Form</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="54"/> | ||||
|         <source>/</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="89"/> | ||||
|         <source>width :</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="90"/> | ||||
|         <source>height:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="91"/> | ||||
|         <source>depth :</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="92"/> | ||||
|         <source>note:</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="93"/> | ||||
|         <source>add extra image note here</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="52"/> | ||||
|         <source>Jump to the image. Input name or index.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="53"/> | ||||
|         <source>Jump to the image.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>MainWindow</name> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="317"/> | ||||
|         <source>ISAT</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="318"/> | ||||
|         <source>File</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="319"/> | ||||
|         <source>View</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="320"/> | ||||
|         <source>Help</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="322"/> | ||||
|         <source>Tools</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="369"/> | ||||
|         <source>Edit</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="324"/> | ||||
|         <source>toolBar</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="325"/> | ||||
|         <source>Info</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="326"/> | ||||
|         <source>Labels</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="327"/> | ||||
|         <source>Files</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="330"/> | ||||
|         <source>Zoom in</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="332"/> | ||||
|         <source>Zoom out</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="335"/> | ||||
|         <source>Fit window</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="337"/> | ||||
|         <source>F</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="338"/> | ||||
|         <source>Setting</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="341"/> | ||||
|         <source>Exit</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="345"/> | ||||
|         <source>Save</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="347"/> | ||||
|         <source>S</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="349"/> | ||||
|         <source>Prev image</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="351"/> | ||||
|         <source>A</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="353"/> | ||||
|         <source>Next image</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="355"/> | ||||
|         <source>D</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="357"/> | ||||
|         <source>About</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="399"/> | ||||
|         <source>C</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="362"/> | ||||
|         <source>Delete</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="363"/> | ||||
|         <source>Delete polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="365"/> | ||||
|         <source>Del</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="366"/> | ||||
|         <source>Bit map</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="368"/> | ||||
|         <source>Space</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="370"/> | ||||
|         <source>Edit polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="395"/> | ||||
|         <source>E</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="372"/> | ||||
|         <source>To top</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="373"/> | ||||
|         <source>Move polygon to top layer</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="375"/> | ||||
|         <source>T</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="376"/> | ||||
|         <source>To bottom</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="377"/> | ||||
|         <source>Move polygon to bottom layer</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="379"/> | ||||
|         <source>B</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="380"/> | ||||
|         <source>Label converter</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="381"/> | ||||
|         <source>Convert annotations to png image.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="321"/> | ||||
|         <source>Laguage</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="328"/> | ||||
|         <source>Images dir</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="329"/> | ||||
|         <source>Open images dir.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="331"/> | ||||
|         <source>Zoom in.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="333"/> | ||||
|         <source>Zoom out.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="336"/> | ||||
|         <source>Fit window.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="339"/> | ||||
|         <source>Setting.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="342"/> | ||||
|         <source>Exit.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="343"/> | ||||
|         <source>Label dir</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="344"/> | ||||
|         <source>Open label dir.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="346"/> | ||||
|         <source>Save annotation.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="350"/> | ||||
|         <source>Prev image.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="354"/> | ||||
|         <source>Next image.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="356"/> | ||||
|         <source>Shortcut</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="359"/> | ||||
|         <source>Segment anything</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="360"/> | ||||
|         <source>Quick annotate using Segment anything.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="361"/> | ||||
|         <source>Q</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="364"/> | ||||
|         <source>Delete polygon.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="367"/> | ||||
|         <source>Show instance or segmeent state.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="371"/> | ||||
|         <source>Edit polygon attribute.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="374"/> | ||||
|         <source>Move polygon to top layer.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="378"/> | ||||
|         <source>Move polygon to bottom layer.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="382"/> | ||||
|         <source>中文</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="383"/> | ||||
|         <source>English</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="385"/> | ||||
|         <source>Backspace</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="386"/> | ||||
|         <source>Backspace.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="387"/> | ||||
|         <source>Z</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="388"/> | ||||
|         <source>Cancel</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="389"/> | ||||
|         <source>Annotate canceled</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="390"/> | ||||
|         <source>Annotate canceled.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="391"/> | ||||
|         <source>Esc</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="392"/> | ||||
|         <source>Finish</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="393"/> | ||||
|         <source>Annotate finished</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="394"/> | ||||
|         <source>Annotate finished.</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="396"/> | ||||
|         <source>Polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="397"/> | ||||
|         <source>Draw polygon</source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="398"/> | ||||
|         <source>Accurately annotate by drawing polygon. </source> | ||||
|         <translation type="unfinished"></translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
							
								
								
									
										54
									
								
								ui/file_dock.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,54 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT/ui/file_dock.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Form(object): | ||||
|     def setupUi(self, Form): | ||||
|         Form.setObjectName("Form") | ||||
|         Form.resize(264, 341) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Form) | ||||
|         self.verticalLayout.setContentsMargins(9, 9, 9, 9) | ||||
|         self.verticalLayout.setSpacing(6) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.listWidget = QtWidgets.QListWidget(Form) | ||||
|         self.listWidget.setObjectName("listWidget") | ||||
|         self.verticalLayout.addWidget(self.listWidget) | ||||
|         self.widget_num = QtWidgets.QWidget(Form) | ||||
|         self.widget_num.setObjectName("widget_num") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget_num) | ||||
|         self.horizontalLayout.setContentsMargins(0, 0, 0, 0) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.lineEdit_jump = QtWidgets.QLineEdit(self.widget_num) | ||||
|         self.lineEdit_jump.setObjectName("lineEdit_jump") | ||||
|         self.horizontalLayout.addWidget(self.lineEdit_jump) | ||||
|         self.label_current = QtWidgets.QLabel(self.widget_num) | ||||
|         self.label_current.setText("") | ||||
|         self.label_current.setObjectName("label_current") | ||||
|         self.horizontalLayout.addWidget(self.label_current) | ||||
|         self.label = QtWidgets.QLabel(self.widget_num) | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout.addWidget(self.label) | ||||
|         self.label_all = QtWidgets.QLabel(self.widget_num) | ||||
|         self.label_all.setText("") | ||||
|         self.label_all.setObjectName("label_all") | ||||
|         self.horizontalLayout.addWidget(self.label_all) | ||||
|         self.verticalLayout.addWidget(self.widget_num) | ||||
| 
 | ||||
|         self.retranslateUi(Form) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Form) | ||||
| 
 | ||||
|     def retranslateUi(self, Form): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Form.setWindowTitle(_translate("Form", "Form")) | ||||
|         self.lineEdit_jump.setToolTip(_translate("Form", "Jump to the image. Input name or index.")) | ||||
|         self.lineEdit_jump.setPlaceholderText(_translate("Form", "Jump to the image.")) | ||||
|         self.label.setText(_translate("Form", "/")) | ||||
							
								
								
									
										88
									
								
								ui/file_dock.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,88 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Form</class> | ||||
|  <widget class="QWidget" name="Form"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>264</width> | ||||
|     <height>341</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <property name="spacing"> | ||||
|     <number>6</number> | ||||
|    </property> | ||||
|    <property name="leftMargin"> | ||||
|     <number>9</number> | ||||
|    </property> | ||||
|    <property name="topMargin"> | ||||
|     <number>9</number> | ||||
|    </property> | ||||
|    <property name="rightMargin"> | ||||
|     <number>9</number> | ||||
|    </property> | ||||
|    <property name="bottomMargin"> | ||||
|     <number>9</number> | ||||
|    </property> | ||||
|    <item> | ||||
|     <widget class="QListWidget" name="listWidget"/> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_num" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLineEdit" name="lineEdit_jump"> | ||||
|         <property name="toolTip"> | ||||
|          <string>Jump to the image. Input name or index.</string> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>Jump to the image.</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_current"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="text"> | ||||
|          <string>/</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_all"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										93
									
								
								ui/info_dock.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,93 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT/ui/info_dock.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Form(object): | ||||
|     def setupUi(self, Form): | ||||
|         Form.setObjectName("Form") | ||||
|         Form.resize(347, 156) | ||||
|         Form.setMinimumSize(QtCore.QSize(0, 100)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         Form.setFont(font) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Form) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.widget = QtWidgets.QWidget(Form) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) | ||||
|         self.horizontalLayout.setContentsMargins(9, 0, 9, 0) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.label = QtWidgets.QLabel(self.widget) | ||||
|         self.label.setMinimumSize(QtCore.QSize(0, 0)) | ||||
|         self.label.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout.addWidget(self.label) | ||||
|         self.label_width = QtWidgets.QLabel(self.widget) | ||||
|         self.label_width.setText("") | ||||
|         self.label_width.setObjectName("label_width") | ||||
|         self.horizontalLayout.addWidget(self.label_width) | ||||
|         self.verticalLayout.addWidget(self.widget) | ||||
|         self.widget_2 = QtWidgets.QWidget(Form) | ||||
|         self.widget_2.setObjectName("widget_2") | ||||
|         self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_2) | ||||
|         self.horizontalLayout_2.setContentsMargins(9, 0, 9, 0) | ||||
|         self.horizontalLayout_2.setObjectName("horizontalLayout_2") | ||||
|         self.label_2 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_2.setMinimumSize(QtCore.QSize(0, 0)) | ||||
|         self.label_2.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label_2.setObjectName("label_2") | ||||
|         self.horizontalLayout_2.addWidget(self.label_2) | ||||
|         self.label_height = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_height.setText("") | ||||
|         self.label_height.setObjectName("label_height") | ||||
|         self.horizontalLayout_2.addWidget(self.label_height) | ||||
|         self.verticalLayout.addWidget(self.widget_2) | ||||
|         self.widget_4 = QtWidgets.QWidget(Form) | ||||
|         self.widget_4.setObjectName("widget_4") | ||||
|         self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.widget_4) | ||||
|         self.horizontalLayout_4.setContentsMargins(9, 0, 9, 0) | ||||
|         self.horizontalLayout_4.setObjectName("horizontalLayout_4") | ||||
|         self.label_3 = QtWidgets.QLabel(self.widget_4) | ||||
|         self.label_3.setMaximumSize(QtCore.QSize(60, 16777215)) | ||||
|         self.label_3.setObjectName("label_3") | ||||
|         self.horizontalLayout_4.addWidget(self.label_3) | ||||
|         self.label_depth = QtWidgets.QLabel(self.widget_4) | ||||
|         self.label_depth.setText("") | ||||
|         self.label_depth.setObjectName("label_depth") | ||||
|         self.horizontalLayout_4.addWidget(self.label_depth) | ||||
|         self.verticalLayout.addWidget(self.widget_4) | ||||
|         self.widget_3 = QtWidgets.QWidget(Form) | ||||
|         self.widget_3.setObjectName("widget_3") | ||||
|         self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget_3) | ||||
|         self.horizontalLayout_3.setContentsMargins(9, 0, 9, 0) | ||||
|         self.horizontalLayout_3.setObjectName("horizontalLayout_3") | ||||
|         self.label_5 = QtWidgets.QLabel(self.widget_3) | ||||
|         self.label_5.setObjectName("label_5") | ||||
|         self.horizontalLayout_3.addWidget(self.label_5) | ||||
|         self.lineEdit_note = QtWidgets.QLineEdit(self.widget_3) | ||||
|         self.lineEdit_note.setMinimumSize(QtCore.QSize(200, 0)) | ||||
|         self.lineEdit_note.setObjectName("lineEdit_note") | ||||
|         self.horizontalLayout_3.addWidget(self.lineEdit_note) | ||||
|         self.verticalLayout.addWidget(self.widget_3) | ||||
| 
 | ||||
|         self.retranslateUi(Form) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Form) | ||||
| 
 | ||||
|     def retranslateUi(self, Form): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Form.setWindowTitle(_translate("Form", "Form")) | ||||
|         self.label.setText(_translate("Form", "width :")) | ||||
|         self.label_2.setText(_translate("Form", "height:")) | ||||
|         self.label_3.setText(_translate("Form", "depth :")) | ||||
|         self.label_5.setText(_translate("Form", "note:")) | ||||
|         self.lineEdit_note.setPlaceholderText(_translate("Form", "add extra image note here")) | ||||
							
								
								
									
										197
									
								
								ui/info_dock.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,197 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Form</class> | ||||
|  <widget class="QWidget" name="Form"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>347</width> | ||||
|     <height>156</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="minimumSize"> | ||||
|    <size> | ||||
|     <width>0</width> | ||||
|     <height>100</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <family>Times New Roman</family> | ||||
|     <pointsize>12</pointsize> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>0</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>width :</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_width"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_2" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_2"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>0</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>height:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_height"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_4" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_4"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_3"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>60</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>depth :</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_depth"> | ||||
|         <property name="text"> | ||||
|          <string/> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_3" native="true"> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||
|       <property name="leftMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="topMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <property name="rightMargin"> | ||||
|        <number>9</number> | ||||
|       </property> | ||||
|       <property name="bottomMargin"> | ||||
|        <number>0</number> | ||||
|       </property> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label_5"> | ||||
|         <property name="text"> | ||||
|          <string>note:</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QLineEdit" name="lineEdit_note"> | ||||
|         <property name="minimumSize"> | ||||
|          <size> | ||||
|           <width>200</width> | ||||
|           <height>0</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="placeholderText"> | ||||
|          <string>add extra image note here</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										31
									
								
								ui/label_dock.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,31 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT/ui/label_dock.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Form(object): | ||||
|     def setupUi(self, Form): | ||||
|         Form.setObjectName("Form") | ||||
|         Form.resize(250, 304) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Form) | ||||
|         self.verticalLayout.setContentsMargins(2, 2, 2, 2) | ||||
|         self.verticalLayout.setSpacing(0) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.listWidget = QtWidgets.QListWidget(Form) | ||||
|         self.listWidget.setObjectName("listWidget") | ||||
|         self.verticalLayout.addWidget(self.listWidget) | ||||
| 
 | ||||
|         self.retranslateUi(Form) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Form) | ||||
| 
 | ||||
|     def retranslateUi(self, Form): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Form.setWindowTitle(_translate("Form", "Form")) | ||||
							
								
								
									
										39
									
								
								ui/label_dock.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,39 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Form</class> | ||||
|  <widget class="QWidget" name="Form"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>250</width> | ||||
|     <height>304</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Form</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <property name="spacing"> | ||||
|     <number>0</number> | ||||
|    </property> | ||||
|    <property name="leftMargin"> | ||||
|     <number>2</number> | ||||
|    </property> | ||||
|    <property name="topMargin"> | ||||
|     <number>2</number> | ||||
|    </property> | ||||
|    <property name="rightMargin"> | ||||
|     <number>2</number> | ||||
|    </property> | ||||
|    <property name="bottomMargin"> | ||||
|     <number>2</number> | ||||
|    </property> | ||||
|    <item> | ||||
|     <widget class="QListWidget" name="listWidget"/> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										99
									
								
								ui/setting_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,99 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/setting_dialog.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Dialog(object): | ||||
|     def setupUi(self, Dialog): | ||||
|         Dialog.setObjectName("Dialog") | ||||
|         Dialog.resize(607, 369) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         Dialog.setFont(font) | ||||
|         self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) | ||||
|         self.verticalLayout_2.setObjectName("verticalLayout_2") | ||||
|         self.widget = QtWidgets.QWidget(Dialog) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(self.widget) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.label = QtWidgets.QLabel(self.widget) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(20) | ||||
|         self.label.setFont(font) | ||||
|         self.label.setObjectName("label") | ||||
|         self.verticalLayout.addWidget(self.label) | ||||
|         self.category_list_widget = QtWidgets.QListWidget(self.widget) | ||||
|         self.category_list_widget.setObjectName("category_list_widget") | ||||
|         self.verticalLayout.addWidget(self.category_list_widget) | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout() | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.category_input = QtWidgets.QLineEdit(self.widget) | ||||
|         self.category_input.setObjectName("category_input") | ||||
|         self.horizontalLayout.addWidget(self.category_input) | ||||
|         self.color_button = QtWidgets.QToolButton(self.widget) | ||||
|         self.color_button.setStyleSheet("background-color: rgb(0, 255, 0);") | ||||
|         self.color_button.setText("") | ||||
|         self.color_button.setObjectName("color_button") | ||||
|         self.horizontalLayout.addWidget(self.color_button) | ||||
|         self.add_button = QtWidgets.QPushButton(self.widget) | ||||
|         self.add_button.setMinimumSize(QtCore.QSize(150, 0)) | ||||
|         self.add_button.setSizeIncrement(QtCore.QSize(0, 0)) | ||||
|         icon = QtGui.QIcon() | ||||
|         icon.addPixmap(QtGui.QPixmap(":/icons/icons/书签_bookmark-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.add_button.setIcon(icon) | ||||
|         self.add_button.setObjectName("add_button") | ||||
|         self.horizontalLayout.addWidget(self.add_button) | ||||
|         self.verticalLayout.addLayout(self.horizontalLayout) | ||||
|         self.horizontalLayout_2 = QtWidgets.QHBoxLayout() | ||||
|         self.horizontalLayout_2.setObjectName("horizontalLayout_2") | ||||
|         self.pushButton_import = QtWidgets.QPushButton(self.widget) | ||||
|         icon1 = QtGui.QIcon() | ||||
|         icon1.addPixmap(QtGui.QPixmap(":/icons/icons/传入3_afferent-three.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_import.setIcon(icon1) | ||||
|         self.pushButton_import.setObjectName("pushButton_import") | ||||
|         self.horizontalLayout_2.addWidget(self.pushButton_import) | ||||
|         self.pushButton_export = QtWidgets.QPushButton(self.widget) | ||||
|         icon2 = QtGui.QIcon() | ||||
|         icon2.addPixmap(QtGui.QPixmap(":/icons/icons/传出3_efferent-three.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.pushButton_export.setIcon(icon2) | ||||
|         self.pushButton_export.setObjectName("pushButton_export") | ||||
|         self.horizontalLayout_2.addWidget(self.pushButton_export) | ||||
|         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) | ||||
|         self.horizontalLayout_2.addItem(spacerItem) | ||||
|         self.cache_button = QtWidgets.QPushButton(self.widget) | ||||
|         icon3 = QtGui.QIcon() | ||||
|         icon3.addPixmap(QtGui.QPixmap(":/icons/icons/关闭_close-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.cache_button.setIcon(icon3) | ||||
|         self.cache_button.setObjectName("cache_button") | ||||
|         self.horizontalLayout_2.addWidget(self.cache_button) | ||||
|         self.apply_button = QtWidgets.QPushButton(self.widget) | ||||
|         icon4 = QtGui.QIcon() | ||||
|         icon4.addPixmap(QtGui.QPixmap(":/icons/icons/校验_check-one.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||||
|         self.apply_button.setIcon(icon4) | ||||
|         self.apply_button.setObjectName("apply_button") | ||||
|         self.horizontalLayout_2.addWidget(self.apply_button) | ||||
|         self.verticalLayout.addLayout(self.horizontalLayout_2) | ||||
|         self.verticalLayout_2.addWidget(self.widget) | ||||
| 
 | ||||
|         self.retranslateUi(Dialog) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Dialog) | ||||
| 
 | ||||
|     def retranslateUi(self, Dialog): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Dialog.setWindowTitle(_translate("Dialog", "Setting")) | ||||
|         self.label.setText(_translate("Dialog", "Label")) | ||||
|         self.add_button.setText(_translate("Dialog", "Add new label")) | ||||
|         self.pushButton_import.setText(_translate("Dialog", "Import")) | ||||
|         self.pushButton_export.setText(_translate("Dialog", "Export")) | ||||
|         self.cache_button.setText(_translate("Dialog", "Cache")) | ||||
|         self.apply_button.setText(_translate("Dialog", "Apply")) | ||||
| import icons_rc | ||||
							
								
								
									
										151
									
								
								ui/setting_dialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,151 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Dialog</class> | ||||
|  <widget class="QDialog" name="Dialog"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>607</width> | ||||
|     <height>369</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <family>Times New Roman</family> | ||||
|     <pointsize>12</pointsize> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Setting</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout_2"> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>20</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Label</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QListWidget" name="category_list_widget"/> | ||||
|       </item> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|         <item> | ||||
|          <widget class="QLineEdit" name="category_input"/> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QToolButton" name="color_button"> | ||||
|           <property name="styleSheet"> | ||||
|            <string notr="true">background-color: rgb(0, 255, 0);</string> | ||||
|           </property> | ||||
|           <property name="text"> | ||||
|            <string/> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QPushButton" name="add_button"> | ||||
|           <property name="minimumSize"> | ||||
|            <size> | ||||
|             <width>150</width> | ||||
|             <height>0</height> | ||||
|            </size> | ||||
|           </property> | ||||
|           <property name="sizeIncrement"> | ||||
|            <size> | ||||
|             <width>0</width> | ||||
|             <height>0</height> | ||||
|            </size> | ||||
|           </property> | ||||
|           <property name="text"> | ||||
|            <string>Add new label</string> | ||||
|           </property> | ||||
|           <property name="icon"> | ||||
|            <iconset resource="../icons.qrc"> | ||||
|             <normaloff>:/icons/icons/书签_bookmark-one.svg</normaloff>:/icons/icons/书签_bookmark-one.svg</iconset> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </item> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|         <item> | ||||
|          <widget class="QPushButton" name="pushButton_import"> | ||||
|           <property name="text"> | ||||
|            <string>Import</string> | ||||
|           </property> | ||||
|           <property name="icon"> | ||||
|            <iconset resource="../icons.qrc"> | ||||
|             <normaloff>:/icons/icons/传入3_afferent-three.svg</normaloff>:/icons/icons/传入3_afferent-three.svg</iconset> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QPushButton" name="pushButton_export"> | ||||
|           <property name="text"> | ||||
|            <string>Export</string> | ||||
|           </property> | ||||
|           <property name="icon"> | ||||
|            <iconset resource="../icons.qrc"> | ||||
|             <normaloff>:/icons/icons/传出3_efferent-three.svg</normaloff>:/icons/icons/传出3_efferent-three.svg</iconset> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <spacer name="horizontalSpacer"> | ||||
|           <property name="orientation"> | ||||
|            <enum>Qt::Horizontal</enum> | ||||
|           </property> | ||||
|           <property name="sizeHint" stdset="0"> | ||||
|            <size> | ||||
|             <width>40</width> | ||||
|             <height>20</height> | ||||
|            </size> | ||||
|           </property> | ||||
|          </spacer> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QPushButton" name="cache_button"> | ||||
|           <property name="text"> | ||||
|            <string>Cache</string> | ||||
|           </property> | ||||
|           <property name="icon"> | ||||
|            <iconset resource="../icons.qrc"> | ||||
|             <normaloff>:/icons/icons/关闭_close-one.svg</normaloff>:/icons/icons/关闭_close-one.svg</iconset> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QPushButton" name="apply_button"> | ||||
|           <property name="text"> | ||||
|            <string>Apply</string> | ||||
|           </property> | ||||
|           <property name="icon"> | ||||
|            <iconset resource="../icons.qrc"> | ||||
|             <normaloff>:/icons/icons/校验_check-one.svg</normaloff>:/icons/icons/校验_check-one.svg</iconset> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										270
									
								
								ui/shortcut_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,270 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| # Form implementation generated from reading ui file '/home/super/PycharmProjects/ISAT_with_segment_anything/ui/shortcut_dialog.ui' | ||||
| # | ||||
| # Created by: PyQt5 UI code generator 5.15.7 | ||||
| # | ||||
| # WARNING: Any manual changes made to this file will be lost when pyuic5 is | ||||
| # run again.  Do not edit this file unless you know what you are doing. | ||||
| 
 | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtGui, QtWidgets | ||||
| 
 | ||||
| 
 | ||||
| class Ui_Dialog(object): | ||||
|     def setupUi(self, Dialog): | ||||
|         Dialog.setObjectName("Dialog") | ||||
|         Dialog.resize(600, 300) | ||||
|         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) | ||||
|         sizePolicy.setHorizontalStretch(0) | ||||
|         sizePolicy.setVerticalStretch(0) | ||||
|         sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) | ||||
|         Dialog.setSizePolicy(sizePolicy) | ||||
|         Dialog.setMinimumSize(QtCore.QSize(600, 300)) | ||||
|         Dialog.setMaximumSize(QtCore.QSize(600, 300)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setKerning(True) | ||||
|         Dialog.setFont(font) | ||||
|         self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) | ||||
|         self.verticalLayout.setObjectName("verticalLayout") | ||||
|         self.widget = QtWidgets.QWidget(Dialog) | ||||
|         self.widget.setMinimumSize(QtCore.QSize(0, 60)) | ||||
|         self.widget.setMaximumSize(QtCore.QSize(16777215, 60)) | ||||
|         self.widget.setObjectName("widget") | ||||
|         self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) | ||||
|         self.horizontalLayout.setObjectName("horizontalLayout") | ||||
|         self.label = QtWidgets.QLabel(self.widget) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(20) | ||||
|         font.setBold(False) | ||||
|         font.setItalic(False) | ||||
|         font.setWeight(50) | ||||
|         self.label.setFont(font) | ||||
|         self.label.setTextFormat(QtCore.Qt.AutoText) | ||||
|         self.label.setObjectName("label") | ||||
|         self.horizontalLayout.addWidget(self.label) | ||||
|         self.verticalLayout.addWidget(self.widget) | ||||
|         self.widget_2 = QtWidgets.QWidget(Dialog) | ||||
|         font = QtGui.QFont() | ||||
|         font.setFamily("Times New Roman") | ||||
|         font.setPointSize(12) | ||||
|         self.widget_2.setFont(font) | ||||
|         self.widget_2.setObjectName("widget_2") | ||||
|         self.gridLayout = QtWidgets.QGridLayout(self.widget_2) | ||||
|         self.gridLayout.setObjectName("gridLayout") | ||||
|         self.label_20 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_20.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_20.setFont(font) | ||||
|         self.label_20.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_20.setObjectName("label_20") | ||||
|         self.gridLayout.addWidget(self.label_20, 5, 3, 1, 1) | ||||
|         self.label_19 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_19.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_19.setFont(font) | ||||
|         self.label_19.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_19.setObjectName("label_19") | ||||
|         self.gridLayout.addWidget(self.label_19, 4, 3, 1, 1) | ||||
|         self.label_17 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_17.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_17.setFont(font) | ||||
|         self.label_17.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_17.setObjectName("label_17") | ||||
|         self.gridLayout.addWidget(self.label_17, 0, 3, 1, 1) | ||||
|         self.label_15 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_15.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_15.setFont(font) | ||||
|         self.label_15.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_15.setObjectName("label_15") | ||||
|         self.gridLayout.addWidget(self.label_15, 5, 1, 1, 1) | ||||
|         self.label_7 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_7.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_7.setFont(font) | ||||
|         self.label_7.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_7.setObjectName("label_7") | ||||
|         self.gridLayout.addWidget(self.label_7, 0, 1, 1, 1) | ||||
|         self.label_2 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_2.setFont(font) | ||||
|         self.label_2.setObjectName("label_2") | ||||
|         self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) | ||||
|         self.label_10 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_10.setFont(font) | ||||
|         self.label_10.setObjectName("label_10") | ||||
|         self.gridLayout.addWidget(self.label_10, 4, 2, 1, 1) | ||||
|         self.label_18 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_18.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_18.setFont(font) | ||||
|         self.label_18.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_18.setObjectName("label_18") | ||||
|         self.gridLayout.addWidget(self.label_18, 1, 3, 1, 1) | ||||
|         self.label_5 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_5.setFont(font) | ||||
|         self.label_5.setObjectName("label_5") | ||||
|         self.gridLayout.addWidget(self.label_5, 1, 2, 1, 1) | ||||
|         self.label_14 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_14.setFont(font) | ||||
|         self.label_14.setObjectName("label_14") | ||||
|         self.gridLayout.addWidget(self.label_14, 6, 0, 1, 1) | ||||
|         self.label_16 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_16.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_16.setFont(font) | ||||
|         self.label_16.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_16.setObjectName("label_16") | ||||
|         self.gridLayout.addWidget(self.label_16, 6, 1, 1, 1) | ||||
|         self.label_11 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_11.setFont(font) | ||||
|         self.label_11.setObjectName("label_11") | ||||
|         self.gridLayout.addWidget(self.label_11, 6, 2, 1, 1) | ||||
|         self.label_21 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_21.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_21.setFont(font) | ||||
|         self.label_21.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_21.setObjectName("label_21") | ||||
|         self.gridLayout.addWidget(self.label_21, 6, 3, 1, 1) | ||||
|         self.label_4 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_4.setFont(font) | ||||
|         self.label_4.setObjectName("label_4") | ||||
|         self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1) | ||||
|         self.label_9 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_9.setFont(font) | ||||
|         self.label_9.setObjectName("label_9") | ||||
|         self.gridLayout.addWidget(self.label_9, 5, 2, 1, 1) | ||||
|         self.label_6 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_6.setFont(font) | ||||
|         self.label_6.setObjectName("label_6") | ||||
|         self.gridLayout.addWidget(self.label_6, 4, 0, 1, 1) | ||||
|         self.label_13 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_13.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_13.setFont(font) | ||||
|         self.label_13.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_13.setObjectName("label_13") | ||||
|         self.gridLayout.addWidget(self.label_13, 4, 1, 1, 1) | ||||
|         self.label_12 = QtWidgets.QLabel(self.widget_2) | ||||
|         self.label_12.setMaximumSize(QtCore.QSize(80, 16777215)) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_12.setFont(font) | ||||
|         self.label_12.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_12.setObjectName("label_12") | ||||
|         self.gridLayout.addWidget(self.label_12, 1, 1, 1, 1) | ||||
|         self.label_3 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_3.setFont(font) | ||||
|         self.label_3.setObjectName("label_3") | ||||
|         self.gridLayout.addWidget(self.label_3, 0, 2, 1, 1) | ||||
|         self.label_22 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_22.setFont(font) | ||||
|         self.label_22.setObjectName("label_22") | ||||
|         self.gridLayout.addWidget(self.label_22, 2, 0, 1, 1) | ||||
|         self.label_23 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_23.setFont(font) | ||||
|         self.label_23.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_23.setObjectName("label_23") | ||||
|         self.gridLayout.addWidget(self.label_23, 2, 1, 1, 1) | ||||
|         self.label_25 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_25.setFont(font) | ||||
|         self.label_25.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_25.setObjectName("label_25") | ||||
|         self.gridLayout.addWidget(self.label_25, 2, 3, 1, 1) | ||||
|         self.label_24 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_24.setFont(font) | ||||
|         self.label_24.setObjectName("label_24") | ||||
|         self.gridLayout.addWidget(self.label_24, 2, 2, 1, 1) | ||||
|         self.label_26 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_26.setFont(font) | ||||
|         self.label_26.setObjectName("label_26") | ||||
|         self.gridLayout.addWidget(self.label_26, 3, 0, 1, 1) | ||||
|         self.label_27 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_27.setFont(font) | ||||
|         self.label_27.setStyleSheet("color: rgb(133, 0, 0);") | ||||
|         self.label_27.setObjectName("label_27") | ||||
|         self.gridLayout.addWidget(self.label_27, 3, 1, 1, 1) | ||||
|         self.label_8 = QtWidgets.QLabel(self.widget_2) | ||||
|         font = QtGui.QFont() | ||||
|         font.setPointSize(12) | ||||
|         self.label_8.setFont(font) | ||||
|         self.label_8.setObjectName("label_8") | ||||
|         self.gridLayout.addWidget(self.label_8, 5, 0, 1, 1) | ||||
|         self.verticalLayout.addWidget(self.widget_2) | ||||
| 
 | ||||
|         self.retranslateUi(Dialog) | ||||
|         QtCore.QMetaObject.connectSlotsByName(Dialog) | ||||
| 
 | ||||
|     def retranslateUi(self, Dialog): | ||||
|         _translate = QtCore.QCoreApplication.translate | ||||
|         Dialog.setWindowTitle(_translate("Dialog", "help")) | ||||
|         self.label.setText(_translate("Dialog", "Shortcut")) | ||||
|         self.label_20.setText(_translate("Dialog", "B")) | ||||
|         self.label_19.setText(_translate("Dialog", "S")) | ||||
|         self.label_17.setText(_translate("Dialog", "D")) | ||||
|         self.label_15.setText(_translate("Dialog", "T")) | ||||
|         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_5.setText(_translate("Dialog", "Draw polygon")) | ||||
|         self.label_14.setText(_translate("Dialog", "Bit map")) | ||||
|         self.label_16.setText(_translate("Dialog", "Space")) | ||||
|         self.label_11.setText(_translate("Dialog", "Zoom fit")) | ||||
|         self.label_21.setText(_translate("Dialog", "F")) | ||||
|         self.label_4.setText(_translate("Dialog", "Segment anything")) | ||||
|         self.label_9.setText(_translate("Dialog", "To bottom")) | ||||
|         self.label_6.setText(_translate("Dialog", "Delete polygon")) | ||||
|         self.label_13.setText(_translate("Dialog", "Del")) | ||||
|         self.label_12.setText(_translate("Dialog", "Q")) | ||||
|         self.label_3.setText(_translate("Dialog", "Next image")) | ||||
|         self.label_22.setText(_translate("Dialog", "Backspace")) | ||||
|         self.label_23.setText(_translate("Dialog", "Z")) | ||||
|         self.label_25.setText(_translate("Dialog", "E")) | ||||
|         self.label_24.setText(_translate("Dialog", "Annotate finish")) | ||||
|         self.label_26.setText(_translate("Dialog", "Annotate cancel")) | ||||
|         self.label_27.setText(_translate("Dialog", "Esc")) | ||||
|         self.label_8.setText(_translate("Dialog", "To top")) | ||||
| import icons_rc | ||||
							
								
								
									
										506
									
								
								ui/shortcut_dialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,506 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>Dialog</class> | ||||
|  <widget class="QDialog" name="Dialog"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>600</width> | ||||
|     <height>300</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="sizePolicy"> | ||||
|    <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> | ||||
|     <horstretch>0</horstretch> | ||||
|     <verstretch>0</verstretch> | ||||
|    </sizepolicy> | ||||
|   </property> | ||||
|   <property name="minimumSize"> | ||||
|    <size> | ||||
|     <width>600</width> | ||||
|     <height>300</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="maximumSize"> | ||||
|    <size> | ||||
|     <width>600</width> | ||||
|     <height>300</height> | ||||
|    </size> | ||||
|   </property> | ||||
|   <property name="font"> | ||||
|    <font> | ||||
|     <kerning>true</kerning> | ||||
|    </font> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>help</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget" native="true"> | ||||
|      <property name="minimumSize"> | ||||
|       <size> | ||||
|        <width>0</width> | ||||
|        <height>60</height> | ||||
|       </size> | ||||
|      </property> | ||||
|      <property name="maximumSize"> | ||||
|       <size> | ||||
|        <width>16777215</width> | ||||
|        <height>60</height> | ||||
|       </size> | ||||
|      </property> | ||||
|      <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|       <item> | ||||
|        <widget class="QLabel" name="label"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <family>Times New Roman</family> | ||||
|           <pointsize>20</pointsize> | ||||
|           <weight>50</weight> | ||||
|           <italic>false</italic> | ||||
|           <bold>false</bold> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Shortcut</string> | ||||
|         </property> | ||||
|         <property name="textFormat"> | ||||
|          <enum>Qt::AutoText</enum> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QWidget" name="widget_2" native="true"> | ||||
|      <property name="font"> | ||||
|       <font> | ||||
|        <family>Times New Roman</family> | ||||
|        <pointsize>12</pointsize> | ||||
|       </font> | ||||
|      </property> | ||||
|      <layout class="QGridLayout" name="gridLayout"> | ||||
|       <item row="5" column="3"> | ||||
|        <widget class="QLabel" name="label_20"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>B</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="3"> | ||||
|        <widget class="QLabel" name="label_19"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>S</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="3"> | ||||
|        <widget class="QLabel" name="label_17"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>D</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="5" column="1"> | ||||
|        <widget class="QLabel" name="label_15"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>T</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QLabel" name="label_7"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>A</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="label_2"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Prior image</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="2"> | ||||
|        <widget class="QLabel" name="label_10"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Save annotation</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="3"> | ||||
|        <widget class="QLabel" name="label_18"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>E</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="2"> | ||||
|        <widget class="QLabel" name="label_5"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Draw polygon</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="0"> | ||||
|        <widget class="QLabel" name="label_14"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Bit map</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="1"> | ||||
|        <widget class="QLabel" name="label_16"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Space</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="2"> | ||||
|        <widget class="QLabel" name="label_11"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Zoom fit</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="6" column="3"> | ||||
|        <widget class="QLabel" name="label_21"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>F</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="label_4"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Segment anything</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="5" column="2"> | ||||
|        <widget class="QLabel" name="label_9"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>To bottom</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="0"> | ||||
|        <widget class="QLabel" name="label_6"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Delete polygon</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="4" column="1"> | ||||
|        <widget class="QLabel" name="label_13"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Del</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="1"> | ||||
|        <widget class="QLabel" name="label_12"> | ||||
|         <property name="maximumSize"> | ||||
|          <size> | ||||
|           <width>80</width> | ||||
|           <height>16777215</height> | ||||
|          </size> | ||||
|         </property> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Q</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="2"> | ||||
|        <widget class="QLabel" name="label_3"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Next image</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="0"> | ||||
|        <widget class="QLabel" name="label_22"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Backspace</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="1"> | ||||
|        <widget class="QLabel" name="label_23"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Z</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="3"> | ||||
|        <widget class="QLabel" name="label_25"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>E</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="2" column="2"> | ||||
|        <widget class="QLabel" name="label_24"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Annotate finish</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="0"> | ||||
|        <widget class="QLabel" name="label_26"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Annotate cancel</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="3" column="1"> | ||||
|        <widget class="QLabel" name="label_27"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="styleSheet"> | ||||
|          <string notr="true">color: rgb(133, 0, 0);</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Esc</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="5" column="0"> | ||||
|        <widget class="QLabel" name="label_8"> | ||||
|         <property name="font"> | ||||
|          <font> | ||||
|           <pointsize>12</pointsize> | ||||
|          </font> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>To top</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources> | ||||
|   <include location="../icons.qrc"/> | ||||
|  </resources> | ||||
|  <connections/> | ||||
| </ui> | ||||
							
								
								
									
										
											BIN
										
									
								
								ui/zh_CN.qm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										904
									
								
								ui/zh_CN.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,904 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!DOCTYPE TS> | ||||
| <TS version="2.1" language="zh_CN" sourcelanguage="en"> | ||||
| <context> | ||||
|     <name>Dialog</name> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="119"/> | ||||
|         <source>category:</source> | ||||
|         <translation>类别:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="120"/> | ||||
|         <source>group:</source> | ||||
|         <translation>组:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="121"/> | ||||
|         <source>group id</source> | ||||
|         <translation>id</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="122"/> | ||||
|         <source>note:</source> | ||||
|         <translation>注释:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="123"/> | ||||
|         <source>add extra note here</source> | ||||
|         <translation>为标签添加额外注释</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="125"/> | ||||
|         <source>is crowded</source> | ||||
|         <translation>拥挤</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="124"/> | ||||
|         <source>layer:</source> | ||||
|         <translation>图层:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="115"/> | ||||
|         <source>cache</source> | ||||
|         <translation>取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="category_choice.py" line="127"/> | ||||
|         <source>apply</source> | ||||
|         <translation>应用</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="106"/> | ||||
|         <source>ISAT to png converter</source> | ||||
|         <translation>ISAT标签文件转png</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="107"/> | ||||
|         <source>png save root</source> | ||||
|         <translation>png保存路径</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="108"/> | ||||
|         <source>Save root</source> | ||||
|         <translation>保存路径</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="109"/> | ||||
|         <source>Is Instance</source> | ||||
|         <translation>实例分割</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="110"/> | ||||
|         <source>ISAT annotations root</source> | ||||
|         <translation>ISAT标注文件路径</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="111"/> | ||||
|         <source>Label root</source> | ||||
|         <translation>标注路径</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="112"/> | ||||
|         <source>aaa</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="113"/> | ||||
|         <source>/</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="114"/> | ||||
|         <source>Convert ISAT annotations to png.</source> | ||||
|         <translation>将ISAT标注文件转换为png图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="convert_dialog.py" line="116"/> | ||||
|         <source>convert</source> | ||||
|         <translation>转换</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="242"/> | ||||
|         <source>help</source> | ||||
|         <translation>帮助</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="487"/> | ||||
|         <source>ISAT</source> | ||||
|         <translation type="obsolete">ISAT 图片分割标注工具</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="488"/> | ||||
|         <source>Polygon</source> | ||||
|         <translation type="obsolete">多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="489"/> | ||||
|         <source>Move polygon to bottom</source> | ||||
|         <translation type="obsolete">多边形置于底层</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="265"/> | ||||
|         <source>E</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="149"/> | ||||
|         <source>Create polygon</source> | ||||
|         <translation type="obsolete">创建多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="492"/> | ||||
|         <source>Move polygon to top</source> | ||||
|         <translation type="obsolete">多边形置于顶层</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="260"/> | ||||
|         <source>Del</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="245"/> | ||||
|         <source>S</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="250"/> | ||||
|         <source>Save annotation</source> | ||||
|         <translation>保存标注文件</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="247"/> | ||||
|         <source>T</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="259"/> | ||||
|         <source>Delete polygon</source> | ||||
|         <translation>删除多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="151"/> | ||||
|         <source>Edit polygon</source> | ||||
|         <translation type="obsolete">编辑多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="244"/> | ||||
|         <source>B</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="501"/> | ||||
|         <source>File</source> | ||||
|         <translation type="obsolete">文件</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="262"/> | ||||
|         <source>Next image</source> | ||||
|         <translation>下一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="246"/> | ||||
|         <source>D</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="504"/> | ||||
|         <source>Prev image</source> | ||||
|         <translation type="obsolete">上一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="248"/> | ||||
|         <source>A</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="506"/> | ||||
|         <source>Open annotations dir</source> | ||||
|         <translation type="obsolete">标签保存位置</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="507"/> | ||||
|         <source>Open images dir</source> | ||||
|         <translation type="obsolete">打开图片文件夹</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="508"/> | ||||
|         <source>Open image</source> | ||||
|         <translation type="obsolete">打开图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="509"/> | ||||
|         <source>View</source> | ||||
|         <translation type="obsolete">视图</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="253"/> | ||||
|         <source>Bit map</source> | ||||
|         <translation>位图</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="254"/> | ||||
|         <source>Space</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="256"/> | ||||
|         <source>F</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="514"/> | ||||
|         <source>Zoom out</source> | ||||
|         <translation type="obsolete">缩小</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="515"/> | ||||
|         <source>Fit window</source> | ||||
|         <translation type="obsolete">窗口大小</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="517"/> | ||||
|         <source>Zoom in</source> | ||||
|         <translation type="obsolete">放大</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="518"/> | ||||
|         <source>Move image</source> | ||||
|         <translation type="obsolete">移动图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="519"/> | ||||
|         <source>Mouse(press left button) or ââââ</source> | ||||
|         <translation type="obsolete">鼠标左键拖动或←↑→↓</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="230"/> | ||||
|         <source>Display</source> | ||||
|         <translation type="obsolete">显示</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="93"/> | ||||
|         <source>Label</source> | ||||
|         <translation>标签</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="232"/> | ||||
|         <source>nohover size</source> | ||||
|         <translation type="obsolete">非悬停时尺寸</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="233"/> | ||||
|         <source>hover alpha</source> | ||||
|         <translation type="obsolete">悬停时透明度</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="234"/> | ||||
|         <source>Vertex</source> | ||||
|         <translation type="obsolete">顶点</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="231"/> | ||||
|         <source>hover size</source> | ||||
|         <translation type="obsolete">悬停时尺寸</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="235"/> | ||||
|         <source>nohover alpha</source> | ||||
|         <translation type="obsolete">非悬停时透明度</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="238"/> | ||||
|         <source>Add new category</source> | ||||
|         <translation type="obsolete">添加新类别</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="239"/> | ||||
|         <source>Add</source> | ||||
|         <translation type="obsolete">添加</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="98"/> | ||||
|         <source>Apply</source> | ||||
|         <translation>应用</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="97"/> | ||||
|         <source>Cache</source> | ||||
|         <translation>取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="92"/> | ||||
|         <source>Setting</source> | ||||
|         <translation>设置</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="95"/> | ||||
|         <source>Import</source> | ||||
|         <translation>导入</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="96"/> | ||||
|         <source>Export</source> | ||||
|         <translation>导出</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="72"/> | ||||
|         <source>about</source> | ||||
|         <translation>关于</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="73"/> | ||||
|         <source>About</source> | ||||
|         <translation>关于</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="74"/> | ||||
|         <source>ISAT with Segment anything.</source> | ||||
|         <translation type="unfinished">ISAT集成Segment anything.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="about_dialog.py" line="75"/> | ||||
|         <source>ISAT Copyright (C) 2022 yatengLG. | ||||
| http://www.yatenglg.cn/isat</source>
 | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="setting_dialog.py" line="94"/> | ||||
|         <source>Add new label</source> | ||||
|         <translation>添加新类别</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="243"/> | ||||
|         <source>Shortcut</source> | ||||
|         <translation>快捷键</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="249"/> | ||||
|         <source>Prior image</source> | ||||
|         <translation>上一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="269"/> | ||||
|         <source>To top</source> | ||||
|         <translation>置顶</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="258"/> | ||||
|         <source>To bottom</source> | ||||
|         <translation>置底</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="255"/> | ||||
|         <source>Zoom fit</source> | ||||
|         <translation>适应窗口</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="252"/> | ||||
|         <source>Draw polygon</source> | ||||
|         <translation>绘制多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="257"/> | ||||
|         <source>Segment anything</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="261"/> | ||||
|         <source>Q</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="263"/> | ||||
|         <source>Backspace</source> | ||||
|         <translation>回退</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="264"/> | ||||
|         <source>Z</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="266"/> | ||||
|         <source>Annotate finish</source> | ||||
|         <translation>标注完成</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="267"/> | ||||
|         <source>Annotate cancel</source> | ||||
|         <translation>标注取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="shortcut_dialog.py" line="268"/> | ||||
|         <source>Esc</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>Form</name> | ||||
|     <message> | ||||
|         <location filename="label_dock.py" line="31"/> | ||||
|         <source>Form</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="54"/> | ||||
|         <source>/</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="89"/> | ||||
|         <source>width :</source> | ||||
|         <translation>宽:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="90"/> | ||||
|         <source>height:</source> | ||||
|         <translation>高:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="91"/> | ||||
|         <source>depth :</source> | ||||
|         <translation>通道:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="92"/> | ||||
|         <source>note:</source> | ||||
|         <translation>注释:</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="info_dock.py" line="93"/> | ||||
|         <source>add extra image note here</source> | ||||
|         <translation>为图片添加额外注释</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="52"/> | ||||
|         <source>Jump to the image. Input name or index.</source> | ||||
|         <translation>跳转到指定图片,输入图片名或序号.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="file_dock.py" line="53"/> | ||||
|         <source>Jump to the image.</source> | ||||
|         <translation>跳转到指定图片.</translation> | ||||
|     </message> | ||||
| </context> | ||||
| <context> | ||||
|     <name>MainWindow</name> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="317"/> | ||||
|         <source>ISAT</source> | ||||
|         <translation>ISAT 图片分割标注工具</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="318"/> | ||||
|         <source>File</source> | ||||
|         <translation>文件</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="319"/> | ||||
|         <source>View</source> | ||||
|         <translation>视图</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="320"/> | ||||
|         <source>Help</source> | ||||
|         <translation>帮助</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="322"/> | ||||
|         <source>Tools</source> | ||||
|         <translation>工具</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="369"/> | ||||
|         <source>Edit</source> | ||||
|         <translation>编辑</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="324"/> | ||||
|         <source>toolBar</source> | ||||
|         <translation>工具栏</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="325"/> | ||||
|         <source>Info</source> | ||||
|         <translation>图片信息</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="326"/> | ||||
|         <source>Labels</source> | ||||
|         <translation>标签列表</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="327"/> | ||||
|         <source>Files</source> | ||||
|         <translation>文件列表</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="261"/> | ||||
|         <source>Open image</source> | ||||
|         <translation type="obsolete">打开图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="262"/> | ||||
|         <source>Open images dir</source> | ||||
|         <translation type="obsolete">打开图片文件夹</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="330"/> | ||||
|         <source>Zoom in</source> | ||||
|         <translation>放大</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="332"/> | ||||
|         <source>Zoom out</source> | ||||
|         <translation>缩小</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="335"/> | ||||
|         <source>Fit window</source> | ||||
|         <translation>适应窗口</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="337"/> | ||||
|         <source>F</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="338"/> | ||||
|         <source>Setting</source> | ||||
|         <translation>设置</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="341"/> | ||||
|         <source>Exit</source> | ||||
|         <translation>退出</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="271"/> | ||||
|         <source>Open annotations dir</source> | ||||
|         <translation type="obsolete">标签保存位置</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="345"/> | ||||
|         <source>Save</source> | ||||
|         <translation>保存</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="347"/> | ||||
|         <source>S</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="274"/> | ||||
|         <source>Prev</source> | ||||
|         <translation type="obsolete">上一张</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="349"/> | ||||
|         <source>Prev image</source> | ||||
|         <translation>上一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="351"/> | ||||
|         <source>A</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="277"/> | ||||
|         <source>Next</source> | ||||
|         <translation type="obsolete">下一张</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="353"/> | ||||
|         <source>Next image</source> | ||||
|         <translation>下一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="355"/> | ||||
|         <source>D</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="357"/> | ||||
|         <source>About</source> | ||||
|         <translation>关于</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="327"/> | ||||
|         <source>Create</source> | ||||
|         <translation type="obsolete">创建</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="328"/> | ||||
|         <source>Create polygon</source> | ||||
|         <translation type="obsolete">创建多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="399"/> | ||||
|         <source>C</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="362"/> | ||||
|         <source>Delete</source> | ||||
|         <translation>删除</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="363"/> | ||||
|         <source>Delete polygon</source> | ||||
|         <translation>删除多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="365"/> | ||||
|         <source>Del</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="366"/> | ||||
|         <source>Bit map</source> | ||||
|         <translation>位图</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="368"/> | ||||
|         <source>Space</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="370"/> | ||||
|         <source>Edit polygon</source> | ||||
|         <translation>编辑多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="395"/> | ||||
|         <source>E</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="372"/> | ||||
|         <source>To top</source> | ||||
|         <translation>置顶</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="373"/> | ||||
|         <source>Move polygon to top layer</source> | ||||
|         <translation>移动多边形到顶层</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="375"/> | ||||
|         <source>T</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="376"/> | ||||
|         <source>To bottom</source> | ||||
|         <translation>置底</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="377"/> | ||||
|         <source>Move polygon to bottom layer</source> | ||||
|         <translation>移动多边形到底层</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="379"/> | ||||
|         <source>B</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="380"/> | ||||
|         <source>Label converter</source> | ||||
|         <translation>标注文件转换器</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="381"/> | ||||
|         <source>Convert annotations to png image.</source> | ||||
|         <translation>将ISAT标注文件转换为png图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="321"/> | ||||
|         <source>Laguage</source> | ||||
|         <translation>语言</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="356"/> | ||||
|         <source>Shortcut</source> | ||||
|         <translation>快捷键</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="314"/> | ||||
|         <source>Chinese</source> | ||||
|         <translation type="obsolete">中文</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="383"/> | ||||
|         <source>English</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="382"/> | ||||
|         <source>中文</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="328"/> | ||||
|         <source>Images dir</source> | ||||
|         <translation>图片文件夹</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="329"/> | ||||
|         <source>Open images dir.</source> | ||||
|         <translation>打开图片文件夹.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="331"/> | ||||
|         <source>Zoom in.</source> | ||||
|         <translation>放大.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="333"/> | ||||
|         <source>Zoom out.</source> | ||||
|         <translation>缩小.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="336"/> | ||||
|         <source>Fit window.</source> | ||||
|         <translation>适应窗口.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="343"/> | ||||
|         <source>Label dir</source> | ||||
|         <translation>标签文件夹</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="344"/> | ||||
|         <source>Open label dir.</source> | ||||
|         <translation>打开标签文件夹.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="346"/> | ||||
|         <source>Save annotation.</source> | ||||
|         <translation>保存.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="317"/> | ||||
|         <source>Priro image</source> | ||||
|         <translation type="obsolete">上一张图片</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="319"/> | ||||
|         <source>Prior image.</source> | ||||
|         <translation type="obsolete">打开上一张图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="354"/> | ||||
|         <source>Next image.</source> | ||||
|         <translation>下一张图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="329"/> | ||||
|         <source>Draw polygon.</source> | ||||
|         <translation type="obsolete">打开下一张图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="364"/> | ||||
|         <source>Delete polygon.</source> | ||||
|         <translation>删除多边形.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="367"/> | ||||
|         <source>Show instance or segmeent state.</source> | ||||
|         <translation>显示语义与实例结果.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="371"/> | ||||
|         <source>Edit polygon attribute.</source> | ||||
|         <translation>编辑多边形属性.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="374"/> | ||||
|         <source>Move polygon to top layer.</source> | ||||
|         <translation>将多边形移动到最上层.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="378"/> | ||||
|         <source>Move polygon to bottom layer.</source> | ||||
|         <translation>将多边形移动到最下层.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="339"/> | ||||
|         <source>Setting.</source> | ||||
|         <translation>设置.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="342"/> | ||||
|         <source>Exit.</source> | ||||
|         <translation>退出.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="350"/> | ||||
|         <source>Prev image.</source> | ||||
|         <translation>前一张图片.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="359"/> | ||||
|         <source>Segment anything</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="360"/> | ||||
|         <source>Quick annotate using Segment anything.</source> | ||||
|         <translation>使用Segment anything进行快速标注.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="361"/> | ||||
|         <source>Q</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="385"/> | ||||
|         <source>Backspace</source> | ||||
|         <translation>回退</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="386"/> | ||||
|         <source>Backspace.</source> | ||||
|         <translation>回退.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="387"/> | ||||
|         <source>Z</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="388"/> | ||||
|         <source>Cancel</source> | ||||
|         <translation>取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="389"/> | ||||
|         <source>Annotate canceled</source> | ||||
|         <translation>标注取消</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="390"/> | ||||
|         <source>Annotate canceled.</source> | ||||
|         <translation>标注取消.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="391"/> | ||||
|         <source>Esc</source> | ||||
|         <translation></translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="392"/> | ||||
|         <source>Finish</source> | ||||
|         <translation>完成</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="393"/> | ||||
|         <source>Annotate finished</source> | ||||
|         <translation>标注完成</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="394"/> | ||||
|         <source>Annotate finished.</source> | ||||
|         <translation>标注完成.</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="396"/> | ||||
|         <source>Polygon</source> | ||||
|         <translation>多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="397"/> | ||||
|         <source>Draw polygon</source> | ||||
|         <translation>绘制多边形</translation> | ||||
|     </message> | ||||
|     <message> | ||||
|         <location filename="MainWindow.py" line="398"/> | ||||
|         <source>Accurately annotate by drawing polygon. </source> | ||||
|         <translation>通过手动绘制多边形,进行精细标注. </translation> | ||||
|     </message> | ||||
| </context> | ||||
| </TS> | ||||
							
								
								
									
										11
									
								
								widgets/about_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.about_dialog import Ui_Dialog | ||||
| 
 | ||||
| class AboutDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent): | ||||
|         super(AboutDialog, self).__init__(parent) | ||||
|         self.setupUi(self) | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||
							
								
								
									
										432
									
								
								widgets/canvas.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,432 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtGui, QtCore | ||||
| from enum import Enum | ||||
| from widgets.polygon import Polygon | ||||
| from configs import STATUSMode, CLICKMode, DRAWMode | ||||
| from PIL import Image | ||||
| import numpy as np | ||||
| import cv2 | ||||
| 
 | ||||
| 
 | ||||
| class AnnotationScene(QtWidgets.QGraphicsScene): | ||||
|     def __init__(self, mainwindow): | ||||
|         super(AnnotationScene, self).__init__() | ||||
|         self.mainwindow = mainwindow | ||||
|         self.image_item:QtWidgets.QGraphicsPixmapItem = None | ||||
|         self.image_data = None | ||||
|         self.current_graph:Polygon = None | ||||
|         self.mode = STATUSMode.VIEW | ||||
|         self.click = CLICKMode.POSITIVE | ||||
|         self.draw_mode = DRAWMode.SEGMENTANYTHING   # 默认使用segment anything进行快速标注 | ||||
|         self.click_points = [] | ||||
|         self.click_points_mode = [] | ||||
|         self.masks:np.ndarray = None | ||||
|         self.top_layer = 1 | ||||
| 
 | ||||
|         self.guide_line_x:QtWidgets.QGraphicsLineItem = None | ||||
|         self.guide_line_y:QtWidgets.QGraphicsLineItem = None | ||||
| 
 | ||||
|     def load_image(self, image_path:str): | ||||
|         self.clear() | ||||
| 
 | ||||
|         self.image_data = np.array(Image.open(image_path)) | ||||
|         if self.mainwindow.use_segment_anything: | ||||
|             self.mainwindow.segany.reset_image() | ||||
| 
 | ||||
|             if self.image_data.ndim == 3 and self.image_data.shape[-1] == 3: | ||||
|                 self.mainwindow.segany.set_image(self.image_data) | ||||
|             elif self.image_data.ndim == 2 and image_path.endswith('.png'): | ||||
|                 # 单通道图标签图 | ||||
|                 pass | ||||
|             else: | ||||
|                 QtWidgets.QMessageBox.warning(self.mainwindow, 'Warning', 'Segment anything only support 3 channel rgb image.') | ||||
| 
 | ||||
|         self.image_item = QtWidgets.QGraphicsPixmapItem() | ||||
|         self.image_item.setZValue(0) | ||||
|         self.addItem(self.image_item) | ||||
|         self.mask_item = QtWidgets.QGraphicsPixmapItem() | ||||
|         self.mask_item.setZValue(1) | ||||
|         self.addItem(self.mask_item) | ||||
| 
 | ||||
|         self.image_item.setPixmap(QtGui.QPixmap(image_path)) | ||||
|         self.setSceneRect(self.image_item.boundingRect()) | ||||
|         self.change_mode_to_view() | ||||
| 
 | ||||
|     def change_mode_to_create(self): | ||||
|         if self.image_item is None: | ||||
|             return | ||||
|         self.mode = STATUSMode.CREATE | ||||
|         self.image_item.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor)) | ||||
|         self.mainwindow.actionPrev.setEnabled(False) | ||||
|         self.mainwindow.actionNext.setEnabled(False) | ||||
| 
 | ||||
|         self.mainwindow.actionSegment_anything.setEnabled(False) | ||||
|         self.mainwindow.actionPolygon.setEnabled(False) | ||||
|         self.mainwindow.actionBackspace.setEnabled(True) | ||||
|         self.mainwindow.actionFinish.setEnabled(True) | ||||
|         self.mainwindow.actionCancel.setEnabled(True) | ||||
| 
 | ||||
|         self.mainwindow.actionTo_top.setEnabled(False) | ||||
|         self.mainwindow.actionTo_bottom.setEnabled(False) | ||||
|         self.mainwindow.actionEdit.setEnabled(False) | ||||
|         self.mainwindow.actionDelete.setEnabled(False) | ||||
|         self.mainwindow.actionSave.setEnabled(False) | ||||
| 
 | ||||
|     def change_mode_to_view(self): | ||||
|         self.mode = STATUSMode.VIEW | ||||
|         self.image_item.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor)) | ||||
| 
 | ||||
|         self.mainwindow.actionPrev.setEnabled(True) | ||||
|         self.mainwindow.actionNext.setEnabled(True) | ||||
| 
 | ||||
|         self.mainwindow.actionSegment_anything.setEnabled(self.mainwindow.use_segment_anything) | ||||
|         self.mainwindow.actionPolygon.setEnabled(True) | ||||
|         self.mainwindow.actionBackspace.setEnabled(False) | ||||
|         self.mainwindow.actionFinish.setEnabled(False) | ||||
|         self.mainwindow.actionCancel.setEnabled(False) | ||||
| 
 | ||||
|         self.mainwindow.actionTo_top.setEnabled(False) | ||||
|         self.mainwindow.actionTo_bottom.setEnabled(False) | ||||
|         self.mainwindow.actionEdit.setEnabled(False) | ||||
|         self.mainwindow.actionDelete.setEnabled(False) | ||||
|         self.mainwindow.actionSave.setEnabled(True) | ||||
| 
 | ||||
|     def change_mode_to_edit(self): | ||||
|         self.mode = STATUSMode.EDIT | ||||
|         self.image_item.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor)) | ||||
| 
 | ||||
|         self.mainwindow.actionPrev.setEnabled(False) | ||||
|         self.mainwindow.actionNext.setEnabled(False) | ||||
| 
 | ||||
|         self.mainwindow.actionSegment_anything.setEnabled(False) | ||||
|         self.mainwindow.actionPolygon.setEnabled(False) | ||||
|         self.mainwindow.actionBackspace.setEnabled(False) | ||||
|         self.mainwindow.actionFinish.setEnabled(False) | ||||
|         self.mainwindow.actionCancel.setEnabled(False) | ||||
| 
 | ||||
|         self.mainwindow.actionTo_top.setEnabled(True) | ||||
|         self.mainwindow.actionTo_bottom.setEnabled(True) | ||||
|         self.mainwindow.actionEdit.setEnabled(True) | ||||
|         self.mainwindow.actionDelete.setEnabled(True) | ||||
|         self.mainwindow.actionSave.setEnabled(True) | ||||
| 
 | ||||
|     def change_click_to_positive(self): | ||||
|         self.click = CLICKMode.POSITIVE | ||||
| 
 | ||||
|     def change_click_to_negative(self): | ||||
|         self.click = CLICKMode.NEGATIVE | ||||
| 
 | ||||
|     def start_segment_anything(self): | ||||
|         self.draw_mode = DRAWMode.SEGMENTANYTHING | ||||
|         self.start_draw() | ||||
| 
 | ||||
|     def start_draw_polygon(self): | ||||
|         self.draw_mode = DRAWMode.POLYGON | ||||
|         self.start_draw() | ||||
| 
 | ||||
|     def start_draw(self): | ||||
|         # 只有view模式时,才能切换create模式 | ||||
|         if self.mode != STATUSMode.VIEW: | ||||
|             return | ||||
|         # 否则,切换到绘图模式 | ||||
|         self.change_mode_to_create() | ||||
|         # 绘图模式 | ||||
|         if self.mode == STATUSMode.CREATE: | ||||
|             self.current_graph = Polygon() | ||||
|             self.addItem(self.current_graph) | ||||
| 
 | ||||
|     def finish_draw(self): | ||||
| 
 | ||||
|         if self.current_graph is None: | ||||
|             return | ||||
| 
 | ||||
|         self.change_mode_to_view() | ||||
| 
 | ||||
|         if self.draw_mode == DRAWMode.SEGMENTANYTHING: | ||||
|             # mask to polygon | ||||
|             # -------------- | ||||
|             if self.masks is not None: | ||||
|                 masks = self.masks | ||||
|                 masks = masks.astype('uint8') * 255 | ||||
|                 h, w = masks.shape[-2:] | ||||
|                 masks = masks.reshape(h, w) | ||||
| 
 | ||||
|                 contours, _ = cv2.findContours(masks, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS) | ||||
| 
 | ||||
|                 # 这里取轮廓点数最多的(可能返回多个轮廓) | ||||
|                 contour = contours[0] | ||||
|                 for cont in contours: | ||||
|                     if len(cont) > len(contour): | ||||
|                         contour = cont | ||||
| 
 | ||||
|                 for point in contour: | ||||
|                     x, y = point[0] | ||||
|                     self.current_graph.addPoint(QtCore.QPointF(x, y)) | ||||
| 
 | ||||
|         elif self.draw_mode == DRAWMode.POLYGON: | ||||
|             if len(self.current_graph.points) < 1: | ||||
|                 return | ||||
| 
 | ||||
|             # 移除鼠标移动点 | ||||
|             # self.current_graph.removePoint(len(self.current_graph.points) - 1) | ||||
| 
 | ||||
|             # 单点,删除 | ||||
|             if len(self.current_graph.points) < 2: | ||||
|                 self.current_graph.delete() | ||||
|                 self.removeItem(self.current_graph) | ||||
|                 self.change_mode_to_view() | ||||
|                 return | ||||
| 
 | ||||
|             # 两点,默认矩形 | ||||
|             if len(self.current_graph.points) == 2: | ||||
|                 first_point = self.current_graph.points[0] | ||||
|                 last_point = self.current_graph.points[-1] | ||||
|                 self.current_graph.removePoint(len(self.current_graph.points) - 1) | ||||
|                 self.current_graph.addPoint(QtCore.QPointF(first_point.x(), last_point.y())) | ||||
|                 self.current_graph.addPoint(last_point) | ||||
|                 self.current_graph.addPoint(QtCore.QPointF(last_point.x(), first_point.y())) | ||||
| 
 | ||||
|         # 选择类别 | ||||
|         self.mainwindow.category_choice_widget.load_cfg() | ||||
|         self.mainwindow.category_choice_widget.show() | ||||
| 
 | ||||
|         # mask清空 | ||||
|         self.click_points.clear() | ||||
|         self.click_points_mode.clear() | ||||
|         self.update_mask() | ||||
| 
 | ||||
|     def cancel_draw(self): | ||||
|         if self.current_graph is None: | ||||
|             return | ||||
|         self.current_graph.delete() # 清除所有路径 | ||||
|         self.removeItem(self.current_graph) | ||||
| 
 | ||||
|         self.current_graph = None | ||||
| 
 | ||||
|         self.change_mode_to_view() | ||||
| 
 | ||||
|         self.click_points.clear() | ||||
|         self.click_points_mode.clear() | ||||
|         self.update_mask() | ||||
| 
 | ||||
|     def delete_selected_graph(self): | ||||
|         deleted_layer = None | ||||
|         for item in self.selectedItems(): | ||||
|             if item in self.mainwindow.polygons: | ||||
|                 self.mainwindow.polygons.remove(item) | ||||
|                 item.delete() | ||||
|                 self.removeItem(item) | ||||
|                 deleted_layer = item.zValue() | ||||
|                 del item | ||||
|         if deleted_layer is not None: | ||||
|             for p in self.mainwindow.polygons: | ||||
|                 if p.zValue() > deleted_layer: | ||||
|                     p.setZValue(p.zValue() - 1) | ||||
|             self.mainwindow.labels_dock_widget.update_listwidget() | ||||
| 
 | ||||
|     def edit_polygon(self): | ||||
|         selectd_items = self.selectedItems() | ||||
|         if len(selectd_items) < 1: | ||||
|             return | ||||
|         item = selectd_items[0] | ||||
|         if not item: | ||||
|             return | ||||
|         self.mainwindow.category_edit_widget.polygon = item | ||||
|         self.mainwindow.category_edit_widget.load_cfg() | ||||
|         self.mainwindow.category_edit_widget.show() | ||||
| 
 | ||||
|     def move_polygon_to_top(self): | ||||
|         selectd_items = self.selectedItems() | ||||
|         if len(selectd_items) < 1: | ||||
|             return | ||||
|         current_polygon = selectd_items[0] | ||||
|         max_layer = len(self.mainwindow.polygons) | ||||
| 
 | ||||
|         current_layer = current_polygon.zValue() | ||||
|         for p in self.mainwindow.polygons: | ||||
|             if p.zValue() > current_layer: | ||||
|                 p.setZValue(p.zValue() - 1) | ||||
| 
 | ||||
|         current_polygon.setZValue(max_layer) | ||||
|         for vertex in current_polygon.vertexs: | ||||
|             vertex.setZValue(max_layer) | ||||
|         self.mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|     def move_polygon_to_bottom(self): | ||||
|         selectd_items = self.selectedItems() | ||||
|         if len(selectd_items) < 1: | ||||
|             return | ||||
|         current_polygon = selectd_items[0] | ||||
| 
 | ||||
|         if current_polygon is not None: | ||||
|             current_layer = current_polygon.zValue() | ||||
| 
 | ||||
|             for p in self.mainwindow.polygons: | ||||
|                 if p.zValue() < current_layer: | ||||
|                     p.setZValue(p.zValue() + 1) | ||||
| 
 | ||||
|             current_polygon.setZValue(1) | ||||
|             for vertex in current_polygon.vertexs: | ||||
|                 vertex.setZValue(1) | ||||
|         self.mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|     def mousePressEvent(self, event: 'QtWidgets.QGraphicsSceneMouseEvent'): | ||||
|         if self.mode == STATUSMode.CREATE: | ||||
|             sceneX, sceneY = event.scenePos().x(), event.scenePos().y() | ||||
|             sceneX = 0 if sceneX < 0 else sceneX | ||||
|             sceneX = self.width() if sceneX > self.width() else sceneX | ||||
|             sceneY = 0 if sceneY < 0 else sceneY | ||||
|             sceneY = self.height() if sceneY > self.height() else sceneY | ||||
| 
 | ||||
|             if event.button() == QtCore.Qt.MouseButton.LeftButton: | ||||
|                 if self.draw_mode == DRAWMode.SEGMENTANYTHING: | ||||
|                     self.click_points.append([sceneX, sceneY]) | ||||
|                     self.click_points_mode.append(1) | ||||
|                 elif self.draw_mode == DRAWMode.POLYGON: | ||||
|                     # 移除随鼠标移动的点 | ||||
|                     self.current_graph.removePoint(len(self.current_graph.points) - 1) | ||||
|                     # 添加当前点 | ||||
|                     self.current_graph.addPoint(QtCore.QPointF(sceneX, sceneY)) | ||||
|                     # 添加随鼠标移动的点 | ||||
|                     self.current_graph.addPoint(QtCore.QPointF(sceneX, sceneY)) | ||||
|                 else: | ||||
|                     raise ValueError('The draw mode named {} not supported.') | ||||
|             if event.button() == QtCore.Qt.MouseButton.RightButton: | ||||
|                 if self.draw_mode == DRAWMode.SEGMENTANYTHING: | ||||
|                     self.click_points.append([sceneX, sceneY]) | ||||
|                     self.click_points_mode.append(0) | ||||
|                 elif self.draw_mode == DRAWMode.POLYGON: | ||||
|                     pass | ||||
|                 else: | ||||
|                     raise ValueError('The draw mode named {} not supported.') | ||||
|             if self.draw_mode == DRAWMode.SEGMENTANYTHING: | ||||
|                 self.update_mask() | ||||
|         super(AnnotationScene, self).mousePressEvent(event) | ||||
| 
 | ||||
|     def mouseMoveEvent(self, event: 'QtWidgets.QGraphicsSceneMouseEvent'): | ||||
|         # 辅助线 | ||||
|         if self.guide_line_x is not None and self.guide_line_y is not None: | ||||
|             if self.guide_line_x in self.items(): | ||||
|                 self.removeItem(self.guide_line_x) | ||||
| 
 | ||||
|             if self.guide_line_y in self.items(): | ||||
|                 self.removeItem(self.guide_line_y) | ||||
| 
 | ||||
|             self.guide_line_x = None | ||||
|             self.guide_line_y = None | ||||
| 
 | ||||
|         pos = event.scenePos() | ||||
|         if pos.x() < 0: pos.setX(0) | ||||
|         if pos.x() > self.width(): pos.setX(self.width()) | ||||
|         if pos.y() < 0: pos.setY(0) | ||||
|         if pos.y() > self.height(): pos.setY(self.height()) | ||||
|         # 限制在图片范围内 | ||||
| 
 | ||||
|         if self.mode == STATUSMode.CREATE: | ||||
|             if self.draw_mode == DRAWMode.POLYGON: | ||||
|                 # 随鼠标位置实时更新多边形 | ||||
|                 self.current_graph.movePoint(len(self.current_graph.points)-1, pos) | ||||
| 
 | ||||
|         # 辅助线 | ||||
|         if self.guide_line_x is None and self.width()>0 and self.height()>0: | ||||
|             self.guide_line_x = QtWidgets.QGraphicsLineItem(QtCore.QLineF(pos.x(), 0, pos.x(), self.height())) | ||||
|             self.guide_line_x.setZValue(1) | ||||
|             self.addItem(self.guide_line_x) | ||||
|         if self.guide_line_y is None and self.width()>0 and self.height()>0: | ||||
|             self.guide_line_y = QtWidgets.QGraphicsLineItem(QtCore.QLineF(0, pos.y(), self.width(), pos.y())) | ||||
|             self.guide_line_y.setZValue(1) | ||||
|             self.addItem(self.guide_line_y) | ||||
| 
 | ||||
|         # 状态栏,显示当前坐标 | ||||
|         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])) | ||||
|         super(AnnotationScene, self).mouseMoveEvent(event) | ||||
| 
 | ||||
|     def update_mask(self): | ||||
|         if not self.mainwindow.use_segment_anything: | ||||
|             return | ||||
|         if not (self.image_data.ndim == 3 and self.image_data.shape[-1] == 3): | ||||
|             return | ||||
| 
 | ||||
|         if len(self.click_points) > 0 and len(self.click_points_mode) > 0: | ||||
|             masks = self.mainwindow.segany.predict(self.click_points, self.click_points_mode) | ||||
|             self.masks = masks | ||||
|             color = np.array([0, 0, 255]) | ||||
|             h, w = masks.shape[-2:] | ||||
|             mask_image = masks.reshape(h, w, 1) * color.reshape(1, 1, -1) | ||||
|             mask_image = mask_image.astype("uint8") | ||||
|             mask_image = cv2.cvtColor(mask_image, cv2.COLOR_BGR2RGB) | ||||
|             mask_image = cv2.addWeighted(self.image_data, 0.5, mask_image, 0.9, 0) | ||||
|             mask_image = QtGui.QImage(mask_image[:], mask_image.shape[1], mask_image.shape[0], mask_image.shape[1] * 3, | ||||
|                                       QtGui.QImage.Format_RGB888) | ||||
|             mask_pixmap = QtGui.QPixmap(mask_image) | ||||
|             self.mask_item.setPixmap(mask_pixmap) | ||||
|         else: | ||||
|             mask_image = np.zeros(self.image_data.shape, dtype=np.uint8) | ||||
|             mask_image = cv2.addWeighted(self.image_data, 1, mask_image, 0, 0) | ||||
|             mask_image = QtGui.QImage(mask_image[:], mask_image.shape[1], mask_image.shape[0], mask_image.shape[1] * 3, | ||||
|                                       QtGui.QImage.Format_RGB888) | ||||
|             mask_pixmap = QtGui.QPixmap(mask_image) | ||||
|             self.mask_item.setPixmap(mask_pixmap) | ||||
| 
 | ||||
|     def backspace(self): | ||||
|         if self.mode != STATUSMode.CREATE: | ||||
|             return | ||||
|         # 返回上一步操作 | ||||
|         if self.draw_mode == DRAWMode.SEGMENTANYTHING: | ||||
|             if len(self.click_points) > 0: | ||||
|                 self.click_points.pop() | ||||
|             if len(self.click_points_mode) > 0: | ||||
|                 self.click_points_mode.pop() | ||||
|             self.update_mask() | ||||
|         elif self.draw_mode == DRAWMode.POLYGON: | ||||
|             if len(self.current_graph.points) < 2: | ||||
|                 return | ||||
|             # 移除随鼠标移动的点 | ||||
|             self.current_graph.removePoint(len(self.current_graph.points) - 2) | ||||
| 
 | ||||
| 
 | ||||
| class AnnotationView(QtWidgets.QGraphicsView): | ||||
|     def __init__(self, parent=None): | ||||
|         super(AnnotationView, self).__init__(parent) | ||||
|         self.setMouseTracking(True) | ||||
|         self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOn) | ||||
|         self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOn) | ||||
|         self.setDragMode(QtWidgets.QGraphicsView.DragMode.ScrollHandDrag) | ||||
|         self.factor = 1.2 | ||||
| 
 | ||||
|     def wheelEvent(self, event: QtGui.QWheelEvent): | ||||
|         angel = event.angleDelta() | ||||
|         angelX, angelY = angel.x(), angel.y() | ||||
|         point = event.pos() # 当前鼠标位置 | ||||
|         if angelY > 0: | ||||
|             self.zoom(self.factor, point) | ||||
|         else: | ||||
|             self.zoom(1 / self.factor, point) | ||||
| 
 | ||||
|     def zoom_in(self): | ||||
|         self.zoom(self.factor) | ||||
| 
 | ||||
|     def zoom_out(self): | ||||
|         self.zoom(1/self.factor) | ||||
| 
 | ||||
|     def zoomfit(self): | ||||
|         self.fitInView(0, 0, self.scene().width(), self.scene().height(),  QtCore.Qt.AspectRatioMode.KeepAspectRatio) | ||||
| 
 | ||||
|     def zoom(self, factor, point=None): | ||||
|         mouse_old = self.mapToScene(point) if point is not None else None | ||||
|         # 缩放比例 | ||||
| 
 | ||||
|         pix_widget = self.transform().scale(factor, factor).mapRect(QtCore.QRectF(0, 0, 1, 1)).width() | ||||
|         if pix_widget > 3 or pix_widget < 0.01: | ||||
|             return | ||||
| 
 | ||||
|         self.scale(factor, factor) | ||||
|         if point is not None: | ||||
|             mouse_now = self.mapToScene(point) | ||||
|             center_now = self.mapToScene(self.viewport().width() // 2, self.viewport().height() // 2) | ||||
|             center_new = mouse_old - mouse_now + center_now | ||||
|             self.centerOn(center_new) | ||||
							
								
								
									
										105
									
								
								widgets/category_choice_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,105 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| 
 | ||||
| from ui.category_choice import Ui_Dialog | ||||
| from PyQt5 import QtWidgets, QtGui, QtCore | ||||
| from configs import load_config, CONFIG_FILE, DEFAULT_CONFIG_FILE | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| class CategoryChoiceDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent, mainwindow, scene): | ||||
|         super(CategoryChoiceDialog, self).__init__(parent) | ||||
| 
 | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.scene = scene | ||||
| 
 | ||||
|         self.lineEdit_group.setValidator(QtGui.QIntValidator(0, 1000)) | ||||
| 
 | ||||
|         self.listWidget.itemClicked.connect(self.get_category) | ||||
|         self.pushButton_apply.clicked.connect(self.apply) | ||||
|         self.pushButton_cache.clicked.connect(self.cache) | ||||
| 
 | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||
| 
 | ||||
|     def load_cfg(self): | ||||
|         self.listWidget.clear() | ||||
| 
 | ||||
|         labels = self.mainwindow.cfg.get('label', []) | ||||
| 
 | ||||
|         for label in labels: | ||||
|             name = label.get('name', 'UNKNOW') | ||||
|             color = label.get('color', '#000000') | ||||
|             item = QtWidgets.QListWidgetItem() | ||||
|             item.setSizeHint(QtCore.QSize(200, 30)) | ||||
|             widget = QtWidgets.QWidget() | ||||
| 
 | ||||
|             layout = QtWidgets.QHBoxLayout() | ||||
|             layout.setContentsMargins(9, 1, 9, 1) | ||||
|             label_category = QtWidgets.QLabel() | ||||
|             label_category.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
|             label_category.setText(name) | ||||
|             label_category.setObjectName('label_category') | ||||
| 
 | ||||
|             label_color = QtWidgets.QLabel() | ||||
|             label_color.setFixedWidth(10) | ||||
|             label_color.setStyleSheet("background-color: {};".format(color)) | ||||
|             label_color.setObjectName('label_color') | ||||
| 
 | ||||
|             layout.addWidget(label_color) | ||||
|             layout.addWidget(label_category) | ||||
|             widget.setLayout(layout) | ||||
| 
 | ||||
|             self.listWidget.addItem(item) | ||||
|             self.listWidget.setItemWidget(item, widget) | ||||
| 
 | ||||
|         self.lineEdit_group.clear() | ||||
|         self.lineEdit_category.clear() | ||||
|         self.checkBox_iscrowded.setCheckState(False) | ||||
|         self.label_layer.setText('{}'.format(len(self.mainwindow.polygons)+1)) | ||||
| 
 | ||||
|         if self.listWidget.count() == 0: | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'Please set categorys before tagging.') | ||||
| 
 | ||||
|     def get_category(self, item): | ||||
|         widget = self.listWidget.itemWidget(item) | ||||
|         label_category = widget.findChild(QtWidgets.QLabel, 'label_category') | ||||
|         self.lineEdit_category.setText(label_category.text()) | ||||
|         self.lineEdit_category.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
| 
 | ||||
|     def apply(self): | ||||
|         category = self.lineEdit_category.text() | ||||
|         group = self.lineEdit_group.text() | ||||
|         is_crowd = int(self.checkBox_iscrowded.isChecked()) | ||||
|         note = self.lineEdit_note.text() | ||||
|         if not category: | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'Please select one category before submitting.') | ||||
|             return | ||||
| 
 | ||||
|         # 设置polygon 属性 | ||||
|         self.scene.current_graph.set_drawed(category, group, is_crowd, note, | ||||
|                                             QtGui.QColor(self.mainwindow.category_color_dict[category]), self.scene.top_layer) | ||||
|         # 添加新polygon | ||||
|         self.mainwindow.polygons.append(self.scene.current_graph) | ||||
|         # 设置为最高图层 | ||||
|         self.scene.current_graph.setZValue(len(self.mainwindow.polygons)) | ||||
|         for vertex in self.scene.current_graph.vertexs: | ||||
|             vertex.setZValue(len(self.mainwindow.polygons)) | ||||
| 
 | ||||
|         self.mainwindow.labels_dock_widget.update_listwidget() | ||||
| 
 | ||||
|         self.scene.current_graph = None | ||||
|         self.scene.change_mode_to_view() | ||||
|         self.close() | ||||
| 
 | ||||
|     def cache(self): | ||||
|         self.scene.cancel_draw() | ||||
|         self.close() | ||||
| 
 | ||||
|     def closeEvent(self, a0: QtGui.QCloseEvent): | ||||
|         self.cache() | ||||
| 
 | ||||
|     def reject(self): | ||||
|         self.cache() | ||||
							
								
								
									
										116
									
								
								widgets/category_edit_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,116 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| 
 | ||||
| from ui.category_choice import Ui_Dialog | ||||
| from PyQt5 import QtWidgets, QtGui, QtCore | ||||
| from configs import load_config, CONFIG_FILE, DEFAULT_CONFIG_FILE | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| class CategoryEditDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent, mainwindow, scene): | ||||
|         super(CategoryEditDialog, self).__init__(parent) | ||||
| 
 | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.scene = scene | ||||
|         self.polygon = None | ||||
| 
 | ||||
|         self.lineEdit_group.setValidator(QtGui.QIntValidator(0,1000)) | ||||
| 
 | ||||
|         self.listWidget.itemClicked.connect(self.get_category) | ||||
|         self.pushButton_apply.clicked.connect(self.apply) | ||||
|         self.pushButton_cache.clicked.connect(self.cache) | ||||
| 
 | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||
| 
 | ||||
|     def load_cfg(self): | ||||
|         self.listWidget.clear() | ||||
| 
 | ||||
|         labels = self.mainwindow.cfg.get('label', []) | ||||
| 
 | ||||
|         for label in labels: | ||||
|             name = label.get('name', 'UNKNOW') | ||||
|             color = label.get('color', '#000000') | ||||
|             # item = QtWidgets.QListWidgetItem() | ||||
|             # item.setText(name) | ||||
|             # item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
|             # self.listWidget.addItem(item) | ||||
| 
 | ||||
|             item = QtWidgets.QListWidgetItem() | ||||
|             item.setSizeHint(QtCore.QSize(200, 30)) | ||||
|             widget = QtWidgets.QWidget() | ||||
| 
 | ||||
|             layout = QtWidgets.QHBoxLayout() | ||||
|             layout.setContentsMargins(9, 1, 9, 1) | ||||
|             label_category = QtWidgets.QLabel() | ||||
|             label_category.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
|             label_category.setText(name) | ||||
|             label_category.setObjectName('label_category') | ||||
| 
 | ||||
|             label_color = QtWidgets.QLabel() | ||||
|             label_color.setFixedWidth(10) | ||||
|             label_color.setStyleSheet("background-color: {};".format(color)) | ||||
|             label_color.setObjectName('label_color') | ||||
| 
 | ||||
|             layout.addWidget(label_color) | ||||
|             layout.addWidget(label_category) | ||||
|             widget.setLayout(layout) | ||||
| 
 | ||||
|             self.listWidget.addItem(item) | ||||
|             self.listWidget.setItemWidget(item, widget) | ||||
| 
 | ||||
|             if self.polygon is not None and self.polygon.category == name: | ||||
|                 self.listWidget.setCurrentItem(item) | ||||
| 
 | ||||
|         if self.polygon is None: | ||||
|             self.lineEdit_group.clear() | ||||
|             self.lineEdit_category.clear() | ||||
|             self.checkBox_iscrowded.setCheckState(False) | ||||
|             self.lineEdit_note.clear() | ||||
|             self.label_layer.setText('{}'.format('')) | ||||
|         else: | ||||
|             self.lineEdit_category.setText('{}'.format(self.polygon.category)) | ||||
|             self.lineEdit_category.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
|             self.lineEdit_group.setText('{}'.format(self.polygon.group)) | ||||
|             iscrowd = QtCore.Qt.CheckState.Checked if self.polygon.iscrowd == 1 else QtCore.Qt.CheckState.Unchecked | ||||
|             self.checkBox_iscrowded.setCheckState(iscrowd) | ||||
|             self.lineEdit_note.setText('{}'.format(self.polygon.note)) | ||||
|             self.label_layer.setText('{}'.format(self.polygon.zValue())) | ||||
|         if self.listWidget.count() == 0: | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'Please set categorys before tagging.') | ||||
| 
 | ||||
|     def get_category(self, item): | ||||
|         widget = self.listWidget.itemWidget(item) | ||||
|         label_category = widget.findChild(QtWidgets.QLabel, 'label_category') | ||||
|         self.lineEdit_category.setText(label_category.text()) | ||||
|         self.lineEdit_category.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
| 
 | ||||
|     def apply(self): | ||||
|         category = self.lineEdit_category.text() | ||||
|         group = self.lineEdit_group.text() | ||||
|         is_crowd = int(self.checkBox_iscrowded.isChecked()) | ||||
|         note = self.lineEdit_note.text() | ||||
|         if not category: | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'Please select one category before submitting.') | ||||
|             return | ||||
| 
 | ||||
|         # 设置polygon 属性 | ||||
|         self.polygon.set_drawed(category, group, is_crowd, note, | ||||
|                                             QtGui.QColor(self.mainwindow.category_color_dict.get(category, '#000000'))) | ||||
|         self.mainwindow.labels_dock_widget.update_listwidget() | ||||
| 
 | ||||
|         self.polygon = None | ||||
|         self.scene.change_mode_to_view() | ||||
|         self.close() | ||||
| 
 | ||||
|     def cache(self): | ||||
|         self.scene.cancel_draw() | ||||
|         self.close() | ||||
| 
 | ||||
|     def closeEvent(self, a0: QtGui.QCloseEvent): | ||||
|         self.cache() | ||||
| 
 | ||||
|     def reject(self): | ||||
|         self.cache() | ||||
							
								
								
									
										86
									
								
								widgets/converter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,86 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.convert_dialog import Ui_Dialog | ||||
| from tools.label_convert import Converter | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| class ConvertDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent, mainwindow): | ||||
|         super(ConvertDialog, self).__init__(parent) | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.label_root = None | ||||
|         self.save_root = None | ||||
|         self.pause = False | ||||
| 
 | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||
| 
 | ||||
|         self.init_connect() | ||||
| 
 | ||||
|     def reset_gui(self): | ||||
|         self.widget_process.setVisible(False) | ||||
|         self.lineEdit_label_root.clear() | ||||
|         self.lineEdit_save_root.clear() | ||||
| 
 | ||||
|     def _label_root(self): | ||||
|         dir = QtWidgets.QFileDialog.getExistingDirectory(self) | ||||
|         if dir: | ||||
|             self.label_root = dir | ||||
|             self.lineEdit_label_root.setText(dir) | ||||
|         else: | ||||
|             self.lineEdit_label_root.clear() | ||||
| 
 | ||||
|     def _save_root(self): | ||||
|         dir = QtWidgets.QFileDialog.getExistingDirectory(self) | ||||
|         if dir: | ||||
|             self.save_root = dir | ||||
|             self.lineEdit_save_root.setText(dir) | ||||
|         else: | ||||
|             self.lineEdit_save_root.clear() | ||||
| 
 | ||||
|     def cache(self): | ||||
|         self.pause = True | ||||
|         self.close() | ||||
| 
 | ||||
|     def apply(self): | ||||
|         self.pause = False | ||||
|         if self.label_root is None or self.save_root is None: | ||||
|             return | ||||
|         # 语义分割,保存类别文件 | ||||
|         if not self.checkBox_is_instance.isChecked(): | ||||
|             with open(os.path.join(self.save_root, 'classesition.txt'), 'w') as f: | ||||
|                 for index, label in enumerate(self.mainwindow.cfg.get('label', [])): | ||||
|                     f.write('{} {}\n'.format(label.get('name'), index)) | ||||
| 
 | ||||
|         converter = Converter(self.mainwindow.cfg, self.checkBox_is_instance.isChecked()) | ||||
|         jsons = [f for f in os.listdir(self.label_root) if f.endswith('.json')] | ||||
| 
 | ||||
|         self.pushButton_label_root.setEnabled(False) | ||||
|         self.pushButton_save_root.setEnabled(False) | ||||
|         self.checkBox_is_instance.setEnabled(False) | ||||
| 
 | ||||
|         self.widget_process.setVisible(True) | ||||
|         self.progressBar.setMaximum(len(jsons)) | ||||
|         self.all_num.setText('{}'.format(len(jsons))) | ||||
| 
 | ||||
|         for index, json in enumerate(jsons): | ||||
|             if self.pause: | ||||
|                 break | ||||
|             label_path = os.path.join(self.label_root, json) | ||||
|             save_path = os.path.join(self.save_root, json[:-5]+'.png') | ||||
|             converter.convert(label_path, save_path) | ||||
|             self.progressBar.setValue(index+1) | ||||
|             self.current_num.setText('{}'.format(index+1)) | ||||
| 
 | ||||
|         self.pushButton_label_root.setEnabled(True) | ||||
|         self.pushButton_save_root.setEnabled(True) | ||||
|         self.checkBox_is_instance.setEnabled(True) | ||||
| 
 | ||||
|     def init_connect(self): | ||||
|         self.pushButton_label_root.clicked.connect(self._label_root) | ||||
|         self.pushButton_save_root.clicked.connect(self._save_root) | ||||
|         self.pushButton_apply.clicked.connect(self.apply) | ||||
|         self.pushButton_cache.clicked.connect(self.cache) | ||||
							
								
								
									
										37
									
								
								widgets/files_dock_widget.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,37 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.file_dock import Ui_Form | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| class FilesDockWidget(QtWidgets.QWidget, Ui_Form): | ||||
|     def __init__(self, mainwindow): | ||||
|         super(FilesDockWidget, self).__init__() | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.listWidget.clicked.connect(self.listwidget_doubleclick) | ||||
|         self.lineEdit_jump.returnPressed.connect(self.mainwindow.jump_to) | ||||
| 
 | ||||
|     def update_widget(self): | ||||
|         self.listWidget.clear() | ||||
|         if self.mainwindow.files_list is None: | ||||
|             return | ||||
| 
 | ||||
|         for file_path in self.mainwindow.files_list: | ||||
|             _, file_name = os.path.split(file_path) | ||||
|             item = QtWidgets.QListWidgetItem() | ||||
|             item.setSizeHint(QtCore.QSize(200, 30)) | ||||
| 
 | ||||
|             item.setText(file_name) | ||||
|             self.listWidget.addItem(item) | ||||
| 
 | ||||
|         self.label_all.setText('{}'.format(len(self.mainwindow.files_list))) | ||||
| 
 | ||||
|     def set_select(self, row): | ||||
|         self.listWidget.setCurrentRow(row) | ||||
| 
 | ||||
|     def listwidget_doubleclick(self): | ||||
|         row = self.listWidget.currentRow() | ||||
|         self.mainwindow.show_image(row) | ||||
							
								
								
									
										24
									
								
								widgets/info_dock_widget.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,24 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.info_dock import Ui_Form | ||||
| 
 | ||||
| class InfoDockWidget(QtWidgets.QWidget, Ui_Form): | ||||
|     def __init__(self, mainwindow): | ||||
|         super(InfoDockWidget, self).__init__() | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
| 
 | ||||
|         self.lineEdit_note.textChanged.connect(self.note_changed) | ||||
| 
 | ||||
|     def note_changed(self): | ||||
|         if self.mainwindow.load_finished: | ||||
|             self.mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|     def update_widget(self): | ||||
|         if self.mainwindow.current_label is not None: | ||||
|             self.label_width.setText('{}'.format(self.mainwindow.current_label.width)) | ||||
|             self.label_height.setText('{}'.format(self.mainwindow.current_label.height)) | ||||
|             self.label_depth.setText('{}'.format(self.mainwindow.current_label.depth)) | ||||
|             self.lineEdit_note.setText(self.mainwindow.current_label.note) | ||||
							
								
								
									
										104
									
								
								widgets/labels_dock_widget.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,104 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.label_dock import Ui_Form | ||||
| import functools | ||||
| 
 | ||||
| 
 | ||||
| class LabelsDockWidget(QtWidgets.QWidget, Ui_Form): | ||||
|     def __init__(self, mainwindow): | ||||
|         super(LabelsDockWidget, self).__init__() | ||||
|         self.setupUi(self) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.polygon_item_dict = {} | ||||
| 
 | ||||
|         self.listWidget.itemSelectionChanged.connect(self.set_polygon_selected) | ||||
| 
 | ||||
|         self.listWidget.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) | ||||
|         self.listWidget.customContextMenuRequested.connect( | ||||
|             self.right_button_menu) | ||||
| 
 | ||||
|     def right_button_menu(self, point): | ||||
|         self.mainwindow.right_button_menu.exec_(self.listWidget.mapToGlobal(point)) | ||||
| 
 | ||||
|     def generate_item_and_itemwidget(self, polygon): | ||||
|         color = self.mainwindow.category_color_dict.get(polygon.category, '#000000') | ||||
|         item = QtWidgets.QListWidgetItem() | ||||
|         item.setSizeHint(QtCore.QSize(200, 30)) | ||||
|         item_widget = QtWidgets.QWidget() | ||||
|         layout = QtWidgets.QHBoxLayout() | ||||
|         layout.setContentsMargins(9, 1, 9, 1) | ||||
|         check_box = QtWidgets.QCheckBox() | ||||
|         check_box.setFixedWidth(20) | ||||
|         check_box.setChecked(polygon.isVisible()) | ||||
|         check_box.stateChanged.connect(functools.partial(self.set_polygon_show, polygon)) | ||||
|         layout.addWidget(check_box) | ||||
| 
 | ||||
|         label_color = QtWidgets.QLabel() | ||||
|         label_color.setFixedWidth(10) | ||||
|         label_color.setStyleSheet("background-color: {};".format(color)) | ||||
|         layout.addWidget(label_color) | ||||
| 
 | ||||
|         category = QtWidgets.QLabel(polygon.category) | ||||
| 
 | ||||
|         group = QtWidgets.QLabel('{}'.format(polygon.group)) | ||||
| 
 | ||||
|         note = QtWidgets.QLabel('{}'.format(polygon.note)) | ||||
| 
 | ||||
|         label_iscrowd = QtWidgets.QLabel() | ||||
|         label_iscrowd.setFixedWidth(3) | ||||
|         if polygon.iscrowd == 1: | ||||
|             label_iscrowd.setStyleSheet("background-color: {};".format('#000000')) | ||||
| 
 | ||||
|         layout.addWidget(category) | ||||
|         layout.addWidget(group) | ||||
|         layout.addWidget(note) | ||||
|         layout.addWidget(label_iscrowd, alignment=QtCore.Qt.AlignmentFlag.AlignRight) | ||||
| 
 | ||||
|         item_widget.setLayout(layout) | ||||
|         return item, item_widget | ||||
| 
 | ||||
|     def update_listwidget(self): | ||||
|         self.listWidget.clear() | ||||
|         self.polygon_item_dict.clear() | ||||
| 
 | ||||
|         for polygon in self.mainwindow.polygons: | ||||
|             item, item_widget = self.generate_item_and_itemwidget(polygon) | ||||
|             self.listWidget.addItem(item) | ||||
|             self.listWidget.setItemWidget(item, item_widget) | ||||
|             self.polygon_item_dict[polygon] = item | ||||
| 
 | ||||
|         if self.mainwindow.load_finished: | ||||
|             self.mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|     def set_selected(self, polygon): | ||||
|         item = self.polygon_item_dict[polygon] | ||||
|         if polygon.isSelected(): | ||||
|             if not item.isSelected(): | ||||
|                 item.setSelected(True) | ||||
|         if not polygon.isSelected(): | ||||
|             if item.isSelected(): | ||||
|                 item.setSelected(False) | ||||
| 
 | ||||
|     def set_polygon_selected(self): | ||||
|         items = self.listWidget.selectedItems() | ||||
| 
 | ||||
|         have_selected = True if items else False | ||||
|         if have_selected: | ||||
|             self.mainwindow.scene.change_mode_to_edit() | ||||
|         else: | ||||
|             self.mainwindow.scene.change_mode_to_view() | ||||
| 
 | ||||
|         for index, polygon in enumerate(self.mainwindow.polygons): | ||||
|             if self.polygon_item_dict[polygon] in items: | ||||
|                 if not polygon.isSelected(): | ||||
|                     polygon.setSelected(True) | ||||
|             else: | ||||
|                 if polygon.isSelected(): | ||||
|                     polygon.setSelected(False) | ||||
| 
 | ||||
|     def set_polygon_show(self, polygon): | ||||
|         for vertex in polygon.vertexs: | ||||
|             vertex.setVisible(self.sender().checkState()) | ||||
|         polygon.setVisible(self.sender().checkState()) | ||||
							
								
								
									
										476
									
								
								widgets/mainwindow.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,476 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.MainWindow import Ui_MainWindow | ||||
| from widgets.setting_dialog import SettingDialog | ||||
| from widgets.category_choice_dialog import CategoryChoiceDialog | ||||
| from widgets.category_edit_dialog import CategoryEditDialog | ||||
| from widgets.labels_dock_widget import LabelsDockWidget | ||||
| from widgets.files_dock_widget import FilesDockWidget | ||||
| from widgets.info_dock_widget import InfoDockWidget | ||||
| from widgets.right_button_menu import RightButtonMenu | ||||
| from widgets.shortcut_dialog import ShortcutDialog | ||||
| from widgets.about_dialog import AboutDialog | ||||
| from widgets.converter import ConvertDialog | ||||
| from widgets.canvas import AnnotationScene, AnnotationView | ||||
| from configs import STATUSMode, MAPMode, load_config, save_config, CONFIG_FILE, DEFAULT_CONFIG_FILE | ||||
| from annotation import Object, Annotation | ||||
| from widgets.polygon import Polygon | ||||
| import os | ||||
| from PIL import Image | ||||
| import imgviz | ||||
| from segment_any.segment_any import SegAny | ||||
| import icons_rc | ||||
| 
 | ||||
| 
 | ||||
| class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): | ||||
|     def __init__(self): | ||||
|         super(MainWindow, self).__init__() | ||||
|         self.setupUi(self) | ||||
|         self.init_ui() | ||||
|         self.image_root: str = None | ||||
|         self.label_root:str = None | ||||
| 
 | ||||
|         self.files_list: list = [] | ||||
|         self.current_index = None | ||||
|         self.current_file_index: int = None | ||||
| 
 | ||||
|         self.config_file = CONFIG_FILE if os.path.exists(CONFIG_FILE) else DEFAULT_CONFIG_FILE | ||||
|         self.saved = True | ||||
|         self.load_finished = False | ||||
|         self.polygons:list = [] | ||||
| 
 | ||||
|         self.png_palette = None # 图像拥有调色盘,说明是单通道的标注png文件 | ||||
|         self.instance_cmap = imgviz.label_colormap() | ||||
|         self.map_mode = MAPMode.LABEL | ||||
|         # 标注目标 | ||||
|         self.current_label:Annotation = None | ||||
| 
 | ||||
|         self.reload_cfg() | ||||
| 
 | ||||
|         self.init_connect() | ||||
|         self.reset_action() | ||||
|         self.init_segment_anything() | ||||
| 
 | ||||
|     def init_segment_anything(self): | ||||
|         if os.path.exists('./segment_any/sam_vit_h_4b8939.pth'): | ||||
|             self.statusbar.showMessage('Find the checkpoint named {}.'.format('sam_vit_h_4b8939.pth')) | ||||
|             self.segany = SegAny('./segment_any/sam_vit_h_4b8939.pth') | ||||
|             self.use_segment_anything = True | ||||
|         elif os.path.exists('./segment_any/sam_vit_l_0b3195.pth'): | ||||
|             self.statusbar.showMessage('Find the checkpoint named {}.'.format('sam_vit_l_0b3195.pth')) | ||||
|             self.segany = SegAny('./segment_any/sam_vit_l_0b3195.pth') | ||||
|             self.use_segment_anything = True | ||||
|         elif os.path.exists('./segment_any/sam_vit_b_01ec64.pth'): | ||||
|             self.statusbar.showMessage('Find the checkpoint named {}.'.format('sam_vit_b_01ec64.pth')) | ||||
|             self.segany = SegAny('./segment_any/sam_vit_b_01ec64.pth') | ||||
|             self.use_segment_anything = True | ||||
|             self.statusbar.showMessage() | ||||
|         else: | ||||
|             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 | ||||
| 
 | ||||
|     def init_ui(self): | ||||
|         self.setting_dialog = SettingDialog(parent=self, mainwindow=self) | ||||
| 
 | ||||
|         self.labels_dock_widget = LabelsDockWidget(mainwindow=self) | ||||
|         self.labels_dock.setWidget(self.labels_dock_widget) | ||||
| 
 | ||||
|         self.files_dock_widget = FilesDockWidget(mainwindow=self) | ||||
|         self.files_dock.setWidget(self.files_dock_widget) | ||||
| 
 | ||||
|         self.info_dock_widget = InfoDockWidget(mainwindow=self) | ||||
|         self.info_dock.setWidget(self.info_dock_widget) | ||||
| 
 | ||||
|         self.scene = AnnotationScene(mainwindow=self) | ||||
|         self.category_choice_widget = CategoryChoiceDialog(self, mainwindow=self, scene=self.scene) | ||||
|         self.category_edit_widget = CategoryEditDialog(self, self, self.scene) | ||||
| 
 | ||||
|         self.convert_dialog = ConvertDialog(self, mainwindow=self) | ||||
| 
 | ||||
|         self.view = AnnotationView(parent=self) | ||||
|         self.view.setScene(self.scene) | ||||
|         self.setCentralWidget(self.view) | ||||
| 
 | ||||
|         self.right_button_menu = RightButtonMenu(mainwindow=self) | ||||
|         self.right_button_menu.addAction(self.actionEdit) | ||||
|         self.right_button_menu.addAction(self.actionTo_top) | ||||
|         self.right_button_menu.addAction(self.actionTo_bottom) | ||||
| 
 | ||||
|         self.shortcut_dialog = ShortcutDialog(self) | ||||
|         self.about_dialog = AboutDialog(self) | ||||
| 
 | ||||
|         self.labelCoordinates = QtWidgets.QLabel('') | ||||
|         self.statusbar.addPermanentWidget(self.labelCoordinates) | ||||
| 
 | ||||
|         self.trans = QtCore.QTranslator() | ||||
| 
 | ||||
|     def translate(self, language='zh'): | ||||
|         if language == 'zh': | ||||
|             self.trans.load('ui/zh_CN') | ||||
|         else: | ||||
|             self.trans.load('ui/en') | ||||
|         self.actionChinese.setChecked(language=='zh') | ||||
|         self.actionEnglish.setChecked(language=='en') | ||||
|         _app = QtWidgets.QApplication.instance() | ||||
|         _app.installTranslator(self.trans) | ||||
|         self.retranslateUi(self) | ||||
|         self.info_dock_widget.retranslateUi(self.info_dock_widget) | ||||
|         self.labels_dock_widget.retranslateUi(self.labels_dock_widget) | ||||
|         self.files_dock_widget.retranslateUi(self.files_dock_widget) | ||||
|         self.category_choice_widget.retranslateUi(self.category_choice_widget) | ||||
|         self.category_edit_widget.retranslateUi(self.category_edit_widget) | ||||
|         self.setting_dialog.retranslateUi(self.setting_dialog) | ||||
|         self.about_dialog.retranslateUi(self.about_dialog) | ||||
|         self.shortcut_dialog.retranslateUi(self.shortcut_dialog) | ||||
|         self.convert_dialog.retranslateUi(self.convert_dialog) | ||||
| 
 | ||||
|     def translate_to_chinese(self): | ||||
|         self.translate('zh') | ||||
|         self.cfg['language'] = 'zh' | ||||
| 
 | ||||
|     def translate_to_english(self): | ||||
|         self.translate('en') | ||||
|         self.cfg['language'] = 'en' | ||||
| 
 | ||||
|     def reload_cfg(self): | ||||
|         self.cfg = load_config(self.config_file) | ||||
|         label_dict_list = self.cfg.get('label', []) | ||||
|         d = {} | ||||
|         for label_dict in label_dict_list: | ||||
|             category = label_dict.get('name', 'unknow') | ||||
|             color = label_dict.get('color', '#000000') | ||||
|             d[category] = color | ||||
|         self.category_color_dict = d | ||||
| 
 | ||||
|         if self.current_index is not None: | ||||
|             self.show_image(self.current_index) | ||||
| 
 | ||||
|         language = self.cfg.get('language', 'en') | ||||
|         self.translate(language) | ||||
| 
 | ||||
|     def set_saved_state(self, is_saved:bool): | ||||
|         self.saved = is_saved | ||||
|         if self.files_list is not None and self.current_index is not None: | ||||
| 
 | ||||
|             if is_saved: | ||||
|                 self.setWindowTitle(self.current_label.label_path) | ||||
|             else: | ||||
|                 self.setWindowTitle('*{}'.format(self.current_label.label_path)) | ||||
| 
 | ||||
|     def open_dir(self): | ||||
|         dir = QtWidgets.QFileDialog.getExistingDirectory(self) | ||||
|         if dir: | ||||
|             self.files_list.clear() | ||||
|             self.files_dock_widget.listWidget.clear() | ||||
| 
 | ||||
|             files = [] | ||||
|             suffixs = tuple(['{}'.format(fmt.data().decode('ascii').lower()) for fmt in QtGui.QImageReader.supportedImageFormats()]) | ||||
|             for f in os.listdir(dir): | ||||
|                 if f.lower().endswith(suffixs): | ||||
|                     # f = os.path.join(dir, f) | ||||
|                     files.append(f) | ||||
|             files = sorted(files) | ||||
|             self.files_list = files | ||||
| 
 | ||||
|             self.files_dock_widget.update_widget() | ||||
| 
 | ||||
|         self.current_index = 0 | ||||
| 
 | ||||
|         self.image_root = dir | ||||
|         self.actionOpen_dir.setStatusTip("Image root: {}".format(self.image_root)) | ||||
|         if self.label_root is None: | ||||
|             self.label_root = dir | ||||
|             self.actionSave_dir.setStatusTip("Label root: {}".format(self.label_root)) | ||||
| 
 | ||||
|         self.show_image(self.current_index) | ||||
| 
 | ||||
|     def save_dir(self): | ||||
|         dir = QtWidgets.QFileDialog.getExistingDirectory(self) | ||||
|         if dir: | ||||
|             self.label_root = dir | ||||
|             self.actionSave_dir.setStatusTip("Label root: {}".format(self.label_root)) | ||||
| 
 | ||||
|         # 刷新图片 | ||||
|         if self.current_index is not None: | ||||
|             self.show_image(self.current_index) | ||||
| 
 | ||||
|     def save(self): | ||||
|         if self.current_label is None: | ||||
|             return | ||||
|         self.current_label.objects.clear() | ||||
|         for polygon in self.polygons: | ||||
|             object = polygon.to_object() | ||||
|             self.current_label.objects.append(object) | ||||
| 
 | ||||
|         self.current_label.note = self.info_dock_widget.lineEdit_note.text() | ||||
|         self.current_label.save_annotation() | ||||
|         self.set_saved_state(True) | ||||
| 
 | ||||
|     def show_image(self, index:int): | ||||
|         self.reset_action() | ||||
|         self.current_label = None | ||||
|         self.load_finished = False | ||||
|         self.saved = True | ||||
|         if not -1 < index < len(self.files_list): | ||||
|             self.scene.clear() | ||||
|             self.scene.setSceneRect(QtCore.QRectF()) | ||||
|             return | ||||
|         try: | ||||
|             self.polygons.clear() | ||||
|             self.labels_dock_widget.listWidget.clear() | ||||
|             self.scene.cancel_draw() | ||||
|             file_path = os.path.join(self.image_root, self.files_list[index]) | ||||
|             image_data = Image.open(file_path) | ||||
| 
 | ||||
|             self.png_palette = image_data.getpalette() | ||||
|             if self.png_palette is not None: | ||||
|                 self.statusbar.showMessage('This is a label file.') | ||||
|                 self.actionSegment_anything.setEnabled(False) | ||||
|                 self.actionPolygon.setEnabled(False) | ||||
|                 self.actionSave.setEnabled(False) | ||||
|                 self.actionBit_map.setEnabled(False) | ||||
|             else: | ||||
|                 self.actionSegment_anything.setEnabled(self.use_segment_anything) | ||||
|                 self.actionPolygon.setEnabled(True) | ||||
|                 self.actionSave.setEnabled(True) | ||||
|                 self.actionBit_map.setEnabled(True) | ||||
|             self.scene.load_image(file_path) | ||||
|             self.view.zoomfit() | ||||
| 
 | ||||
|             # load label | ||||
|             if self.png_palette is None: | ||||
|                 _, name = os.path.split(file_path) | ||||
|                 label_path = os.path.join(self.label_root, '.'.join(name.split('.')[:-1]) + '.json') | ||||
|                 self.current_label = Annotation(file_path, label_path) | ||||
|                 # 载入数据 | ||||
|                 self.current_label.load_annotation() | ||||
| 
 | ||||
|                 for object in self.current_label.objects: | ||||
|                     polygon = Polygon() | ||||
|                     self.scene.addItem(polygon) | ||||
|                     polygon.load_object(object) | ||||
|                     self.polygons.append(polygon) | ||||
| 
 | ||||
|             if self.current_label is not None: | ||||
|                 self.setWindowTitle('{}'.format(self.current_label.label_path)) | ||||
|             else: | ||||
|                 self.setWindowTitle('{}'.format(file_path)) | ||||
| 
 | ||||
|             self.labels_dock_widget.update_listwidget() | ||||
|             self.info_dock_widget.update_widget() | ||||
|             self.files_dock_widget.set_select(index) | ||||
|             self.current_index = index | ||||
|             self.files_dock_widget.label_current.setText('{}'.format(self.current_index+1)) | ||||
|             self.load_finished = True | ||||
| 
 | ||||
|         except Exception as e: | ||||
|             print(e) | ||||
|         finally: | ||||
|             if self.current_index > 0: | ||||
|                 self.actionPrev.setEnabled(True) | ||||
|             else: | ||||
|                 self.actionPrev.setEnabled(False) | ||||
| 
 | ||||
|             if self.current_index < len(self.files_list) - 1: | ||||
|                 self.actionNext.setEnabled(True) | ||||
|             else: | ||||
|                 self.actionNext.setEnabled(False) | ||||
| 
 | ||||
|     def prev_image(self): | ||||
|         if self.scene.mode != STATUSMode.VIEW: | ||||
|             return | ||||
|         if self.current_index is None: | ||||
|             return | ||||
|         if not self.saved: | ||||
|             result = QtWidgets.QMessageBox.question(self, 'Warning', 'Proceed without saved?', QtWidgets.QMessageBox.StandardButton.Yes|QtWidgets.QMessageBox.StandardButton.No, QtWidgets.QMessageBox.StandardButton.No) | ||||
|             if result == QtWidgets.QMessageBox.StandardButton.No: | ||||
|                 return | ||||
|         self.current_index = self.current_index - 1 | ||||
|         if self.current_index < 0: | ||||
|             self.current_index = 0 | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'This is the first picture.') | ||||
|         else: | ||||
|             self.show_image(self.current_index) | ||||
| 
 | ||||
|     def next_image(self): | ||||
|         if self.scene.mode != STATUSMode.VIEW: | ||||
|             return | ||||
|         if self.current_index is None: | ||||
|             return | ||||
|         if not self.saved: | ||||
|             result = QtWidgets.QMessageBox.question(self, 'Warning', 'Proceed without saved?', QtWidgets.QMessageBox.StandardButton.Yes|QtWidgets.QMessageBox.StandardButton.No, QtWidgets.QMessageBox.StandardButton.No) | ||||
|             if result == QtWidgets.QMessageBox.StandardButton.No: | ||||
|                 return | ||||
|         self.current_index = self.current_index + 1 | ||||
|         if self.current_index > len(self.files_list)-1: | ||||
|             self.current_index = len(self.files_list)-1 | ||||
|             QtWidgets.QMessageBox.warning(self, 'Warning', 'This is the last picture.') | ||||
|         else: | ||||
|             self.show_image(self.current_index) | ||||
| 
 | ||||
|     def jump_to(self): | ||||
|         index = self.files_dock_widget.lineEdit_jump.text() | ||||
|         if index: | ||||
|             if not index.isdigit(): | ||||
|                 if index in self.files_list: | ||||
|                     index = self.files_list.index(index)+1 | ||||
|                 else: | ||||
|                     QtWidgets.QMessageBox.warning(self, 'Warning', 'Don`t exist image named: {}'.format(index)) | ||||
|                     self.files_dock_widget.lineEdit_jump.clear() | ||||
|                     return | ||||
|             index = int(index)-1 | ||||
|             if 0 <= index < len(self.files_list): | ||||
|                 self.show_image(index) | ||||
|                 self.files_dock_widget.lineEdit_jump.clear() | ||||
|             else: | ||||
|                 QtWidgets.QMessageBox.warning(self, 'Warning', 'Index must be in [1, {}].'.format(len(self.files_list))) | ||||
|                 self.files_dock_widget.lineEdit_jump.clear() | ||||
|                 self.files_dock_widget.lineEdit_jump.clearFocus() | ||||
|                 return | ||||
| 
 | ||||
|     def cancel_draw(self): | ||||
|         self.scene.cancel_draw() | ||||
| 
 | ||||
|     def setting(self): | ||||
|         self.setting_dialog.load_cfg() | ||||
|         self.setting_dialog.show() | ||||
| 
 | ||||
|     def add_new_object(self, category, group, segmentation, area, layer, bbox): | ||||
|         if self.current_label is None: | ||||
|             return | ||||
|         object = Object(category=category, group=group, segmentation=segmentation, area=area, layer=layer, bbox=bbox) | ||||
|         self.current_label.objects.append(object) | ||||
| 
 | ||||
|     def delete_object(self, index:int): | ||||
|         if 0 <= index < len(self.current_label.objects): | ||||
|             del self.current_label.objects[index] | ||||
| 
 | ||||
|     def change_bit_map(self): | ||||
|         if self.scene.mode == STATUSMode.CREATE: | ||||
|             self.scene.cancel_draw() | ||||
|         if self.map_mode == MAPMode.LABEL: | ||||
|             # to semantic | ||||
|             for polygon in self.polygons: | ||||
|                 polygon.setEnabled(False) | ||||
|                 for vertex in polygon.vertexs: | ||||
|                     vertex.setVisible(False) | ||||
|                 polygon.change_color(QtGui.QColor(self.category_color_dict.get(polygon.category, '#000000'))) | ||||
|                 polygon.color.setAlpha(255) | ||||
|                 polygon.setBrush(polygon.color) | ||||
|             self.labels_dock_widget.listWidget.setEnabled(False) | ||||
|             self.actionSegment_anything.setEnabled(False) | ||||
|             self.actionPolygon.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) | ||||
|             self.actionBit_map.setIcon(semantic_icon) | ||||
| 
 | ||||
|         elif self.map_mode == MAPMode.SEMANTIC: | ||||
|             # to instance | ||||
|             for polygon in self.polygons: | ||||
|                 polygon.setEnabled(False) | ||||
|                 for vertex in polygon.vertexs: | ||||
|                     vertex.setVisible(False) | ||||
|                 if polygon.group != '': | ||||
|                     rgb = self.instance_cmap[int(polygon.group)] | ||||
|                 else: | ||||
|                     rgb = self.instance_cmap[0] | ||||
|                 polygon.change_color(QtGui.QColor(rgb[0], rgb[1], rgb[2], 255)) | ||||
|                 polygon.color.setAlpha(255) | ||||
|                 polygon.setBrush(polygon.color) | ||||
|             self.labels_dock_widget.listWidget.setEnabled(False) | ||||
|             self.actionSegment_anything.setEnabled(False) | ||||
|             self.actionPolygon.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) | ||||
|             self.actionBit_map.setIcon(instance_icon) | ||||
| 
 | ||||
|         elif self.map_mode == MAPMode.INSTANCE: | ||||
|             # to label | ||||
|             for polygon in self.polygons: | ||||
|                 polygon.setEnabled(True) | ||||
|                 for vertex in polygon.vertexs: | ||||
|                     # vertex.setEnabled(True) | ||||
|                     vertex.setVisible(polygon.isVisible()) | ||||
|                 polygon.change_color(QtGui.QColor(self.category_color_dict.get(polygon.category, '#000000'))) | ||||
|                 polygon.color.setAlpha(polygon.nohover_alpha) | ||||
|                 polygon.setBrush(polygon.color) | ||||
|             self.labels_dock_widget.listWidget.setEnabled(True) | ||||
|             self.actionSegment_anything.setEnabled(self.use_segment_anything) | ||||
|             self.actionPolygon.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) | ||||
|             self.actionBit_map.setIcon(label_icon) | ||||
|         else: | ||||
|             pass | ||||
| 
 | ||||
|     def label_converter(self): | ||||
|         self.convert_dialog.reset_gui() | ||||
|         self.convert_dialog.show() | ||||
| 
 | ||||
|     def help(self): | ||||
|         self.shortcut_dialog.show() | ||||
| 
 | ||||
|     def about(self): | ||||
|         self.about_dialog.show() | ||||
| 
 | ||||
|     def save_cfg(self, config_file): | ||||
|         save_config(self.cfg, config_file) | ||||
| 
 | ||||
|     def exit(self): | ||||
|         self.save_cfg(self.config_file) | ||||
|         self.close() | ||||
| 
 | ||||
|     def closeEvent(self, a0: QtGui.QCloseEvent): | ||||
|         self.exit() | ||||
| 
 | ||||
|     def init_connect(self): | ||||
|         self.actionOpen_dir.triggered.connect(self.open_dir) | ||||
|         self.actionSave_dir.triggered.connect(self.save_dir) | ||||
|         self.actionPrev.triggered.connect(self.prev_image) | ||||
|         self.actionNext.triggered.connect(self.next_image) | ||||
|         self.actionSetting.triggered.connect(self.setting) | ||||
|         self.actionExit.triggered.connect(self.exit) | ||||
| 
 | ||||
|         self.actionSegment_anything.triggered.connect(self.scene.start_segment_anything) | ||||
|         self.actionPolygon.triggered.connect(self.scene.start_draw_polygon) | ||||
|         self.actionCancel.triggered.connect(self.scene.cancel_draw) | ||||
|         self.actionBackspace.triggered.connect(self.scene.backspace) | ||||
|         self.actionFinish.triggered.connect(self.scene.finish_draw) | ||||
|         self.actionEdit.triggered.connect(self.scene.edit_polygon) | ||||
|         self.actionDelete.triggered.connect(self.scene.delete_selected_graph) | ||||
|         self.actionSave.triggered.connect(self.save) | ||||
|         self.actionTo_top.triggered.connect(self.scene.move_polygon_to_top) | ||||
|         self.actionTo_bottom.triggered.connect(self.scene.move_polygon_to_bottom) | ||||
| 
 | ||||
|         self.actionZoom_in.triggered.connect(self.view.zoom_in) | ||||
|         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.actionConverter.triggered.connect(self.label_converter) | ||||
| 
 | ||||
|         self.actionShortcut.triggered.connect(self.help) | ||||
|         self.actionAbout.triggered.connect(self.about) | ||||
| 
 | ||||
|         self.actionChinese.triggered.connect(self.translate_to_chinese) | ||||
|         self.actionEnglish.triggered.connect(self.translate_to_english) | ||||
| 
 | ||||
|         self.labels_dock_widget.listWidget.doubleClicked.connect(self.scene.edit_polygon) | ||||
| 
 | ||||
|     def reset_action(self): | ||||
|         self.actionPrev.setEnabled(False) | ||||
|         self.actionNext.setEnabled(False) | ||||
|         self.actionSegment_anything.setEnabled(False) | ||||
|         self.actionPolygon.setEnabled(False) | ||||
|         self.actionEdit.setEnabled(False) | ||||
|         self.actionDelete.setEnabled(False) | ||||
|         self.actionSave.setEnabled(False) | ||||
|         self.actionTo_top.setEnabled(False) | ||||
|         self.actionTo_bottom.setEnabled(False) | ||||
|         self.actionBit_map.setChecked(False) | ||||
|         self.actionBit_map.setEnabled(False) | ||||
							
								
								
									
										244
									
								
								widgets/polygon.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,244 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtCore, QtWidgets, QtGui | ||||
| from annotation import Object | ||||
| import typing | ||||
| 
 | ||||
| class Vertex(QtWidgets.QGraphicsPathItem): | ||||
|     def __init__(self, polygon, index, color): | ||||
|         super(Vertex, self).__init__() | ||||
|         self.polygon = polygon | ||||
|         self.index = index | ||||
|         self.color = color | ||||
| 
 | ||||
|         self.hover_size = 3 | ||||
|         self.nohover_size = 2 | ||||
|         self.line_width = 0 | ||||
| 
 | ||||
|         self.nohover = QtGui.QPainterPath() | ||||
|         self.nohover.addEllipse(QtCore.QRectF(-self.nohover_size//2, -self.nohover_size//2, self.nohover_size, self.nohover_size)) | ||||
|         self.hover = QtGui.QPainterPath() | ||||
|         self.hover.addEllipse(QtCore.QRectF(-self.hover_size//2, -self.hover_size//2, self.hover_size, self.hover_size)) | ||||
| 
 | ||||
|         self.setPath(self.nohover) | ||||
|         self.setBrush(self.color) | ||||
|         self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor)) | ||||
|         self.setPen(QtGui.QPen(self.color, self.line_width)) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, True) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True) | ||||
|         self.setAcceptHoverEvents(True) | ||||
|         self.setZValue(1e5) | ||||
| 
 | ||||
|     def itemChange(self, change: 'QtWidgets.QGraphicsItem.GraphicsItemChange', value: typing.Any): | ||||
| 
 | ||||
|         if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemPositionChange and self.isEnabled(): | ||||
|             # 限制顶点移动到图外 | ||||
|             if value.x() < 0: | ||||
|                 value.setX(0) | ||||
|             if value.x() > self.scene().width(): | ||||
|                 value.setX(self.scene().width()) | ||||
|             if value.y() < 0: | ||||
|                 value.setY(0) | ||||
|             if value.y() > self.scene().height(): | ||||
|                 value.setY(self.scene().height()) | ||||
| 
 | ||||
|             self.polygon.movePoint(self.index, value) | ||||
| 
 | ||||
|         return super(Vertex, self).itemChange(change, value) | ||||
|      | ||||
|     def hoverEnterEvent(self, event: 'QGraphicsSceneHoverEvent'): | ||||
|         self.setPath(self.hover) | ||||
|         super(Vertex, self).hoverEnterEvent(event) | ||||
| 
 | ||||
|     def hoverLeaveEvent(self, event: 'QGraphicsSceneHoverEvent'): | ||||
|         self.setPath(self.nohover) | ||||
|         super(Vertex, self).hoverLeaveEvent(event) | ||||
| 
 | ||||
| 
 | ||||
| class Polygon(QtWidgets.QGraphicsPolygonItem): | ||||
|     def __init__(self): | ||||
|         super(Polygon, self).__init__(parent=None) | ||||
|         self.line_width = 0 | ||||
|         self.hover_alpha = 150 | ||||
|         self.nohover_alpha = 80 | ||||
|         self.points = [] | ||||
|         self.vertexs = [] | ||||
|         self.category = '' | ||||
|         self.group = 0 | ||||
|         self.iscrowd = 0 | ||||
|         self.note = '' | ||||
| 
 | ||||
|         self.rxmin, self.rxmax, self.rymin, self.rymax = 0, 0, 0, 0 # 用于绘画完成后,记录多边形的各边界,此处与points对应 | ||||
|         self.color = QtGui.QColor('#ff0000') | ||||
|         self.is_drawing = True | ||||
| 
 | ||||
|         self.setPen(QtGui.QPen(self.color, self.line_width)) | ||||
|         self.setBrush(QtGui.QBrush(self.color, QtCore.Qt.BrushStyle.FDiagPattern)) | ||||
| 
 | ||||
|         self.setAcceptHoverEvents(True) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, True) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True) | ||||
|         self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True) | ||||
|         self.setZValue(1e5) | ||||
| 
 | ||||
|     def addPoint(self, point): | ||||
|         self.points.append(point) | ||||
|         vertex = Vertex(self, len(self.points)-1, self.color) | ||||
|         # 添加路径点 | ||||
|         self.scene().addItem(vertex) | ||||
|         self.vertexs.append(vertex) | ||||
|         vertex.setPos(point) | ||||
| 
 | ||||
|     def movePoint(self, index, point): | ||||
|         if not 0 <= index < len(self.points): | ||||
|             return | ||||
|         self.points[index] = self.mapFromScene(point) | ||||
| 
 | ||||
|         self.redraw() | ||||
|         if self.scene().mainwindow.load_finished and not self.is_drawing: | ||||
|             self.scene().mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|     def removePoint(self, index): | ||||
|         if not self.points: | ||||
|             return | ||||
|         self.points.pop(index) | ||||
|         vertex = self.vertexs.pop(index) | ||||
|         self.scene().removeItem(vertex) | ||||
|         del vertex | ||||
|         self.redraw() | ||||
| 
 | ||||
|     def delete(self): | ||||
|         self.points.clear() | ||||
|         while self.vertexs: | ||||
|             vertex = self.vertexs.pop() | ||||
|             self.scene().removeItem(vertex) | ||||
|             del vertex | ||||
| 
 | ||||
|     def moveVertex(self, index, point): | ||||
|         if not 0 <= index < len(self.vertexs): | ||||
|             return | ||||
|         vertex = self.vertexs[index] | ||||
|         vertex.setEnabled(False) | ||||
|         vertex.setPos(point) | ||||
|         vertex.setEnabled(True) | ||||
| 
 | ||||
|     def itemChange(self, change: 'QGraphicsItem.GraphicsItemChange', value: typing.Any): | ||||
|         if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemSelectedHasChanged and not self.is_drawing: # 选中改变 | ||||
|             if self.isSelected(): | ||||
|                 color = QtGui.QColor('#00A0FF') | ||||
|                 color.setAlpha(self.hover_alpha) | ||||
|                 self.setBrush(color) | ||||
|             else: | ||||
|                 self.color.setAlpha(self.nohover_alpha) | ||||
|                 self.setBrush(self.color) | ||||
|             self.scene().mainwindow.labels_dock_widget.set_selected(self) # 更新label面板 | ||||
| 
 | ||||
|         if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemPositionChange: # ItemPositionHasChanged | ||||
|             bias = value | ||||
|             l, t, b, r = self.boundingRect().left(), self.boundingRect().top(), self.boundingRect().bottom(), self.boundingRect().right() | ||||
|             if l + bias.x() < 0: bias.setX(-l) | ||||
|             if r + bias.x() > self.scene().width(): bias.setX(self.scene().width()-r) | ||||
|             if t + bias.y() < 0: bias.setY(-t) | ||||
|             if b + bias.y() > self.scene().height(): bias.setY(self.scene().height()-b) | ||||
| 
 | ||||
|             for index, point in enumerate(self.points): | ||||
|                 self.moveVertex(index, point+bias) | ||||
| 
 | ||||
|             if self.scene().mainwindow.load_finished and not self.is_drawing: | ||||
|                 self.scene().mainwindow.set_saved_state(False) | ||||
| 
 | ||||
|         return super(Polygon, self).itemChange(change, value) | ||||
| 
 | ||||
|     def hoverEnterEvent(self, event: 'QGraphicsSceneHoverEvent'): | ||||
|         if not self.is_drawing: | ||||
|             self.color.setAlpha(self.hover_alpha) | ||||
|             self.setBrush(self.color) | ||||
|         super(Polygon, self).hoverEnterEvent(event) | ||||
| 
 | ||||
|     def hoverLeaveEvent(self, event: 'QGraphicsSceneHoverEvent'): | ||||
|         if not self.is_drawing: | ||||
|             self.color.setAlpha(self.nohover_alpha) | ||||
|             self.setBrush(self.color) | ||||
|         super(Polygon, self).hoverEnterEvent(event) | ||||
| 
 | ||||
|     def mouseDoubleClickEvent(self, event: 'QGraphicsSceneMouseEvent'): | ||||
|         if event.button() == QtCore.Qt.MouseButton.LeftButton: | ||||
|             self.scene().mainwindow.category_edit_widget.polygon = self | ||||
|             self.scene().mainwindow.category_edit_widget.load_cfg() | ||||
|             self.scene().mainwindow.category_edit_widget.show() | ||||
| 
 | ||||
|     def redraw(self): | ||||
|         if len(self.points) < 1: | ||||
|             return | ||||
|         xs = [p.x() for p in self.points] | ||||
|         ys = [p.y() for p in self.points] | ||||
|         self.rxmin, self.rymin, self.rxmax, self.rymax = min(xs), min(ys), max(xs), max(ys) | ||||
|         self.setPolygon(QtGui.QPolygonF(self.points)) | ||||
| 
 | ||||
|     def change_color(self, color): | ||||
|         self.color = color | ||||
|         self.color.setAlpha(self.nohover_alpha) | ||||
|         self.setPen(QtGui.QPen(self.color, self.line_width)) | ||||
|         self.setBrush(self.color) | ||||
|         for vertex in self.vertexs: | ||||
|             vertex_color = self.color | ||||
|             vertex_color.setAlpha(255) | ||||
|             vertex.setPen(QtGui.QPen(vertex_color, self.line_width)) | ||||
|             vertex.setBrush(vertex_color) | ||||
| 
 | ||||
|     def set_drawed(self, category, group, iscrowd, note, color:QtGui.QColor, layer=None): | ||||
|         self.is_drawing = False | ||||
|         self.category = category | ||||
|         self.group = group | ||||
|         self.iscrowd = iscrowd | ||||
|         self.note = note | ||||
| 
 | ||||
|         self.color = color | ||||
|         self.color.setAlpha(self.nohover_alpha) | ||||
|         self.setPen(QtGui.QPen(self.color, self.line_width)) | ||||
|         self.setBrush(self.color) | ||||
|         if layer is not None: | ||||
|             self.setZValue(layer) | ||||
|         for vertex in self.vertexs: | ||||
|             vertex_color = self.color | ||||
|             vertex_color.setAlpha(255) | ||||
|             vertex.setPen(QtGui.QPen(vertex_color, self.line_width)) | ||||
|             vertex.setBrush(vertex_color) | ||||
|             if layer is not None: | ||||
|                 vertex.setZValue(layer) | ||||
| 
 | ||||
|     def calculate_area(self): | ||||
|         area = 0 | ||||
|         num_points = len(self.points) | ||||
|         for i in range(num_points): | ||||
|             p1 = self.points[i] | ||||
|             p2 = self.points[(i + 1) % num_points] | ||||
|             d = p1.x() * p2.y() - p2.x() * p1.y() | ||||
|             area += d | ||||
|         return abs(area) / 2 | ||||
| 
 | ||||
|     def load_object(self, object): | ||||
|         segmentation = object.segmentation | ||||
|         for x, y in segmentation: | ||||
|             point = QtCore.QPointF(x, y) | ||||
|             self.addPoint(point) | ||||
|         color = self.scene().mainwindow.category_color_dict.get(object.category, '#000000') | ||||
|         self.set_drawed(object.category, object.group, object.iscrowd, object.note, QtGui.QColor(color), object.layer)  # ... | ||||
| 
 | ||||
|     def to_object(self): | ||||
|         if self.is_drawing: | ||||
|             return None | ||||
|         segmentation = [] | ||||
|         for point in self.points: | ||||
|             point = point + self.pos() | ||||
|             segmentation.append((round(point.x()), round(point.y()))) | ||||
|         xmin = self.boundingRect().x() + self.pos().x() | ||||
|         ymin = self.boundingRect().y() + self.pos().y() | ||||
|         xmax = xmin + self.boundingRect().width() | ||||
|         ymax = ymin + self.boundingRect().height() | ||||
| 
 | ||||
|         object = Object(self.category, group=self.group, segmentation=segmentation, | ||||
|                         area=self.calculate_area(), layer=self.zValue(), bbox=(xmin, ymin, xmax, ymax), iscrowd=self.iscrowd, note=self.note) | ||||
|         return object | ||||
							
								
								
									
										11
									
								
								widgets/process_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from ui.process_dialog import Ui_Dialog | ||||
| from PyQt5 import QtGui, QtWidgets, QtCore | ||||
| 
 | ||||
| class PorcessDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent): | ||||
|         super(PorcessDialog, self).__init__(parent) | ||||
|         self.setupUi(self) | ||||
| 
 | ||||
							
								
								
									
										10
									
								
								widgets/right_button_menu.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,10 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets | ||||
| 
 | ||||
| class RightButtonMenu(QtWidgets.QMenu): | ||||
|     def __init__(self, mainwindow): | ||||
|         super(RightButtonMenu, self).__init__() | ||||
|         self.mainwindow = mainwindow | ||||
| 
 | ||||
							
								
								
									
										132
									
								
								widgets/setting_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,132 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from PyQt5 import QtWidgets, QtCore, QtGui | ||||
| from ui.setting_dialog import Ui_Dialog | ||||
| from configs import * | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| class SettingDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent, mainwindow): | ||||
|         super(SettingDialog, self).__init__(parent) | ||||
|         self.mainwindow = mainwindow | ||||
|         self.setupUi(self) | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||
| 
 | ||||
|         self.init_connect() | ||||
| 
 | ||||
|     def get_item_and_widget(self, category, color: str): | ||||
|         item = QtWidgets.QListWidgetItem() | ||||
|         item.setSizeHint(QtCore.QSize(200, 40)) | ||||
| 
 | ||||
|         widget = QtWidgets.QWidget() | ||||
|         layout = QtWidgets.QHBoxLayout() | ||||
|         category_label = QtWidgets.QLabel() | ||||
|         category_label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) | ||||
|         category_label.setText(category) | ||||
|         category_label.setObjectName('category') | ||||
|         # 颜色 | ||||
|         color_button = QtWidgets.QPushButton() | ||||
|         color_button.setStyleSheet('QWidget {background-color: %s}' % color) | ||||
|         color_button.setFixedWidth(50) | ||||
|         color_button.clicked.connect(self.edit_category_item_color) | ||||
|         color_button.setObjectName('color') | ||||
|         # 删除 | ||||
|         delete_button = QtWidgets.QPushButton() | ||||
|         delete_button.setText('delete') | ||||
|         delete_button.setFixedWidth(80) | ||||
|         delete_button.clicked.connect(self.remove_category_item) | ||||
| 
 | ||||
|         if category == '__background__': | ||||
|             color_button.setEnabled(False) | ||||
|             delete_button.setEnabled(False) | ||||
| 
 | ||||
|         layout.addWidget(category_label) | ||||
|         layout.addWidget(color_button) | ||||
|         layout.addWidget(delete_button) | ||||
|         widget.setLayout(layout) | ||||
|         return item, widget | ||||
| 
 | ||||
|     def edit_category_item_color(self): | ||||
|         button = self.sender() | ||||
|         color = QtWidgets.QColorDialog.getColor() | ||||
|         if color.isValid(): | ||||
|             button.setStyleSheet('QWidget {background-color: %s}' % (color.name())) | ||||
| 
 | ||||
|     def remove_category_item(self): | ||||
|         button = self.sender() | ||||
|         row = self.category_list_widget.indexAt(button.parent().pos()).row() | ||||
|         self.category_list_widget.takeItem(row) | ||||
| 
 | ||||
|     def load_cfg(self): | ||||
|         cfg = load_config(self.mainwindow.config_file) | ||||
|         self.category_list_widget.clear() | ||||
|         labels = cfg.get('label', []) | ||||
|         labels_key = [l.get('name') for l in labels] | ||||
| 
 | ||||
|         if '__background__' not in labels_key: | ||||
|             print(labels) | ||||
|             labels.insert(0, {'name': '__background__', 'color': '#000000'}) | ||||
| 
 | ||||
|         if labels is not None: | ||||
|             for label in labels: | ||||
|                 item, item_widget = self.get_item_and_widget(label.get('name', ''), color=label.get('color', '#00ff00')) | ||||
|                 self.category_list_widget.addItem(item) | ||||
|                 self.category_list_widget.setItemWidget(item, item_widget) | ||||
| 
 | ||||
|     def add_new_category(self): | ||||
|         category = self.category_input.text() | ||||
|         color = self.color_button.palette().button().color().name() | ||||
|         if category: | ||||
|             item, item_widget = self.get_item_and_widget(category, color) | ||||
|             self.category_list_widget.addItem(item) | ||||
|             self.category_list_widget.setItemWidget(item, item_widget) | ||||
|         self.category_input.clear() | ||||
| 
 | ||||
|     def choice_color(self): | ||||
|         color = QtWidgets.QColorDialog.getColor() | ||||
|         if color.isValid(): | ||||
|             self.color_button.setStyleSheet('QWidget {background-color: %s}' % color.name()) | ||||
| 
 | ||||
|     def import_cfg(self): | ||||
|         file, _ = QtWidgets.QFileDialog.getOpenFileName(self, filter='Yaml File(*.yaml)') | ||||
|         if file: | ||||
|             self.mainwindow.config_file = file | ||||
|             self.mainwindow.actionSetting.setStatusTip("Config yaml: {}".format(file)) | ||||
|             self.mainwindow.reload_cfg() | ||||
|         self.load_cfg() | ||||
| 
 | ||||
|     def export_cfg(self): | ||||
|         file, _ = QtWidgets.QFileDialog.getSaveFileName(self, filter='Yaml File(*.yaml)') | ||||
|         if not file.endswith('.yaml'): | ||||
|             file += '.yaml' | ||||
|         if file: | ||||
|             self.mainwindow.save_cfg(file) | ||||
|         self.load_cfg() | ||||
| 
 | ||||
|     def apply(self): | ||||
|         cfg = {} | ||||
|         cfg['label'] = [] | ||||
|         for index in range(self.category_list_widget.count()): | ||||
|             item = self.category_list_widget.item(index) | ||||
|             widget = self.category_list_widget.itemWidget(item) | ||||
|             category_label = widget.findChild(QtWidgets.QLabel, 'category') | ||||
|             color_button = widget.findChild(QtWidgets.QPushButton, 'color') | ||||
|             cfg['label'].append( | ||||
|                 {'name': category_label.text(), 'color': color_button.palette().button().color().name()}) | ||||
| 
 | ||||
|         save_config(cfg, self.mainwindow.config_file) | ||||
|         self.mainwindow.reload_cfg() | ||||
|         self.close() | ||||
| 
 | ||||
|     def cache(self): | ||||
|         self.close() | ||||
| 
 | ||||
|     def init_connect(self): | ||||
|         self.add_button.clicked.connect(self.add_new_category) | ||||
|         self.apply_button.clicked.connect(self.apply) | ||||
|         self.cache_button.clicked.connect(self.cache) | ||||
|         self.color_button.clicked.connect(self.choice_color) | ||||
|         self.pushButton_import.clicked.connect(self.import_cfg) | ||||
|         self.pushButton_export.clicked.connect(self.export_cfg) | ||||
							
								
								
									
										11
									
								
								widgets/shortcut_dialog.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,11 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # @Author  : LG | ||||
| 
 | ||||
| from ui.shortcut_dialog import Ui_Dialog | ||||
| from PyQt5 import QtGui, QtCore, QtWidgets | ||||
| 
 | ||||
| class ShortcutDialog(QtWidgets.QDialog, Ui_Dialog): | ||||
|     def __init__(self, parent): | ||||
|         super(ShortcutDialog, self).__init__(parent) | ||||
|         self.setupUi(self) | ||||
|         self.setWindowModality(QtCore.Qt.WindowModality.WindowModal) | ||||