图像目标检测与跟踪学习笔记(一)

一. 讲座心得

     

        刘洋师兄的讲座深入浅出,用通俗的语言给我们介绍了Computer Vision这个领域的相关知识。

        开篇先介绍了几个很有意思的应用,印象最深刻的是速度与激情的视频,能够在如此快的速度下精确地识别到各个特征目标,很强势!接着向我们解释了一些基本的概念:监督学习&非监督学习、欠拟合&过拟合等等,之前有看过一点机器学习的入门视频,对这些概念有了一些基本的认识,要进一步理解的话还需要更多的应用实践。

        对于如何学好Computer Vision,师兄给了很系统的建议,不管是技能要求还是学习资料都很详细的列举了出来。看着这么多东西有点鸭梨山大,感觉前路漫漫,要学的东西好多,不过有这么多小伙伴一起学习,也有了前进的动力。


How to learn CV(入门):

编程要求:matlab、python、C/C++

数学基础:微积分、矩阵、数理统计、优化理论

技能储备:C++教程(http://www.chinesemooc.org/mooc/4387)

                  python教程(https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000)

                  git教程(https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)

学习资料:CS231N、CS229 阅读中文讲义,完成编程作业(http://blog.csdn.net/ccq976586618/article/details/52159655?locationNum=2&fps=1)

                 机器学习工程师——吴恩达(http://mooc.study.163.com/smartSpec/detail/1001319001.htm)


二. 作业小结

 题目:

图像目标检测与跟踪学习笔记(一)_第1张图片

 课后的编程小作业,让我对梯度下降算法有了更进一步的理解。对于凸函数f(xy),求解minf,可利用:

                        x-= a*df/dx

                        y-= a*df/dy

分别用matlab和c语言进行了编程:

1. matlab拥有便捷的画图功能,结果直观可见,先画出函数在题目制定区间的三维图形,Hold  on

clear all;
clc;
xa = -5:0.1:0;
ya = -5:0.1:0;
[x,y] = meshgrid(xa,ya);
z = func(x,y);
mesh(x,y,z)
hold on;
 其中func为定义的函数:

function [ Fc ] = func(x,y)
a = 1-cos(x);
b = 1-sin(y);
c = x-y;
Fc = sin(y).* exp(a.*a)+cos(x).*exp(b.*b)+c.*c;
end

输入指定点(x0,y0)以及解算的步长a=0.0001,求解在这一点的两个偏导值,然后代入上面的梯度下降公式,运行次数一万次:

x0 = -3;
y0 = -4;
a = 0.0001;
i = 0;
while i <= 1000
   i = i+1; 
   x0 = x0 + a*fnc_dzdx(x0,y0);
   y0 = y0 + a*fnc_dzdy(x0,y0);
   z0 = func(x0,y0);
   plot3(x0,y0,z0,'.r');
end
其中求函数偏导直接利用matlab中的diff功能,然后带入(x0,y0)求解:

function [ dzdy_num1 ] = fnc_dzdy( x_num,y_num )
syms x y
z = func(x,y);
dzdy = diff(z,y);
dzdy_num = subs (dzdy,'x',x_num); 
dzdy_num = subs(dzdy_num,'y',y_num);
dzdy_num1 = eval(dzdy_num);
end

运行结果如下:

图像目标检测与跟踪学习笔记(一)_第2张图片

可见,算法能够在一万次内求解到(x0,y0)附近的局部极大值。

2. c语言程序与matlab程序原理相同,代码如下:

#include
#include
#include
using namespace std;

double Func(double x, double y)
{
	double cosx = cos(x), siny = sin(y);
	double a = 1 - cosx, b = 1 - siny, c = x - y;
	return siny*exp(a*a) + cosx*exp(b*b) + c*c;
}

double Dfx(double x, double y)
{
	double dfx;
	dfx = 2 * x - 2 * y - exp((sin(y) - 1)*(sin(y) - 1))*sin(x) - 2 * exp((cos(x) - 1)*(cos(x) - 1))*sin(x)*sin(y)*(cos(x) - 1);
	return dfx;
}

double Dfy(double x, double y)
{
	double dfy;
	dfy = 2 * y - 2 * x + exp((cos(x) - 1)*(cos(x) - 1))*cos(y) + 2 * exp((sin(y) - 1)*(sin(y) - 1))*cos(x)*cos(y)*(sin(y) - 1);
	return dfy;
}

double Constrain(double x )
{	
		if (x > 0)
			x = 0;
		else if (x < -5)
			x = -5;
	return x;
}

void main()
{
	double x, y, i,f, step = 0.0001;
	double dfx, dfy;
	cout << "请输入x y\n";
	cin >> x >> y;
	cout << "\n输入的坐标为:x=" << x << " y=" << y << "\n\n";

	x = Constrain(x);
	y = Constrain(y);
	for (i = 0;i < 10000;i++)
	{
			dfx = Dfx(x, y);
			dfy = Dfy(x, y);

			if (abs(dfx) < 0.001&&abs(dfy) < 0.001)
				break;
			x = x + step*Dfx(x, y);
			y = y + step*Dfy(x, y);
			x = Constrain(x);
			y = Constrain(y);
			f = Func(x, y);
	}
	cout << "极大值点的坐标为:" << "x =" << x << " y=" << y << "\n\n极大值点函数值为:f=" << f <<"\n";	
}

运行界面如下:

图像目标检测与跟踪学习笔记(一)_第3张图片

你可能感兴趣的:(图像目标检测与跟踪基础学习)