北科資工二多媒體技術與應用 第五周團隊作業 - 對兩類別影像進行HOG特徵提取並送入SVM分類器進行訓練進行辨識

筆記說明

此筆記用途在於台北科技大學資訊工程系大二下多媒體技術與應用作業紀錄
並非所有人都適用,部分對我而言稍加容易的內容並不會寫在此內。
這是學習後心得的筆記,可能不太適用會未來的學生

由於我沒有學習過裡面的理論,因此這是資工大二學生透過網路與自身理解的筆記,學習價值並不高、且可能擁有大量錯誤。

題目要求

hog 簡介

為 Dalad and Triggs 提出的一種在電腦視覺與影像處理中用來檢測物體特徵,善於描述物件的輪廓,並降低光影變化的影響

SIFT 優點

  • 可以將 cell 放大,提高性能
  • 對於影像幾何與光學變化都能保持很好的不變性
  • 對於細微的動作可以將 cell 放大,來進行忽略而不影響檢測結果

資料集

這裡我們採用兩組資料集來使用 hog 特徵辨識

心得

自從學習過天佑的程式碼,我對於機器學習有著初步認識,但只僅限在應用上XD,大該知道要怎麼進行訓練、辨識了XD。

總之,謝謝在學習多媒體技術與應用時一路幫助過我的人,如果沒有他們幫助我,我可能到現在還甚麼都不會。

在最後一刻還沒有把作業做完,因為之前理解錯了題目意思,最後還需要助教幫忙再多開 10 分鐘,來上傳作業並將作業完成,真的是非常感謝助教QQQQQ。

我自己就搞錯了,花一堆時間除錯QQQQ

也謝謝發明此演算法的大師,可以讓我運用,讓我學會此應用方式,沒有大家我都做不好QQ。

參考來源

北科大電資學士班林天佑

程式碼

直接透過程式碼來進行說明,相信會比較好理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 8 10:58:26 2021

"""

import cv2
import numpy as np
from skimage.feature import hog
from sklearn.datasets import fetch_lfw_people
from sklearn import svm
from sklearn.model_selection import train_test_split

data_amount = 100 #每一個資料集總數 100
train_amount = 90 #訓練資料集筆數
test_amount = 10 #訓練資料集筆數

dogs = list()
cats = list()
for i in range(1,data_amount+1): #讀取狗原始資料
image = cv2.imread("../resize_dog/dog_%.3d.jpg" % i)
dogs.append(image)
for i in range(1,data_amount+1): #讀取貓原始資料
image = cv2.imread("../resize_cat/cat_%.3d.jpg" % i)
cats.append(image)

## 如果要讀柯南與哆啦A夢使用這邊的資料
# for i in range(1,data_amount+1):
# image = cv2.imread("../conan/images (%d).jpg" % i)
# image = cv2.resize(image, (349,256))
# dogs.append(image)
# for i in range(1,data_amount+1):
# image = cv2.imread("../Doraemon/images (%d).jpg" % i)
# image = cv2.resize(image, (349,256))
# cats.append(image)

hog_dogs = list()
hog_cats = list()
for image in dogs: #將狗的原始資料透過 hog 描繪邊緣
fd, hog_image = hog(
image,
orientations=8,
pixels_per_cell=(9,9),
cells_per_block=(1,1),
visualize=True,
)
hog_dogs.append(fd)
for image in cats: #將貓的原始資料透過 hog 描繪邊緣
fd, hog_image = hog(
image,
orientations=8,
pixels_per_cell=(9,9),
cells_per_block=(1,1),
visualize=True,
)
hog_cats.append(fd)

# train model
train_target_dog = [0] * train_amount #狗的訓練集數
train_target_cat = [1] * train_amount #貓的訓練集數
train_target = train_target_dog + train_target_cat #合併
train_images = hog_dogs[:train_amount] + hog_cats[:train_amount] #圖片合併

# test model
test_target_dog = [0] * test_amount #狗的測試集數
test_target_cat = [1] * test_amount #貓的測試集數
test_target = test_target_dog + test_target_cat #合併
test_images = hog_dogs[-test_amount:] + hog_cats[-test_amount:] #圖片合併

#svm train
clf = svm.SVC(kernel="linear", C=1, gamma="auto") #設定方法
clf.fit(train_images, train_target) #進行訓練

print("accuracy")
print("train:", clf.score(train_images, train_target)) #訓練集準確度
print("test:", clf.score(test_images, test_target), "\n") #測試集準確度

結果

貓與狗

多拉A夢與柯南

圖片辨識後結論

貓與狗

由於 hog 屬於輪廓辨識,小貓與小狗的體型較為類似,而我們的資料集圖片中小貓與小狗的比例佔大多數,因此 hog 辨識較差。

我認為如果改用成年大狗與小貓,那辨識程度就會更高

多拉A夢與柯南

這組的準確程度較高,因為多拉A夢的輪廓較圓滑、柯南的輪廓比較偏瘦,因此倆著在透過輪廓辨識時,比較容易辨識出來。

測試集成功率達到 0.875,很高的辨識率,我認為算是蠻不錯的成績

無註解程式碼

提供無註解程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 8 10:58:26 2021

"""
#hog 比較容易受到外音干擾,旋轉光影也會干擾

import cv2
import numpy as np
from skimage.feature import hog
from sklearn.datasets import fetch_lfw_people
from sklearn import svm
from sklearn.model_selection import train_test_split

data_amount = 100
train_amount = 80
test_amount = 20

dogs = list()
cats = list()
for i in range(1,data_amount+1):
image = cv2.imread("../resize_dog/dog_%.3d.jpg" % i)
dogs.append(image)
for i in range(1,data_amount+1):
image = cv2.imread("../resize_cat/cat_%.3d.jpg" % i)
cats.append(image)

#for i in range(1,data_amount+1):
# image = cv2.imread("../conan/images (%d).jpg" % i)
# image = cv2.resize(image, (349,256))
# dogs.append(image)
#for i in range(1,data_amount+1):
# image = cv2.imread("../Doraemon/images (%d).jpg" % i)
# image = cv2.resize(image, (349,256))
# cats.append(image)

hog_dogs = list()
hog_cats = list()
for image in dogs:
fd, hog_image = hog(
image,
orientations=8,
pixels_per_cell=(9,9),
cells_per_block=(1,1),
visualize=True,
)
hog_dogs.append(fd)
for image in cats:
fd, hog_image = hog(
image,
orientations=8,
pixels_per_cell=(9,9),
cells_per_block=(1,1),
visualize=True,
)
hog_cats.append(fd)

# train model
train_target_dog = [0] * train_amount
train_target_cat = [1] * train_amount
train_target = train_target_dog + train_target_cat
train_images = hog_dogs[:train_amount] + hog_cats[:train_amount]

# test model
test_target_dog = [0] * test_amount
test_target_cat = [1] * test_amount
test_target = test_target_dog + test_target_cat
test_images = hog_dogs[-test_amount:] + hog_cats[-test_amount:] #last

#svm train
clf = svm.SVC(kernel="linear", C=1, gamma="auto")
clf.fit(train_images, train_target)

print("accuracy")
print("train:", clf.score(train_images, train_target))
print("test:", clf.score(test_images, test_target), "\n")
  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: