使用k-means技術分群擷取出來的照片。
在終端機下使用python3指令測試程式,必要時需使用pip3安裝相關執行套件(參考下方指令)。
pip3 install opencv-python
pip3 install matplotlib
pip3 install scikit-learn
修改參數k,測試在不同k值下的表現。
附上測試結果圖,三點說明參數值的決定方法:
測試過程,決定根據,結果討論。
其他偵測模型:haarcascades
# Import the necessary modules and libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import shutil
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
#讀取辨識用影片檔
cap = cv2.VideoCapture("twofaces.mp4")
if os.path.isdir("data"):
shutil.rmtree("data")
os.mkdir("data")
else: os.mkdir("data")
#Data collection
num = 0
data = list()
while True:
ret, img = cap.read()
if ret == False: break;
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5, 4 )
for (x, y, w, h) in faces:
image = img[y: y+h, x: x+w]
cv2.imwrite('data/%d.png'%num, image)
#計算圖片特徵值
data.append([np.std(image), np.mean(image)])
num = num+1
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv2.imshow('img', img)
k = cv2.waitKey(1)
if k == 27: break
cap.release()
cv2.destroyAllWindows()
#Data scaling
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(data)
data = scaler.transform(data)
#使用k-means技術分群
from sklearn.cluster import KMeans
X = np.array(data)
y_p = KMeans(n_clusters=2).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_p)
plt.savefig('kmeans.png')
#修改檔案名稱標示分群結果
for i in range(num):
os.rename('data/%d.png'%i, 'data/'+str(y_p[i])+('_%d.png'%i))
測試過程:一鄉二里共三夫子不識四書五經六義,竟敢教七八九子,十分大膽!十室九貧湊得八兩七錢六分五毫四厘,尚且三心二意,一等下流!
決定根據:圖書裡,龍不吟虎不嘯,小小書僮可笑可笑。棋盤裡,車無輪馬無韁,叫聲將軍提防提防。
結果討論:鶯鶯燕燕翠翠紅紅處處融融洽洽。雨雨風風花花葉葉年年暮暮朝朝。十口心思,思君思國思社稷。八目共賞,賞花賞月賞秋香。《唐伯虎點秋香》