From 66d9c9fa2061b8960a003c06d50791bff6970ed4 Mon Sep 17 00:00:00 2001
From: ExcaliburEX <912011727@qq.com>
Date: Sun, 4 Jul 2021 16:08:26 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=202021=E5=B9=B47=E6=9C=884?=
=?UTF-8?q?=E6=97=A516:08:12=20=E4=BF=AE=E5=A4=8D=E9=A2=84=E8=AE=AD?=
=?UTF-8?q?=E7=BB=83=E6=A8=A1=E5=9E=8B=E4=BC=9A=E4=B8=8B=E8=BD=BD=E5=A4=B1?=
=?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 4 +-
finger.py | 116 ++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 108 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index b5a5c9e..7232c5f 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,10 @@
---
最新release:
-
+
+# 更新日志
+- 2021-07-04:因为VGG19下载的预训练模型在Github导致有可能下载失败,因此将模型文件存储到自己的腾讯云OSS桶,通过程序自动下载,手动设置了VGG19的预训练模型的路径,规避了因为网络问题导致的下载失败。
# 使用说明
diff --git a/finger.py b/finger.py
index f15956f..889d50f 100644
--- a/finger.py
+++ b/finger.py
@@ -8,12 +8,12 @@
from tensorflow.compat.v1 import logging as log
log.set_verbosity(log.ERROR)
import time
-from keras.applications.vgg16 import VGG16, preprocess_input
+from keras.applications.vgg19 import VGG19, preprocess_input
from keras.preprocessing import image
from PIL import Image
import numpy as np
import random
-import ssl
+# import ssl
def get_feature(path,model):
@@ -38,6 +38,7 @@ def cos_sim(a, b):
import PySimpleGUI as sg
from io import BytesIO
import base64
+import requests
def gaborfilter(I, S, F, W, P):
size = int(1.5 / S)
@@ -133,7 +134,7 @@ def Train(file,flag,window,model):
f.close()
return feature,1
else:
- print('\n',time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "图片 %s 已识别过..."%(name))
+ print(time.strftime("\n[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "图片 %s 已识别过..."%(name))
return None,2
def Test(trainPic, readPic, finger_num,num,window,model):
@@ -220,18 +221,22 @@ def GUI():
layout = [
[
sg.Text('单人手指图片个数:', font=("KaiTi", 12),justification='left',relief=sg.RELIEF_RIDGE),
+ # sg.InputText('7', font=("KaiTi", 12), size=(17, 2), key='-RANGE1-'),
sg.InputText('', font=("KaiTi", 12), size=(17, 2), key='-RANGE1-'),
sg.Text('随机选取的图片测试个数:', font=("KaiTi", 12),justification='left',relief=sg.RELIEF_RIDGE),
+ # sg.InputText('5', font=("KaiTi", 12), size=(17, 2), key='-RANGE2-')
sg.InputText('', font=("KaiTi", 12), size=(17, 2), key='-RANGE2-')
],
[
sg.Text('训练集图片文件夹:', font=("KaiTi", 12),justification='left',relief=sg.RELIEF_RIDGE),
- sg.In(size=(60, 1), enable_events=True, key="-FOLDER1-"),
+ # sg.In('C:/Users/Excalibur/Desktop/Test/V1.0/HighGuardFinger',size=(60, 1), enable_events=True, key="-FOLDER1-"),
+ sg.In('',size=(60, 1), enable_events=True, key="-FOLDER1-"),
sg.FolderBrowse('浏览', button_color=('Lavender', 'BlueViolet'), font=("KaiTi", 10),size=(8, 1))
],
[
sg.Text('待识别图片文件夹:', font=("KaiTi", 12),justification='left',relief=sg.RELIEF_RIDGE),
- sg.In(size=(60, 1), enable_events=True, key="-FOLDER2-"),
+ # sg.In('C:/Users/Excalibur/Desktop/Test/V1.0/HighGuardTest',size=(60, 1), enable_events=True, key="-FOLDER2-"),
+ sg.In('',size=(60, 1), enable_events=True, key="-FOLDER2-"),
sg.FolderBrowse('浏览', button_color=('Lavender', 'BlueViolet'), font=("KaiTi", 10),size=(8, 1))
],
[sg.Column(col, background_color='papayawhip', size=(
@@ -244,7 +249,7 @@ def GUI():
sg.Exit('退出', button_color=('white', 'firebrick4'),key='Exit', size=(37, 1), font=("KaiTi", 12))
]
]
- window = sg.Window('HighGuardFingerRecV1.0', layout,
+ window = sg.Window('HighGuardFingerRecV1.1', layout,
default_element_size=(80, 1), resizable=True, element_justification='center', text_justification='center',finalize=True)
@@ -269,30 +274,119 @@ def GUI():
+# 判斷模型文件是否存在
+def FileExist():
+ filename = 'vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'
+ # username = getpass.getuser()
+ # fileloc = r'C:\Users\\' + username + '\.keras\models\\'
+ fileloc = os.getcwd() + '\\'
+ fullname = fileloc + filename
+ if os.path.exists(fullname):
+ return True,fileloc
+ else:
+ return False,fileloc
+
+# 手动下载模型文件
+def progressbar(url,path,file_name,window):
+ if not os.path.exists(path): # 看是否有该文件夹,没有则创建文件夹
+ os.mkdir(path)
+ file_path = os.path.join(path, file_name)
+ start = time.time() #下载开始时间
+ response = requests.get(url, stream=True)
+ size = 0 #初始化已下载大小
+ chunk_size = 1024 * 1024 * 3 # 每次下载的数据大小
+ content_size = int(response.headers['content-length']) # 下载文件总大小
+ count_tmp = 0
+ count = 0
+ try:
+ if response.status_code == 200: #判断是否响应成功
+ print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()),'开始下载,[模型-大小] %s : %.2f MB'%(file_name,content_size / chunk_size * 3)) #开始下载,显示下载文件大小
+ with open(file_name,'wb') as file: #显示进度条
+ for data in response.iter_content(chunk_size = chunk_size):
+ file.write(data)
+ count += len(data)
+ size += len(data)
+ speed = (count - count_tmp) / 1024 / 1024
+ count_tmp = count
+ end = time.time() #下载结束时间
+ rate = int((size / content_size) * 20)
+ len1 = '>' * rate
+ len2 = '_' * (20-rate)
+ window['OUTPUT'].update(value=time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()) + '模型总大小:%.2f MB,下载速度:%.2f M/S \n'%(content_size / chunk_size * 3,speed) +
+ time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()) + '下载进度: [%s%s] |%d / %d| %.2f%%' % (len1,len2,size,content_size, float(size / content_size * 100)) +
+ time.strftime("\n[%Y-%m-%d %H:%M:%S]: ",time.localtime()) + '已经耗时%.2f秒'%(end - start))
+ time.sleep(0.1)
+ end = time.time() #下载结束时间
+ print(time.strftime("\n[%Y-%m-%d %H:%M:%S]: ",time.localtime()),'模型下载成功!,耗时: %.2f秒' % (end - start)) #输出下载用时时间
+ return True
+ except:
+ end = time.time() #下载结束时间
+ print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()),'模型下载失败!,耗时: %.2f秒,请检查网络及相关设置再继续训练' % (end - start)) #输出下载用时时间
+ return False
+
+
+# 暂时放弃的第一版下载方案
+# def DownloadFile2(model_url, save_url,file_name):
+# try:
+# if model_url is None or save_url is None or file_name is None:
+# print('参数错误')
+# return None
+# folder = os.path.exists(save_url)
+# if not folder:
+# os.makedirs(save_url)
+# res = requests.get(model_url,stream=True)
+# total_size = int(int(res.headers["Content-Length"])/1024+0.5)
+# file_path = os.path.join(save_url, file_name)
+# from tqdm import tqdm
+# with open(file_path, 'wb') as fd:
+# print('开始下载文件:{},当前文件大小:{}KB'.format(file_name,total_size))
+# for chunk in tqdm(iterable=res.iter_content(1024),total=total_size,unit='k',desc=None):
+# fd.write(chunk)
+# print(file_name+' 下载完成!')
+# except:
+# print("程序错误")
+
+
+
+
+
+
# 批量训练与识别
def BatchTrain(directory,window):
+ model_name = 'VGG19'
+ model_full_name = 'vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'
print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "正在加载识别模型..." )
- ssl._create_default_https_context = ssl._create_unverified_context # 下载模型的时候不想进行ssl证书校验
+ # ssl._create_default_https_context = ssl._create_unverified_context # 下载模型的时候不想进行ssl证书校验
starttime = time.time()
- model = VGG16(weights='imagenet', include_top=False)
+ file_name = 'vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'
+ model_url = 'https://blog-1259799643.cos.ap-shanghai.myqcloud.com/' + file_name
+ flag,loc = FileExist()
+ if flag == False:
+ print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "初次使用需要下载 %s 预训练模型!"%(model_name))
+ downloadflag = progressbar(model_url, loc, file_name,window)
+ if downloadflag == False:
+ return
+ model = VGG19(weights=os.getcwd() + '\\' + model_full_name, include_top=False)
elapse = time.time() - starttime
print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "加载完毕,耗时:%.3fs" % (elapse))
filelist = os.listdir(directory)
cnt = 1
starttime2 = time.time()
for f in filelist:
- window['OUTPUT'].update(value=time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()) + "正在训练第 %d / %d 个图片..."%(cnt,len(filelist)))
+ elapse2 = time.time() - starttime2
+ window['OUTPUT'].update(value=time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()) + "正在训练第 %d / %d 个图片: %s,已耗时:%.2fs,单张平均耗时:%.2fs ..."%(cnt,len(filelist),f,elapse2,elapse2/cnt))
Train(directory + '/' + f,1,window,model)
cnt += 1
elapse2 = time.time() - starttime2
- print('\n',time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "训练完毕,耗时:%.3fs" % (elapse2))
+ print(time.strftime("\n[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "训练完毕,耗时:%.3fs" % (elapse2))
def BatchTest(trainPic, readPicDir, finger_num,num,window):
+ model_full_name = 'vgg19_weights_tf_dim_ordering_tf_kernels_notop.h5'
print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "单人手指数:%d张,随机抽取其中 %d 张进行比对!"%(int(finger_num),int(num)) )
print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "正在加载识别模型..." )
starttime = time.time()
- model = VGG16(weights='imagenet', include_top=False)
+ model = VGG19(weights=os.getcwd() + '\\' + model_full_name, include_top=False)
elapse = time.time() - starttime
print(time.strftime("[%Y-%m-%d %H:%M:%S]: ",time.localtime()), "加载完毕,耗时:%.3fs" % (elapse))
filelist = os.listdir(readPicDir)