2026.06.02征图日记27(标注+webAi-lite忙不过来了)

上午在标注电池蓝膜的顶贴片线扫交叉光工位的图片标了200多张,又一边在看webai-lite的架构:React+vite前端,FastAPI后端,还有一个客户端用来推理的。目前了解到的情况是后端和客户端是这样通信的:后端提交推理任务后并不会通知客户端,实际训练推理由外部客户端通过 GET /api/jobs 拉队列,PATCH /api/jobs/{id}/status 回写状态。

并且没有像原webAi那样多租户的概念,但有一个工作区概念,目前是单工作区,后续拓展为多个工作区

下午也先标注了一会,大改100多张吧,之后mentor来问我看的咋样了,我发现有一个笔刷的bug,就是画出来的缺陷和光标位置不是重合的。mentor一眼看出问题所在,因为我用的mac电脑的safari浏览器,有不兼容问题,改为谷歌的chrome浏览器就搞定了。

还有一个真正的问题是使用笔刷进行标注的时候会把全图的mask都合并为一个mask canvas,希望修改为每次笔刷 stroke 生成一个独立 mask 对象,并且保留原来的数据结构给客户端

今天要一边标注,一边还要看这边的webAI-lite,感觉燃尽了。之后得有一个规定了,比如每天标注200张之后就不干标注了,剩下的时间就是做webai-lite,这个项目月底还要上线,并且毕竟重点还是要放在技术提升上。

二叉树的最大路径和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
* right(right) {}
* };
*/
class Solution {
public:
int ans = INT_MIN;
int maxPathSum(TreeNode* root) {
dfs(root);
return ans;
}
// 返回当前节点单边最大路径
int dfs(TreeNode* cur) {
if (!cur)
return 0;
// 舍弃单边路径小于零的部分
int left = max(0, dfs(cur->left));
int right = max(0, dfs(cur->right));
// 更新结果
ans = max(ans, left + right + cur->val);
// 返回给上一层
return max(left, right) + cur->val;
}
};

二叉搜索树中第 K 小的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// /**
// * Definition for a binary tree node.
// * struct TreeNode {
// * int val;
// * TreeNode *left;
// * TreeNode *right;
// * TreeNode() : val(0), left(nullptr), right(nullptr) {}
// * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
// * right(right) {}
// * };
// */
// class Solution {
// public:
// // 中序递归
// int ans = 0;
// int kthSmallest(TreeNode* root, int k) {
// int cur = 0;
// dfs(root, k, cur);
// return ans;
// }
// // cur需要传引用每次都对同一个副本进行++
// void dfs(TreeNode* root, int k, int& cur) {
// if (!root)
// return;
// dfs(root->left, k, cur);
// cur++;
// if (cur == k) {
// ans = root->val;
// return;
// }
// dfs(root->right, k, cur);
// }
// };

class Solution {
public:
// 用栈来迭代
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> stk;
TreeNode* cur = root;
int cnt = 0;

while (cur || !stk.empty()) {
while (cur) {
// 一直向左走
stk.push(cur);
cur = cur->left;
}
// 弹出最左边的节点
cur = stk.top();
stk.pop();
// 访问当前节点
cnt++;
if (cnt == k)
return cur->val;

// 访问当前节点的右子树
cur = cur->right;
}
return -1;
}
};

今天忙得工作日志都忘了发,不过mentor说不要紧~~


今日工作内容

  1. 样本标注314张
  2. 将标注画布从单全局 mask canvas 改为按 classId 独立 mask 对象架构。新增 MaskObjectManager 管理多个 canvas 层,mask 对象与矢量对象在 model.objects[] 中同级管理。支持选中高亮(调暗其他 + 像素轮廓虚线边框)、独立编辑和删除。保存时每个 mask 独立编码为 RLE shape,推理端数据格式不变。同步沉淀 editor-architecture.md code-spec 和 editor-canvas-guide.md 思考指南。

下阶段计划

  1. 继续标注
  2. 思考FastAPI后端如何与推理客户端通信