前言
有限状态机(英语:finite-state machine,縮寫:FSM)又稱有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。(FROM WIKI)
核心
状态机中的核心内容:有限个状态、通过外部操作引起状态的转移。 用来对状态的流转进行解耦,使代码逻辑更加清楚和更容易维护
FSM的组成和分类
组成
- 现态:是指当前所处的状态。
- 条件:又称为事件。当一个条件被满足,可能将会触发一个动作,或者执行一次状态的迁移。
- 动作:条件满足后执行的动作行为。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
- 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
所有的状态转换都可以概括为:F(S, E) -> (A, S’),即如果当前状态为S,接收到一个事件E,则执行动作A,同时状态转换为下个状态S’。
分类
- F(S) -> (A, S’) 型状态机:下一状态只由当前状态决定
- F(S, E) -> (A, S’) 型状态机:下一状态不但与当前状态有关,还与当前输入值有关
状态机的实际业务设计和抽象
1、状态机组件的抽象
1)开始组件
代表流程开始
{
"id":1,
"stageId":"start",
"stageName":"开始",
"conditions":[
{
"cond":"next",
"condName":"流转到下一阶段",
"stageId":"preLabel"
}
]
}
2)预标注组件
调用执行算法模型,实现支持自动标注过程
输入
- 标注模型
- 识别视频URL
输出
- 标注结果
{
"id":2,
"stageId":"preLabel",
"stageName":"预标注",
"conditions":[
{
"cond":"fail",
"condName":"预标注失败",
"stageId":"end"
},
{
"cond":"succ",
"condName":"预标注成功",
"stageId":"label"
}
],
"params":[
{
"paramId":1,
"paramName":"模型",
"paramType":"model",
"paramVal":"1"
}
]
}
3)标注组件
人工标注过程
输入
- 标注人
- 标注结果
输出
无
{
"id":3,
"stageId":"label",
"stageName":"标注",
"conditions":[
{
"cond":"save",
"condName":"标注保存",
"stageId":"label"
},
{
"cond":"submit",
"condName":"标注提交",
"stageId":"approve"
},
{
"cond":"finish",
"condName":"标注结束",
"stageId":"end"
}
],
"params":[
{
"paramId":1,
"paramName":"标注人",
"paramType":"user",
"paramVal":"张三"
},
{
"paramId":2,
"paramName":"标注工具",
"paramType":"labelTool",
"paramVal":"1"
},
{
"paramId":3,
"paramName":"填槽,标注结果(根据工具的不同,值不同)",
"paramType":"@slotLabel",
"paramVal":null
}
]
}
说明:参数中带有@的是接口交互的时候补充进来的参数,不带@的是流程初始化的时候给到的参数
4)审核
审核视频是否通过
输入
- 审核人
- 通过、驳回
输出
无
{
"id":4,
"stageId":"approve",
"stageName":"审核",
"conditions":[
{
"cond":"relabel",
"condName":"打回,重新标注",
"stageId":"label"
},
{
"cond":"pass",
"condName":"通过",
"stageId":"end"
}
],
"params":[
{
"paramId":1,
"paramName":"审核人",
"paramType":"user",
"paramVal":"李四"
},
{
"paramId":2,
"paramName":"填槽,审核结果",
"paramType":"@slotApprove",
"paramVal":null
}
]
}
5)结束
代表流程的结束
输入
无
输出
无
{
"id":5,
"stageId":"end",
"stageName":"结束",
"conditions":null,
"params":[
{
"paramId":1,
"paramName":"结束标识",
"paramType":"@end",
"paramVal":null
}
]
}
2、状态机流程的抽象
状态机流程,这个流程是可以以绘图的方式生成
{
"id":1,
"flowName":"预标注+标注+审核",
"stages":[
{
"id":1,
"stageId":"start",
"stageName":"开始",
"conditions":[
{
"cond":"next",
"condName":"流转到下一阶段",
"stageId":"preLabel"
}
],
"params":null
},
{
"id":2,
"stageId":"preLabel",
"stageName":"预标注",
"conditions":[
{
"cond":"fail",
"condName":"预标注失败",
"stageId":"end"
},
{
"cond":"succ",
"condName":"预标注成功",
"stageId":"label"
}
],
"params":[
{
"paramId":1,
"paramName":"模型",
"paramType":"model",
"paramVal":"1"
}
]
},
{
"id":3,
"stageId":"label",
"stageName":"标注",
"conditions":[
{
"cond":"save",
"condName":"标注保存",
"stageId":"label"
},
{
"cond":"submit",
"condName":"标注提交",
"stageId":"approve"
},
{
"cond":"finish",
"condName":"标注结束",
"stageId":"end"
}
],
"params":[
{
"paramId":1,
"paramName":"标注人",
"paramType":"user",
"paramVal":"张三"
},
{
"paramId":2,
"paramName":"标注工具",
"paramType":"labelTool",
"paramVal":"1"
},
{
"paramId":3,
"paramName":"填槽,标注结果(根据工具的不同,值不同)",
"paramType":"@slotLabel",
"paramVal":null
}
]
},
{
"id":4,
"stageId":"approve",
"stageName":"审核",
"conditions":[
{
"cond":"relabel",
"condName":"打回,重新标注",
"stageId":"label"
},
{
"cond":"pass",
"condName":"通过",
"stageId":"end"
}
],
"params":[
{
"paramId":1,
"paramName":"审核人",
"paramType":"user",
"paramVal":"李四"
},
{
"paramId":2,
"paramName":"填槽,审核结果",
"paramType":"@slotApprove",
"paramVal":null
}
]
},
{
"id":5,
"stageId":"end",
"stageName":"结束",
"conditions":null,
"params":[
{
"paramId":1,
"paramName":"结束标识",
"paramType":"@end",
"paramVal":null
}
]
}
],
"flowDesc":""
}