OpenDecision 发布自托管图像决策 API,基于 SigLIP2 匹配图像与候选描述
Show HN: Self Hosted System One Decision API for Images
OpenDecision 推出自托管图像决策 API,用 SigLIP2 将图像与候选描述匹配,并依据规则返回动作,如识别到熊触发 sound_alarm、垃圾桶溢出触发 request_collection。在 Apple M3 本地加载模型下,单次 HTTP 调用中位耗时 233-317 ms,覆盖 2-4 个问题,动作均为模拟执行。
OpenDecision 使用 SigLIP2 将图像与候选描述进行匹配。下面的示例展示了提供的描述、返回的答案以及组合出的动作。
这 11 张照片使用图像 API 进行了测试。每个表格展示了陈述或问题以及返回的答案。
时间是在搭载 Apple M3 并加载模型的设备上,五次本地 HTTP 调用的中位数。每次时间包含该照片列出的所有问题。测量详情。
结果
野生动物警报
API 调用:316 毫秒,共 2 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 图像中可见一只动物。 | 是 |
| 可见的是什么动物? | bear |
规则:animal_present 为真且 animal_type 等于 bear。
返回的动作:sound_alarm。该动作是模拟的。
描述与返回的分数
animal_present(noul)
true:图像中可见一只动物。false:没有任何动物的场景。
{
"type": "noul",
"noul": 0.9854469299316406
}
animal_type(choice)
cat:一张猫的照片。dog:一张狗的照片。coyote:一张郊狼的照片。bear:一张熊的照片。other_animal:一张其他种类动物的照片。no_animal:没有任何动物的风景。
{
"type": "choice",
"choice": "bear",
"probabilities": {
"cat": 4.2180534364888445e-05,
"dog": 0.00014694735000375658,
"coyote": 0.000802758033387363,
"bear": 0.9885395169258118,
"other_animal": 0.010174029506742954,
"no_animal": 0.00029455311596393585
},
"confidence": 0.9620985402679022
}
垃圾桶收集
API 调用:240 毫秒,共 3 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 一张垃圾桶的照片。 | 是 |
| 垃圾桶处于什么状态? | overflowing |
| 垃圾桶周围的地板上散落着垃圾。 | 是 |
规则:bin_present 为真且 bin_condition 等于 overflowing。
返回的动作:request_collection。该动作是模拟的。
描述与返回的分数
bin_present(noul)
true:一张垃圾桶的照片。false:一张空房间的照片。
{
"type": "noul",
"noul": 0.9997207522392273
}
bin_condition(choice)
empty:一个空的垃圾桶。contained:一个整齐地装着垃圾的垃圾桶。overflowing:一个垃圾满溢、堆在顶部并洒落到地板上的垃圾桶。
{
"type": "choice",
"choice": "overflowing",
"probabilities": {
"empty": 0.02629130892455578,
"contained": 0.27365437150001526,
"overflowing": 0.7000542879104614
},
"confidence": 0.3629010822262866
}
ground_litter(noul)
true:垃圾桶周围的地板上散落着垃圾。false:垃圾桶周围干净整洁的地板。
{
"type": "noul",
"noul": 0.9977849721908569
}
围栏维修
API 调用:266 毫秒,共 3 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 一张金属围栏的照片。 | 是 |
| 围栏处于什么状态? | damaged |
| 围栏是什么材料制成的? | other |
规则:fence_present 为真且 fence_condition 等于 damaged。
返回的动作:create_repair_task。该动作是模拟的。
描述与返回的分数
fence_present(noul)
true:一张金属围栏的照片。false:一张森林中植物的照片。
{
"type": "noul",
"noul": 0.9967530369758606
}
fence_condition(choice)
intact:一个笔直竖立、状况良好的金属围栏。damaged:一个弯曲倒塌、倾倒在植被中的金属围栏。unclear:一个大部分被植物遮挡、状况不明的围栏。
{
"type": "choice",
"choice": "damaged",
"probabilities": {
"intact": 6.503957411041483e-05,
"damaged": 0.9995725750923157,
"unclear": 0.00036233218270353973
},
"confidence": 0.9964272309629573
}
fence_material(choice)
metal:一个由铁条制成的金属围栏。wood:一个由木板制成的木质围栏。wire_mesh:一个由柔性铁丝网制成的围栏。other:一个由其他材料制成的围栏。
{
"type": "choice",
"choice": "other",
"probabilities": {
"metal": 0.1567850559949875,
"wood": 0.08964116871356964,
"wire_mesh": 0.03200826793909073,
"other": 0.7215655446052551
},
"confidence": 0.3851610518055971
}
林中的鸟
API 调用:317 毫秒,共 4 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 图像中可见一只鸟。 | 是 |
| 图像中可见一只鹰。 | 是 |
| 图像中可见一个人。 | 否 |
| 可见的是什么鸟? | other_bird |
描述与返回的分数
bird_present(noul)
true:图像中可见一只鸟。false:没有任何鸟的场景。
{
"type": "noul",
"noul": 0.9660131335258484
}
eagle_present(noul)
true:图像中可见一只鹰。false:没有鹰的场景。
{
"type": "noul",
"noul": 0.8165377378463745
}
human_present(noul)
true:图像中可见一个人。false:森林中树木间的一只野鸟。
{
"type": "noul",
"noul": 0.0017106442246586084
}
bird_kind(choice)
eagle:一张鹰的照片。hawk:一张鹰(隼形目)的照片。owl:一张猫头鹰的照片。other_bird:一张其他鸟类的照片。no_bird:没有鸟的场景。
{
"type": "choice",
"choice": "other_bird",
"probabilities": {
"eagle": 0.051251474767923355,
"hawk": 0.16163183748722076,
"owl": 0.08185870200395584,
"other_bird": 0.6947102546691895,
"no_bird": 0.010547762736678123
},
"confidence": 0.4080094712923271
}
天空中的月亮
API 调用:233 毫秒,共 3 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 哪个天体可见? | moon |
| 天空中可见一架飞机。 | 是 |
| 图像中可见一棵树。 | 是 |
标题与返回的分数
sky_object(选择)
moon:蓝天中可见月亮。sun:蓝天中可见太阳。neither:蓝天中既无月亮也无太阳。
{
"type": "choice",
"choice": "moon",
"probabilities": {
"moon": 0.7818400859832764,
"sun": 0.17475949227809906,
"neither": 0.04340038076043129
},
"confidence": 0.4234408001266272
}
plane_present(noul)
true:天空中可见一架飞机。false:天空中没有可见的飞机。
{
"type": "noul",
"noul": 0.7038407921791077
}
tree_present(noul)
true:图像中可见一棵树。false:没有任何树木的场景。
{
"type": "noul",
"noul": 0.8658673763275146
}
露台上的猫
API 调用:234 毫秒,共 3 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 图像中可见一只猫。 | 是 |
| 可见多少只猫? | one |
| 一只猫正在睡觉或打盹。 | 否 |
标题与返回的分数
cat_present(noul)
true:图像中可见一只猫。false:没有任何猫的场景。
{
"type": "noul",
"noul": 0.9102864265441895
}
cat_count(选择)
zero:没有猫的场景。one:一只猫的照片。multiple:两只或更多猫的照片。
{
"type": "choice",
"choice": "one",
"probabilities": {
"zero": 0.055449433624744415,
"one": 0.7995275855064392,
"multiple": 0.14502301812171936
},
"confidence": 0.4363100113079119
}
cat_napping(noul)
true:一只猫正在睡觉或打盹。false:一只猫醒着,端坐并环顾四周。
{
"type": "noul",
"noul": 0.0040166135877370834
}
冷却架上的面包
API 调用:85 毫秒,共 1 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 可见多少条面包? | one |
标题与返回的分数
bread_count(选择)
zero:没有面包的场景。one:冷却架上的一条面包。multiple:冷却架上的两条或更多面包。
{
"type": "choice",
"choice": "one",
"probabilities": {
"zero": 0.0010277321562170982,
"one": 0.8948542475700378,
"multiple": 0.10411805659532547
},
"confidence": 0.6886767894020007
}
树林中的水
API 调用:233 毫秒,共 3 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 后院被积水淹没。 | 是 |
| 一条浅浅的溪流穿过树林区域。 | 是 |
| 什么最能描述这个水景? | wooded_creek |
标题与返回的分数
backyard_flooded(noul)
true:后院被积水淹没。false:后院干燥,没有积水。
{
"type": "noul",
"noul": 0.8128588795661926
}
water_present(noul)
true:一条浅浅的溪流穿过树林区域。false:干燥的森林地面覆盖着植物和倒下的树枝。
{
"type": "noul",
"noul": 0.9993311166763306
}
water_scene(选择)
flooded_yard:后院被水淹没,覆盖了草坪。wooded_creek:一条小溪或溪流穿过树林区域。dry_yard:干燥的后院,地面上没有水。
{
"type": "choice",
"choice": "wooded_creek",
"probabilities": {
"flooded_yard": 7.847583765396848e-05,
"wooded_creek": 0.9998863935470581,
"dry_yard": 3.519013989716768e-05
},
"confidence": 0.9988928978738509
}
露台上的动物
API 调用:514 毫秒,共 5 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 可见多少只动物? | one |
| 一张熊的照片。 | 否 |
| 一张郊狼的照片。 | 否 |
| 图像中可见一只动物。 | 是 |
| 可见什么种类的动物? | cat |
规则:animal_present 为真且 animal_type 等于 bear。
返回的动作:no_alarm。该动作是模拟的。
标题与返回的分数
animal_count(选择)
zero:没有动物的户外场景。one:露台上的一只动物。multiple:露台上一起的几只动物。
{
"type": "choice",
"choice": "one",
"probabilities": {
"zero": 0.04124877601861954,
"one": 0.7521222233772278,
"multiple": 0.2066289633512497
},
"confidence": 0.3887085165327596
}
bear_present(noul)
true:一张熊的照片。false:一张猫的照片。
{
"type": "noul",
"noul": 0.03849371522665024
}
coyote_present(noul)
true:一张郊狼的照片。false:一张猫的照片。
{
"type": "noul",
"noul": 0.052384644746780396
}
animal_present(noul)
true:图像中可见一只动物。false:没有任何动物的场景。
{
"type": "noul",
"noul": 0.9874376654624939
}
animal_type(选择)
cat:一张猫的照片。dog:一张狗的照片。coyote:一张郊狼的照片。bear:一张熊的照片。other_animal:一张其他种类动物的照片。no_animal:没有任何动物的风景。
{
"type": "choice",
"choice": "cat",
"probabilities": {
"cat": 0.8867677450180054,
"dog": 0.01656363531947136,
"coyote": 0.049020957201719284,
"bear": 0.035501569509506226,
"other_animal": 0.012059740722179413,
"no_animal": 8.643681212561205e-05
},
"confidence": 0.7237879201664215
}
天气与停放的汽车
API 调用:191 毫秒,共 2 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 可见什么天气? | sunny |
| 可见多少辆停放的汽车? | two |
标题与返回的分数
weather(选择)
sunny:晴朗的一天,蓝天无云。rainy:下雨的一天,雨水落下。cloudy:阴天,有灰色的云。night:黑暗的夜晚场景。
{
"type": "choice",
"choice": "sunny",
"probabilities": {
"sunny": 0.9859010577201843,
"rainy": 0.002233620034530759,
"cloudy": 0.009337893687188625,
"night": 0.0025274145882576704
},
"confidence": 0.9376820523920272
}
parked_car_count(选择)
zero:没有停放汽车的车道。one:停放着一辆汽车的车道。two:车道上停着两辆车。three_or_more:车道上停着三辆或更多辆车。
{
"type": "choice",
"choice": "two",
"probabilities": {
"zero": 0.20297342538833618,
"one": 0.25532975792884827,
"two": 0.3041783571243286,
"three_or_more": 0.23751848936080933
},
"confidence": 0.0076392976526203915
}
猫在窗边
API 调用:180 毫秒,用于 2 个问题。

| 陈述或问题 | 返回的答案 |
|---|---|
| 图像中可见一只猫。 | 是 |
| 猫在看哪里? | window |
说明文字和返回的分数
cat_present(noul)
true:图像中可见一只猫。false:没有任何猫的场景。
{
"type": "noul",
"noul": 0.8177101612091064
}
cat_gaze(choice)
camera:一只猫正对着并直视镜头。window:一只猫望向窗外,呈侧面。elsewhere:一只猫在房间内望向别处。
{
"type": "choice",
"choice": "window",
"probabilities": {
"camera": 0.00216315477155149,
"window": 0.9727381467819214,
"elsewhere": 0.02509867027401924
},
"confidence": 0.8792590849353216
}
这些示例的说明
- 监控照片中包含多只动物。模型返回了
one。 - 受损的栅栏是金属的。材质问题返回了
other。 - 车辆计数问题返回了
two,获胜概率为 0.304。 - 鸟的种类尚未核实。天空照片中可见凝结尾迹。林间水道通常的水位未知。
- 否定式说明文字在测试期间产生了误报。具体的替代方案改善了若干结果。
这些规则使用 0.5 的 Noul 阈值,并要求获胜的 Choice 概率至少为 0.6。缺失或较弱的答案会产生未知的规则状态。分数未经校准。
来源:Hacker News · deepanwadhwa.github.io