【机器学习】机器学习之支持向量机(SVM)

目录

  • 一、下载LibSVM
  • 二、使用LibSVM工具准备数据
  • 三、训练模型并写出决策函数的数学公式
  • 四、参考文献

一、下载LibSVM

LibSVM官网
下载完成解压后得到文件目录如下:
【机器学习】机器学习之支持向量机(SVM)_第1张图片之后选择对应语言的代码:(这里我用的JAVA

【机器学习】机器学习之支持向量机(SVM)_第2张图片
创建一个项目,添加一个Test类,项目目录结构如下:【机器学习】机器学习之支持向量机(SVM)_第3张图片

二、使用LibSVM工具准备数据

选择windows文件夹,找到名为svm-toy.exe的运行程序并运行

手动绘制数据集的点:

【机器学习】机器学习之支持向量机(SVM)_第4张图片最后点击Save将数据保存为train.txt。

在原有基础上再次添加一点数据,保存为test.txt。

三、训练模型并写出决策函数的数学公式

Test类

package Test;

import java.io.IOException;
import java.sql.SQLOutput;

public class Test {
    public static void main(String args[]) throws IOException {

        String filepath = "E:\\LibSvm_project1\\";

        String[] arg = {"-s","0","-c","10","-t","0",filepath+"train.txt",filepath+"text.txt"};
        System.out.println("----------------线性-----------------");

        svm_train.main(arg);

        arg[5]="1";
        arg[7]=filepath+"poly.txt";
        System.out.println("---------------多项式-----------------");
        svm_train.main(arg);

        arg[5]="2";
        arg[7]=filepath+"RBF.txt";
        System.out.println("---------------高斯核-----------------");
        svm_train.main(arg);

    }

}

运行项目,结果如下:

【机器学习】机器学习之支持向量机(SVM)_第5张图片

输出文件:

  • train.txt训练数据
  • text.txt线性模型
  • poly多项式模型
  • RBF高斯核模型

【机器学习】机器学习之支持向量机(SVM)_第6张图片

数据说明

  • svm_type //所选择的svm类型,默认为c_svc
  • kernel_type //训练采用的核函数类型,此处为RBF核
  • gamma //RBF核的参数γ
  • nr_class //类别数
  • total_sv //支持向量总个数
  • rho //判决函数的偏置项b
  • label //原始文件中的类别标识
  • nr_sv //每个类的支持向量机的个数
  • SV //各个类的权系数及相应的支持向量
    线性模型
    【机器学习】机器学习之支持向量机(SVM)_第7张图片

多项式模型
【机器学习】机器学习之支持向量机(SVM)_第8张图片
高斯核模型
【机器学习】机器学习之支持向量机(SVM)_第9张图片
决策函数

公式:f(x)=SV*x+rho

  • wT为向量的转置矩阵,即为模型数据中的SV
  • b为偏置常数,即为数据模型中的rho

四、参考文献

1.基于LibSVM得到决策函数

本文转自 https://blog.csdn.net/wanerXR/article/details/121410752,如有侵权,请联系删除。

  • 一、人脸特征提取
  • 二、获取每个人68个特征数据并保存到csv中
  • 三、参考链接

环境
pycharm专业版
python3.8
dlib19.19.0

一、人脸特征提取

人脸数据集
①使用摄像头采集(视频流截图)
采集的过程,最好使用同一设备同一光线下进行采集

import cv2
import dlib
import os
import sys
import random

# 存储位置
output_dir = 'D:/mypicture/picture/'
size = 64

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 改变图片的亮度与对比度

def relight(img, light=1, bias=0):
    w = img.shape[1]
    h = img.shape[0]
    # image = []
    for i in range(0, w):
        for j in range(0, h):
            for c in range(3):
                tmp = int(img[j, i, c] * light + bias)
                if tmp > 255:
                    tmp = 255
                elif tmp < 0:
                    tmp = 0
                img[j, i, c] = tmp
    return img


# 使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
# 打开摄像头 参数为输入流,可以为摄像头或视频文件
camera = cv2.VideoCapture(0)
index = 1
while True:
    if (index <= 20):  # 存储20张人脸特征图像
        print('Being processed picture %s' % index)
        # 从摄像头读取照片
        success, img = camera.read()
        # 转为灰度图片
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 使用detector进行人脸检测
        dets = detector(gray_img, 1)

        for i, d in enumerate(dets):
            x1 = d.top() if d.top() > 0 else 0
            y1 = d.bottom() if d.bottom() > 0 else 0
            x2 = d.left() if d.left() > 0 else 0
            y2 = d.right() if d.right() > 0 else 0

            face = img[x1:y1, x2:y2]
            # 调整图片的对比度与亮度, 对比度与亮度值都取随机数,这样能增加样本的多样性
            face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))

            face = cv2.resize(face, (size, size))

            cv2.imshow('image', face)

            cv2.imwrite(output_dir + '/' + str(index) + '.jpg', face)

            index += 1
        key = cv2.waitKey(30) & 0xff
        if key == 27:
            break
    else:
        print('Finished!')
        # 释放摄像头 release camera
        camera.release()
        # 删除建立的窗口 delete all the windows
        cv2.destroyAllWindows()
        break

结果:

【机器学习】机器学习之支持向量机(SVM)_第10张图片

运行结果
【机器学习】机器学习之支持向量机(SVM)_第11张图片
在对应的输出目录下,会得到20张摄像头采集得到的图片。

二、获取每个人68个特征数据并保存到csv中

# 从人脸图像文件中提取人脸特征存入 CSV
# Features extraction from images and save into features_all.csv

# return_128d_features()          获取某张图像的128D特征
# compute_the_mean()              计算128D特征均值

from cv2 import cv2 as cv2
import os
import dlib
from skimage import io
import csv
import numpy as np

# 要读取人脸图像文件的路径
path_images_from_camera = "D:/mypicture/picture/"

# Dlib 正向人脸检测器
detector = dlib.get_frontal_face_detector()

# Dlib 人脸预测器
predictor = dlib.shape_predictor("D:\BaiduNetdiskDownload/shape_predictor_68_face_landmarks.dat")

# Dlib 人脸识别模型
# Face recognition model, the object maps human faces into 128D vectors
face_rec = dlib.face_recognition_model_v1("D:\BaiduNetdiskDownload/dlib_face_recognition_resnet_model_v1.dat")

# 返回单张图像的 128D 特征
def return_128d_features(path_img):
    img_rd = io.imread(path_img)
    img_gray = cv2.cvtColor(img_rd, cv2.COLOR_BGR2RGB)
    faces = detector(img_gray, 1)

    print("%-40s %-20s" % ("检测到人脸的图像 / image with faces detected:", path_img), '\n')

    # 因为有可能截下来的人脸再去检测,检测不出来人脸了
    # 所以要确保是 检测到人脸的人脸图像 拿去算特征
    if len(faces) != 0:
        shape = predictor(img_gray, faces[0])
        face_descriptor = face_rec.compute_face_descriptor(img_gray, shape)
    else:
        face_descriptor = 0
        print("no face")

    return face_descriptor


# 将文件夹中照片特征提取出来, 写入 CSV
def return_features_mean_personX(path_faces_personX):
    features_list_personX = []
    photos_list = os.listdir(path_faces_personX)
    if photos_list:
        for i in range(len(photos_list)):
            # 调用return_128d_features()得到128d特征
            print("%-40s %-20s" % ("正在读的人脸图像 / image to read:", path_faces_personX + "/" + photos_list[i]))
            features_128d = return_128d_features(path_faces_personX + "/" + photos_list[i])
            #  print(features_128d)
            # 遇到没有检测出人脸的图片跳过
            if features_128d == 0:
                i += 1
            else:
                features_list_personX.append(features_128d)
                i1 = str(i + 1)
                add = "D:/mypicture/face_feature" + i1 + ".csv"
                print(add)
                with open(add, "w", newline="") as csvfile:
                    writer1 = csv.writer(csvfile)
                    writer1.writerow(features_128d)
    else:
        print("文件夹内图像文件为空 / Warning: No images in " + path_faces_personX + '/', '\n')

    # 计算 128D 特征的均值
    # N x 128D -> 1 x 128D
    if features_list_personX:
        features_mean_personX = np.array(features_list_personX).mean(axis=0)
    else:
        features_mean_personX = '0'

    return features_mean_personX


# 读取某人所有的人脸图像的数据
people = os.listdir(path_images_from_camera)
people.sort()

with open("D:/mypicture/features/features2_all.csv", "w", newline="") as csvfile:
    writer = csv.writer(csvfile)
    for person in people:
        print("##### " + person + " #####")
        # Get the mean/average features of face/personX, it will be a list with a length of 128D
        features_mean_personX = return_features_mean_personX(path_images_from_camera + person)
        writer.writerow(features_mean_personX)
        print("特征均值 / The mean of features:", list(features_mean_personX))
        print('\n')
    print("所有录入人脸数据存入 / Save all the features of faces registered into: D:/myworkspace/JupyterNotebook/People/feature/features_all2.csv")

运行结果
【机器学习】机器学习之支持向量机(SVM)_第12张图片得到如下文件
【机器学习】机器学习之支持向量机(SVM)_第13张图片

三、参考链接

1.Dlib模型实现人脸识别

本文转自 https://blog.csdn.net/wanerXR/article/details/121412126,如有侵权,请联系删除。

你可能感兴趣的:(机器学习,支持向量机,机器学习,人工智能)