上一博客中
https://blog.youkuaiyun.com/reset2021/article/details/119209553中讲述了怎样通过dlib实现人脸的特征检测,以及特征描述,获取人脸对应的128维向量。
这一篇文章主要讲述一下通过sqlite3实现对上述特征向量的保存。
1、sqlite3的安装
首先查询一下是否已经安装了sqlite3,在python环境下输入如下命令:
import sqlite3
如果没有安装的话,需要先进行编译,然后重新安装相应的python版本,具体操作可以参考如下连接,有详细的安装说明
https://www.cnblogs.com/setname/p/8496990.html
2、在上一博客中获取到图像中人脸的128维特征向量。
为后续人脸识别与人脸聚类的需要,所以采用sqlite3数据库对上述获取的128维向量进行存储。
2.1、数据库,数据表的创建
下列代码中首先判断数据库文件是否已经存在,如果存在,则直接进行连接,如果不存在的话,则进行数据库与数据表的创建。
if os.path.exists(dbpath):
message = 'OK, the db file exists.'
con = sqlite3.connect(dbpath)
cur = con.cursor()
else:
con = sqlite3.connect(dbpath)
cur = con.cursor()
createsql = "create table " + tablename + "(SNO char(10) UNIQUE primary key,Spath char(200), P1 REAL, P2 REAL, P3 REAL, P4 REAL, P5 REAL, P6 REAL, P7 REAL, P8 REAL \
, P9 REAL, P10 REAL, P11 REAL, P12 REAL, P13 REAL, P14 REAL, P15 REAL, P16 REAL \
, P17 REAL, P18 REAL, P19 REAL, P20 REAL, P21 REAL, P22 REAL, P23 REAL, P24 REAL \
, P25 REAL, P26 REAL, P27 REAL, P28 REAL, P29 REAL, P30 REAL, P31 REAL, P32 REAL \
, P33 REAL, P34 REAL, P35 REAL, P36 REAL, P37 REAL, P38 REAL, P39 REAL, P40 REAL \
, P41 REAL, P42 REAL, P43 REAL, P44 REAL, P45 REAL, P46 REAL, P47 REAL, P48 REAL \
, P49 REAL, P50 REAL, P51 REAL, P52 REAL, P53 REAL, P54 REAL, P55 REAL, P56 REAL \
, P57 REAL, P58 REAL, P59 REAL, P60 REAL, P61 REAL, P62 REAL, P63 REAL, P64 REAL \
, P65 REAL, P66 REAL, P67 REAL, P68 REAL, P69 REAL, P70 REAL, P71 REAL, P72 REAL \
, P73 REAL, P74 REAL, P75 REAL, P76 REAL, P77 REAL, P78 REAL, P79 REAL, P80 REAL \
, P81 REAL, P82 REAL, P83 REAL, P84 REAL, P85 REAL, P86 REAL, P87 REAL, P88 REAL \
, P89 REAL, P90 REAL, P91 REAL, P92 REAL, P93 REAL, P94 REAL, P95 REAL, P96 REAL \
, P97 REAL, P98 REAL, P99 REAL, P100 REAL, P101 REAL, P102 REAL, P103 REAL, P104 REAL \
, P105 REAL, P106 REAL, P107 REAL, P108 REAL, P109 REAL, P110 REAL, P111 REAL, P112 REAL \
, P113 REAL, P114 REAL, P115 REAL, P116 REAL, P117 REAL, P118 REAL, P119 REAL, P120 REAL \
, P121 REAL, P122 REAL, P123 REAL, P124 REAL, P125 REAL, P126 REAL, P127 REAL, P128 REAL);"
cur.execute(createsql)
上述代码中,dbpath为数据库文件的路径,tablename为数据表的名称。上述语句创建了一个名为tablename的数据表,其中数据表中包含一个主键,一个Spath(图片的路径),P1~P128共130个元素,其中,P1~P128用于存储人脸的128维向量。
2.2、数据库的插入
通过对人脸的相关数据进行处理,保证图像人脸路径与特征向量一一对应。执行如下命令,实现人脸与特征数据的插入操作。
try:
#在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
sql_insert = "INSERT INTO " + tablename +" VALUES" #SQL语句一
sql_values = "" #SQL语句二
for i in range(0,len(imagefiles)): #列表下标索引,一一提取一行数据
sql_values += '(' #增加execute语句所需的左括号
sql_values += str(i+1)
sql_values += ","
sql_values += "'{}'".format(imagefiles[i]) #插入数据
tmepdes = descriptors[i]
sql_values += ","
for j in range(0,len(tmepdes)):#插入数据
sql_values += str(tmepdes[j])
if (j < len(tmepdes) - 1):
sql_values += ","
sql_values += '),' #右括号
sql_values = sql_values.strip(',') #去除最后一行数据的逗号,也可replace为分号
sql_todo = sql_insert + sql_values #两个SQL分语句合并
#插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
cur.execute(sql_todo)
con.commit()
print('插入成功')
except Exception as e:
print(e)
print('插入失败')
con.rollback()
finally:
# 关闭游标
cur.close()
# 关闭连接
con.close()
上述代码中,imagefiles为人脸对应的图像路径,descriptors为128维向量的集合。
2.3、数据的更新
新增加的图片,经过特征检测与特征描述后,可以通过以下代码来实现数据库的增量。
if os.path.exists(dbpath):
message = 'OK, the db file exists.'
con = sqlite3.connect(dbpath)
cur = con.cursor()
else:
con = sqlite3.connect(dbpath)
cur = con.cursor()
createsql = "create table IF NOT EXISTS " + tablename + "(SNO char(10) UNIQUE primary key,Spath char(200), P1 REAL, P2 REAL, P3 REAL, P4 REAL, P5 REAL, P6 REAL, P7 REAL, P8 REAL \
, P9 REAL, P10 REAL, P11 REAL, P12 REAL, P13 REAL, P14 REAL, P15 REAL, P16 REAL \
, P17 REAL, P18 REAL, P19 REAL, P20 REAL, P21 REAL, P22 REAL, P23 REAL, P24 REAL \
, P25 REAL, P26 REAL, P27 REAL, P28 REAL, P29 REAL, P30 REAL, P31 REAL, P32 REAL \
, P33 REAL, P34 REAL, P35 REAL, P36 REAL, P37 REAL, P38 REAL, P39 REAL, P40 REAL \
, P41 REAL, P42 REAL, P43 REAL, P44 REAL, P45 REAL, P46 REAL, P47 REAL, P48 REAL \
, P49 REAL, P50 REAL, P51 REAL, P52 REAL, P53 REAL, P54 REAL, P55 REAL, P56 REAL \
, P57 REAL, P58 REAL, P59 REAL, P60 REAL, P61 REAL, P62 REAL, P63 REAL, P64 REAL \
, P65 REAL, P66 REAL, P67 REAL, P68 REAL, P69 REAL, P70 REAL, P71 REAL, P72 REAL \
, P73 REAL, P74 REAL, P75 REAL, P76 REAL, P77 REAL, P78 REAL, P79 REAL, P80 REAL \
, P81 REAL, P82 REAL, P83 REAL, P84 REAL, P85 REAL, P86 REAL, P87 REAL, P88 REAL \
, P89 REAL, P90 REAL, P91 REAL, P92 REAL, P93 REAL, P94 REAL, P95 REAL, P96 REAL \
, P97 REAL, P98 REAL, P99 REAL, P100 REAL, P101 REAL, P102 REAL, P103 REAL, P104 REAL \
, P105 REAL, P106 REAL, P107 REAL, P108 REAL, P109 REAL, P110 REAL, P111 REAL, P112 REAL \
, P113 REAL, P114 REAL, P115 REAL, P116 REAL, P117 REAL, P118 REAL, P119 REAL, P120 REAL \
, P121 REAL, P122 REAL, P123 REAL, P124 REAL, P125 REAL, P126 REAL, P127 REAL, P128 REAL);"
#print(createsql)
cur.execute(createsql)
selectsql = "select * from " + tablename
cur.execute(selectsql)
#cur.execute("select * from tablename")
rows = cur.fetchall()
lastsize = 0
if len(rows) > rows[-1][0]:
lastsize = len(rows)
else:
lastsize = int(rows[-1][0])
try:
#在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
sql_insert = "INSERT INTO " + tablename +" VALUES" #SQL语句一
sql_values = "" #SQL语句二
for i in range(0,len(imagefiles_update)): #列表下标索引,一一提取一行数据
sql_values += '(' #增加execute语句所需的左括号
sql_values += str(lastsize + i + 1)
sql_values += ","
sql_values += "'{}'".format(imagefiles_update[i]) #插入数据
tmepdes = descriptors_update[i]
sql_values += ","
for j in range(0,len(tmepdes)):#插入数据
sql_values += str(tmepdes[j])
if (j < len(tmepdes) - 1):
sql_values += ","
sql_values += '),' #右括号
sql_values = sql_values.strip(',') #去除最后一行数据的逗号,也可replace为分号
sql_todo = sql_insert + sql_values #两个SQL分语句合并
#print(sql_todo)
#插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
cur.execute(sql_todo)
con.commit()
print('插入成功')
except Exception as e:
print(e)
print('插入失败')
con.rollback()
finally:
# 关闭游标
cur.close()
# 关闭连接
con.close()
上述代码中,首先判断数据库的存在与否,如果不存在则进行新建;然后对数据库进行查询,获取SNO值,新增得数据需要在SNO上递增,以保证SNO数据的唯一性。然后通过sql命令实现数据的增量操作。
注意:这里的数据的更新其实是实现数据的新增。与常规的更新是有所区别的,常规的更新是针对数据项的更改,由于这里暂时还没涉及到对数据项的更改,所以就不在这里进行描述啦。
2.4、数据的删除
在本应用中,主要涉及到的是对图像相关数据的删除,具体操作见如下代码
if os.path.exists(dbpath):
message = 'OK, the db file exists.'
con = sqlite3.connect(dbpath)
cur = con.cursor()
selectsql = "select * from "+tablename
cur.execute(selectsql)
#cur.execute("select * from tablename")
count = cur.fetchall()
if(count):
try:
#在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
sql_values = "" #SQL语句二
for i in range(0,len(imagefiles)): #列表下标索引,一一提取一行数据
sql_delete = "delete from " + tablename + " where Spath=" #SQL语句一
sql_delete += "'{}'".format(imagefiles[i]) #增加execute语句所需的左括号
#插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
cur.execute(sql_delete)
con.commit()
print('删除成功')
except Exception as e:
print(e)
print('删除失败')
con.rollback()
finally:
# 关闭游标
cur.close()
# 关闭连接
con.close()
else:
print("there is no db file")
首先还是对数据库有无的判断,其次是通过传递图像路径数据,对该图像的所有数据进行删除操作。
总结:上述步骤结合实际应用简单地介绍了以下python当中sqlite3的基本应用,后续将针对这些数据库中存储的数据进行后续相关处理。
这篇博客详细介绍了如何在Python环境中安装和使用sqlite3库。内容包括数据库的安装、128维特征向量的存储、数据表的创建与插入、数据的更新和删除。示例代码展示了如何处理人脸检测数据,并将其存储到sqlite3数据库中,为后续人脸识别和聚类提供基础。
1699

被折叠的 条评论
为什么被折叠?



