OpenCV不止能解决AI最后一公里的问题

最近两年,无人驾驶物流配送车出现在各大城市,例如,阿里的小蛮驴,无人车的出现解决了快递配送最后一公里问题,那在AI计算机视觉领域,谁又能充当这个角色呢?

在AI视觉领域,尤其是分割任务,AI框架输出的是二进制的分割结果掩码,通过分割结果可以显示肿瘤的轮廓,但光有肿瘤的解剖结构还不行,医生想要更多的信息,例如,肿瘤的体积,轮廓,横截面最大径等,这就需要其他一些工具在AI分割结果的基础上进行进一步计算,在所有可用的工具中,OpenCV是被使用频率最高的一个。

例如,通过下面三个函数,计算分割结果的边缘,计算轮廓,计算轮廓外接矩形来补充分割结果信息。

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,

double threshold1, double threshold2,

int apertureSize = 3, bool L2gradient = false )

CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours,

OutputArray hierarchy, int mode,

int method, Point offset = Point());

CV_EXPORTS_W RotatedRect minAreaRect( InputArray points );

在这里插入图片描述

OpenCV在计算机视觉领域非常强大,集成了各种图像滤波,形态学,分割,模式识别等算法,在人工智能大行其道的今天,OpenCV紧跟时代步伐,在传统算法的基础上,增加了对人工智能的支持。

OpenCV不仅仅只能解决最后一公里问题,它正逐步发展成一个人工智能框架。

推理:

OpenCV的dnn模块,能够解析Pytorch,Tensorflow,ONNX等第三方AI框架训练好的模型参数文件,在产品中对模型进行部署,虽然很多AI框架都提供了针对C++,Python,JS等多种语言的推理框架,但如果只用一种框架就能解决全部问题,那何乐而不为呢?

CV_EXPORTS_W Net readNetFromTorch(const String &model, bool isBinary = true, bool evaluate = true);

CV_EXPORTS NetreadNetFromTensorflow(const char *bufferModel, size_t lenModel,

const char *bufferConfig = NULL, size_t lenConfig = 0);

机器学习算法:

一提到机器学习算法,大家很快都会想到scikit-learn,它确实是一个很强大的机器学习算法库,但它并没有提供多语言的支持,例如,如果我们的项目是C++,可能没办法直接使用scikit-learn,这时OpenCV就是一个不错的选择,下面我们尝试用OpenCV去实现几个常用的机器学习算法。

Kmean:

定义训练数据,坐标位置x,y代表特征

Mat points(sampleCount, 1, CV_32FC2), labels;

设定聚类中心数目,随机生成聚类中心点,并在聚类中心附近随机生成样本点

for( k = 0; k < clusterCount; k++ )

{

Point center;

center.x = rng.uniform(0, img.cols);

center.y = rng.uniform(0, img.rows);

Mat pointChunk = points.rowRange(k*sampleCount/clusterCount,

k == clusterCount - 1 ? sampleCount :

              (k+1)*sampleCount/clusterCount);

rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y),             Scalar(img.cols*0.05, img.rows*0.05));

}

randShuffle(points, 1, &rng);

进行聚类

double compactness = kmeans(points, clusterCount, labels,

TermCriteria( TermCriteria::EPS+TermCriteria::COUNT, 10, 1.0),

3, KMEANS_PP_CENTERS, centers);

KNN属于无监督的机器学习方法,训练数据不存在标签值,聚类过程就相当于训练过程,训练完成后生成的模型参数就是聚类中心,当对新的数据进行推理时,只要计算新的数据与所有聚类中心的距离即可。

在这里插入图片描述

SVM:

bool doTrain( const Mat samples, const Mat responses, Mat &weights, float &shift)

{

cv::Ptr<SVMSGD> svmsgd = SVMSGD::create();

cv::Ptr trainData = TrainData::create(samples, cv::ml::ROW_SAMPLE, responses);

svmsgd->train( trainData );

if (svmsgd->isTrained())

{

    weights = svmsgd->getWeights();

    shift = svmsgd->getShift();

    return true;

}

return false;

}

Samples是训练数据的输入特征,responses是标签值,训练完成后输出模型的权重和偏移。

在这里插入图片描述

人工神经网络:

除了机器学习算法外,OpenCV还支持人工神经网络的搭建:

定义训练数据输入特征,数据个数100,特征维度100

//create random training data

Mat_ data(100, 100);

randn(data, Mat::zeros(1, 1, data.type()), Mat::ones(1, 1, data.type()));

定义训练数据标签

//half of the samples for each class

Mat_ responses(data.rows, 2);

for (int i = 0; i<data.rows; ++i)

{

if (i < data.rows/2)

{

    responses(i, 0) = 1;

    responses(i, 1) = 0;

}

else

{

    responses(i, 0) = 0;

    responses(i, 1) = 1;

}

}

定义神经网络输入层,隐藏层,输出层神经元个数

Mat_ layerSizes(1, 3);

layerSizes(0, 0) = data.cols;输入层神经元个数与数据特征维度一致

layerSizes(0, 1) = 20;隐藏层神经元个数

layerSizes(0, 2) = responses.cols;输出层神经元个数与标签维度一致

定义神经网络

Ptr<ANN_MLP> network = ANN_MLP::create();

network->setLayerSizes(layerSizes);

设置激活函数

network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 0.1, 0.1);

network->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1);

Ptr trainData = TrainData::create(data, ROW_SAMPLE, responses);

模型训练

network->train(trainData);

if(network->isTrained())

{

printf(“Predict one-vector:\n”);

Mat result;

network->predict(Mat::ones(1, data.cols, data.type()), result);

cout << result << endl;

printf(“Predict training data:\n”);

for (int i=0; i<data.rows; ++i)

{

network->predict(data.row(i), result);推理

cout << result << endl;

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340