数据增强
数据处理
import glob
import numpy as np
import pandas as pd
import cv2
def my_dataset(smoke_path, non_path):
smoke_imgs = glob.glob(smoke_path + '\\*.jpg')
non_imgs = glob.glob(non_path + '\\*.jpg')
len_smoke = len(smoke_imgs)
len_non = len(non_imgs)
data = pd.DataFrame(np.zeros((len_smoke + len_non, 10001)), index=None, columns=None)
for i in range(0, len_smoke):
img1 = cv2.imread(smoke_imgs[i], 0)
if img1.shape == (110, 100):
img1 = cv2.resize(img1, (100, 100))
img1 = np.ndarray.flatten(img1)
data.iloc[i, :10000] = img1
data.iloc[i, -1] = 1
for i in range(len_smoke, len_smoke + len_non):
img1 = cv2.imread(non_imgs[i - len_smoke], 0)
img1 = np.ndarray.flatten(img1)
data.iloc[i, :10000] = img1
data.iloc[i, -1] = 0
return data
翻转,旋转
import os
import glob
import cv2
def rotate(image, angle=45 , scale=1.0):
height, width = image.shape[:2]
center = (width / 2, height / 2)
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, M, (height, width))
return rotated
def creat_roate_hv_dataset(smoke_path, non_path):
smoke_imgs = glob.glob(smoke_path + '\\*.jpg')
non_imgs = glob.glob(non_path + '\\*.jpg')
len_smoke = len(smoke_imgs)
len_non = len(non_imgs)
for i in range(0, len_smoke):
img1 = cv2.imread(smoke_imgs[i], 0)
if img1.shape == (110, 100):
img1 = cv2.resize(img1, (100, 100))
img11=rotate(img1)
img12 = cv2.flip(img1, 1)
img13 = cv2.flip(img1, 0)
path1= 'roate0' + str(i) + '.jpg'
path2= 'hor0' + str(i) + '.jpg'
path3= 'ver0' + str(i) + '.jpg'
test_smoke_t1_path= os.path.join(smoke_path_t, path1)
cv2.imwrite(test_smoke_t1_path, img11)
print('第{}张旋转smoke...'.format(i))
test_smoke_t2_path= os.path.join(smoke_path_t, path2)
cv2.imwrite(test_smoke_t2_path, img12)
print('第{}张水平翻转smoke...'.format(i))
test_smoke_t2_path= os.path.join(smoke_path_t, path3)
cv2.imwrite(test_smoke_t2_path, img13)
print('第{}张垂直翻转smoke...'.format(i))
for i in range(0 , len_non):
img1 = cv2.imread(non_imgs[i - len_smoke], 0)
img11=rotate(img1)
img12 = cv2.flip(img1, 1)
img13 = cv2.flip(img1, 0)
path1= 'roate0' + str(i) + '.jpg'
path2 = 'hor0' + str(i) + '.jpg'
path3 = 'ver0' + str(i) + '.jpg'
test_smoke_t1_path= os.path.join(tnon_path_t, path1)
print('第{}张旋转nonsmoke...'.format(i))
cv2.imwrite(test_smoke_t1_path, img11)
test_smoke_t1_path= os.path.join(tnon_path_t, path2)
print('第{}张水平翻转nonsmoke...'.format(i))
cv2.imwrite(test_smoke_t1_path, img12)
test_smoke_t1_path= os.path.join(tnon_path_t, path3)
print('第{}张垂直翻转nonsmoke...'.format(i))
cv2.imwrite(test_smoke_t1_path, img13)
file = "C:\\Users\\Curry\\Desktop\\pattern_recognize"
train_val_smoke_path = os.path.join(file, 'lib81_1\\smoke')
smoke_path_t = os.path.join(file, 'lib81_1\\smoke_t')
train_val_non_path = os.path.join(file, 'lib81_1\\non')
tnon_path_t = os.path.join(file, 'lib81_1\\non_t')
creat_roate_hv_dataset(train_val_smoke_path, train_val_non_path)
SVM训练模型
import pandas as pd
from sklearn import svm
import numpy as np
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.preprocessing import MinMaxScaler
data = pd.read_excel('./训练集特征向量.xls')
data2 = pd.read_excel('./训练增强数据集特征向量.xls')
data = pd.concat([data,data2], ignore_index=True)
data = data.reindex(np.random.permutation(data.index))
data_test = pd.read_excel('./测试集特征向量.xls')
data_test = data_test.reindex(np.random.permutation(data_test.index))
img = data.iloc[:, 0:58]
img = pd.DataFrame(img)
label = data.iloc[:, 59]
img_test = data_test.iloc[:, 0:58]
img_test = pd.DataFrame(img_test)
label_test = data_test.iloc[:, 59]
feature_trainset = img
feature_testset = img_test
train_validation_data = pd.DataFrame(feature_trainset)
feature_trainset['label'] = label
feature_testset['label'] = label_test
train_validation = feature_trainset.iloc[:, :-1]
train_validation_labels = feature_trainset.iloc[:, -1].ravel()
model = svm.SVC(C=53, kernel='rbf', gamma = 54, decision_function_shape='ovo')
model = svm.SVC(C=99, kernel='rbf', gamma = 99, decision_function_shape='ovo')
model.fit(train_validation, train_validation_labels.astype(int))
test = feature_testset.iloc[:, :-1]
test_labels = feature_testset.iloc[:, -1].ravel()
train_score = model.score(train_validation, train_validation_labels)
print("训练集:", train_score)
test_score = model.score(test, test_labels)
print("测试集:", test_score)