影象目標檢測與跟蹤學習筆記(一)
一. 講座心得
劉洋師兄的講座深入淺出,用通俗的語言給我們介紹了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(x,y),求解minf,可利用:
x-= a*
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";
}
執行介面如下: