婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 人臉識別具體案例(李智恩)

人臉識別具體案例(李智恩)

熱門標簽:房產電銷外呼系統 南京銷售外呼系統軟件 上海機器人外呼系統哪家好 地圖標注的意義點 地圖制圖標注位置改變是移位嗎 蓋州市地圖標注 浙江電銷卡外呼系統好用嗎 315電話機器人廣告 地圖標注微信發送位置不顯示

項目環境:python3.6

一、項目結構

二、數據集準備

數據集準備分為兩步:

  1. 獲取圖片.
  2. 提取人臉.

1、獲取圖片

首先可以利用爬蟲,從百度圖片上批量下載圖片,但注意下載數據集所用的關鍵詞不要和之后識別任務的關鍵詞太接近,否則若有圖片重合,就會產生“識別得很準”的錯覺。下面的程序為爬蟲部分,在name.txt文件中寫好要搜索的關鍵詞,即可使用。

# 爬蟲部分,存放到 name + ‘文件'
    #############################################################################################
    if GET_PIC == 1:
        headers = {
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Upgrade-Insecure-Requests': '1'
        }
        A = requests.Session()
        A.headers = headers
        tm = int(input('請輸入每類圖片的下載數量 '))
        numPicture = tm
        line_list = []
        with open('./name.txt', encoding='utf-8') as file:
            line_list = [k.strip() for k in file.readlines()]  # 用 strip()移除末尾的空格
        for word in line_list:
            url = 'https://image.baidu.com/search/flip?tn=baiduimageie=utf-8word=' + word + 'pn='
            tot = Find(url, A)
            Recommend = recommend(url)  # 記錄相關推薦
            print('經過檢測%s類圖片共有%d張' % (word, tot))
            file = word + '文件'
            y = os.path.exists(file)
            if y == 1:
                print('該文件已存在,無需創建')
            else:
                os.mkdir(file)
            t = 0
            tmp = url
            while t  numPicture:
                try:
                    url = tmp + str(t)
                    # result = requests.get(url, timeout=10)
                    # 這里搞了下
                    result = A.get(url, timeout=10, allow_redirects=False)
                    print(url)
                except error.HTTPError as e:
                    print('網絡錯誤,請調整網絡后重試')
                    t = t + 60
                else:
                    dowmloadPicture(result.text, word)
                    t = t + 60
            numPicture = numPicture + tm
        print('當前搜索結束,開始提取人臉')
    #############################################################################################

下載圖片時要注意區分,將IU的圖片放在一個文件夾下,Other的放在另一文件夾下。訓練集和測試集都要如此。如下圖所示:

每個文件夾內都是下圖形式:

在IU文件夾內圖片如下所示:

對于文件夾內文件的命名,可以利用以下這段程序,按順序重命名。

import os
raw_train_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/train/IU/'
raw_train_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/train/Other/'
raw_test_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/test/IU/'
raw_test_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/test/Other/'
raw_roots = [raw_train_root_1, raw_train_root_2, raw_test_root_1, raw_test_root_2]
for path in raw_roots:
    # 獲取該目錄下所有文件,存入列表中
    fileList = os.listdir(path)
    n = 0
    for i in fileList:
        # 設置舊文件名(就是路徑+文件名)
        oldname = path + os.sep + fileList[n]  # os.sep添加系統分隔符
        # 設置新文件名
        newname = path + os.sep + str(n) + '.JPG'
        os.rename(oldname, newname)  # 用os模塊中的rename方法對文件改名
        print(oldname, '======>', newname)
        n += 1

2.提取人臉

提取人臉,需要用到一個人臉識別庫face_recognition庫。face_recognition庫的下載步驟參考:

https://www.jb51.net/article/209870.htm

主要有三步,可以直接在anaconda的命令行界面復制使用:

  1. pip install CMake -i https://pypi.douban.com/simple
  2. pip install dlib==19.7.0 -i https://pypi.douban.com/simple
  3. pip install face_recognition -i https://pypi.douban.com/simple

筆者已嘗試,確實可用。

使用下述的函數就可以獲得一張圖片對應的人臉,返回值就是人臉圖片。

# 找到圖片中的人臉
#############################################################################################
def find_face(path):
    # Load the jpg file into a numpy array
    image = face_recognition.load_image_file(path)
    # Find all the faces in the image using the default HOG-based model.
    # This method is fairly accurate, but not as accurate as the CNN model and not GPU accelerated.
    # See also: find_faces_in_picture_cnn.py
    face_locations = face_recognition.face_locations(image) # 可以選擇 model="cnn"
    if len(face_locations) == 0:
        return None
    else:
        for face_location in face_locations:
            # Print the location of each face in this image
            top, right, bottom, left = face_location
            # You can access the actual face itself like this:
            face_image = image[top:bottom, left:right]
            pil_image = Image.fromarray(face_image)
            return pil_image
#############################################################################################

對數據集進行操作之后,就可以獲得處理后的人臉圖片。之所以不用人物圖訓練,而是提取出人臉后再進行訓練,是考慮到人物圖像中干擾因素太多,且經過試驗后發現識別的效果非常差,于是加入這個提取人臉的環節。對數據集的操作代碼如下:

# 將訓練集和測試集中的raw圖片處理,提取出人臉圖片
#############################################################################################
if __name__ == '__main__':  # 主函數入口
    raw_train_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/train/IU/'
    raw_train_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/train/Other/'
    raw_test_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/test/IU/'
    raw_test_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/test/Other/'
    raw_roots = [raw_train_root_1, raw_train_root_2, raw_test_root_1, raw_test_root_2]
    img_raw_train_1 = os.listdir(raw_train_root_1)
    img_raw_train_2 = os.listdir(raw_train_root_2)
    img_raw_test_1 = os.listdir(raw_test_root_1)
    img_raw_test_2 = os.listdir(raw_test_root_2)
    img_raws = [img_raw_train_1, img_raw_train_2, img_raw_test_1, img_raw_test_2]
    new_path_train_1 = 'E:/Table/學習數據集/find_iu/data/processed/train/IU/'
    new_path_train_2 = 'E:/Table/學習數據集/find_iu/data/processed/train/Other/'
    new_path_test_1 = 'E:/Table/學習數據集/find_iu/data/processed/test/IU/'
    new_path_test_2 = 'E:/Table/學習數據集/find_iu/data/processed/test/Other/'
    new_paths = [new_path_train_1, new_path_train_2, new_path_test_1, new_path_test_2]
    for raw_root, img_raw, new_path in zip(raw_roots, img_raws, new_paths):
        n = 0
        for i in range(len(img_raw)):
            try:
                img = Image.open(raw_root + img_raw[i])
            except:
                print('a file error, continue')
                continue
            else:
                img_train = find_face(raw_root + img_raw[i])
                if img_train == None:
                    continue
                else:
                    # img_train.save(new_path + '%d.JPG'%n)
                    # print(raw_root + img_raw[i])
                    n += 1
        print('在%d張圖片中,共找到%d張臉' % (len(img_raw), n))
#############################################################################################

處理前的圖片數據均存放在raw文件夾中,處理后的存放在processed文件夾中,如下圖:

兩個文件夾的內部結構完全一樣:

三、網絡模型

1、圖像處理

將圖片裁剪為112×92大小,使用RGB圖像,(這里試過用灰度圖像,但好像效果不會更好,就放棄了),在對圖片進行歸一化處理。

data_transform = transforms.Compose([
        # transforms.Grayscale(num_output_channels=1),  # 彩色圖像轉灰度圖像num_output_channels默認1
        transforms.Resize(112),
        transforms.CenterCrop((112, 92)),  # 中心裁剪為112*92
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
        # transforms.Normalize(mean=0.5, std=0.5)
    ])

使用孿生神經網絡(Siamese Network)

class SiameNetwork(nn.Module):
    def __init__(self):
        super(SiameNetwork, self).__init__()
        # input: h=112, w=92
        self.conv1 = torch.nn.Sequential(
            torch.nn.Conv2d(in_channels=3,  # 輸入單通道
                            out_channels=16,  # 16個3*3卷積核
                            kernel_size=3,  # 卷積核尺寸
                            stride=2,  # 卷積核滑動步長, 1的話圖片大小不變,2的話會大小會變為(h/2)*(w/2)
                            padding=1),  # 邊緣填充大小,如果要保持原大小,kernel_size//2
            torch.nn.BatchNorm2d(16),  # 標準化,前面卷積后有16個圖層
            torch.nn.ReLU()  # 激活函數
        )  # output: h=56, w=46
        self.conv2 = torch.nn.Sequential(
            torch.nn.Conv2d(16, 32, 3, 2, 1),
            torch.nn.BatchNorm2d(32),
            torch.nn.ReLU()
        )  # output: h=28, w=23
        self.conv3 = torch.nn.Sequential(
            torch.nn.Conv2d(32, 64, 3, 2, 1),
            torch.nn.BatchNorm2d(64),
            torch.nn.ReLU()
        )  # output: h=14, w=12
        self.conv4 = torch.nn.Sequential(
            torch.nn.Conv2d(64, 64, 2, 2, 0),
            torch.nn.BatchNorm2d(64),
            torch.nn.ReLU()
        )  # output: h=7, w=6
        self.mlp1 = torch.nn.Linear(7 * 6 * 64, 100)  # 需要計算conv4的輸出尺寸,每次卷積的輸出尺寸(size - kernal + 2*padding)/stride + 1
        self.mlp2 = torch.nn.Linear(100, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.mlp1(x.view(x.size(0), -1))  # view展平
        x = self.mlp2(x)
        return x

四、具體代碼

1.get_face.py

from PIL import Image
import face_recognition
import os
# 找到圖片中的人臉
#############################################################################################
def find_face(path):
    # Load the jpg file into a numpy array
    image = face_recognition.load_image_file(path)
    # Find all the faces in the image using the default HOG-based model.
    # This method is fairly accurate, but not as accurate as the CNN model and not GPU accelerated.
    # See also: find_faces_in_picture_cnn.py
    face_locations = face_recognition.face_locations(image) # 可以選擇 model="cnn"
    if len(face_locations) == 0:
        return None
    else:
        for face_location in face_locations:
            # Print the location of each face in this image
            top, right, bottom, left = face_location
            # You can access the actual face itself like this:
            face_image = image[top:bottom, left:right]
            pil_image = Image.fromarray(face_image)
            return pil_image
#############################################################################################
# 將訓練集和測試集中的raw圖片處理,提取出人臉圖片
#############################################################################################
if __name__ == '__main__':  # 主函數入口
    raw_train_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/train/IU/'
    raw_train_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/train/Other/'
    raw_test_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/test/IU/'
    raw_test_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/test/Other/'
    raw_roots = [raw_train_root_1, raw_train_root_2, raw_test_root_1, raw_test_root_2]
    img_raw_train_1 = os.listdir(raw_train_root_1)
    img_raw_train_2 = os.listdir(raw_train_root_2)
    img_raw_test_1 = os.listdir(raw_test_root_1)
    img_raw_test_2 = os.listdir(raw_test_root_2)
    img_raws = [img_raw_train_1, img_raw_train_2, img_raw_test_1, img_raw_test_2]
    new_path_train_1 = 'E:/Table/學習數據集/find_iu/data/processed/train/IU/'
    new_path_train_2 = 'E:/Table/學習數據集/find_iu/data/processed/train/Other/'
    new_path_test_1 = 'E:/Table/學習數據集/find_iu/data/processed/test/IU/'
    new_path_test_2 = 'E:/Table/學習數據集/find_iu/data/processed/test/Other/'
    new_paths = [new_path_train_1, new_path_train_2, new_path_test_1, new_path_test_2]
    for raw_root, img_raw, new_path in zip(raw_roots, img_raws, new_paths):
        n = 0
        for i in range(len(img_raw)):
            try:
                img = Image.open(raw_root + img_raw[i])
            except:
                print('a file error, continue')
                continue
            else:
                img_train = find_face(raw_root + img_raw[i])
                if img_train == None:
                    continue
                else:
                    # img_train.save(new_path + '%d.JPG'%n)
                    # print(raw_root + img_raw[i])
                    n += 1
        print('在%d張圖片中,共找到%d張臉' % (len(img_raw), n))
#############################################################################################

2.find_iu.py

import torch
import torchvision
import torch.nn as nn
from torch.autograd import Variable
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import cv2   #opencv庫,用于圖片可視化
import numpy as np
import os
from utils import draw_result
from network import SiameNetwork
from get_face import find_face
if __name__ == '__main__':  # 主函數入口
    # 設置參數
    #############################################################################################
    path = 'E:/Table/學習數據集/find_iu/result/'    # 存放和生成結果的路徑標志
    epochs = 20       #訓練周期
    BATCH_SIZE = 16    #批量樣本大小
    NUM_WORKERS = 0
    #############################################################################################
    # 數據處理
    #############################################################################################
    data_transform = transforms.Compose([
        # transforms.Grayscale(num_output_channels=1),  # 彩色圖像轉灰度圖像num_output_channels默認1
        transforms.Resize(112),
        transforms.CenterCrop((112, 92)),  # 中心裁剪為112*92
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
        # transforms.Normalize(mean=0.5, std=0.5)
    ])
    train_dataset = datasets.ImageFolder(root = r'E:/Table/學習數據集/find_iu/data/processed/train',
                                         transform = data_transform)
    test_dataset = datasets.ImageFolder(root = r'E:/Table/學習數據集/find_iu/data/processed/test',
                                         transform = data_transform)
    train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=NUM_WORKERS)
    test_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=NUM_WORKERS)
    image, labels = next(iter(train_loader))       #數據可視化
    img = torchvision.utils.make_grid(image, nrow = 10)
    img = img.numpy().transpose(1, 2, 0)
    cv2.imshow('img', img)    #展示圖像
    cv2.waitKey(0)  #按下任一按鍵后開始工作
    print("data ready!")
    #############################################################################################
    #配置設備、損失函數和優化器
    #############################################################################################
    device = torch.device('cuda')
    model = SiameNetwork().to(device)
    cost = torch.nn.CrossEntropyLoss()        #定義損失函數,使用交叉熵
    optimizer = torch.optim.Adam(model.parameters(), lr=0.0008, weight_decay=0.001)            #Adam優化器
    print("device ready!")
    #############################################################################################
    #訓練過程,訓練周期由epochs決定
    #############################################################################################
    draw_epoch = []   #記錄訓練階段
    draw_loss = []    #記錄訓練損失,用于繪制
    draw_train_acc = []   #記錄訓練準確度,用于繪制
    draw_val_loss = []   #記錄測試損失,用于繪制
    draw_val_acc = []  # 記錄測試準確度,用于繪制
    for epoch in range(epochs):
        #訓練過程
        sum_loss = 0.0
        sum_val_loss = 0.0
        train_correct = 0
        test_correct = 0
        for data in train_loader:
            inputs,labels = data
            inputs,labels = Variable(inputs).cuda(),Variable(labels).cuda()
            optimizer.zero_grad()        #將上一batch梯度清零
            outputs = model(inputs)
            loss = cost(outputs, labels)
            loss.backward()             #反向傳播
            optimizer.step()
            _, id = torch.max(outputs.data, 1)
            sum_loss += loss.data
            train_correct += torch.sum(id == labels.data)
        for data in test_loader:              # 模型測試
            inputs,labels = data
            inputs,labels = Variable(inputs).cuda(),Variable(labels).cuda()
            outputs = model(inputs)
            val_loss = cost(outputs, labels)
            _,id = torch.max(outputs.data, 1)
            sum_val_loss += val_loss.data
            test_correct += torch.sum(id == labels.data)
        print('[%d,%d] train loss:%.03f      train acc:%.03f%%'
              %(epoch + 1, epochs, sum_loss / len(train_loader), (100 * train_correct / len(train_dataset))))
        print('        val loss:%.03f        val acc:%.03f%%'
              %(sum_val_loss / len(test_loader), (100 * test_correct / len(test_dataset))))
        draw_epoch.append(epoch+1)       # 用于后續畫圖的數據
        draw_loss.append(sum_loss / len(train_loader))
        draw_train_acc.append(100 * train_correct / len(train_dataset))
        draw_val_loss.append(sum_val_loss / len(test_loader))
        draw_val_acc.append(100 * test_correct / len(test_dataset))
        np.savetxt('%s/train_loss.txt'%(path), draw_loss, fmt="%.3f")        # 保存損失數據
        np.savetxt('%s/train_acc.txt'%(path), draw_train_acc, fmt="%.3f")  # 保存準確率數據
        np.savetxt('%s/val_loss.txt'%(path), draw_val_loss, fmt="%.3f")     # 保存損失數據
        np.savetxt('%s/val_acc.txt'%(path), draw_val_acc, fmt="%.3f")  # 保存準確率數據
    print("train ready!")
    #############################################################################################
    #數據可視化
    #############################################################################################
    draw_result(draw_epoch, path)   # 繪圖函數
    print("draw ready!")
    #############################################################################################
    #模型的存儲和載入
    #############################################################################################
    torch.save(model.state_dict(), "parameter.pkl") #save
    print("save ready!")
    #############################################################################################

3.spider_iu.py

import re
import requests
from urllib import error
from bs4 import BeautifulSoup
import os
import torch
from torch.autograd import Variable
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from network import SiameNetwork
from utils import cv_imread
import cv2
from PIL import Image
import shutil
from get_face import find_face
# 設置參數
#############################################################################################
GET_PIC = 0    # 1 執行這步,0 不執行
GET_FACE = 0
GET_IU = 1
#############################################################################################
num = 0
numPicture = 0
file = ''
List = []
# 爬蟲所用函數
#############################################################################################
def Find(url, A):
    global List
    print('正在檢測圖片總數,請稍等.....')
    t = 0
    i = 1
    s = 0
    while t  1000:
        Url = url + str(t)
        try:
            # 這里搞了下
            Result = A.get(Url, timeout=7, allow_redirects=False)
        except BaseException:
            t = t + 60
            continue
        else:
            result = Result.text
            pic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正則表達式找到圖片url
            s += len(pic_url)
            if len(pic_url) == 0:
                break
            else:
                List.append(pic_url)
                t = t + 60
    return s
def recommend(url):
    Re = []
    try:
        html = requests.get(url, allow_redirects=False)
    except error.HTTPError as e:
        return
    else:
        html.encoding = 'utf-8'
        bsObj = BeautifulSoup(html.text, 'html.parser')
        div = bsObj.find('div', id='topRS')
        if div is not None:
            listA = div.findAll('a')
            for i in listA:
                if i is not None:
                    Re.append(i.get_text())
        return Re
def dowmloadPicture(html, keyword):
    global num
    # t =0
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正則表達式找到圖片url
    print('找到關鍵詞:' + keyword + '的圖片,即將開始下載圖片...')
    for each in pic_url:
        print('正在下載第' + str(num + 1) + '張圖片,圖片地址:' + str(each))
        try:
            if each is not None:
                pic = requests.get(each, timeout=7)
            else:
                continue
        except BaseException:
            print('錯誤,當前圖片無法下載')
            continue
        else:
            string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
            fp = open(string, 'wb')
            fp.write(pic.content)
            fp.close()
            num += 1
        if num >= numPicture:
            return
#############################################################################################
if __name__ == '__main__':  # 主函數入口
    # 爬蟲部分,存放到 name + ‘文件'
    #############################################################################################
    if GET_PIC == 1:
        headers = {
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Upgrade-Insecure-Requests': '1'
        }
        A = requests.Session()
        A.headers = headers
        tm = int(input('請輸入每類圖片的下載數量 '))
        numPicture = tm
        line_list = []
        with open('./name.txt', encoding='utf-8') as file:
            line_list = [k.strip() for k in file.readlines()]  # 用 strip()移除末尾的空格
        for word in line_list:
            url = 'https://image.baidu.com/search/flip?tn=baiduimageie=utf-8word=' + word + 'pn='
            tot = Find(url, A)
            Recommend = recommend(url)  # 記錄相關推薦
            print('經過檢測%s類圖片共有%d張' % (word, tot))
            file = word + '文件'
            y = os.path.exists(file)
            if y == 1:
                print('該文件已存在,無需創建')
            else:
                os.mkdir(file)
            t = 0
            tmp = url
            while t  numPicture:
                try:
                    url = tmp + str(t)
                    # result = requests.get(url, timeout=10)
                    # 這里搞了下
                    result = A.get(url, timeout=10, allow_redirects=False)
                    print(url)
                except error.HTTPError as e:
                    print('網絡錯誤,請調整網絡后重試')
                    t = t + 60
                else:
                    dowmloadPicture(result.text, word)
                    t = t + 60
            numPicture = numPicture + tm
        print('當前搜索結束,開始提取人臉')
    #############################################################################################
    # 將訓練集和測試集中的raw圖片處理,提取出人臉圖片,從file+'文件'到‘待分辨人臉'
    ############################################################################################
    if GET_FACE == 1:
        if GET_PIC == 0:
            file = '韓國女藝人文件'
        raw_root = 'E:/Table/學習數據集/find_iu/'+ file + '/'
        img_raw = os.listdir(raw_root)
        new_path = 'E:/Table/學習數據集/find_iu/待分辨人臉/'
        n = 0
        for i in range(len(img_raw)):
            try:
                img = Image.open(raw_root + img_raw[i])
            except:
                print('a file error, continue')
                continue
            else:
                img_train = find_face(raw_root + img_raw[i])
                if img_train == None:
                    continue
                else:
                    img_train.save(new_path + '%d.JPG' % n)
                    print(raw_root + img_raw[i])
                    n += 1
        print('在%d張圖片中,共找到%d張臉' % (len(img_raw), n))
        print('提取人臉結束,開始尋找IU')
    #############################################################################################
    # 開始判別,從'待分辨人臉‘中找出IU存放到'IU_pic‘
    #############################################################################################
    if GET_IU == 1:
        data_transform = transforms.Compose([
            # transforms.Grayscale(num_output_channels=1),  # 彩色圖像轉灰度圖像num_output_channels默認1
            transforms.Resize(112),
            transforms.CenterCrop((112, 92)),  # 中心裁剪為112*92
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.5, 0.5, 0.5],std=[0.5, 0.5, 0.5])
            # transforms.Normalize(mean=0.5, std=0.5)
        ])
        device = torch.device('cuda')
        model = SiameNetwork().to(device)
        model.load_state_dict(torch.load('parameter.pkl'))  # load
        model.eval()
        judge_root = 'E:/Table/學習數據集/find_iu/待分辨人臉/'
        img_judge = os.listdir(judge_root)
        new_path = 'E:/Table/學習數據集/find_iu/IU_pic/'
        result = []
        n = 0
        for i in range(len(img_judge)):
            try:
                img = Image.open(judge_root + img_judge[i])
            except:
                print('a file error, continue')
                continue
            else:
                img = img.convert('RGB')
                print(judge_root + img_judge[i])
                input = data_transform(img)
                input = input.unsqueeze(0)  # 這里經過轉換后輸出的input格式是[C,H,W],網絡輸入還需要增加一維批量大小B
                # 增加一維,輸出的img格式為[1,C,H,W]
                input = Variable(input.cuda())
                output = model(input)  # 將圖片輸入網絡得到輸出
                _, id = torch.max(output.data, 1)   # 0是IU,1是其他
                if id.item() == 0:
                    shutil.copy(judge_root + img_judge[i], new_path)
                    n += 1
        print('/n在%d張圖片中,共找到%d張IU的圖片'%(len(img_judge), n))
    #############################################################################################

4.file_deal.py

import os
raw_train_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/train/IU/'
raw_train_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/train/Other/'
raw_test_root_1 = 'E:/Table/學習數據集/find_iu/data/raw/test/IU/'
raw_test_root_2 = 'E:/Table/學習數據集/find_iu/data/raw/test/Other/'
raw_roots = [raw_train_root_1, raw_train_root_2, raw_test_root_1, raw_test_root_2]
for path in raw_roots:
    # 獲取該目錄下所有文件,存入列表中
    fileList = os.listdir(path)
    n = 0
    for i in fileList:
        # 設置舊文件名(就是路徑+文件名)
        oldname = path + os.sep + fileList[n]  # os.sep添加系統分隔符
        # 設置新文件名
        newname = path + os.sep + str(n) + '.JPG'
        os.rename(oldname, newname)  # 用os模塊中的rename方法對文件改名
        print(oldname, '======>', newname)
        n += 1

5.network.py

import torch
import torch.nn as nn
class SiameNetwork(nn.Module):
    def __init__(self):
        super(SiameNetwork, self).__init__()
        # input: h=112, w=92
        self.conv1 = torch.nn.Sequential(
            torch.nn.Conv2d(in_channels=3,  # 輸入單通道
                            out_channels=16,  # 16個3*3卷積核
                            kernel_size=3,  # 卷積核尺寸
                            stride=2,  # 卷積核滑動步長, 1的話圖片大小不變,2的話會大小會變為(h/2)*(w/2)
                            padding=1),  # 邊緣填充大小,如果要保持原大小,kernel_size//2
            torch.nn.BatchNorm2d(16),  # 標準化,前面卷積后有16個圖層
            torch.nn.ReLU()  # 激活函數
        )  # output: h=56, w=46
        self.conv2 = torch.nn.Sequential(
            torch.nn.Conv2d(16, 32, 3, 2, 1),
            torch.nn.BatchNorm2d(32),
            torch.nn.ReLU()
        )  # output: h=28, w=23
        self.conv3 = torch.nn.Sequential(
            torch.nn.Conv2d(32, 64, 3, 2, 1),
            torch.nn.BatchNorm2d(64),
            torch.nn.ReLU()
        )  # output: h=14, w=12
        self.conv4 = torch.nn.Sequential(
            torch.nn.Conv2d(64, 64, 2, 2, 0),
            torch.nn.BatchNorm2d(64),
            torch.nn.ReLU()
        )  # output: h=7, w=6
        self.mlp1 = torch.nn.Linear(7 * 6 * 64, 100)  # 需要計算conv4的輸出尺寸,每次卷積的輸出尺寸(size - kernal + 2*padding)/stride + 1
        self.mlp2 = torch.nn.Linear(100, 10)
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.mlp1(x.view(x.size(0), -1))  # view展平
        x = self.mlp2(x)
        return x

6.utils.py

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import cv2
# 繪制訓練、測試的損失、準確度
#############################################################################################
def draw_result(draw_epoch, path):
    show_loss = np.loadtxt('%s/train_loss.txt' % (path))   # 讀取txt文件,不同優化器的損失
    show_train_acc = np.loadtxt('%s/train_acc.txt' % (path))  # 讀取不同模型的準確度
    show_val_loss = np.loadtxt('%s/val_loss.txt' % (path))  # 讀取txt文件,不同優化器的損失
    show_val_acc = np.loadtxt('%s/val_acc.txt' % (path))  # 讀取不同模型的準確度
    mpl.rc('font',family='Times New Roman', weight='semibold', size=9)  # 設置matplotlib中所有繪圖風格的設置
    font1 = {'weight' : 'semibold', 'size' : 11}  #設置文字風格
    fig = plt.figure(figsize = (7,5))    #figsize是圖片的大小`
    ax1 = fig.add_subplot(2, 2, 1)       # ax1是子圖的名字
    ax1.plot(draw_epoch, show_loss,color = 'red', label = u'AdaPID', linewidth =1.0)
    ax1.legend()   #顯示圖例
    ax1.set_title('Training Loss', font1)
    ax1.set_xlabel(u'Epoch', font1)
    ax2 = fig.add_subplot(2, 2, 2)
    ax2.plot(draw_epoch, show_val_loss,color = 'red', label = u'Adam', linewidth =1.0)
    ax2.legend()   #顯示圖例
    ax2.set_title('Validation Loss', font1)
    ax2.set_xlabel(u'Epoch', font1)
    ax3 = fig.add_subplot(2, 2, 3)
    ax3.plot(draw_epoch, show_train_acc,color = 'red', label = u'Adam', linewidth =1.0)
    ax3.legend()   #顯示圖例
    ax3.set_title('Training Accuracy', font1)
    ax3.set_xlabel(u'Epoch', font1)
    ax4 = fig.add_subplot(2, 2, 4)
    ax4.plot(draw_epoch, show_val_acc,color = 'red', label = u'Adam', linewidth =1.0)
    ax4.legend()   #顯示圖例
    ax4.set_title('Validation Accuracy', font1)
    ax4.set_xlabel(u'Epoch', font1)
    plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.45) # hspace為子圖上下間距
    plt.savefig('%s/show_curve.jpg' % (path), dpi=300)
#############################################################################################
# 用于解決cv.imread不能讀取中文路徑的問題
#############################################################################################
def cv_imread(filePath):
    # 核心就是下面這句,一般直接用這句就行,直接把圖片轉為mat數據
    cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), -1)
    # imdecode讀取的是rgb,如果后續需要opencv處理的話,需要轉換成bgr,轉換后圖片顏色會變化
    # cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
    return cv_img
#############################################################################################

總結

總體而言,這是一個新人的興趣之作,但是限于GPU性能無法使用太復雜的網絡,最后識別的效果不佳,若讀者有興趣,也可以去替換一下網絡,改善一下數據集,嘗試提升識別性能。更多相關人臉識別內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 用Python做個個性的動畫掛件讓桌面不單調
  • 自己用python做的一款超炫酷音樂播放器
  • Python做個自定義動態壁紙還可以放視頻
  • 使用python svm實現直接可用的手寫數字識別
  • 基礎語音識別-食物語音識別baseline(CNN)
  • 詳細過程帶你用Python做車牌自動識別系統

標簽:雙鴨山 貴州 金華 克拉瑪依 臨汾 赤峰 陽泉 日照

巨人網絡通訊聲明:本文標題《人臉識別具體案例(李智恩)》,本文關鍵詞  人臉,識別,具體,案例,李智恩,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《人臉識別具體案例(李智恩)》相關的同類信息!
  • 本頁收集關于人臉識別具體案例(李智恩)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产91精品一区二区| 欧美日韩精品三区| 日韩一区二区免费高清| 亚洲成va人在线观看| 免费在线观看一区| 另类小说综合欧美亚洲| 91精品国产色综合久久久蜜香臀| 欧美性色黄大片| 色综合久久久久综合| 欧美午夜精品免费| 国产精品久久久久久久久免费桃花 | 国产午夜精品美女毛片视频| 国产精品久久久久国产精品日日| 一卡二卡三卡日韩欧美| 懂色一区二区三区免费观看| 欧美日韩一区二区在线观看| 国产精品欧美久久久久无广告| 免费视频一区二区| 日韩精品欧美精品| hitomi一区二区三区精品| 国产情人综合久久777777| 国产一区高清在线| 26uuu另类欧美亚洲曰本| 国产精品一区二区x88av| 久久久天堂av| 美女视频黄 久久| 久久综合色之久久综合| 成人18视频日本| 亚洲精品乱码久久久久久日本蜜臀| 国产成人精品亚洲777人妖| 激情综合网激情| 中文字幕在线不卡视频| 欧美少妇一区二区| 国产成人午夜高潮毛片| 国产精品99久久久久久久vr | 国产精品久久久久7777按摩| 91美女福利视频| 中文字幕一区二区三区四区不卡| 亚洲gay无套男同| 久久视频一区二区| 日韩影院免费视频| 欧美韩国一区二区| 日韩精品专区在线影院重磅| 狠狠色狠狠色综合| 亚洲国产精品一区二区久久 | 精品免费国产二区三区 | 五月天网站亚洲| 日韩精品一区二区三区中文精品| 日韩精品一区二区三区视频播放| 日韩欧美久久久| 色94色欧美sute亚洲线路一ni | 欧洲一区在线电影| 国产精品三级av在线播放| 亚洲1区2区3区视频| 欧美日本一区二区三区四区 | 岛国精品一区二区| 日韩免费高清av| 久久99精品久久久久久国产越南| 欧美日韩一级片在线观看| 一区二区三区四区在线| 麻豆国产精品官网| 日韩av不卡一区二区| a4yy欧美一区二区三区| 久久久99久久| 91精品国产品国语在线不卡| 一区二区三区在线高清| 亚洲天堂免费在线观看视频| 琪琪久久久久日韩精品| 亚洲愉拍自拍另类高清精品| 天天综合色天天| 亚洲人成在线播放网站岛国| 91精品国模一区二区三区| 国产欧美一区二区精品性色超碰| 成人免费在线视频| 波多野结衣亚洲| 欧美mv日韩mv国产| 亚洲精品日日夜夜| 91福利精品第一导航| 丝袜亚洲另类欧美| 精品国偷自产国产一区| 久久久综合精品| 欧美中文字幕一区| 国产91精品免费| 亚洲靠逼com| 亚洲欧美国产77777| 亚洲成人av一区二区| 欧美tk丨vk视频| 成人一区二区三区视频在线观看| 国产成人精品免费网站| 欧美久久久影院| 中文字幕亚洲欧美在线不卡| 麻豆精品在线视频| 风间由美一区二区三区在线观看| 欧美性感一区二区三区| 国产精品久久777777| 精品一区二区三区视频在线观看| 色乱码一区二区三区88| 一本色道久久综合精品竹菊| 成人黄色av电影| 日韩你懂的在线播放| 色婷婷久久综合| 一区二区三区在线视频免费| 美女视频黄久久| 成人国产精品视频| 久久久不卡影院| 国产毛片一区二区| 国产无遮挡一区二区三区毛片日本| 一区二区视频在线| 在线观看网站黄不卡| 天堂久久一区二区三区| 欧美日韩国产首页| 日本免费新一区视频| 欧美三级日韩三级| 亚洲黄色小说网站| 日韩一区二区三区在线视频| 蜜桃视频一区二区| 26uuu欧美| 日韩欧美中文一区| 国产高清一区日本| 国产精品国产三级国产aⅴ原创| 国产91清纯白嫩初高中在线观看| 欧美嫩在线观看| 久久99精品国产麻豆婷婷洗澡| 国产视频一区二区在线| 亚洲国产精品影院| 国产精品1区二区.| 亚洲成av人在线观看| 欧美性感一区二区三区| 国产黑丝在线一区二区三区| 国产精品入口麻豆九色| 欧美性受极品xxxx喷水| 蜜乳av一区二区三区| 在线播放一区二区三区| 成人一级片在线观看| 亚洲成a人v欧美综合天堂| 亚洲欧洲99久久| 日韩欧美激情一区| 成人av电影在线网| 亚洲午夜三级在线| 欧美国产综合一区二区| bt7086福利一区国产| 久久se这里有精品| 五月婷婷另类国产| 另类中文字幕网| 国产麻豆午夜三级精品| 国产一区二区0| 国产成a人亚洲精品| 一区二区三区精品在线| 亚洲男人天堂一区| 亚洲影院理伦片| 亚洲精品一区二区三区影院 | 中文字幕中文在线不卡住| 一区二区不卡在线播放 | 99国产欧美另类久久久精品| 国产剧情一区二区三区| 成人免费高清在线观看| 成人一级片在线观看| 久久不见久久见免费视频7 | 亚洲女女做受ⅹxx高潮| 亚洲天堂av一区| 午夜精品国产更新| 国产91精品久久久久久久网曝门| 中文字幕一区二区三区在线不卡| 丝袜美腿亚洲一区| 国产高清无密码一区二区三区| 欧洲av在线精品| 国产精品久久久久一区| 日产国产欧美视频一区精品| 一本色道久久综合亚洲精品按摩| 国产精品视频一二三| 精品一区二区三区久久久| 欧美区一区二区三区| 亚洲资源中文字幕| 欧美在线视频不卡| 一区二区在线观看视频| 成人激情校园春色| 欧美激情中文字幕一区二区| 国产一区欧美日韩| 久久久精品黄色| 另类的小说在线视频另类成人小视频在线 | 欧洲生活片亚洲生活在线观看| 国产亚洲欧洲997久久综合| 国产精品伦理在线| 无吗不卡中文字幕| 欧美一区二区国产| 国产一区 二区| 亚洲欧洲精品成人久久奇米网| 99re视频精品| 亚洲狼人国产精品| 日韩亚洲欧美成人一区| 国产一区在线不卡| 亚洲精品乱码久久久久久久久| 在线免费观看不卡av| 久久国产精品99久久人人澡| 日韩一级在线观看| 成人av在线播放网站| 亚洲18女电影在线观看| 久久久久久久久97黄色工厂| 色狠狠av一区二区三区| 韩国视频一区二区|