1. 程式人生 > >影象目標檢測與跟蹤學習筆記(一)

影象目標檢測與跟蹤學習筆記(一)

一. 講座心得

        劉洋師兄的講座深入淺出,用通俗的語言給我們介紹了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)

二. 作業小結

 題目:


 課後的程式設計小作業,讓我對梯度下降演算法有了更進一步的理解。對於凸函式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

執行結果如下:


可見,演算法能夠在一萬次內求解到(x0,y0)附近的區域性極大值。

2. c語言程式與matlab程式原理相同,程式碼如下:

#include<stdio.h>
#include<math.h>
#include<iostream>
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";	
}

執行介面如下: