我的博客

分享技术与生活

rknn-toolkit2开发套件

用于模型转换、推理、性能评估

提供python编程接口

图形采集=》npu处理=》

SDK提供图像分类、目标检测、

卷积神经网络

两大应用:图形分类、

目标检测

  • 定位

  • 分类

  • 基于区域的两阶段目标检测算法

    1. 生成样本候选框(Region of Interest,ROI)(典型算法:R-CNN、Fast R-CNN、Faster R-CNN)
    2. 卷积神经网络对样本分类+位置回归
  • 基于回归的一阶段目标检测算法

    1. 将目标框定位问题转化为回归问题处理(典型算法:Yolo、SSD)

YOLO

术语

世界坐标系word frame

本体坐标系body frame

rotation matrix或者transformation matrix的三种用法

描述一个frame相对另一个frame的姿态;(mapping)

将point由一个frame的表达转换到另一frame的表达;

描述向量在同一frame中进行运动

旋转运动

3*3旋转矩阵R

固定坐标系fix

欧拉坐标系eulor

4*4移动+旋转矩阵P

动力学

F=ma

动能守恒:动能+未能+保守力做功

合力积分=动量变化

Denavit-Hartenberg(DH)参数法

类图

1
2
3
4
5
6
7
8
9
10
@startuml
class Singleton {
- static Singleton* instance
- Singleton()
+ static Singleton* getInstance()
+ void doSomething()
- Singleton(const Singleton&)
- Singleton& operator=(const Singleton&)
}
@enduml

实现

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
// Singleton.h
#pragma once

class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数

public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}

// 禁止拷贝和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

void doSomething() {
// 业务逻辑
}
};

// 初始化静态成员
Singleton* Singleton::instance = nullptr;

目的

  1. 复用:编译后的二进制复用,非代码的复用;
  2. 了解设计模式的框架,知道什么场景使用什么设计模式。

重构技巧

  1. 重构获得模式,寻找变化点,隔离稳定与变化;
  2. 静态绑定->动态绑定
  3. 早绑定->晚绑定
  4. 继承->组合
    1. 合成聚合:尽量使用合成、聚合,尽量不要使用类继承。
    2. 继承属于强耦合,父类更改,子类必须要变。
  5. 编译时依赖->运行时依赖
  6. 紧耦合->松耦合
  7. 无环依赖
  8. 避免贫血类:只有数据没有功能的类。
  9. 避免上帝类
  10. 只说不问:可以由类独立完成的操作,不需要开放过多的接口。
  11. 避免使用静态成员
  12. 让类尽可能小

面向对象编程的特征

  1. 变量声明为抽象基类;
  2. 晚绑定:运行时绑定;
  3. 依赖接口編程,避免依赖实现;
  4. 组合优于继承;
  5. 拓展性:可通过子类重写父类虚函数;
  6. 抽象、封装、多态;
  7. 隔离变化与稳定;
  8. 界面与业务分隔;

编码的原则

  1. 保持简单和直接原则(KISS)
  2. 不需要原则(YAGNI)
  3. 避免复制原则(DRY)
  4. 信息隐藏原则
  5. 高内聚原则
  6. 松耦合原则
  7. 小心优化原则
  8. 最少惊讶原则
  9. 童子军原则
  10. 迪米特法则(不要和陌生人说话)
  11. 控制依赖方向

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另外一个类的某个方法的话,可以通过第三者转发调用。

降低对象间的耦合,提高系统的可维护性,在模块间应该只通过接口编程,而不会理会模块的内部工作原理,它可以使各个模块耦合度讲到最低,促进软件的复用。

设计模式

组件协作

1、模板模式:

驱动器状态机存在稳定的整体结构、子步骤存在多变的需求.父类实现框架、调用虚函数,推荐声明为protected注:父类的西沟为虚函数

2、策略模式:

速度模式位置模式切换使用的算法经常变化,可能新增传统做法:switch case,违背开闭原则。拓展方式解决:提取基类算法纯虚,派生具体子类算法.使用基类指针,可以结合工厂模式,创建返回具体的子类算法,可互相替换.消除条件判断解耦.绝对稳定不变的可以用枚举坏味道

3、观察者模式(事件模式)

目标对象变化,观察者对象自动得到通知并响应;

观察者依赖抽象,抽象通知;

逻辑不要耦合业务界面,松耦合;

vector或者list支持多个观察者;

可增删单一职责类装饰模式组合(has a)优于继承(is a)继承+组合:完善接口规范,支持shi?x解决主体类在多个方向上的拓展多继承:继承多个接口.抽象基类:具体转抽象静态转动态、继?转组合框架与应用、晚绑定:lib调用app(面向对象),延迟到子类(父类定义虚函数,子类重写)实现松耦合早绑定:app调用lib职责链避免发送者和接收者之间的耦合.行为变化类命令模式与函数对象类似.行为封装为对象.请求与实现解耦.

术语

Entity实体

Factory工厂:一种封装机制,把复杂创建逻辑封装,抽象出创建的对象类型;

Function函数:没有副作用的操作;

Repository仓库:一种把存储、检索行为封装起来的机制,类似于对象集合;

Service服务:一种作为接口提供的操作,无封装的状态;

Standalone class(孤立的类);

Value Object值对象:

Ubiquitous Language:通识语言,术语;

分层模式(Layered Architecture)

原则

任何元素仅依赖本层其他元素或下层元素。(内聚)

向上通信需要通过间接传递机制(回调、观察者模式)。

有边界的上下文(Bounded Context)

常用分层结构

  1. 用户界面层
  2. 应用层:简单、不包含业务规则
  3. 领域层:表达业务概念、模型
  4. 基础设施层

模型元素

Entity(Reference Object)

特征:

  1. 一种表示事物的对象;
  2. 具有唯一标识(由标识区分,而不是属性区分)
    1. 用于识别、查找、匹配对象;
  3. 生命周期内就有连续性
    1. 形式、内容可变;

建模思路:

  1. 设计标识:

    1. 必须具有唯一性(即标识一致为同一实体)
      1. 属性+唯一性约束
      2. 实例名+唯一符号数字
  2. 属性:与标识有关的属性留在实体内;(关注必要属性、避免陷入细节属性)

  3. 行为:转移到关联的其他对象中;

  4. 确保连续性(措施:保持实体简练)

示例:

  1. 一个人(标识:身份证号、name、手机号、地址等);
  2. 一个座位(标识:座位号);
  3. 仿真软件中一个元器件标识;

Value Object

特征:

  1. 描述一个事务的特征,表示状态属性的对象;
  2. 包含的属性形成一个整体;
  3. 标识的分配会导致模型的复杂度增加,VO不分配标识
  4. 设计为不可变,
    1. 简化实现(避免在模型中产生不必要的约束)
    2. 保证安全
    3. 使用新的替代更改
      1. 可以引用entity:比如路线是VO,城市是Entity
  5. 避免双向依赖;

示例:

  1. address是一个VO,包含:street、city、state

复制和共享

优点 缺点 场景
复制 可能导致被大量对象阻塞 实现可变
共享 节省数据空间减少对象数量 减慢分布式系统的速度 传递引用通信开销低对象不可变

Service

特征

  1. 用于表示动作或操作;(动词)
  2. 不属于任何entity或者OV;
  3. 避免导致对象的混乱;

建模思路

  1. 接口由领域模型定义
  2. 无状态
  3. 参数或结果为Entity或者OV

MODULE(PACKAGE)

特征:

  1. 高内聚、低耦合

按技术分包

按需求任务分包

对象之间的关联

基于同样属性的遍历机制

关联越少越简单

Entity的双向关联难以维护

VO双向关联无意义

对关联进行规则限定,可以简化模型;

关联的控制

  1. 定义遍历方向
  2. 定义限定符
  3. 消除不必要的关联

领域模型和UML的区别

细节层次

  • 领域模型
  • 抽象程度较高,关注的是业务概念和逻辑。
  • 不包含实现细节,如方法、数据类型、访问修饰符等。
  • 例如,领域模型可能只表示“订单”和“客户”之间的关系,而不涉及订单如何保存到数据库。
  • UML 类图
  • 细节程度更高,可以包含类的属性、方法、访问修饰符、参数类型等。
  • 适合用于设计阶段,帮助开发人员理解系统的实现细节。

对象生命周期的管理

AGGREGATE聚合

定义对象的所属关系和边界;

外部对象无法引用聚合内部的entity(除了根entity);

可以传递VO

FACTORY工厂

职责

  1. 创建复杂对象(AGGREGATE)

特征

  1. 每个创建方法是原子的
  2. 工厂应该被抽象为所需的类型
  3. 合理选择输入参数
  4. 区分entity factory 和 VO factory

REPOSITORY仓库

查找对象

在模型中加入对象或关系,将概念显示表达出来

柔性设计

Intention Revealing Interfaces

组件的使用者,应该不需要研究其内部实现;

命名中描述效果和目的,不要表露通过何种方式实现;

Side Effect Free Function

命令

查询

Assertion

Conceptual Contour概念轮廓

Standalone Class

Closure of operation闭合操作

保持模型的完整性

明确定义模型应用的上下文;

Bounded Context有限上下文

Continuous Integration持续集成

Context Map

Shared Kernel共享内核

价值维度

  1. 行为价值
  2. 架构价值

编程范式

  1. 结构化编程
    1. 限制程序的直接转移,goto的使用
  2. 面向对象编程
  3. 函数式编程
    1. 隔离可变性:
      1. 可变组件:事务性内存保护变量
      2. 不可变组件:函数实现

软件系统

开发、部署、运行、维护

目的

支持系统的生命周期

成本最小化

特征

易于理解

易于开发

易于维护

易于部署

概念

组件:最小部署单元,二进制文件,比如dll

要求:保留独立部署、独立开发的能力

无环依赖原则

稳定依赖原则

FanIn:外部依赖本组件的数量

FanOut:依赖外部类的数量

不稳定性:I = FanOut / (FanIn + FanOut)

稳定抽象原则

Na:抽象类和接口的数量

Nc:类的数量

抽象性:A=Na/Nc

内聚原则

REP原则:复用、发布等价原则(包容性,使组件变大)

CCP原则:共同闭合原则(包容性,使组件变大)

变更原因相同的类内聚为一个组件;

CRP原则:共同复用原则(排他性,使组件变小)

0%