在之前博客椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection介绍的基础上,我们针对其公开的源代码进行说明,介绍如何使用其提供的数据集和源代码。
文章目录
1 编译源码
此代码在开发过程中使用的是opencv3.1,测试opencv3.4也能用,其源码内主要基于opencv的一些基本函数,基本上各个版本都通用。
1.1 在Windows上编译
在windows上编译时,其源码依赖的是VS2015,创建一个VS项目,注意选择项目为64位,并配置好OpenCV的环境,也就是包含目录,库目录,附加依赖项。
这些结束后,要将代码全部导入到工程中,右键解决方案资源管理器中的头文件,选择添加→现有项,把所有头文件添加进去,同理,右键源文件,添加所有cpp文件添加进去。
解决这些事情之后,编译项目即可,main.cpp提供了一个示例。
#include "FLED.h"
int main()
{
string imgPath = "002_0038.jpg"; //图片路径
Mat imgC, imgG;
// 初始化AAMED算法,指定drows=540,dcols=960,
// 切记,drows和dcols一定要大于所有待检测图像的行数和列数
AAMED aamed(540, 960);
// 参数设置,第一个参数控制曲线弯曲程度,目标更像是一个圆的话,可以将这个设置的更低些。
// 第二个参数(其实没啥用了,敏感度分析已经说明这个参数不敏感了)
// 主要是第三个参数,如果目标缺失较大,则设置的小些,如果几乎无缺失,大些即可。
aamed.SetParameters(CV_PI / 3, 3.4, 0.77); // config parameters of AAMED
imgC = cv::imread(imgPath);
cv::cvtColor(imgC, imgG, CV_RGB2GRAY);
aamed.run_FLED(imgG); // 执行算法,可以直接放在循环中检测多张图片。
cv::Vec<double, 10> detailTime;
aamed.showDetailBreakdown(detailTime); // 展示每个阶段所用的时间
aamed.drawFLED(imgG, ""); // 绘制结果
aamed.writeDetailData(); // 保存关键数据,用于AAMEDViewer分析数据用
cv::waitKey();
return 0;
}
1.2 在Ubuntu上编译源码
在Ubuntu上的代码编译使用了cmake,源码中已经提供了CMakeLists.txt文件,具体流程如下。
cd AAMED/cmake-build
cmake .. # 生成Makefile文件
make
./AAMED # 执行算法
1.3 编译可在Python上运行的代码
先进入python文件夹中,同样的,先配置OpenCV路径,在setup.py中,修改opencv_include, opencv_lib_dirs,并在 ext_modules 中配置库文件libraries=['opencv_world310']
opencv_include = "D:/opencv3.1/opencv/build/include"
opencv_lib_dirs = "D:/opencv3.1/opencv/build/x64/vc14/lib"
然后在当前文件夹中执行,即可开始编译AAMED算法
python setup.py build_ext --inplace
我是在Windows上平台编译的,编译之后会生成一个pyAAMED.cp36-win_amd64.pyd
文件,这个文件就是可在python上执行的包。
test_aamed.py
提供了一个测试说明,用法跟C++用法相似。
from pyAAMED import pyAAMED
import cv2
imgC = cv2.imread('002_0038.jpg')
imgG = cv2.cvtColor(imgC, cv2.COLOR_BGR2GRAY)
aamed = pyAAMED(600, 600)
aamed.setParameters(3.1415926/3, 3.4,0.77)
res = aamed.run_AAMED(imgG)
print(res)
aamed.drawAAMED(imgG)
cv2.waitKey()
下面是一个图片的检测示例。
1.4 编译可在MATLAB上运行的代码
先配置OpenCV环境,查看setup.m,修改之后执行即可。setup.m调用了mex工具,如果是第一次使用mex,请先配置mex的C++编译工具。编译通过之后,将会生成如下4个文件。
test_aamed.m是一个示例。
clc;clear;close all;
obj = mexAAMED(540, 960);
mexSetAAMEDParameters(obj, pi/3, 3.4, 0.77);
figure;
img = imread('139_0018.jpg');
img = rgb2gray(img);
detElps = mexdetectImagebyAAMED(obj, img);
imshow(img); hold on;
plot_aamed_res(detElps)
hold off;
% 释放内存,如果不调用这个代码,AAMED算法内存将一直在MATLAB中无法释放,只能重启软件才能消失
mexdestoryAAMED(obj);
2 椭圆标记工具
最早在2012年Prasad的文章中,给了一个标记工具,但是其标记小椭圆时误差较大,而且无法放大,图片,我们自己开发了一个标记工具。
先调用setup.m编译椭圆拟合函数,生成mexElliFit.mexw64
,然后执行main.m
即可启动这个工具,下面是使用时候这个软件的界面。
下面给出这个软件的具体用法。
- 单张图片标记模式
-
点击Open an Image 打开一张图片
-
选择Select Points 开始选择标记点 (快捷键s,一定要点在GUI界面上,不要点在图像上,否则快捷键可能失效)
-
在图像上开始选点,因为椭圆拟合需要6个点,因此选择6个点之后,会有个拟合出来的椭圆。
-
6个点之后,会给1秒的时间判断这个椭圆是否符合需求
- 如果这个椭圆满足需求,请在1秒内按下空格键
- 如果这个椭圆不满足需求,在1s之后继续点击其他点,重新进行拟合
- 如果想取消这次选择,请在1s之后点击之前点过的点即可(比如之前点过一个坐标为(1,2)的点,再点击这个点即可取消)
-
按下回车之后,拟合出的椭圆参数将会自动保存到图片路径下,也可以点击Save保存数据。
-
- 批量图片标记模式
- 点击Open a Folder,选择一个包含待标记的图片的文件夹
- 点击列表中的某个图片进行标记,有快捷键(a,d)切换上下张图片
- 进行单张图片的标记,标记方法如上面介绍的一样
一些操作技巧: 可以使用菜单栏中的放大镜对图片进行放大和缩小,使用小手图标进行拖动。
3 AAMED 数据可视化工具
这个工具用来展示算法中涉及到的几个核心数据,edge contours(边缘轮廓), DP contours(多边形逼近轮廓),arc contours(分割出的椭圆弧段),AAM矩阵和检测结果。
一般导出这些参数在matlab上进行开发,函数测试无误后再转到C++中。
在C++中调用如下函数生成对应的数据文件。
aamed.writeDetailData(); // 保存关键数据,用于AAMEDViewer分析数据用
先执行setup.m 编译出数据读取函数mexcvtBasicData, mexcvtRRect, mexcvtVVP, mexcvtAAM,然后使用main.m文件读取生成的DetailAAMED.aamed文件,下面是调用生成的数据,可视化的结果。
4 9个公开数据集
椭圆检测中,目前为止,提供了3个真实数据集和2个仿真数据集,论文在此基础上补充了2个卫星数据集和2个仿真数据集。
数据集传到了百度云上,连接为https://pan.baidu.com/s/1vUx7d3mvRxIPGSwi8DLADg,验证码 7br2
5 评价工具
代码提供了算法的验证工具,用于衡量检测结果和真值的差异,同样需要先运行setup.m编译一些用于计算重合度的函数基本库文件。
然后,下面说明如何使用这个工具
5.1 补充读取自己算法的检测方法
读取结果主要是获取一个数据集上,每个图片的对应检测结果,结果用cell文件存的。
- filepath:表示结果文件夹路径
- imgname:表示所有图片的文件名
- dataset_name:算法名
下面,按照如下格式,在Read_Ellipse_Results.m
上添加下面一段代码,每张图片的读取方法由用户自定义。
if strcmp(dataset_name, 'aamed')
for i = 1:imgnum
% 读取一张图片的检测结果,并存入elps_data中
dt_elps{i} = elps_data;
fclose(fid_dt);
end
return;
end
5.2 配置验证主函数文件
在文件MeasureAllDatasets.m中已经提供了验证算法的一个主函数,其中有几个变量需要明确说明下。
- data_root_path:数据集根目录地址
- dataset_name:数据集名称,也就是数据集文件夹的名称
- gt_label:数据集对应的缩写,每一个元素与dataset_name中的元素一一对应,用于在文件Read_Ellipse_GT.m中读取数据集的真值。
- methods_name:要验证的算法名称,当前算法的检测结果放在这个文件夹名称里。
- method_label:算法的缩写名称,用于在文件Read_Ellipse_Results.m中读取算法的检测结果
- T_overlap:重合度阈值,大于这个阈值则表示为真椭圆,否则为虚假椭圆。
6 制作自己的数据集
制作数据集方法很简单,步骤如下所示。
- 在数据集根目录下创建一个文件夹,命名为A(A表示数据集名称,根据实际需求更换)
- 创建images文件夹,放入所有图片,格式可以不唯一
- 创建图像名称文件imagenames.txt,里面存储了images下所有图片的名称
- 创建文件夹gt,存储图片的真值数据
- 在Read_Ellipse_GT.m中补充该数据集真值读取部分
总结
本博客仅提供了AAMED算法及相关数据集的使用方法,提供了验证准则,标记工具,数据可视化等相关工具,方便后续研究者研究本方向时使用。
这些工具在实际项目开发中起到了很大的作用,如果对相关工具有改进意见或者需要补充其他工具,欢迎指出,我将尽可能对其进行补充。