《戴昊-领域驱动设计启发下的AI视觉分析引擎构建.pdf》由会员分享,可在线阅读,更多相关《戴昊-领域驱动设计启发下的AI视觉分析引擎构建.pdf(36页珍藏版)》请在三个皮匠报告上搜索。
1、领域驱动设计启发下的AI视觉分析引擎构建主讲人:戴 昊领域驱动设计启发下的AI视觉分析引擎构建主讲人:戴 昊演讲嘉宾介绍戴昊 AI创业公司技术副总裁20年 大型软件产品架构经验瑞穗银行(Mizuho Bank,Ltd.)服务器软件故障自动侦测与分析系统(SIRMS)东京证券(Tokyo Stock Exchange,Inc.)富士通数据库 Symfoware 加密连接系统(ECG)五十铃汽车(ISUZU Motors,Ltd.)车载系统云计算 SaaS 解决方案(ITP)15年 技术讲师经验,课程服务企业:华为、联想、SAP、Cisco、深圳证券交易所、中国银联、工商银行、中国平安、华泰证券、
2、招商银行信用卡中心、中国金融期货交易所、中兴银行信用卡中心、民生银行、华润银行、花旗银行、上海清算所、中国电信、中兴通讯、振华重工、广汽集团、厦门航空目录CONTENTS我们要解决的问题1234限界上下文处理领域复杂度领域建模处理实现复杂度架构:EDA,CQRS,P&A我们要解决的问题1视觉分析引擎需求 视觉分析引擎需要能识别图像中的对象信息,并分析对象特征,再根据对象特征与业务规则,对上层系统所感兴趣的事件进行侦测与发布道路状况感知3D 位置与姿态关键点及行为 要理解软件所要解决的问题,就必须理解其存在的背景-组织的商业战略,以及组织想通过构建软件获得什么价值 领域与子域领域子域子域设计策略
3、子域类型问题竞争优势复杂度模式实现核心感兴趣的是高领域模型内部通用已解决的否高领域模型购买/开源支撑明显的否低事务脚本外包视频抽桢目标识别目标分析控制 API参数配置对象存储事件告警GCGCCSS分析引擎子域划分领域知识中的“二义性”我们谈“分析”的时候,我们在谈些什么?目标侦测目标跟踪目标分类特征提取位姿估计关键点建模时应如何处理通用语言在不同上下文中的不一致性?SDK/APIBusiness LogicEntities事务脚本 模式针对不同的分析场景使用不同的逻辑实现上帝类 反模式实体需承载不同分析场景下不同的特征信息传统建模方式限界上下文处理领域复杂度2我们为什么要建模 模型是对事物或现
4、象的简化表示,它有意强调某些方面而忽略其他方面。模型考虑的是特定用途的抽象 有用的模型并不是现实世界的复制品。相反,模型旨在解决特定问题,并且应该仅为此目的提供足够的信息 模型不能没有边界而存在;否则它将蔓延成为现实世界的副本。这使得定义模型的边界-也就是它的限界上下文-成为了建模过程固有的部分使用限界上下文隔离“二义性”Facade目标侦测目标追踪轨迹分析图像分析目标抓拍特征提取同步调用异步调用ROI分析位姿预测使用限界上下文形成有逻辑边界的服务分析业务编排网关编排限界上下文以应对不同业务需求目标侦测目标跟踪轨迹分析目标抓拍特征提取Gateway/Application Service目标侦
5、测位姿估计特征提取Gateway/Application Service车速监控场景机械臂抓取视觉引导场景管理 API视频抽桢对象侦测实例分割分类OCR特征关键点位姿跟踪轨迹速度方向事件警告配置读取图像获取目标识别单桢分析多桢分析聚合告警对象存储视频流抓拍分析引擎宏观处理流程ROI系统复杂度的横切 与 纵切复杂性的不同维度领域建模处理实现复杂度3目标侦测+跟踪+轨迹+测速truck_1抓拍厢式货车红色苏BXXXXX反光标贴特征抽取男性短发头发:黑色上身:绿色下身:黑色鞋:黑色打电话person_1不同的分析需要不同的数据结构进行存储truck_1person_1高速监控分析场景建模需求 为了持
6、有不同的“分析”结果,使用传统的建模方式创建的实体很可能是“包罗万象”的 God Object传统的实体建模侦测“分析”结果跟踪“分析”结果轨迹“分析”结果特征“分析”结果各种“分析”事件领域建模 实体/值对象/聚合聚合-一个共享了事务边界的实体层次结构。聚合边界所包含的所有数据都必须是强一致性的值对象-业务领域中的概念,可以完全通过它们的值来识别,因此不需要一个明确的 ID 字段。由于其中一个字段的变化在语义上创造了新的值,所以值对象是不可改变的 聚合体现了封装技术在领域建模的应用,使用封装进行建模视频桢及其分析结果信息聚合设计-Frame 特征抽取需要基于高质量的抓拍,抓拍上下文会依据策略
7、,挑选“最优”或者“最快”的方式,返回抓拍图像抓拍列表抓拍策略领域事件抓拍已生成架构:EDA,CQRS,P&A4业务操作&领域事件 的原子性public abstract class DomainEventAwareAggregate JsonIgnore private final List events=newArrayList();protected void raiseEvent(DomainEvent event)this.events.add(event);void clearEvents()this.events.clear();List getEvents()return Co
8、llections.unmodifiableList(events);public abstract class DomainEventAwareRepository Autowired private DomainEventDao eventDao;public void save(DEAA aggregate)eventDao.insert(aggregate.getEvents();aggregate.clearEvents();doSave(aggregate);/Template method protected abstract void doSave(AR aggregate);
9、领域事件感知聚合根领域事件感知资源库非业务侵入性领域事件生成AspectComponentpublic class DomainEventPublishAspect /.After(annotation(org.springframework.web.bind.annotation.PostMapping)|+annotation(org.springframework.web.bind.annotation.PutMapping)|+annotation(org.springframework.web.bind.annotation.PatchMapping)|+annotation(org
10、.springframework.web.bind.annotation.DeleteMapping)|)public void publishEvents(JoinPoint joinPoint)logger.info(Trigger domain event publish process.);taskExecutor.execute()-publisher.publish();/.publish()方法将调用实际的消息队列(比如RabbitMQ/Kafka等)API完成消息发送非业务侵入性领域事件发布AspectComponentpublic class DomainEventRecor
11、dingConsumerAspect /.Before(annotation(org.springframework.amqp.rabbit.annotation.RabbitHandler)|+annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)public Object recordEvents(ProceedingJoinPoint joinPoint)throws Throwable return domainEventRecordingConsumer.recordAndConsume(joinPo
12、int);/.DomainEvent event=(DomainEvent)optionalEvent.get();try dao.recordEvent(event);catch(DuplicateKeyException dke)logger.warn(Duplicated skipped.,event);return null;return joinPoint.proceed();非业务侵入性领域事件幂等消费如何使用 EventSourcing 引入时间维度建模EventSourcing 建模实现public abstract class DomainEvent public abstr
13、act void accept(VehicleStateVisitor visitor);public class VehicleStateVisitor private int version;private double distance;private double speed;public void apply(LocationUpdated event)version+=1;distance+=calculateDistance();speed=calculateSpeed();/.public class Vehicle private List domainEvents=new
14、ArrayList();private VehicleStateVisitor state;public Vehicle(List events)state=new VehicleStateVisitor();for(DomainEvent event:events)event.accept(state);public class LocationUpdated extends DomainEvent Override public void accept(VehicleStateVisitor visitor)visitor.apply(this);写模型Location写模型Event读模
15、型LocationWithEvent通过 CQRS 进行“跨服务查询”写模型Location写模型Event读模型LocationWithEventLOCATIONEVENTLOCATION_EVENT 使用依赖倒置原则(DIP)将技术和业务相分离分析业务模型RESTAPIYOLODetectionAdapterR-CNNDetectionAdapterRDB ORMAdapterObject StorageAdapterKafkaAdapterRabbitMQAdapter通过 端口适配器 架构隔离 业务与技术public class DetectionHandler extends Ana
16、lysisHandlerBase AutoWired private IObjectDetector detector;AutoWired private RoadDefinition roadDefinition;Override public FrameInfo Analyze(FrameInfo frameInfo)List detectionInfos=detector.Detect(frameInfo.getScene(),roadDefinition.getDetectionThresh()frameInfo.setDetectionInfos(detectionInfos);return frameInfo;public interface IObjectDetector public List Detect(Mat imageData,float thresh);public class YoloV4NativeDetector implements IObjectDetector public List Detect(Mat imageData,float thresh)/;端口适配器代码实现我们要解决的问题1234限界上下文处理领域复杂度领域建模处理实现复杂度架构:EDA,CQRS,P&A总结THANKSK+峰会北京站官网AiDD峰会北京站官网