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.
Files changed (39) hide show
  1. laboard-1.0.0/LICENSE +8 -0
  2. laboard-1.0.0/PKG-INFO +400 -0
  3. laboard-1.0.0/README.md +368 -0
  4. laboard-1.0.0/laboard/__init__.py +1 -0
  5. laboard-1.0.0/laboard/__main__.py +5 -0
  6. laboard-1.0.0/laboard/app.py +528 -0
  7. laboard-1.0.0/laboard/assets/fonts/Figtree-Black.ttf +0 -0
  8. laboard-1.0.0/laboard/assets/fonts/Figtree-Regular.ttf +0 -0
  9. laboard-1.0.0/laboard/assets/fonts/Inter-latin-var.woff2 +0 -0
  10. laboard-1.0.0/laboard/assets/logo/laboard_splash.svg +2 -0
  11. laboard-1.0.0/laboard/charts.py +631 -0
  12. laboard-1.0.0/laboard/labels.py +189 -0
  13. laboard-1.0.0/laboard/modelinfo.py +218 -0
  14. laboard-1.0.0/laboard/netronview.py +107 -0
  15. laboard-1.0.0/laboard/newproject.py +287 -0
  16. laboard-1.0.0/laboard/pages/__init__.py +0 -0
  17. laboard-1.0.0/laboard/pages/data.py +352 -0
  18. laboard-1.0.0/laboard/pages/home.py +242 -0
  19. laboard-1.0.0/laboard/pages/hyperparameter.py +154 -0
  20. laboard-1.0.0/laboard/pages/model.py +78 -0
  21. laboard-1.0.0/laboard/pages/result.py +707 -0
  22. laboard-1.0.0/laboard/pages/setting.py +272 -0
  23. laboard-1.0.0/laboard/project.py +1127 -0
  24. laboard-1.0.0/laboard/readers.py +156 -0
  25. laboard-1.0.0/laboard/remote.py +343 -0
  26. laboard-1.0.0/laboard/sidebar.py +242 -0
  27. laboard-1.0.0/laboard/store.py +38 -0
  28. laboard-1.0.0/laboard/theme.py +111 -0
  29. laboard-1.0.0/laboard/tomledit.py +262 -0
  30. laboard-1.0.0/laboard/torchgraph.py +102 -0
  31. laboard-1.0.0/laboard/widgets.py +1128 -0
  32. laboard-1.0.0/laboard.egg-info/PKG-INFO +400 -0
  33. laboard-1.0.0/laboard.egg-info/SOURCES.txt +37 -0
  34. laboard-1.0.0/laboard.egg-info/dependency_links.txt +1 -0
  35. laboard-1.0.0/laboard.egg-info/entry_points.txt +2 -0
  36. laboard-1.0.0/laboard.egg-info/requires.txt +27 -0
  37. laboard-1.0.0/laboard.egg-info/top_level.txt +1 -0
  38. laboard-1.0.0/pyproject.toml +46 -0
  39. 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/&lt;model&gt;/ |
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 &lt;Task&gt;_&lt;Key&gt;, e.g. Instance_segmentation_Predict |
292
+ | | required | `Type` | `""` | CSV \| DB |
293
+ | | CSV: required | `File_path` | `""` | CSV: result file name / glob under Path.Results/&lt;task&gt; |
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 &lt;instance_name&gt; --zone &lt;zone&gt; |
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 &lt;vm_name&gt; --resource-group &lt;resource-group&gt; |
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 &lt;private key&gt; &lt;user&gt;@&lt;public ip&gt; |
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/&lt;key_name&gt; &lt;user_name&gt;@&lt;ip&gt; |
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 |