模式识别大作业-代码

数据增强

数据处理

#将文件下的图片处理成的数据,保存在Dataframe中
import glob
import numpy as np
import pandas as pd
import cv2

def my_dataset(smoke_path, non_path):
    #也可以读取源文件夹的文件列表
    #file_list = os.listdir(source_dir)
    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  # 标签为1,有烟
    # print(len_smoke)
    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  # 标签为0,无烟
    # print(data)
    return data

翻转,旋转

# -*- coding:utf-8 -*-
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))
             #cv2.warpAffine()的第二个参数是变换矩阵,第三个参数是输出图像的大小,大小不变
	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))
        #旋转45度
        img11=rotate(img1)
        # Flipped Horizontally & Vertically 水平垂直翻转
        img12 = cv2.flip(img1, 1)#水平
        img13 = cv2.flip(img1, 0)#垂直
        # cv2.imshow("还原",img1)#看看旋转后的效果
        # cv2.waitKey(111)
        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)

        # cv2.imshow("还原",img1)#看看旋转后的效果
        # cv2.waitKey(111)
        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')  # SHAPE:(n,60)

# data2 = pd.read_excel('./训练增强数据集特征向量.xls')  # SHAPE:(n,60)
data2 = pd.read_excel('./训练增强数据集特征向量.xls')  # SHAPE:(n,60)

data = pd.concat([data,data2], ignore_index=True)

data = data.reindex(np.random.permutation(data.index))  # 随机打乱
# data = data.reindex(np.random.permutation(data.index))  # 随机打乱
# data = data.reindex(np.random.permutation(data.index))  # 随机打乱

# data = data.iloc[:250, :]

# data_test = pd.read_excel('TestsetData.xls')
data_test = pd.read_excel('./测试集特征向量.xls')
data_test = data_test.reindex(np.random.permutation(data_test.index))  # 随机打乱
# data_test = data_test.reindex(np.random.permutation(data_test.index))  # 随机打乱
# data_test = data_test.reindex(np.random.permutation(data_test.index))  # 随机打乱


img = data.iloc[:, 0:58]
# for i in range( feature_testset.shape[0] ):
#     img.iloc[i, 0] = sum( img.iloc[i, 0:20] )
#     img.iloc[i, 1] = sum( img.iloc[i, 20:39] )
#     img.iloc[i, 2] = sum( img.iloc[i, 39:] )

# img = img.iloc[:, 0:3]

# img = StandardScaler().fit_transform(img)
# img = MinMaxScaler().fit_transform( img )
# img.iloc[:, 0:28] = sum(img.iloc[:, 0:28])
# img.iloc[:, 0:28] = data.iloc[:, 28:58]

img = pd.DataFrame(img)

label = data.iloc[:, 59]


img_test = data_test.iloc[:, 0:58]
# for i in range( feature_testset.shape[0] ):
#     img_test.iloc[i, 0] = sum( img_test.iloc[i, 0:20] )
#     img_test.iloc[i, 1] = sum( img_test.iloc[i, 20:39] )
#     img_test.iloc[i, 2] = sum( img_test.iloc[i, 39:] )
# img_test = img_test.iloc[:, 0:3]

# img_test = StandardScaler().fit_transform(img_test)
# img_test = MinMaxScaler().fit_transform( img_test )
img_test = pd.DataFrame(img_test)

label_test = data_test.iloc[:, 59]# train_val_data = data.reindex(np.random.permutation(data.index))  # 随机打乱

feature_trainset = img
feature_testset = img_test

train_validation_data = pd.DataFrame(feature_trainset)
feature_trainset['label'] = label
feature_testset['label'] = label_test
    # test_data = pd.DataFrame(test_data)
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')#测试集: 0.9528239202657808

model.fit(train_validation, train_validation_labels.astype(int))

# model =clf.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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:【备注】主要针对正在做毕设的同学和需要项目实战的深度学习、matlab、数字图像处理、cv图像识别模式识别方向学习者。 也可作为课程设计、期末大作业。包含:项目源码和项目说明等,该项目可直接作为毕设使用。 也...。 引用:因为想用txt里的数据去画图,而不是直接 x=1:10:100 这种方法去画图,于是先研究了把数据的散点图画出来,为了方便输入算式(主要是因为用matlab对正态分布的最大似然估计求偏导数过程中,操作代码有bug竟然求a出个负数于是放弃,直接手算求导再用matlab当作计算求和工具罢了) %手动求导数,最终求出了u的算式,最大似然估计值为u,然后才有下面这步 sum = 0; for n = 1:1000 sum = data(n) sum ; end u = sum /1000; %手动求导数,最终求出了a的算式,最大似然估计值为a_zhengtai,然后才有下面这步 zum = 0; for k = 1:1000 zum = (data(k)-u)^2 zum; end a_zhengtai = (zum/1000)^1/2; %用lognpdf来画图,lognpdf是用来计算X中的元素在mu、sigma参数指定的对数正态分布下的概率密度函数值 for i =1:1000 x_zt = data(i); y_zt = lognpdf(x_zt,u,a_zhengtai); hold on scatter(x_zt,y_zt); % plotyy(x_zt,y_zt,'plot');这个是百度的,但是不知道怎么用,只画出一个点 plot(x_zt,y_zt,'-o'); end 。 引用:把数据读到矩阵里的代码: 第一种很简单: fid = fopen('C:\Users\Administrator\Desktop\A.txt','rt'); sizeA =[1000 1]; data = fscanf(fid,'%f',sizeA); 。 模式识别大作业中,你可以使用Matlab来进行一些数据处理和图像绘制的操作。例如,你可以使用Matlab读取一个文本文件中的数据,并将这些数据绘制成散点图。你可以按照以下步骤进行操作: 1. 打开文本文件:使用fid = fopen('文件路径','rt')打开存储数据的文本文件。 2. 读取数据:使用fscanf函数按照指定的格式读取数据,将数据存储到一个矩阵中。例如,可以使用data = fscanf(fid,'%f',sizeA)将文件中的数据读取到名为data的1000行1列的矩阵中。 3. 绘制散点图:使用scatter函数将数据绘制成散点图。可以使用for循环遍历data矩阵的每个元素,并使用scatter(x_zt,y_zt)将每个元素绘制成一个散点。其中x_zt表示数据的横坐标,y_zt表示数据的纵坐标。你还可以使用plot函数绘制出更具体的线条。例如,使用plot(x_zt,y_zt,'-o')可以绘制出带有线条和圆点的图形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值