laboard 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- laboard-1.0.0/LICENSE +8 -0
- laboard-1.0.0/PKG-INFO +400 -0
- laboard-1.0.0/README.md +368 -0
- laboard-1.0.0/laboard/__init__.py +1 -0
- laboard-1.0.0/laboard/__main__.py +5 -0
- laboard-1.0.0/laboard/app.py +528 -0
- laboard-1.0.0/laboard/assets/fonts/Figtree-Black.ttf +0 -0
- laboard-1.0.0/laboard/assets/fonts/Figtree-Regular.ttf +0 -0
- laboard-1.0.0/laboard/assets/fonts/Inter-latin-var.woff2 +0 -0
- laboard-1.0.0/laboard/assets/logo/laboard_splash.svg +2 -0
- laboard-1.0.0/laboard/charts.py +631 -0
- laboard-1.0.0/laboard/labels.py +189 -0
- laboard-1.0.0/laboard/modelinfo.py +218 -0
- laboard-1.0.0/laboard/netronview.py +107 -0
- laboard-1.0.0/laboard/newproject.py +287 -0
- laboard-1.0.0/laboard/pages/__init__.py +0 -0
- laboard-1.0.0/laboard/pages/data.py +352 -0
- laboard-1.0.0/laboard/pages/home.py +242 -0
- laboard-1.0.0/laboard/pages/hyperparameter.py +154 -0
- laboard-1.0.0/laboard/pages/model.py +78 -0
- laboard-1.0.0/laboard/pages/result.py +707 -0
- laboard-1.0.0/laboard/pages/setting.py +272 -0
- laboard-1.0.0/laboard/project.py +1127 -0
- laboard-1.0.0/laboard/readers.py +156 -0
- laboard-1.0.0/laboard/remote.py +343 -0
- laboard-1.0.0/laboard/sidebar.py +242 -0
- laboard-1.0.0/laboard/store.py +38 -0
- laboard-1.0.0/laboard/theme.py +111 -0
- laboard-1.0.0/laboard/tomledit.py +262 -0
- laboard-1.0.0/laboard/torchgraph.py +102 -0
- laboard-1.0.0/laboard/widgets.py +1128 -0
- laboard-1.0.0/laboard.egg-info/PKG-INFO +400 -0
- laboard-1.0.0/laboard.egg-info/SOURCES.txt +37 -0
- laboard-1.0.0/laboard.egg-info/dependency_links.txt +1 -0
- laboard-1.0.0/laboard.egg-info/entry_points.txt +2 -0
- laboard-1.0.0/laboard.egg-info/requires.txt +27 -0
- laboard-1.0.0/laboard.egg-info/top_level.txt +1 -0
- laboard-1.0.0/pyproject.toml +46 -0
- laboard-1.0.0/setup.cfg +4 -0
laboard-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
Copyright © 2026 gh914
|
|
3
|
+
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
5
|
+
|
|
6
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
laboard-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: laboard
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Laboard — PyQt6 desktop tracker for ML experiments and their git history
|
|
5
|
+
Project-URL: Homepage, https://github.com/YuriHan914/Laboard
|
|
6
|
+
Project-URL: Repository, https://github.com/YuriHan914/Laboard
|
|
7
|
+
Project-URL: Documentation, https://github.com/YuriHan914/Laboard/tree/master/Docs
|
|
8
|
+
Requires-Python: >=3.11
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: PyQt6>=6.7
|
|
12
|
+
Requires-Dist: PyQt6-WebEngine>=6.7
|
|
13
|
+
Requires-Dist: netron>=8.0
|
|
14
|
+
Requires-Dist: onnx>=1.15
|
|
15
|
+
Requires-Dist: msgpack>=1.0
|
|
16
|
+
Requires-Dist: PyYAML>=6.0
|
|
17
|
+
Requires-Dist: SQLAlchemy>=2.0
|
|
18
|
+
Provides-Extra: postgres
|
|
19
|
+
Requires-Dist: psycopg2-binary>=2.9; extra == "postgres"
|
|
20
|
+
Provides-Extra: mysql
|
|
21
|
+
Requires-Dist: PyMySQL>=1.1; extra == "mysql"
|
|
22
|
+
Provides-Extra: mssql
|
|
23
|
+
Requires-Dist: pymssql>=2.3; extra == "mssql"
|
|
24
|
+
Provides-Extra: oracle
|
|
25
|
+
Requires-Dist: oracledb>=2.0; extra == "oracle"
|
|
26
|
+
Provides-Extra: sqlite
|
|
27
|
+
Provides-Extra: parquet
|
|
28
|
+
Requires-Dist: pandas>=2.0; extra == "parquet"
|
|
29
|
+
Provides-Extra: all
|
|
30
|
+
Requires-Dist: laboard[mssql,mysql,oracle,parquet,postgres]; extra == "all"
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
# 🧪 Laboard
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
<p align="center">
|
|
37
|
+
<picture>
|
|
38
|
+
<source media="(prefers-color-scheme: dark)" srcset="Docs/assets/LABOARD_LOGO_DARK.png"/>
|
|
39
|
+
<img src="Docs/assets/LABOARD_LOGO.png" alt="Laboard" width="136"/>
|
|
40
|
+
</picture>
|
|
41
|
+
</p>
|
|
42
|
+
|
|
43
|
+
<p align="center">
|
|
44
|
+
<a href="README.ko.md"><img src="https://img.shields.io/badge/%F0%9F%87%B0%F0%9F%87%B7_%ED%95%9C%EA%B5%AD%EC%96%B4-9fe870?style=for-the-badge" alt="한국어"/></a>
|
|
45
|
+
<a href="README.md"><img src="https://img.shields.io/badge/%F0%9F%87%BA%F0%9F%87%B8_English-e8ebe6?style=for-the-badge" alt="English"/></a>
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<p align="center">
|
|
49
|
+
<img src="https://img.shields.io/github/v/release/YuriHan914/EX_Tool?style=for-the-badge&label=Version" alt="Version 1.0.0"/>
|
|
50
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/Python-3.11%2B-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.11+"/></a>
|
|
51
|
+
<a href="https://pypi.org/project/PyQt6/"><img src="https://img.shields.io/badge/PyQt6-6.7%2B-41CD52?style=for-the-badge&logo=qt&logoColor=white" alt="PyQt6 6.7+"/></a>
|
|
52
|
+
<a href="https://www.sqlalchemy.org/"><img src="https://img.shields.io/badge/SQLAlchemy-2.0%2B-D71F00?style=for-the-badge&logo=sqlalchemy&logoColor=white" alt="SQLAlchemy 2.0+"/></a>
|
|
53
|
+
<a href="https://github.com/lutzroeder/netron"><img src="https://img.shields.io/badge/Netron-8.0%2B-555555?style=for-the-badge" alt="Netron 8.0+"/></a>
|
|
54
|
+
<a href="https://onnx.ai/"><img src="https://img.shields.io/badge/ONNX-1.15%2B-005CED?style=for-the-badge&logo=onnx&logoColor=white" alt="ONNX 1.15+"/></a>
|
|
55
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge" alt="License: MIT"/></a>
|
|
56
|
+
</p>
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
<br></br>
|
|
60
|
+
|
|
61
|
+
<table>
|
|
62
|
+
<tr>
|
|
63
|
+
<td align="center" width="50%"><img src="Docs/assets/LABOARD_HOME.png" alt="Home (light)"/><br/><sub>[Light]</sub></td>
|
|
64
|
+
<td align="center" width="50%"><img src="Docs/assets/LABOARD_HOME_DARK.png" alt="Home (dark)"/><br/><sub>[Dark]</sub></td>
|
|
65
|
+
</tr>
|
|
66
|
+
</table>
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
<br></br>
|
|
70
|
+
|
|
71
|
+
A PyQt6 desktop experiment tracker for machine-learning projects. Point it at one project file (`.toml`)
|
|
72
|
+
that says where your data, models, training runs and results live and which git repository to follow,
|
|
73
|
+
and Laboard shows all of them in one window.
|
|
74
|
+
|
|
75
|
+
Laboard only reads: it never edits your files, your database or your repository. The one exception is
|
|
76
|
+
the **Fetch** button in the git log popup, which runs `git fetch` and so updates only the
|
|
77
|
+
remote-tracking branches.
|
|
78
|
+
|
|
79
|
+
</br>
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 🚀 Features
|
|
84
|
+
|
|
85
|
+
* Data viewer with train / valid / test splits, labels and model predictions side by side
|
|
86
|
+
* Model graphs in an embedded [Netron](https://netron.app) view, with parameter counts (no GPU or torch needed)
|
|
87
|
+
* Training runs: progress and every hyperparameter from the config files
|
|
88
|
+
* Result charts from csv / jsonl / TensorBoard files, with smoothing and multi-curve comparison
|
|
89
|
+
* Git history, and the whole project viewed as of any earlier commit
|
|
90
|
+
* Data from a database table (Supabase, PostgreSQL, MySQL, MariaDB, SQLite, MSSQL, Oracle) or a table file (csv / tsv / jsonl / parquet)
|
|
91
|
+
* Files on another machine, read over gcloud / az / aws / ssh
|
|
92
|
+
* Light and dark themes
|
|
93
|
+
* Text on screen (table values, hyperparameters, settings, …) can be selected by dragging the mouse and copied with Ctrl+C or the right-click menu
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 🛠️ Installation
|
|
98
|
+
|
|
99
|
+
- Recommend Python 3.11+
|
|
100
|
+
|
|
101
|
+
1. Download from git repository
|
|
102
|
+
```bash
|
|
103
|
+
git clone https://github.com/YuriHan914/Laboard.git
|
|
104
|
+
cd Laboard
|
|
105
|
+
pip install -e . # no database (csv / tsv / jsonl files, SQLite)
|
|
106
|
+
pip install -e ".[postgres]" # PostgreSQL, Supabase
|
|
107
|
+
pip install -e ".[mysql,oracle]" # several
|
|
108
|
+
pip install -r requirements.txt # all (= pip install -e ".[all]")
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
2. pip install
|
|
113
|
+
```bash
|
|
114
|
+
pip install laboard # no database (csv / tsv / jsonl files, SQLite)
|
|
115
|
+
pip install "laboard[postgres]" # with the driver of the database you use
|
|
116
|
+
pip install "laboard[mysql,oracle]" # several
|
|
117
|
+
pip install "laboard[all]" # every database driver + parquet
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
| extra | Database | Driver installed |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `postgres` | PostgreSQL, Supabase | `psycopg2-binary` |
|
|
123
|
+
| `mysql` | MySQL, MariaDB | `PyMySQL` |
|
|
124
|
+
| `mssql` | Microsoft SQL Server | `pymssql` |
|
|
125
|
+
| `oracle` | Oracle | `oracledb` |
|
|
126
|
+
| `sqlite` | SQLite | none (comes with Python) |
|
|
127
|
+
| `parquet` | `.parquet` data files | `pandas` |
|
|
128
|
+
|
|
129
|
+
Using a database without its driver names the extra to install in the `DB … unavailable` note, e.g.
|
|
130
|
+
`install it with: pip install "laboard[mysql]"`. For development, install with `pip install -e ".[all]"` (or
|
|
131
|
+
`pip install -r requirements.txt`).
|
|
132
|
+
|
|
133
|
+
### Cloud CLIs for remote files (optional)
|
|
134
|
+
|
|
135
|
+
Only needed when a path in the project file is on another machine, written `gcloud:…`, `az:…` or `aws:…`
|
|
136
|
+
([Accessing files on remote machines](#accessing-files-on-remote-machines)). Laboard logs in by running these
|
|
137
|
+
command-line tools, which pip doesn't install. Install the one you use, make sure it is on your `PATH`, and log in
|
|
138
|
+
once yourself.
|
|
139
|
+
|
|
140
|
+
| Path prefix | CLI | Install | Log in once |
|
|
141
|
+
| --- | --- | --- | --- |
|
|
142
|
+
| `gcloud:` | Google Cloud CLI | [Install the gcloud CLI](https://docs.cloud.google.com/sdk/docs/install-sdk) | `gcloud auth login`, then `gcloud config set project <project-id>` |
|
|
143
|
+
| `az:` | Azure CLI | [Install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) | `az login`, then `az extension add --name ssh` (for `az ssh vm`) |
|
|
144
|
+
| `aws:` | AWS CLI | [Install the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) | `aws configure` (or `aws configure sso`) |
|
|
145
|
+
| `ssh:` | OpenSSH | comes with Linux / macOS / Windows 10+ | – |
|
|
146
|
+
|
|
147
|
+
- **No prompts:** Laboard runs them in the background, so the login must work without a password prompt. Connect
|
|
148
|
+
to the server once by hand so its host key is known.
|
|
149
|
+
- **Login details** (instance name, zone, user, ip, …) go in the project file's `[gcloud]`, `[az]`, `[aws]` or
|
|
150
|
+
`[ssh]` section; [`template.toml`](template.toml) lists the keys of each.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## ▶️ Quick Start
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
python -m laboard # runs without a toml; create one in the app
|
|
158
|
+
python -m laboard --project my_project.toml # runs with the given toml
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Command-line options
|
|
162
|
+
|
|
163
|
+
| Option | Effect |
|
|
164
|
+
| --- | --- |
|
|
165
|
+
| `--project TOML` | Load this project file at start and open on Home |
|
|
166
|
+
| `--tab home\|data\|model\|hyperparameter\|result\|setting` | Start on this tab. The default is `home`, or `setting` when no project is given |
|
|
167
|
+
| `--theme light\|dark` | Start in the light or dark theme (default: light) |
|
|
168
|
+
| `--frameless` | Draw Laboard's own dark title bar instead of the system one |
|
|
169
|
+
| `--screenshot out.png` | Render the window once, save it as a PNG and exit. Works headless with `QT_QPA_PLATFORM=offscreen` |
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
### Making a project toml file
|
|
173
|
+
|
|
174
|
+
Fill in only the parts you need and leave the rest empty.
|
|
175
|
+
1. Start Laboard, click **New** in **Setting**, fill in the form of each section and save
|
|
176
|
+
2. Or copy [`template.toml`](template.toml) below, fill it in and save
|
|
177
|
+
<details>
|
|
178
|
+
<summary>template.toml</summary>
|
|
179
|
+
|
|
180
|
+
```toml
|
|
181
|
+
# Laboard project file.
|
|
182
|
+
# One raw data source ([Data]) is shared by every task; each task has its own labels ([Label]) and predictions
|
|
183
|
+
# ([Prediction]). Fill in the keys your data uses and leave the others empty (""). Paths are absolute, or relative
|
|
184
|
+
# to this file. Settings shows every key below with a description of what to put in it. Names are read in any case.
|
|
185
|
+
|
|
186
|
+
[Project]
|
|
187
|
+
Name = "" # project name; empty: the root folder's name
|
|
188
|
+
Root = "" # folder of the project's git repository
|
|
189
|
+
Task = "classification,object detection,..." # one task or several, comma-separated: classification, object detection,
|
|
190
|
+
# instance segmentation, semantic segmentation, panoptic segmentation,
|
|
191
|
+
# anomaly detection, pose-estimation
|
|
192
|
+
DB = False # True when [Data], [Label] or [Prediction] uses Type = "DB"
|
|
193
|
+
|
|
194
|
+
[DB] # database connection, shown and used when [Project] DB = True
|
|
195
|
+
DB = "" # supabase
|
|
196
|
+
DB_ip = "" # e.g. "http://127.0.0.1:54323/" or "postgresql://user:password@host:5432/db"
|
|
197
|
+
|
|
198
|
+
[Git] # fallbacks when git can't tell
|
|
199
|
+
Remote = "" # e.g. "github.com:user/repo.git"
|
|
200
|
+
Branch = "" # e.g. "main"
|
|
201
|
+
|
|
202
|
+
[Path] # each may hold one folder per task, e.g. Results/classification/<model>/
|
|
203
|
+
Models = "" # folder with model checkpoints
|
|
204
|
+
Hyperparameter = "" # folder with one sub-folder per training run
|
|
205
|
+
Results = "" # folder with result files
|
|
206
|
+
|
|
207
|
+
[Data] # the raw data files, one list for every task
|
|
208
|
+
Type = "" # CSV | DB
|
|
209
|
+
File_path = "" # CSV: the csv listing the files
|
|
210
|
+
Table = "" # DB: table with one row per file
|
|
211
|
+
Raw = "" # CSV / DB: column with each raw file's path, e.g. "file_path"
|
|
212
|
+
|
|
213
|
+
[Label] # ground truth, one column for every task
|
|
214
|
+
Type = "" # CSV | DB
|
|
215
|
+
File_path = "" # CSV: the labels csv
|
|
216
|
+
Table = "" # DB: table with the labels
|
|
217
|
+
Label = "" # its column; a task column picks each task's row
|
|
218
|
+
|
|
219
|
+
[Prediction] # any key can be set for one task as <Task>_<Key>, e.g. Instance_segmentation_Predict
|
|
220
|
+
Type = "" # CSV | DB
|
|
221
|
+
File_path = "" # CSV: result file name / glob under Path.Results/<task>
|
|
222
|
+
Table = "" # DB: table with the predictions
|
|
223
|
+
Predict = "" # predicted-class column
|
|
224
|
+
Predict_score = "" # score column
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
[gcloud] # gcloud compute ssh <instance_name> --zone <zone>
|
|
228
|
+
instance_name="instance name" # required: the VM instance's name
|
|
229
|
+
zone="instance zone" # e.g. "us-west1-b"
|
|
230
|
+
|
|
231
|
+
[az] # az ssh vm --name <vm_name> --resource-group <resource-group>
|
|
232
|
+
vm_name="VM name" # the Azure VM's name
|
|
233
|
+
resource-group="resource group" # its resource group
|
|
234
|
+
|
|
235
|
+
[aws] # sends the public key (EC2 Instance Connect), then ssh -i <private key> <user>@<public ip>
|
|
236
|
+
instance-id="instance ID" # required: e.g. "i-0123456789abcdef0"
|
|
237
|
+
instance-os-user="ec2-user" # required: the login user, e.g. "ec2-user", "ubuntu"
|
|
238
|
+
ssh-public-key="file://~/.ssh/id_ed25519.pub" # required: public key; the private key is this file without .pub
|
|
239
|
+
availability-zone="AZ(zone)" # e.g. "us-east-1a"; its region finds the instance's public ip
|
|
240
|
+
|
|
241
|
+
[ssh] # ssh -i ~/.ssh/<key_name> <user_name>@<ip>
|
|
242
|
+
key_name="" # a key under ~/.ssh, or the key file's own path when it has a "/"
|
|
243
|
+
user_name="" # login user; empty: ssh's default
|
|
244
|
+
ip="" # required: server address (ip or host name)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
</details>
|
|
249
|
+
|
|
250
|
+
<details>
|
|
251
|
+
<summary>Project file reference</summary>
|
|
252
|
+
|
|
253
|
+
<br>
|
|
254
|
+
|
|
255
|
+
- Section and key names can be written in any case (`[Path]` = `[paths]`).
|
|
256
|
+
- Paths are absolute, or relative to the folder that holds the project file.
|
|
257
|
+
- An empty value (`""`) counts as not set.
|
|
258
|
+
- Any path can be on another machine, written `<host>:<path>` (see [below](#accessing-files-on-remote-machines)).
|
|
259
|
+
|
|
260
|
+
**`template.toml`** (as in the repository; Setting's **New** asks for the same sections and keys in a form):
|
|
261
|
+
|
|
262
|
+
Laboard project file. One raw data source ([Data]) is shared by every task; each task has its own labels ([Label]) and predictions ([Prediction]). Fill in the keys your data uses and leave the others empty (""). Paths are absolute, or relative to this file. Settings shows every key below with a description of what to put in it. Names are read in any case.
|
|
263
|
+
|
|
264
|
+
| Section | Needed | Key | Value | Comment |
|
|
265
|
+
| --- | --- | --- | --- | --- |
|
|
266
|
+
| **`[Project]`** | | | | |
|
|
267
|
+
| | optional | `Name` | `""` | project name; empty: the root folder's name |
|
|
268
|
+
| | optional | `Root` | `""` | folder of the project's git repository |
|
|
269
|
+
| | **required** | `Task` | `"classification,object detection,..."` | one task or several, comma-separated: classification, object detection, instance segmentation, semantic segmentation, panoptic segmentation, anomaly detection, pose-estimation |
|
|
270
|
+
| | with `Type = "DB"` | `DB` | `False` | True when [Data], [Label] or [Prediction] uses Type = "DB" |
|
|
271
|
+
| **`[DB]`** | | | | database connection, shown and used only when [Project] DB = True |
|
|
272
|
+
| | with DB | `DB` | `""` | supabase |
|
|
273
|
+
| | with DB | `DB_ip` | `""` | e.g. "http://127.0.0.1:54323/" or "postgresql://user:password@host:5432/db" |
|
|
274
|
+
| **`[Git]`** | | | | fallbacks used only when git can't tell |
|
|
275
|
+
| | optional | `Remote` | `""` | e.g. "github.com:user/repo.git" |
|
|
276
|
+
| | optional | `Branch` | `""` | e.g. "main" |
|
|
277
|
+
| **`[Path]`** | | | | each may hold one folder per task, e.g. Results/classification/<model>/ |
|
|
278
|
+
| | optional | `Models` | `""` | folder with model checkpoints |
|
|
279
|
+
| | optional | `Hyperparameter` | `""` | folder with one sub-folder per training run |
|
|
280
|
+
| | optional | `Results` | `""` | folder with result files |
|
|
281
|
+
| **`[Data]`** | | | | the raw data files, one list for every task |
|
|
282
|
+
| | required | `Type` | `""` | CSV \| DB |
|
|
283
|
+
| | CSV: required | `File_path` | `""` | CSV: the csv listing the files |
|
|
284
|
+
| | DB: required | `Table` | `""` | DB: table with one row per file |
|
|
285
|
+
| | optional | `Raw` | `""` | CSV / DB: column with each raw file's path, e.g. "file_path" |
|
|
286
|
+
| **`[Label]`** | | | | ground truth, one column for every task |
|
|
287
|
+
| | required | `Type` | `""` | CSV \| DB |
|
|
288
|
+
| | CSV: optional | `File_path` | `""` | CSV: the labels csv |
|
|
289
|
+
| | DB: optional | `Table` | `""` | DB: table with the labels |
|
|
290
|
+
| | to show labels | `Label` | `""` | its column; a task column picks each task's row |
|
|
291
|
+
| **`[Prediction]`** | | | | any key can be set for one task as <Task>_<Key>, e.g. Instance_segmentation_Predict |
|
|
292
|
+
| | required | `Type` | `""` | CSV \| DB |
|
|
293
|
+
| | CSV: required | `File_path` | `""` | CSV: result file name / glob under Path.Results/<task> |
|
|
294
|
+
| | DB: required | `Table` | `""` | DB: table with the predictions |
|
|
295
|
+
| | required | `Predict` | `""` | predicted-class column |
|
|
296
|
+
| | optional | `Predict_score` | `""` | score column |
|
|
297
|
+
| **`[gcloud]`** | | | | gcloud compute ssh <instance_name> --zone <zone> |
|
|
298
|
+
| | **required** | `instance_name` | `"instance name"` | required: the VM instance's name |
|
|
299
|
+
| | optional | `zone` | `"instance zone"` | e.g. "us-west1-b" |
|
|
300
|
+
| **`[az]`** | | | | az ssh vm --name <vm_name> --resource-group <resource-group> |
|
|
301
|
+
| | optional | `vm_name` | `"VM name"` | the Azure VM's name |
|
|
302
|
+
| | optional | `resource-group` | `"resource group"` | its resource group |
|
|
303
|
+
| **`[aws]`** | | | | sends the public key (EC2 Instance Connect), then ssh -i <private key> <user>@<public ip> |
|
|
304
|
+
| | **required** | `instance-id` | `"instance ID"` | required: e.g. "i-0123456789abcdef0" |
|
|
305
|
+
| | **required** | `instance-os-user` | `"ec2-user"` | required: the login user, e.g. "ec2-user", "ubuntu" |
|
|
306
|
+
| | **required** | `ssh-public-key` | `"file://~/.ssh/id_ed25519.pub"` | required: public key; the private key is this file without .pub |
|
|
307
|
+
| | optional | `availability-zone` | `"AZ(zone)"` | e.g. "us-east-1a"; its region finds the instance's public ip |
|
|
308
|
+
| **`[ssh]`** | | | | ssh -i ~/.ssh/<key_name> <user_name>@<ip> |
|
|
309
|
+
| | optional | `key_name` | `""` | a key under ~/.ssh, or the key file's own path when it has a "/" |
|
|
310
|
+
| | optional | `user_name` | `""` | login user; empty: ssh's default |
|
|
311
|
+
| | **required** | `ip` | `""` | required: server address (ip or host name) |
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
</details>
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
### Accessing files on remote machines
|
|
319
|
+
|
|
320
|
+
- With the sections below in the toml file, files can also be read from a remote machine.
|
|
321
|
+
- Remote login: register the keys for ssh or cloud login yourself beforehand. **Laboard does not register keys.**
|
|
322
|
+
- To read a file on a remote machine, start its path with the remote's name followed by `:`.
|
|
323
|
+
|
|
324
|
+
| Remote name | How it logs in |
|
|
325
|
+
| ------------ | --- |
|
|
326
|
+
| `ssh:` | ssh, as above |
|
|
327
|
+
| `gcloud:` | gcloud compute ssh |
|
|
328
|
+
| `az:` | az ssh vm |
|
|
329
|
+
| `aws:` | aws ec2-instance-connect |
|
|
330
|
+
|
|
331
|
+
- Examples
|
|
332
|
+
- **Folder** : ```"gcloud:/home/Runs"```
|
|
333
|
+
- **File** : ```"gcloud:/home/img.png"```
|
|
334
|
+
|
|
335
|
+
- Other logins can be added at the end of the toml file
|
|
336
|
+
|
|
337
|
+
| Prefix | Section | How it logs in |
|
|
338
|
+
| --- | --- | --- |
|
|
339
|
+
| `abc:` | `[abc]` | other cloud login |
|
|
340
|
+
|
|
341
|
+
```toml
|
|
342
|
+
[train-vm] # for train-vm:… paths
|
|
343
|
+
type = "ssh"
|
|
344
|
+
key_name = "train-key"
|
|
345
|
+
user_name = "ubuntu"
|
|
346
|
+
ip = "10.0.0.5"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
## 🗂️ Data Format
|
|
351
|
+
|
|
352
|
+
The columns a csv / table needs when data is read with `[Data] Type = "CSV"` / `"DB"`, and how labels are stored.
|
|
353
|
+
The full description is in [Data · Data format](Docs/en/data.md#data-format-required-columns-and-label-values).
|
|
354
|
+
|
|
355
|
+
- **One row per file:** one label column, named with `Label = "label"`. Fits a single task.
|
|
356
|
+
- **One row per task:** a task column + the same one label column, for several tasks. A table where the same file
|
|
357
|
+
path appears in several rows is read this way.
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
| Column | Needed | Value |
|
|
361
|
+
| --- | --- | --- |
|
|
362
|
+
| File path (`file_path`, …, set with `[Data] Raw`) | **required** | The raw file's path. DB: absolute · CSV: absolute, or relative to the csv's folder |
|
|
363
|
+
| Label (set with `[Label] Label`) | required to see the ground truth | See the label format below |
|
|
364
|
+
| Task (`task` / `object`) | **required** when a file has one row per task | A task name from `[Project] Task` |
|
|
365
|
+
| Split (`type`, `split`, …) | optional (recommended) | `train` / `valid` / `test` |
|
|
366
|
+
| Created (`create_date`, …) | optional | `2024-01-05 10:00:00` |
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
**Label format**: a plain string, or json in coco format. Json is drawn over the image on the Data page.
|
|
371
|
+
|
|
372
|
+
| Task | Format |
|
|
373
|
+
| --- | --- |
|
|
374
|
+
| classification | `cat` or `["cat", "dog"]` |
|
|
375
|
+
| object detection | `[{"category": "cat", "bbox": [x, y, w, h]}]` |
|
|
376
|
+
| instance segmentation | `[{"category": "cat", "segmentation": [[x1, y1, x2, y2, …]]}]`, one object per instance (polygons, or RLE `{"counts", "size"}`) |
|
|
377
|
+
| semantic segmentation | `[{"category": "cat", "segmentation": [[x1, y1, x2, y2, …], …]]}]`, one object per category covering all of its area (polygons, or RLE `{"counts", "size"}`) |
|
|
378
|
+
| pose-estimation | `[{"category": "person", "bbox": [x, y, w, h], "keypoints": [x, y, v, …]}]` |
|
|
379
|
+
| panoptic segmentation | `{"mask_path": "<absolute png path>", "segments_info": [{"id", "category", "bbox"}]}` |
|
|
380
|
+
|
|
381
|
+
- Instance and semantic segmentation use the same format and are drawn the same way; they differ only in what one
|
|
382
|
+
object covers.
|
|
383
|
+
- Coordinates are image pixels (origin at the top left); a bbox is `[x, y, w, h]`.
|
|
384
|
+
- Save with `json.dumps`. `['cat']` written by `str(list)` (single quotes) isn't json and isn't drawn.
|
|
385
|
+
- Make a DB label column `JSONB` (recommended) or `TEXT`.
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## 📚 Documentation
|
|
390
|
+
|
|
391
|
+
Each page has a detailed guide in [Docs](Docs/README.md).
|
|
392
|
+
|
|
393
|
+
| Page | What it is for |
|
|
394
|
+
| --- | --- |
|
|
395
|
+
| [Home](Docs/en/home.md) | Data / model / latest run / result summaries, next to the git history |
|
|
396
|
+
| [Data](Docs/en/data.md) | Browse every data file, its split and label, and compare it with model predictions |
|
|
397
|
+
| [Model](Docs/en/model.md) | A model file's graph in Netron, its properties and parameters by layer |
|
|
398
|
+
| [Hyperparameter](Docs/en/hyperparameter.md) | A training run's progress and all of its hyperparameters |
|
|
399
|
+
| [Result](Docs/en/result.md) | Charts from csv / jsonl / TensorBoard, curve comparison, tables, logs and images |
|
|
400
|
+
| [Setting](Docs/en/setting.md) | Load a project file, see what was detected, switch the theme, set Result and Hyperparameter table rows per page; the project file reference |
|