Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
27号BigBang
labelme
提交
ab87ce00
L
labelme
项目概览
27号BigBang
/
labelme
与 Fork 源项目一致
从无法访问的项目Fork
通知
6
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
labelme
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ab87ce00
编写于
7月 02, 2019
作者:
C
Chen Zhang
提交者:
Kentaro Wada
12月 26, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add QTranslator support
上级
0644d0c6
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
133 addition
and
130 deletion
+133
-130
labelme/app.py
labelme/app.py
+129
-129
labelme/main.py
labelme/main.py
+4
-1
未找到文件。
labelme/app.py
浏览文件 @
ab87ce00
...
...
@@ -88,7 +88,7 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
lastOpenDir
=
None
self
.
flag_dock
=
self
.
flag_widget
=
None
self
.
flag_dock
=
QtWidgets
.
QDockWidget
(
'Flags'
,
self
)
self
.
flag_dock
=
QtWidgets
.
QDockWidget
(
self
.
tr
(
'Flags'
)
,
self
)
self
.
flag_dock
.
setObjectName
(
'Flags'
)
self
.
flag_widget
=
QtWidgets
.
QListWidget
()
if
config
[
'flags'
]:
...
...
@@ -104,23 +104,23 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
labelList
.
setDragDropMode
(
QtWidgets
.
QAbstractItemView
.
InternalMove
)
self
.
labelList
.
setParent
(
self
)
self
.
shape_dock
=
QtWidgets
.
QDockWidget
(
'Polygon Labels'
,
self
)
self
.
shape_dock
=
QtWidgets
.
QDockWidget
(
self
.
tr
(
'Polygon Labels'
)
,
self
)
self
.
shape_dock
.
setObjectName
(
'Labels'
)
self
.
shape_dock
.
setWidget
(
self
.
labelList
)
self
.
uniqLabelList
=
EscapableQListWidget
()
self
.
uniqLabelList
.
setToolTip
(
self
.
uniqLabelList
.
setToolTip
(
self
.
tr
(
"Select label to start annotating for it. "
"Press 'Esc' to deselect."
)
"Press 'Esc' to deselect."
)
)
if
self
.
_config
[
'labels'
]:
self
.
uniqLabelList
.
addItems
(
self
.
_config
[
'labels'
])
self
.
uniqLabelList
.
sortItems
()
self
.
label_dock
=
QtWidgets
.
QDockWidget
(
u
'Label List'
,
self
)
self
.
label_dock
=
QtWidgets
.
QDockWidget
(
self
.
tr
(
u
'Label List'
)
,
self
)
self
.
label_dock
.
setObjectName
(
u
'Label List'
)
self
.
label_dock
.
setWidget
(
self
.
uniqLabelList
)
self
.
fileSearch
=
QtWidgets
.
QLineEdit
()
self
.
fileSearch
.
setPlaceholderText
(
'Search Filename'
)
self
.
fileSearch
.
setPlaceholderText
(
self
.
tr
(
'Search Filename'
)
)
self
.
fileSearch
.
textChanged
.
connect
(
self
.
fileSearchChanged
)
self
.
fileListWidget
=
QtWidgets
.
QListWidget
()
self
.
fileListWidget
.
itemSelectionChanged
.
connect
(
...
...
@@ -131,7 +131,7 @@ class MainWindow(QtWidgets.QMainWindow):
fileListLayout
.
setSpacing
(
0
)
fileListLayout
.
addWidget
(
self
.
fileSearch
)
fileListLayout
.
addWidget
(
self
.
fileListWidget
)
self
.
file_dock
=
QtWidgets
.
QDockWidget
(
u
'File List'
,
self
)
self
.
file_dock
=
QtWidgets
.
QDockWidget
(
self
.
tr
(
u
'File List'
)
,
self
)
self
.
file_dock
.
setObjectName
(
u
'Files'
)
fileListWidget
=
QtWidgets
.
QWidget
()
fileListWidget
.
setLayout
(
fileListLayout
)
...
...
@@ -181,194 +181,194 @@ class MainWindow(QtWidgets.QMainWindow):
# Actions
action
=
functools
.
partial
(
utils
.
newAction
,
self
)
shortcuts
=
self
.
_config
[
'shortcuts'
]
quit
=
action
(
'&Quit'
,
self
.
close
,
shortcuts
[
'quit'
],
'quit'
,
'Quit application'
)
open_
=
action
(
'&Open'
,
self
.
openFile
,
shortcuts
[
'open'
],
'open'
,
'Open image or label file'
)
opendir
=
action
(
'&Open Dir'
,
self
.
openDirDialog
,
shortcuts
[
'open_dir'
],
'open'
,
u
'Open Dir'
)
quit
=
action
(
self
.
tr
(
'&Quit'
)
,
self
.
close
,
shortcuts
[
'quit'
],
'quit'
,
self
.
tr
(
'Quit application'
)
)
open_
=
action
(
self
.
tr
(
'&Open'
)
,
self
.
openFile
,
shortcuts
[
'open'
],
'open'
,
self
.
tr
(
'Open image or label file'
)
)
opendir
=
action
(
self
.
tr
(
'&Open Dir'
)
,
self
.
openDirDialog
,
shortcuts
[
'open_dir'
],
'open'
,
self
.
tr
(
u
'Open Dir'
)
)
openNextImg
=
action
(
'&Next Image'
,
self
.
tr
(
'&Next Image'
)
,
self
.
openNextImg
,
shortcuts
[
'open_next'
],
'next'
,
u
'Open next (hold Ctl+Shift to copy labels)'
,
self
.
tr
(
u
'Open next (hold Ctl+Shift to copy labels)'
)
,
enabled
=
False
,
)
openPrevImg
=
action
(
'&Prev Image'
,
self
.
tr
(
'&Prev Image'
)
,
self
.
openPrevImg
,
shortcuts
[
'open_prev'
],
'prev'
,
u
'Open prev (hold Ctl+Shift to copy labels)'
,
self
.
tr
(
u
'Open prev (hold Ctl+Shift to copy labels)'
)
,
enabled
=
False
,
)
save
=
action
(
'&Save'
,
self
.
saveFile
,
shortcuts
[
'save'
],
'save'
,
'Save labels to file'
,
enabled
=
False
)
saveAs
=
action
(
'&Save As'
,
self
.
saveFileAs
,
shortcuts
[
'save_as'
],
'save-as'
,
'Save labels to a different file'
,
save
=
action
(
self
.
tr
(
'&Save'
)
,
self
.
saveFile
,
shortcuts
[
'save'
],
'save'
,
self
.
tr
(
'Save labels to file'
)
,
enabled
=
False
)
saveAs
=
action
(
self
.
tr
(
'&Save As'
)
,
self
.
saveFileAs
,
shortcuts
[
'save_as'
],
'save-as'
,
self
.
tr
(
'Save labels to a different file'
)
,
enabled
=
False
)
deleteFile
=
action
(
'&Delete File'
,
self
.
tr
(
'&Delete File'
)
,
self
.
deleteFile
,
shortcuts
[
'delete_file'
],
'delete'
,
'Delete current label file'
,
self
.
tr
(
'Delete current label file'
)
,
enabled
=
False
)
changeOutputDir
=
action
(
'&Change Output Dir'
,
self
.
tr
(
'&Change Output Dir'
)
,
slot
=
self
.
changeOutputDirDialog
,
shortcut
=
shortcuts
[
'save_to'
],
icon
=
'open'
,
tip
=
u
'Change where annotations are loaded/saved'
tip
=
self
.
tr
(
u
'Change where annotations are loaded/saved'
)
)
saveAuto
=
action
(
text
=
'Save &Automatically'
,
text
=
self
.
tr
(
'Save &Automatically'
)
,
slot
=
lambda
x
:
self
.
actions
.
saveAuto
.
setChecked
(
x
),
icon
=
'save'
,
tip
=
'Save automatically'
,
tip
=
self
.
tr
(
'Save automatically'
)
,
checkable
=
True
,
enabled
=
True
,
)
saveAuto
.
setChecked
(
self
.
_config
[
'auto_save'
])
close
=
action
(
'&Close'
,
self
.
closeFile
,
shortcuts
[
'close'
],
'close'
,
'Close current file'
)
color1
=
action
(
'Polygon &Line Color'
,
self
.
chooseColor1
,
close
=
action
(
self
.
tr
(
'&Close'
)
,
self
.
closeFile
,
shortcuts
[
'close'
],
'close'
,
self
.
tr
(
'Close current file'
)
)
color1
=
action
(
self
.
tr
(
'Polygon &Line Color'
)
,
self
.
chooseColor1
,
shortcuts
[
'edit_line_color'
],
'color_line'
,
'Choose polygon line color'
)
color2
=
action
(
'Polygon &Fill Color'
,
self
.
chooseColor2
,
self
.
tr
(
'Choose polygon line color'
)
)
color2
=
action
(
self
.
tr
(
'Polygon &Fill Color'
)
,
self
.
chooseColor2
,
shortcuts
[
'edit_fill_color'
],
'color'
,
'Choose polygon fill color'
)
self
.
tr
(
'Choose polygon fill color'
)
)
toggle_keep_prev_mode
=
action
(
'Keep Previous Annotation'
,
self
.
tr
(
'Keep Previous Annotation'
)
,
self
.
toggleKeepPrevMode
,
shortcuts
[
'toggle_keep_prev_mode'
],
None
,
'Toggle "keep pevious annotation" mode'
,
self
.
tr
(
'Toggle "keep pevious annotation" mode'
)
,
checkable
=
True
)
toggle_keep_prev_mode
.
setChecked
(
self
.
_config
[
'keep_prev'
])
createMode
=
action
(
'Create Polygons'
,
self
.
tr
(
'Create Polygons'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'polygon'
),
shortcuts
[
'create_polygon'
],
'objects'
,
'Start drawing polygons'
,
self
.
tr
(
'Start drawing polygons'
)
,
enabled
=
False
,
)
createRectangleMode
=
action
(
'Create Rectangle'
,
self
.
tr
(
'Create Rectangle'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'rectangle'
),
shortcuts
[
'create_rectangle'
],
'objects'
,
'Start drawing rectangles'
,
self
.
tr
(
'Start drawing rectangles'
)
,
enabled
=
False
,
)
createCircleMode
=
action
(
'Create Circle'
,
self
.
tr
(
'Create Circle'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'circle'
),
shortcuts
[
'create_circle'
],
'objects'
,
'Start drawing circles'
,
self
.
tr
(
'Start drawing circles'
)
,
enabled
=
False
,
)
createLineMode
=
action
(
'Create Line'
,
self
.
tr
(
'Create Line'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'line'
),
shortcuts
[
'create_line'
],
'objects'
,
'Start drawing lines'
,
self
.
tr
(
'Start drawing lines'
)
,
enabled
=
False
,
)
createPointMode
=
action
(
'Create Point'
,
self
.
tr
(
'Create Point'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'point'
),
shortcuts
[
'create_point'
],
'objects'
,
'Start drawing points'
,
self
.
tr
(
'Start drawing points'
)
,
enabled
=
False
,
)
createLineStripMode
=
action
(
'Create LineStrip'
,
self
.
tr
(
'Create LineStrip'
)
,
lambda
:
self
.
toggleDrawMode
(
False
,
createMode
=
'linestrip'
),
shortcuts
[
'create_linestrip'
],
'objects'
,
'Start drawing linestrip. Ctrl+LeftClick ends creation.'
,
self
.
tr
(
'Start drawing linestrip. Ctrl+LeftClick ends creation.'
)
,
enabled
=
False
,
)
editMode
=
action
(
'Edit Polygons'
,
self
.
setEditMode
,
editMode
=
action
(
self
.
tr
(
'Edit Polygons'
)
,
self
.
setEditMode
,
shortcuts
[
'edit_polygon'
],
'edit'
,
'Move and edit the selected polygons'
,
enabled
=
False
)
self
.
tr
(
'Move and edit the selected polygons'
)
,
enabled
=
False
)
delete
=
action
(
'Delete Polygons'
,
self
.
deleteSelectedShape
,
delete
=
action
(
self
.
tr
(
'Delete Polygons'
)
,
self
.
deleteSelectedShape
,
shortcuts
[
'delete_polygon'
],
'cancel'
,
'Delete the selected polygons'
,
enabled
=
False
)
copy
=
action
(
'Duplicate Polygons'
,
self
.
copySelectedShape
,
self
.
tr
(
'Delete the selected polygons'
)
,
enabled
=
False
)
copy
=
action
(
self
.
tr
(
'Duplicate Polygons'
)
,
self
.
copySelectedShape
,
shortcuts
[
'duplicate_polygon'
],
'copy'
,
'Create a duplicate of the selected polygons'
,
self
.
tr
(
'Create a duplicate of the selected polygons'
)
,
enabled
=
False
)
undoLastPoint
=
action
(
'Undo last point'
,
self
.
canvas
.
undoLastPoint
,
undoLastPoint
=
action
(
self
.
tr
(
'Undo last point'
)
,
self
.
canvas
.
undoLastPoint
,
shortcuts
[
'undo_last_point'
],
'undo'
,
'Undo last drawn point'
,
enabled
=
False
)
self
.
tr
(
'Undo last drawn point'
)
,
enabled
=
False
)
addPointToEdge
=
action
(
'Add Point to Edge'
,
self
.
tr
(
'Add Point to Edge'
)
,
self
.
canvas
.
addPointToEdge
,
shortcuts
[
'add_point_to_edge'
],
'edit'
,
'Add point to the nearest edge'
,
self
.
tr
(
'Add point to the nearest edge'
)
,
enabled
=
False
,
)
undo
=
action
(
'Undo'
,
self
.
undoShapeEdit
,
shortcuts
[
'undo'
],
'undo'
,
'Undo last add and edit of shape'
,
enabled
=
False
)
undo
=
action
(
self
.
tr
(
'Undo'
)
,
self
.
undoShapeEdit
,
shortcuts
[
'undo'
],
'undo'
,
self
.
tr
(
'Undo last add and edit of shape'
)
,
enabled
=
False
)
hideAll
=
action
(
'&Hide
\n
Polygons'
,
hideAll
=
action
(
self
.
tr
(
'&Hide
\n
Polygons'
)
,
functools
.
partial
(
self
.
togglePolygons
,
False
),
icon
=
'eye'
,
tip
=
'Hide all polygons'
,
enabled
=
False
)
showAll
=
action
(
'&Show
\n
Polygons'
,
icon
=
'eye'
,
tip
=
self
.
tr
(
'Hide all polygons'
)
,
enabled
=
False
)
showAll
=
action
(
self
.
tr
(
'&Show
\n
Polygons'
)
,
functools
.
partial
(
self
.
togglePolygons
,
True
),
icon
=
'eye'
,
tip
=
'Show all polygons'
,
enabled
=
False
)
icon
=
'eye'
,
tip
=
self
.
tr
(
'Show all polygons'
)
,
enabled
=
False
)
help
=
action
(
'&Tutorial'
,
self
.
tutorial
,
icon
=
'help'
,
tip
=
'Show tutorial page'
)
help
=
action
(
self
.
tr
(
'&Tutorial'
)
,
self
.
tutorial
,
icon
=
'help'
,
tip
=
self
.
tr
(
'Show tutorial page'
)
)
zoom
=
QtWidgets
.
QWidgetAction
(
self
)
zoom
.
setDefaultWidget
(
self
.
zoomWidget
)
self
.
zoomWidget
.
setWhatsThis
(
'Zoom in or out of the image. Also accessible with '
'{} and {} from the canvas.'
self
.
tr
(
'Zoom in or out of the image. Also accessible with '
'{} and {} from the canvas.'
)
.
format
(
utils
.
fmtShortcut
(
'{},{}'
.
format
(
shortcuts
[
'zoom_in'
],
shortcuts
[
'zoom_out'
]
)
),
utils
.
fmtShortcut
(
"Ctrl+Wheel"
),
utils
.
fmtShortcut
(
self
.
tr
(
"Ctrl+Wheel"
)
),
)
)
self
.
zoomWidget
.
setEnabled
(
False
)
zoomIn
=
action
(
'Zoom &In'
,
functools
.
partial
(
self
.
addZoom
,
1.1
),
zoomIn
=
action
(
self
.
tr
(
'Zoom &In'
)
,
functools
.
partial
(
self
.
addZoom
,
1.1
),
shortcuts
[
'zoom_in'
],
'zoom-in'
,
'Increase zoom level'
,
enabled
=
False
)
zoomOut
=
action
(
'&Zoom Out'
,
functools
.
partial
(
self
.
addZoom
,
0.9
),
self
.
tr
(
'Increase zoom level'
)
,
enabled
=
False
)
zoomOut
=
action
(
self
.
tr
(
'&Zoom Out'
)
,
functools
.
partial
(
self
.
addZoom
,
0.9
),
shortcuts
[
'zoom_out'
],
'zoom-out'
,
'Decrease zoom level'
,
enabled
=
False
)
zoomOrg
=
action
(
'&Original size'
,
self
.
tr
(
'Decrease zoom level'
)
,
enabled
=
False
)
zoomOrg
=
action
(
self
.
tr
(
'&Original size'
)
,
functools
.
partial
(
self
.
setZoom
,
100
),
shortcuts
[
'zoom_to_original'
],
'zoom'
,
'Zoom to original size'
,
enabled
=
False
)
fitWindow
=
action
(
'&Fit Window'
,
self
.
setFitWindow
,
self
.
tr
(
'Zoom to original size'
)
,
enabled
=
False
)
fitWindow
=
action
(
self
.
tr
(
'&Fit Window'
)
,
self
.
setFitWindow
,
shortcuts
[
'fit_window'
],
'fit-window'
,
'Zoom follows window size'
,
checkable
=
True
,
self
.
tr
(
'Zoom follows window size'
)
,
checkable
=
True
,
enabled
=
False
)
fitWidth
=
action
(
'Fit &Width'
,
self
.
setFitWidth
,
fitWidth
=
action
(
self
.
tr
(
'Fit &Width'
)
,
self
.
setFitWidth
,
shortcuts
[
'fit_width'
],
'fit-width'
,
'Zoom follows window width'
,
self
.
tr
(
'Zoom follows window width'
)
,
checkable
=
True
,
enabled
=
False
)
# Group zoom controls into a list for easier toggling.
zoomActions
=
(
self
.
zoomWidget
,
zoomIn
,
zoomOut
,
zoomOrg
,
...
...
@@ -382,22 +382,22 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
MANUAL_ZOOM
:
lambda
:
1
,
}
edit
=
action
(
'&Edit Label'
,
self
.
editLabel
,
shortcuts
[
'edit_label'
],
'edit'
,
'Modify the label of the selected polygon'
,
edit
=
action
(
self
.
tr
(
'&Edit Label'
)
,
self
.
editLabel
,
shortcuts
[
'edit_label'
],
'edit'
,
self
.
tr
(
'Modify the label of the selected polygon'
)
,
enabled
=
False
)
shapeLineColor
=
action
(
'Shape &Line Color'
,
self
.
chshapeLineColor
,
icon
=
'color-line'
,
tip
=
'Change the line color for this specific shape'
,
enabled
=
False
)
self
.
tr
(
'Shape &Line Color'
)
,
self
.
chshapeLineColor
,
icon
=
'color-line'
,
tip
=
self
.
tr
(
'Change the line color for this specific shape'
)
,
enabled
=
False
)
shapeFillColor
=
action
(
'Shape &Fill Color'
,
self
.
chshapeFillColor
,
icon
=
'color'
,
tip
=
'Change the fill color for this specific shape'
,
enabled
=
False
)
self
.
tr
(
'Shape &Fill Color'
)
,
self
.
chshapeFillColor
,
icon
=
'color'
,
tip
=
self
.
tr
(
'Change the fill color for this specific shape'
)
,
enabled
=
False
)
fill_drawing
=
action
(
'Fill Drawing Polygon'
,
self
.
tr
(
'Fill Drawing Polygon'
)
,
lambda
x
:
self
.
canvas
.
setFillDrawing
(
x
),
None
,
'color'
,
'Fill polygon while drawing'
,
self
.
tr
(
'Fill polygon while drawing'
)
,
checkable
=
True
,
enabled
=
True
,
)
...
...
@@ -484,11 +484,11 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
canvas
.
edgeSelected
.
connect
(
self
.
canvasShapeEdgeSelected
)
self
.
menus
=
utils
.
struct
(
file
=
self
.
menu
(
'&File'
),
edit
=
self
.
menu
(
'&Edit'
),
view
=
self
.
menu
(
'&View'
),
help
=
self
.
menu
(
'&Help'
),
recentFiles
=
QtWidgets
.
QMenu
(
'Open &Recent'
),
file
=
self
.
menu
(
self
.
tr
(
'&File'
)
),
edit
=
self
.
menu
(
self
.
tr
(
'&Edit'
)
),
view
=
self
.
menu
(
self
.
tr
(
'&View'
)
),
help
=
self
.
menu
(
self
.
tr
(
'&Help'
)
),
recentFiles
=
QtWidgets
.
QMenu
(
self
.
tr
(
'Open &Recent'
)
),
labelList
=
labelMenu
,
)
...
...
@@ -569,7 +569,7 @@ class MainWindow(QtWidgets.QMainWindow):
fitWidth
,
)
self
.
statusBar
().
showMessage
(
'%s started.'
%
__appname__
)
self
.
statusBar
().
showMessage
(
self
.
tr
(
'%s started.'
)
%
__appname__
)
self
.
statusBar
().
show
()
if
output_file
is
not
None
and
self
.
_config
[
'auto_save'
]:
...
...
@@ -885,8 +885,8 @@ class MainWindow(QtWidgets.QMainWindow):
if
text
is
None
:
return
if
not
self
.
validateLabel
(
text
):
self
.
errorMessage
(
'Invalid label'
,
"Invalid label '{}' with validation type '{}'"
self
.
errorMessage
(
self
.
tr
(
'Invalid label'
)
,
self
.
tr
(
"Invalid label '{}' with validation type '{}'"
)
.
format
(
text
,
self
.
_config
[
'validate_label'
]))
return
shape
.
label
=
text
...
...
@@ -1050,7 +1050,7 @@ class MainWindow(QtWidgets.QMainWindow):
# self.filename = filename
return
True
except
LabelFileError
as
e
:
self
.
errorMessage
(
'Error saving label data'
,
'<b>%s</b>'
%
e
)
self
.
errorMessage
(
self
.
tr
(
'Error saving label data'
),
self
.
tr
(
'<b>%s</b>'
)
%
e
)
return
False
def
copySelectedShape
(
self
):
...
...
@@ -1109,8 +1109,8 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
labelDialog
.
edit
.
setText
(
previous_label
)
if
text
and
not
self
.
validateLabel
(
text
):
self
.
errorMessage
(
'Invalid label'
,
"Invalid label '{}' with validation type '{}'"
self
.
errorMessage
(
self
.
tr
(
'Invalid label'
)
,
self
.
tr
(
"Invalid label '{}' with validation type '{}'"
)
.
format
(
text
,
self
.
_config
[
'validate_label'
]))
text
=
''
if
text
:
...
...
@@ -1190,10 +1190,10 @@ class MainWindow(QtWidgets.QMainWindow):
filename
=
str
(
filename
)
if
not
QtCore
.
QFile
.
exists
(
filename
):
self
.
errorMessage
(
'Error opening file'
,
'No such file: <b>%s</b>'
%
filename
)
self
.
tr
(
'Error opening file'
),
self
.
tr
(
'No such file: <b>%s</b>'
)
%
filename
)
return
False
# assumes same name, but json extension
self
.
status
(
"Loading %s..."
%
osp
.
basename
(
str
(
filename
)))
self
.
status
(
self
.
tr
(
"Loading %s..."
)
%
osp
.
basename
(
str
(
filename
)))
label_file
=
osp
.
splitext
(
filename
)[
0
]
+
'.json'
if
self
.
output_dir
:
label_file_without_path
=
osp
.
basename
(
label_file
)
...
...
@@ -1204,11 +1204,11 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
labelFile
=
LabelFile
(
label_file
)
except
LabelFileError
as
e
:
self
.
errorMessage
(
'Error opening file'
,
"<p><b>%s</b></p>"
"<p>Make sure <i>%s</i> is a valid label file."
self
.
tr
(
'Error opening file'
)
,
self
.
tr
(
"<p><b>%s</b></p>"
"<p>Make sure <i>%s</i> is a valid label file."
)
%
(
e
,
label_file
))
self
.
status
(
"Error reading %s"
%
label_file
)
self
.
status
(
self
.
tr
(
"Error reading %s"
)
%
label_file
)
return
False
self
.
imageData
=
self
.
labelFile
.
imageData
self
.
imagePath
=
osp
.
join
(
...
...
@@ -1231,11 +1231,11 @@ class MainWindow(QtWidgets.QMainWindow):
formats
=
[
'*.{}'
.
format
(
fmt
.
data
().
decode
())
for
fmt
in
QtGui
.
QImageReader
.
supportedImageFormats
()]
self
.
errorMessage
(
'Error opening file'
,
'<p>Make sure <i>{0}</i> is a valid image file.<br/>'
'Supported image formats: {1}</p>'
self
.
tr
(
'Error opening file'
)
,
self
.
tr
(
'<p>Make sure <i>{0}</i> is a valid image file.<br/>'
'Supported image formats: {1}</p>'
)
.
format
(
filename
,
','
.
join
(
formats
)))
self
.
status
(
"Error reading %s"
%
filename
)
self
.
status
(
self
.
tr
(
"Error reading %s"
)
%
filename
)
return
False
self
.
image
=
image
self
.
filename
=
filename
...
...
@@ -1256,7 +1256,7 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
paintCanvas
()
self
.
addRecentFile
(
self
.
filename
)
self
.
toggleActions
(
True
)
self
.
status
(
"Loaded %s"
%
osp
.
basename
(
str
(
filename
)))
self
.
status
(
self
.
tr
(
"Loaded %s"
)
%
osp
.
basename
(
str
(
filename
)))
return
True
def
resizeEvent
(
self
,
event
):
...
...
@@ -1369,10 +1369,10 @@ class MainWindow(QtWidgets.QMainWindow):
path
=
osp
.
dirname
(
str
(
self
.
filename
))
if
self
.
filename
else
'.'
formats
=
[
'*.{}'
.
format
(
fmt
.
data
().
decode
())
for
fmt
in
QtGui
.
QImageReader
.
supportedImageFormats
()]
filters
=
"Image & Label files (%s)"
%
' '
.
join
(
filters
=
self
.
tr
(
"Image & Label files (%s)"
)
%
' '
.
join
(
formats
+
[
'*%s'
%
LabelFile
.
suffix
])
filename
=
QtWidgets
.
QFileDialog
.
getOpenFileName
(
self
,
'%s - Choose Image or Label file'
%
__appname__
,
self
,
self
.
tr
(
'%s - Choose Image or Label file'
)
%
__appname__
,
path
,
filters
)
if
QT5
:
filename
,
_
=
filename
...
...
@@ -1388,7 +1388,7 @@ class MainWindow(QtWidgets.QMainWindow):
default_output_dir
=
self
.
currentPath
()
output_dir
=
QtWidgets
.
QFileDialog
.
getExistingDirectory
(
self
,
'%s - Save/Load Annotations in Directory'
%
__appname__
,
self
,
self
.
tr
(
'%s - Save/Load Annotations in Directory'
)
%
__appname__
,
default_output_dir
,
QtWidgets
.
QFileDialog
.
ShowDirsOnly
|
QtWidgets
.
QFileDialog
.
DontResolveSymlinks
,
...
...
@@ -1401,7 +1401,7 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
output_dir
=
output_dir
self
.
statusBar
().
showMessage
(
'%s . Annotations will be saved/loaded in %s'
%
self
.
tr
(
'%s . Annotations will be saved/loaded in %s'
)
%
(
'Change Annotations Dir'
,
self
.
output_dir
))
self
.
statusBar
().
show
()
...
...
@@ -1432,8 +1432,8 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
_saveFile
(
self
.
saveFileDialog
())
def
saveFileDialog
(
self
):
caption
=
'%s - Choose File'
%
__appname__
filters
=
'Label files (*%s)'
%
LabelFile
.
suffix
caption
=
self
.
tr
(
'%s - Choose File'
)
%
__appname__
filters
=
self
.
tr
(
'Label files (*%s)'
)
%
LabelFile
.
suffix
if
self
.
output_dir
:
dlg
=
QtWidgets
.
QFileDialog
(
self
,
caption
,
self
.
output_dir
,
filters
...
...
@@ -1456,8 +1456,8 @@ class MainWindow(QtWidgets.QMainWindow):
self
.
currentPath
(),
basename
+
LabelFile
.
suffix
)
filename
=
dlg
.
getSaveFileName
(
self
,
'Choose File'
,
default_labelfile_name
,
'Label files (*%s)'
%
LabelFile
.
suffix
)
self
,
self
.
tr
(
'Choose File'
)
,
default_labelfile_name
,
self
.
tr
(
'Label files (*%s)'
)
%
LabelFile
.
suffix
)
if
QT5
:
filename
,
_
=
filename
filename
=
str
(
filename
)
...
...
@@ -1487,9 +1487,9 @@ class MainWindow(QtWidgets.QMainWindow):
def
deleteFile
(
self
):
mb
=
QtWidgets
.
QMessageBox
msg
=
'You are about to permanently delete this label file, '
\
'proceed anyway?'
answer
=
mb
.
warning
(
self
,
'Attention'
,
msg
,
mb
.
Yes
|
mb
.
No
)
msg
=
self
.
tr
(
'You are about to permanently delete this label file, '
\
'proceed anyway?'
)
answer
=
mb
.
warning
(
self
,
self
.
tr
(
'Attention'
)
,
msg
,
mb
.
Yes
|
mb
.
No
)
if
answer
!=
mb
.
Yes
:
return
...
...
@@ -1523,9 +1523,9 @@ class MainWindow(QtWidgets.QMainWindow):
if
not
self
.
dirty
:
return
True
mb
=
QtWidgets
.
QMessageBox
msg
=
'Save annotations to "{}" before closing?'
.
format
(
self
.
filename
)
msg
=
self
.
tr
(
'Save annotations to "{}" before closing?'
)
.
format
(
self
.
filename
)
answer
=
mb
.
question
(
self
,
'Save annotations?'
,
self
.
tr
(
'Save annotations?'
)
,
msg
,
mb
.
Save
|
mb
.
Discard
|
mb
.
Cancel
,
mb
.
Save
)
...
...
@@ -1546,7 +1546,7 @@ class MainWindow(QtWidgets.QMainWindow):
def
chooseColor1
(
self
):
color
=
self
.
colorDialog
.
getColor
(
self
.
lineColor
,
'Choose line color'
,
default
=
DEFAULT_LINE_COLOR
)
self
.
lineColor
,
self
.
tr
(
'Choose line color'
)
,
default
=
DEFAULT_LINE_COLOR
)
if
color
:
self
.
lineColor
=
color
# Change the color for all shape lines:
...
...
@@ -1556,7 +1556,7 @@ class MainWindow(QtWidgets.QMainWindow):
def
chooseColor2
(
self
):
color
=
self
.
colorDialog
.
getColor
(
self
.
fillColor
,
'Choose fill color'
,
default
=
DEFAULT_FILL_COLOR
)
self
.
fillColor
,
self
.
tr
(
'Choose fill color'
)
,
default
=
DEFAULT_FILL_COLOR
)
if
color
:
self
.
fillColor
=
color
Shape
.
fill_color
=
self
.
fillColor
...
...
@@ -1568,9 +1568,9 @@ class MainWindow(QtWidgets.QMainWindow):
def
deleteSelectedShape
(
self
):
yes
,
no
=
QtWidgets
.
QMessageBox
.
Yes
,
QtWidgets
.
QMessageBox
.
No
msg
=
'You are about to permanently delete {} polygons, '
\
'proceed anyway?'
.
format
(
len
(
self
.
canvas
.
selectedShapes
))
if
yes
==
QtWidgets
.
QMessageBox
.
warning
(
self
,
'Attention'
,
msg
,
msg
=
self
.
tr
(
'You are about to permanently delete {} polygons, '
\
'proceed anyway?'
)
.
format
(
len
(
self
.
canvas
.
selectedShapes
))
if
yes
==
QtWidgets
.
QMessageBox
.
warning
(
self
,
self
.
tr
(
'Attention'
)
,
msg
,
yes
|
no
):
self
.
remLabels
(
self
.
canvas
.
deleteSelected
())
self
.
setDirty
()
...
...
@@ -1580,7 +1580,7 @@ class MainWindow(QtWidgets.QMainWindow):
def
chshapeLineColor
(
self
):
color
=
self
.
colorDialog
.
getColor
(
self
.
lineColor
,
'Choose line color'
,
default
=
DEFAULT_LINE_COLOR
)
self
.
lineColor
,
self
.
tr
(
'Choose line color'
)
,
default
=
DEFAULT_LINE_COLOR
)
if
color
:
for
shape
in
self
.
canvas
.
selectedShapes
:
shape
.
line_color
=
color
...
...
@@ -1589,7 +1589,7 @@ class MainWindow(QtWidgets.QMainWindow):
def
chshapeFillColor
(
self
):
color
=
self
.
colorDialog
.
getColor
(
self
.
fillColor
,
'Choose fill color'
,
default
=
DEFAULT_FILL_COLOR
)
self
.
fillColor
,
self
.
tr
(
'Choose fill color'
)
,
default
=
DEFAULT_FILL_COLOR
)
if
color
:
for
shape
in
self
.
canvas
.
selectedShapes
:
shape
.
fill_color
=
color
...
...
@@ -1619,7 +1619,7 @@ class MainWindow(QtWidgets.QMainWindow):
if
self
.
filename
else
'.'
targetDirPath
=
str
(
QtWidgets
.
QFileDialog
.
getExistingDirectory
(
self
,
'%s - Open Directory'
%
__appname__
,
defaultOpenDirPath
,
self
,
self
.
tr
(
'%s - Open Directory'
)
%
__appname__
,
defaultOpenDirPath
,
QtWidgets
.
QFileDialog
.
ShowDirsOnly
|
QtWidgets
.
QFileDialog
.
DontResolveSymlinks
))
self
.
importDirImages
(
targetDirPath
)
...
...
labelme/main.py
浏览文件 @
ab87ce00
...
...
@@ -5,7 +5,7 @@ import os
import
sys
import
yaml
from
qtpy
import
QtWidgets
from
qtpy
import
QtWidgets
,
QtCore
from
labelme
import
__appname__
from
labelme
import
__version__
...
...
@@ -154,9 +154,12 @@ def main():
else
:
output_dir
=
output
translator
=
QtCore
.
QTranslator
()
translator
.
load
(
QtCore
.
QLocale
.
system
().
name
(),
'translate'
)
app
=
QtWidgets
.
QApplication
(
sys
.
argv
)
app
.
setApplicationName
(
__appname__
)
app
.
setWindowIcon
(
newIcon
(
'icon'
))
app
.
installTranslator
(
translator
)
win
=
MainWindow
(
config
=
config
,
filename
=
filename
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录