基于hog的人臉識(shí)別-作業(yè)1

作業(yè)1內(nèi)容:


image.png

image.png

image.png

image.png
# -*- coding: utf-8 -*-

from PIL import Image
import cv2
import numpy as np
import math
import os

cell_size = 8
bin_size = 9
angle_unit = 180 / bin_size
cell_gradient_vector = np.zeros((int(128/cell_size),int(128/cell_size), bin_size))
def cell_gradient(cell_mag, cell_angle):
    '''Calculate Gradients in 8*8 cells'''
    orientation_centers = [0] * bin_size
    for k in range(cell_mag.shape[0]):
        for l in range(cell_mag.shape[1]):
            gradient_strength = cell_mag[k][l]
            gradient_angle = cell_angle[k][l]
            if gradient_angle<160:
                min_angle = int(gradient_angle / angle_unit)%8
                max_angle = (min_angle + 1) % bin_size
                mod = gradient_angle % angle_unit
                orientation_centers[min_angle] +=(gradient_strength*(1-(mod/angle_unit)))
                orientation_centers[max_angle] +=(gradient_strength*(mod/angle_unit))
            else:
                mod = gradient_angle%angle_unit
                orientation_centers[bin_size-1] +=(gradient_strength*(1-(mod/angle_unit)))
                orientation_centers[0] +=(gradient_strength*(mod/angle_unit))
    return orientation_centers


def preprocess(im):
    '''Preprocessing'''
    #im=Image.open(im)
    #region=im.crop((159,68,328,229))
    #region=region.resize((128, 128),Image.ANTIALIAS)
    img=Image.open(im)
    img=cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)
    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    return img

def Gradient_Image(img):
    '''Calculate the Gradient Images'''
    gx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=1)
    gy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=1)
    mag,angle=cv2.cartToPolar(gx,gy,angleInDegrees=True)
    for i in range(128):
        for j in range(128):
            if (angle[i,j]>=180):
                angle[i,j]=angle[i,j]-180
    return mag,angle

def hog_vector(mag,angle):
    '''Calculate Histogram of Gradients in 8*8 cells'''
    cell_gradient_vector = np.zeros((int(128/cell_size),int(128/cell_size), bin_size))
    for i in range(cell_gradient_vector.shape[0]):
        for j in range(cell_gradient_vector.shape[1]):
            cell_magnitude=mag[i*cell_size:(i+1)*cell_size,j*cell_size:(j+1)*cell_size]
            cell_angle=angle[i*cell_size:(i+1)*cell_size,j*cell_size:(j+1)*cell_size]
            cell_gradient_vector[i][j] = cell_gradient(cell_magnitude, cell_angle)
    '''16*16 Block Normalization'''
    hog_vector = []
    for i in range(cell_gradient_vector.shape[0] - 1):
        for j in range(cell_gradient_vector.shape[1] - 1):
            block_vector = []
            block_vector.extend(cell_gradient_vector[i][j])
            block_vector.extend(cell_gradient_vector[i][j + 1])
            block_vector.extend(cell_gradient_vector[i + 1][j])
            block_vector.extend(cell_gradient_vector[i + 1][j + 1])
            mag = lambda vector: math.sqrt(sum(i ** 2 for i in vector))
            magnitude = mag(block_vector)
            if magnitude != 0:
                normalize = lambda block_vector, magnitude: [element / magnitude for element in block_vector]
                block_vector = normalize(block_vector, magnitude)
            hog_vector.append(block_vector)
    hog_vector_final=[]
    for i in hog_vector:
        hog_vector_final.extend(i)
    return np.array(hog_vector_final)


'''read image files and creat hog feature dataset'''

pos_im_file="./classifer/bounding box/posimage"
neg_im_file="./classifer/bounding box/negimage"
def loadimg_infile(imgdir):
    imgname=[]
    imgname_sorted=[]
    filename=os.listdir(imgdir)
    for file in filename:
        if 'jpg' in file:
            imgname.append(imgdir+file)
    s=len(imgname)
    for i in range(s):
        imgname_sorted.append(imgdir+'/'+str(i+1)+'.jpg')
    return imgname_sorted

pos_im_list=loadimg_infile(pos_im_file)
neg_im_list=loadimg_infile(neg_im_file)
xdata=[]
ydata=[]
for pos_im in pos_im_list:
    mag,angle=Gradient_Image(preprocess(pos_im))
    xdata.append(hog_vector(mag,angle))
    ydata.append(1.0)
for neg_im in neg_im_list:
    mag,angle=Gradient_Image(preprocess(neg_im))
    xdata.append(hog_vector(mag,angle))
    ydata.append(0.0)
    
'''split data to train and test'''
from sklearn.cross_validation import train_test_split
test_size=0.1
X_train,X_test,y_train,y_test=train_test_split(xdata,ydata,test_size=test_size,random_state=1)

'''different kinds of classifers'''
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn import metrics
from sklearn.metrics import precision_recall_curve, roc_curve, auc
from sklearn.externals import joblib
#clf = GaussianNB()
#clf = MultinomialNB(alpha=0.01)
#clf = LogisticRegression()
#clf = SVC(kernel = 'linear')
#clf = KNeighborsClassifier()
clf = SVC(kernel='linear', gamma= 0.5, C = 2.0)
clf.fit(X_train,y_train)
pred = clf.predict(xdata)
s = metrics.confusion_matrix(ydata,pred,labels=None)
print(s)
pred_train = clf.predict(X_train)
pred_test = clf.predict(X_test)
s_train= metrics.confusion_matrix(y_train,pred_train,labels=None)
s_test= metrics.confusion_matrix(y_test,pred_test,labels=None)
accuracy_train=(s_train[0][0]+s_train[1][1])/(100-100*test_size)
accuracy_test=(s_test[0][0]+s_test[1][1])/(100*test_size)
print('accuracy_train:',accuracy_train)
print('accuracy_test:',accuracy_test)
#joblib.dump(clf, "train_model.m")#save trained model
#clf = joblib.load("train_model.m") #load existed trained model


'''Test the detector'''
testimg='./classifer/posimage/3.jpg'
truelabel=[159,68,328,229] #圖片對(duì)應(yīng)的真實(shí)標(biāo)簽
img2=Image.open(testimg)
'''
w_size和stride可調(diào)
'''
w_size=150#window_size
stride=8 #step_size
imgbgr=cv2.cvtColor(np.asarray(img2),cv2.COLOR_RGB2BGR)
imggray=cv2.cvtColor(imgbgr,cv2.COLOR_BGR2GRAY)
mag,angle=Gradient_Image(imggray)
iarray=[]#記錄近奧巴馬臉區(qū)域檢測(cè)出很多框的左上角i
jarray=[]#記錄近奧巴馬臉區(qū)域檢測(cè)出很多框的左上角j
for i in range(int((imggray.shape[0]-w_size)/stride)):
    for j in range(int((imggray.shape[1]-w_size)/stride)):
        imgcrop=imggray[i*stride:i*stride+w_size,j*stride:j*stride+w_size]
        imgcrop=Image.fromarray(imgcrop)
        imgcrop=imgcrop.resize((128, 128),Image.ANTIALIAS)
        imgcrop=cv2.cvtColor(np.asarray(imgcrop),cv2.COLOR_BAYER_GR2GRAY)
        recmag,recangle=Gradient_Image(imgcrop)
        hogrec=hog_vector(recmag,recangle)
        hogrec=hogrec.reshape(1,-1)
        prediction=clf.predict(hogrec)
        if int(prediction[0])==1:
            #cv2.rectangle(imgbgr, (i,j), (i+128,j+128), (0,255,0), 1)
            iarray.append(i*stride)
            jarray.append(j*stride)
'''
藍(lán)色為原先標(biāo)簽,綠色為檢測(cè)出的奧巴馬人臉區(qū)域溃肪,
紅色為綠色的平均载慈,
'''
#draw original labels
cv2.rectangle(imgbgr, (159,68), (328,229), (255,0,0), 2)

#draw detected Obama face by above code
if len(iarray)>0:
    iarray_avg=int(sum(iarray)/len(iarray))
    jarray_avg=int(sum(jarray)/len(jarray))
    #畫(huà)紅色
    cv2.rectangle(imgbgr, (jarray_avg,iarray_avg), (jarray_avg+w_size,iarray_avg+w_size), (0,0,255), 2)
    for i in iarray:
        for j in jarray:
            cv2.rectangle(imgbgr, (j,i), (j+w_size,i+w_size), (0,255,0), 1)
    cv2.imshow('Frame',imgbgr)
    cv2.waitKey(0)
else:
    print("Obama not in this picture under this window size and stride")


結(jié)果:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末片拍,一起剝皮案震驚了整個(gè)濱河市筋栋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件直撤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜕着,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)红柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)承匣,“玉大人,你說(shuō)我怎么就攤上這事锤悄∪推” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵零聚,是天一觀的道長(zhǎng)袍暴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)隶症,這世上最難降的妖魔是什么政模? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚂会,結(jié)果婚禮上淋样,老公的妹妹穿的比我還像新娘。我一直安慰自己胁住,他們只是感情好趁猴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著彪见,像睡著了一般儡司。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上余指,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天捕犬,我揣著相機(jī)與錄音,去河邊找鬼浪规。 笑死或听,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笋婿。 我是一名探鬼主播誉裆,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缸濒!你這毒婦竟也來(lái)了足丢?” 一聲冷哼從身側(cè)響起粱腻,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斩跌,沒(méi)想到半個(gè)月后绍些,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耀鸦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柬批,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖订。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氮帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洛姑,到底是詐尸還是另有隱情上沐,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布楞艾,位于F島的核電站参咙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硫眯。R本人自食惡果不足惜蕴侧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舟铜。 院中可真熱鬧戈盈,春花似錦、人聲如沸谆刨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痊夭。三九已至刁岸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間她我,已是汗流浹背虹曙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留番舆,地道東北人酝碳。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恨狈,于是被迫代替她去往敵國(guó)和親疏哗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容