| by YoungTimes | No comments

CGAL实现多边形凸分解

凹多边形的处理往往比较复杂,难以使用,所以我们往往需要将非凸多边形,甚至带空洞(Hole)的多边形拆解为凸多边形。

下图为带空洞的多边形(Polygon With Hole)。

我们的目标是使用CGAL将其分解(decompose)为如下的多个凸多边形。

1. CGAL中的凸分解(Decompose)

CGAL中提供了Polygon和PolygonWithHole两大类凸分解的方法。

PolygonConvexDecomposition_2

CGAL::Small_side_angle_bisector_decomposition_2<Kern[......]

继续阅读

Read More
| by YoungTimes | No comments

Object Detection-YOLOv2 Anchor Box Clustering

Dimension Clusters是YOLOv2中使用的优化策略之一,它的主要思路是通过聚合算法,从数据集中预先得到Bounding Box的形状先验数据,从而使得模型更容易学习,并且得到更好的Object Detection结果。

从实际的实验结果看,Cluster算法得到5个先验Anchor Box的效果已经与手工挑选的9个先验Anchor Box的效果持平,9个Clustering AnchorBox的效果相比于5个Clustering Anchor Box的效果有明显的提升,说明,Dimension Cluster的策略确实起到了非常正向的效果。

本文主要理解C[……]

继续阅读

Read More
| by YoungTimes | No comments

CGAL计算多边形的对称差 (Symmetric difference)

数学上,两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合。 集合论中的这个运算相当于布尔逻辑中的异或运算。

Symmetric Difference实现

下面我们使用两个带空洞(Hole)的多边形为例,看下symmetric difference的具体实现和效果。

CGAL提供了symmetric_difference函数可以直接用来帮助我们实现这一功能。

先实现带空洞多边形的打印函数,方面后续调试。

计算两个多边形的symmetric_difference。

g++编译代码:

程序打印结果如下[……]

继续阅读

Read More
| by YoungTimes | No comments

Python- numpy数组初始化为相同的值

有时我们需要将numpy数组初始化为相同的值,numpy提供了一些方法帮助我们实现这个目的。

1. np.zeros

np.zeros返回来一个给定形状和类型的用0填充的数组。

2. np.ones

np.ones返回来一个给定形状和类型的用1填充的数组。

初始化数组中的所有元素为10:

3. np.full

np.full返回来一个给定形状和类型的用fill_value填充的数组。

4. 数组填充-fill

np.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。

[……]

继续阅读

Read More
| by YoungTimes | No comments

Object Detection-理解YOLO v2

论文链接

《YOLO9000: Better, Faster, Stronger》

https://arxiv.org/abs/1612.08242

YOLO V2

YOLOv1的Detection速度很快,但是精度却不如R-CNN系列方法。

YOLOv2中提出了如上表所示的几种改进策略在保持检测速度的前提下提升YOLO模型的准确度和召回率,从而提高mAP。在67FPS时,YOLO V2在VOC 2007数据集上获得了76.8mAP;在40FPS时,YOLO V2在VOC 2007数据集上获得了78.6 mAP,超越了当时state-of-art的Fast[……]

继续阅读

Read More
| by YoungTimes | No comments

路径规划-人工势场法(Artificial Potential Field)

人工势场法是一种经典的机器人路径规划算法。该算法将目标和障碍物分别看做对机器人有引力和斥力的物体,机器人沿引力与斥力的合力来进行运动。

下图是一个机器人在有障碍物的二维环境下的运动示例,动图可以比较清晰的说明人工势场法是怎么工作的。人工势场法根据运动环境生成势力场,然后机器人沿着势力场的引导,从”山顶”出发,途中避开障碍物形成的”小山峰”,一路奔向目标位置所在的”山脚”。

1、引力场(Attractive Field)和斥力场(Repulsive Field)

人工势场包含两种两种力场:运动目标位置所形成的引力场(Attractive Field)和障碍物所形[……]

继续阅读

Read More
| by YoungTimes | No comments

C++11多线程编程-实现线程安全队列

线程安全队列的接口文件如下:

push函数

push()函数实现向队列添加数据的功能。添加数据后,使用std::condition_variable的notify_one通知取数据时被阻塞的线程。

wait_and_pop函数

wait_and_pop()函数实现从队列取数据的功能,当队列为空时,线程被挂起,等待有数据时被唤醒。

注意,这两个函数中没有使用std::lock_guard,而是使用std::unique_lock,这是为什么呢?

这是因为std::condition_variable的wait函数会首先检测条件data_queue.em[……]

继续阅读

Read More
| by YoungTimes | No comments

一段时间只做一件事情

作为一名程序员,随着在一个公司工作的时间越长,参与开发维护的模块越多,每天要应付的事情就会越多。新的功能亟待开发,旧的模块又不时冒出一些新需求或者新问题。每天都处于一种疲于奔命的状态。

这种状态是非常糟糕的,可能由于频繁的在各种任务中切换,每件事情都是着急忙慌的,导致每件事情都做不好。

就像一台计算机,你同时开着十几个浏览器窗口,同时还在播放音乐,可能还在运行着聊天软件,后台正在下载电影,这些同时运转的程序占用了大量的处理器时间,导致各个程序的响应都及其缓慢。多任务的并行并未加速你完成目标的时间,反而可能拖慢你的整体进度。

类似于计算机,大脑也会产生类似的效应。为了赶进度,你[……]

继续阅读

Read More
| by YoungTimes | No comments

C++11多线程编程-std::async

C++11中提供了异步线程接口std::async,std::async是异步编程的高级封装,相对于直接使用std::thread,std::async的优势在于:

1、std::async会自动创建线程去调用线程函数,相对于低层次的std::thread,使用起来非常方便;

2、std::async返回std::future对象,通过返回的std::future对象我们可以非常方便的获取到线程函数的返回结果;

3、std::async提供了线程的创建策略,可以指定同步或者异步的方式去创建线程;

1、函数原型

C++ 11中提供如下函数原型:

其中,[……]

继续阅读

Read More
| by YoungTimes | No comments

自动驾驶运动规划-Hybird A*算法(续)

Hybird A\*算法保证生成的路径是车辆可实际行驶的,但它仍然包含很多不必要的车辆转向操作,我们可以对其进行进一步的平滑和优化。

Objective Function

对于Hybird A\*生成的车辆轨迹序列:${(x_1, y_1),(x_2, y_2),…,(x_N, y_N)}$,论文【1】中提出如下的目标优化函数(Objective Function):

$$\begin{array}{l}w_{\rho} \sum_{i=1}^{N} \rho_{V}\left(x_{i}, y_{i}\right)+ \\ w_{o} \sum_{i=1}^{N} \s[……]

继续阅读

Read More