基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集
目录
- 前言
- 总体设计
- 系统整体结构图
- 系统流程图
- 运行环境
- Python环境
- Pycharm 环境
- 模块实现
- 1. Face++.APl调用
- 1)Face++.APl介绍
- 2)调用API
- 2. 数据爬取
- 1)网络数据爬取步骤
- 2)爬虫实现
- 3. 模型构建
- 4. 用户界面设计
- 1)需要调用的库文件
- 2)读取用户人脸图片位置
- 3)判断用户人脸图片是否能成功识别函数
- 4)最终效果图展示函数
- 5)模块拼接
- 6)应用打包
- 系统测试
- 1. 测试效果
- 1)控制台效果
- 2)融合效果
- 2. 用户界面
- 工程源代码下载
- 其它资料下载
前言
这个项目利用了网络开源平台Face++ API,并结合了Python网络爬虫技术,以实现自动化的流程,来帮助用户找到最适合他们的发型。具体步骤如下:
首先,项目利用Face++ API来分析用户的脸型特征。Face++是一项强大的人脸识别和分析工具,能够识别脸部轮廓、五官特征以及脸部的形状。通过这个API,项目可以准确地获取用户的脸型信息。
接着,项目结合了Python网络爬虫技术,自动爬取了匹配用户脸型的发型模板,这涉及到从互联网上的发型图片库中获取各种不同风格和长度的发型图片。
一旦项目获得了这些发型图片,它可以分析每个发型的特点,包括发型的长度、卷度、颜色等。然后,它将用户的脸型特征与这些发型特点进行比对,找到与用户脸型最匹配的发型模板。
最后,项目会将这些匹配的发型模板呈现给用户,作为造型参考。这些发型模板可以包括图片、描述和建议,以帮助用户更好地选择适合他们脸型和个人风格的发型。
总的来说,这个项目结合了人脸分析和网络爬虫技术,为用户提供了一个个性化的发型推荐系统。用户可以根据他们的脸型和偏好来寻找最适合的发型,从而更好地满足他们的美容需求。这种项目在美容和时尚领域具有广泛的应用潜力。
总体设计
本部分包括系统整体结构图和系统流程图。
系统整体结构图
系统整体结构如图所示。
系统流程图
系统流程如图所示。
用户流程如图所示。
运行环境
本部分包括 Python 环境和Pycharm环境。
Python环境
需要Python 3.6及以上配置,在Windows环境下推荐下载Anaconda完成Python所需环境的配置,下载地址为https://www.anaconda.com/,也可下载虚拟机在Linux环境下运行代码。
鼠标右击“我的电脑”,单击“属性”,选择高级系统设置。单击“环境变量”,找到系统变量中的Path,单击“编辑”然后新建,将Python解释器所在路径粘贴并确定。
Pycharm 环境
PyCharm下载地址为http://www.jetbrains.com/pycharm/download/#section=windows,进入网站后单击Comminity版本下的DOWNLOAD下载安装包,下载完成后安装。单击Create New Project创建新的项目文件,Location为存放工程的路径,单击project附近的三角符号,可以看到PyCharm已经自动获取Python 3.6,单击create完成。
模块实现
本项目包括4个模块: Face++ . API调用、数据爬取、模型构建、用户界面设计,下面分别给出各模块的功能介绍及相关代码。
1. Face++.APl调用
本部分包括Face++ . API介绍和调用API具体实现。
1)Face++.APl介绍
Face++ . API可检测并定位图片中的人脸,返回高精度的人脸框坐标。只要注册便可获取试用版的API Key,方便调用。
- Detect API
调用URL https://api-cn.faceplusplus.com/facepp/v3/detect
,检测图片内的所有人脸,对于每张检测出的人脸,给出其唯一标识face_token
, 可用于后续分析、比对等操作。
该API支持对检测到的人脸直接分析,获得关键点和各类属性信息。对于试用API Key,只对人脸框面积最大的5个人脸进行分析,其他可以使用Face Analyze API进行。
本文使用API Key为试用版Key,对于正式的API Key,支持指定图片的某一区域进行检测并分析所有检测到的人脸。
此接口用于识别人脸106个关键点信息,判断用户性别,如图所示。
- 面部特征分析
调用URL https://api-cn.faceplusplus.com/facepp/v1/facialfeatures
,根据单张正面人脸图片,分析面部特征。此接口用于判断脸型,为用户推荐发型,如图所示。
- 人脸融合
调用URL https://api-cn.faceplusplus.com/imagepp/v1/mergeface
,使用API,可以对模板图和图中的人脸进行融合操作。融合后的图片中包含人脸特征、模板图中的其他外貌特征与内容。返回值是一段JSON, 包含融合完成后图片的Base64编码。
2)调用API
相关步骤如下:
- 原理
Face++人工智能开放平台API是HTTP API。使用者向Face++服务器发起请求,并加上合适参数,服务器会对请求进行处理,得到结果返回给使用者。
- 鉴权
账号下每创建一个应用就会生成一组对应的api key
和api secret
, 用以识别用户是否有权调用API,所有的API调用必须提供对应的api key
和api secret
参数。
- 需要调用的库文件
相关代码如下:
#导入相应库文件
import requests
from json import JSONDecoder
import urllib.error
import base64
import os
import time
- 性别检测函数
相关代码如下:
#用户性别,参数为图片路径
def detect_gender(filepath):
#URLhttp_url1 = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
#账号密码key = "CNsZZXKA4M2qzlz8lKw5ML0BRSitwHfW"secret = "c8udJa_mDz_KIRAhrvxV9w5PbrrVtTM0"
#数据提交data1= {'api_key': key, 'api_secret': secret, 'return_attributes': "gender"}files1 = {"image_file": open(filepath, "rb")}
#数据获取response1 = requests.post(http_url1, data=data1, files=files1)
#数据进行utf-8编译后解码处理req_con1 = response1.content.decode('utf-8')req_dict1 = JSONDecoder().decode(req_con1)
#网络状态
#判断获取到的数据是否为正确数据if response1.status_code == requests.codes.ok:
#提取正确数据的性别相关内容sex = req_dict1["faces"][0]['attributes']['gender']['value']print(req_dict1["faces"][0]['attributes']['gender']['value'])return sexelse:
#数据错误则打印性别识别失败,返回空值print('faile to detect_gender')return None
- 脸型检测函数
相关代码如下:
#用户脸型
def detect_face_type(filepath):http_url2 = 'https://api-cn.faceplusplus.com/facepp/v1/facialfeatures'key = "CNsZZXKA4M2qzlz8lKw5ML0BRSitwHfW"secret = "c8udJa_mDz_KIRAhrvxV9w5PbrrVtTM0"data2 = {'api_key': key, 'api_secret': secret}files2 = {"image_file": open(filepath, "rb")}response2 = requests.post(http_url2, data=data2, files=files2)req_con2 = response2.content.decode('utf-8')req_dict2 = JSONDecoder().decode(req_con2)if response2.status_code == requests.codes.ok:
#提取正确数据的脸型相关内容face_type = req_dict2["result"]["face"]["face_type"]print(req_dict2["result"]["face"]["face_type"])return face_typeelse:
#数据错误则打印脸型识别失败,返回空值print('faile to detect_face_type')return None
- 人脸融合主函数
相关代码如下:
#识别人脸关键点信息
def find_face(imgpath):http_url1 = 'https://api-cn.faceplusplus.com/facepp/v3/detect'key = "CNsZZXKA4M2qzlz8lKw5ML0BRSitwHfW"secret = "c8udJa_mDz_KIRAhrvxV9w5PbrrVtTM0"
#"return_landmark": 2表示获取106个人脸关键点信息data1 = {'api_key': key, 'api_secret': secret, "return_landmark": 2}
#判断路径图片是否存在if os.path.isfile(imgpath)==False:return Nonefiles = {"image_file": open(imgpath, "rb")}response1 = requests.post(http_url1, data=data1, files=files)req_con1 = response1.content.decode('utf-8')req_dict1 = JSONDecoder().decode(req_con1)if response1.status_code == requests.codes.ok:
#获取人脸关键点信息face_rectangle = req_dict1["faces"][0]['face_rectangle']return face_rectangleelse:print('faile to find_face')#number表示换脸的相似度#将上述关键点信息调用,实现人脸融合
#参数为用户人像路径、模型发型路径、生成效果图路径
#number表示人脸融合相似度范围为0~100
def merge_face(image_url_1, image_url_2, image_url, number):ff1 = find_face(image_url_1)ff2 = find_face(image_url_2)if ff1 and ff2:rectangle1 = str(str(ff1['top']) + "," + str(ff1['left']) + "," + str(ff1['width']) + "," + str(ff1['height']))rectangle2 = str(ff2['top']) + "," + str(ff2['left']) + "," + str(ff2['width']) + "," + str(ff2['height'])url_add = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"f1 = open(image_url_1, 'rb')f1_64 = base64.b64encode(f1.read())f1.close()f2 = open(image_url_2, 'rb')f2_64 = base64.b64encode(f2.read())f2.close()data = {"api_key": "CNsZZXKA4M2qzlz8lKw5ML0BRSitwHfW", "api_secret": "c8udJa_mDz_KIRAhrvxV9w5PbrrVtTM0","template_base64": f1_64, "template_rectangle": rectangle1,"merge_base64": f2_64, "merge_rectangle": rectangle2, "merge_rate": number}response = requests.post(url_add, data=data)req_con = response.content.decode('utf-8')req_dict = JSONDecoder().decode(req_con)#判断网络状态if response.status_code == requests.codes.ok:result = req_dict['result']imgdata = base64.b64decode(result)file = open(image_url, 'wb')
#图片保存到相应路径file.write(imgdata)file.close()else:print('faile to merge_face')return None
2. 数据爬取
本部分包括网络数据爬取步骤和爬虫具体实现。
1)网络数据爬取步骤
下载地址为http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=1&cl=2&nc=1&ie=utf-8&word=“男生发型”。
通过Selenium+Chrome无头浏览器形式自动滚动爬取网络图片。通过Face++性别识别与脸型检测筛选出用发型模板。图片自动存储指定位置并按性别、脸型序号形式命名。
2)爬虫实现
本部分包括引入库文件、爬虫初始化。
#引入库文件
from selenium import webdriver
import urllib.request
import re
import requests
from json import JSONDecoder
import urllib.error
import base64
import time
from selenium.webdriver.chrome.options import Options
#爬虫初始化,浏览器初始化并模拟滚动条向下滚动
word ="男生发型"
#创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#驱动路径
path = r'C:\Users\ZBLi\Desktop\1801\day05\ziliao\chromedriver.exe'
#创建浏览器对象
browser = webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\chromedriver.exe", chrome_options=chrome_options)
#参数添加
browser.maximize_window() #最大化
#地址加入关键词实现网址获取
browser.get('http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word='+word)
js = 'var action=document.documentElement.scrollTop=10001'
#设置滚动条距离顶部的位置为 10000, 超过10000就是最底部
for i in range(5):#共执行5次脚本 实现滑轮向下滚动5次browser.execute_script(js) #执行脚本time.sleep(2) #休眠2s
#读取源代码
data=browser.page_source
#爬虫
k = re.split(r'\s+',data)
s = []
sp = []
#进行正则表达式匹配
for i in k :if re.match(r'data-objurl=',i) :if re.match(r'.*?jpg"', i)or re.match(r'.*?png"', i):s.append(i)
for it in s :if (re.match(r'.*?png"',it) or re.match(r'.*?jpg"',it) ):sp.append(it)
#将匹配到的多余部分进行删减精准定位URL信息
for it in sp:m = re.search(r'data-objurl="(.*?)"',it)iturl =m.group(1)#urlprint(iturl)itdata = None
#避免出现数据读取过慢而导致超时问题
#如果规定时间内无法识别则跳过并睡眠0.1stry:itdata = urllib.request.urlopen(iturl,data=None,timeout=1).read()except:time.sleep(0.1)
#itdata为爬取图片的URLif itdata==None:continue
图片分类存储,采用Face++ 爬取图片的性别与脸型信息并存储(存储图片类型共分为14种:两种性别、七种脸型),以瓜子脸为例 ,相关代码如下:
#判断脸型是否存在并将其导入变量
if (detect_face_type(itdata) and detect_gender(itdata)):sex = detect_gender(itdata)face_type = detect_face_type(itdata)#瓜子脸
#判断脸型与性别,符合则存储至相应位置并重命名为Male_ pointed_faceNUM if sex == 'Male' and face_type == 'pointed_face':
#存储到指定区域并分类别命名f = open('E:\BeautifulPicture\\' + sex + '_' + face_type + str(Male_pointed_num) + '.jpg', "wb")
#序号逐渐增加代表每一种脸型的总数不断增加Male_pointed_num += 1f.write(itdata)f.close()if sex == 'Female' and face_type == 'pointed_face':f = open('E:\BeautifulPicture\\' + sex + '_' + face_type + str(Female_pointed_num) + '.jpg', "wb")Female_pointed_num += 1f.write(itdata)f.close()
#最后退出终止浏览器
browser.execute_script(js)
browser.quit()
3. 模型构建
本部分包括库函数调用、模拟用户面部图片并设定路径、人脸融合。
库函数调用,相关代码如下:
#调用相应库实现功能
#-*- coding: utf-8 -*-
import requests
from json import JSONDecoder
import urllib.error
import base64
import os
import time
#模拟用户面部图片并设定路径,后面GUI调试将变为可视化打开图片形式
filepath = r"E:/new/Female_oval_face9.jpg"
sex = detect_gender(filepath)
face_type = detect_face_type(filepath)
#人脸融合-核心函数core()
#以瓜子脸为例,假设模板最多25种发型推荐
number = 25
Male_pointed_num = 1
Female_pointed_num = 1
if sex == 'Male' and face_type == 'pointed_face':
#i从1~25进行循环for i in range(number):
#判断是否存在该图片路径,存在则进行人脸融合if os.path.isfile(r"E:\app\picture\Male_pointed_face" + str(Male_pointed_num) + ".jpg"):exm=r"E:\app\picture\Male_pointed_face" + str(Male_pointed_num)+".jpg"result = r"E:\app\picture1\\" + str(Male_pointed_num) + ".jpg"
#人脸融合更加真实,设定相似度为90/100merge_face(exm, filepath, result, 90)
#成功则进行下一部分循环Male_pointed_num += 1print("人脸融合成功")
#女性瓜子脸效果同上
#Female_pointed_face(瓜子脸)
if sex == 'Female' and face_type == 'pointed_face':for i in range(number):
#每次循环计数加一判断发型模板是否存在,存在则进行人脸融合if os.path.isfile(r"E:\app\picture\Female_pointed_face" + str(Female_pointed_num) + ".jpg"):exm = r"E:\app\picture\Female_pointed_face" + str(Female_pointed_num) + ".jpg"result = r"E:\app\picture1\\" + str(Female_pointed_num) + ".jpg"merge_face(exm, filepath, result, 90)Female_pointed_num += 1print("人脸融合成功")
4. 用户界面设计
该设计采用Python自带的Tkinter作为用户操作GUI,同时引入PI便于图片操作。界面设计分三个阶段:
- ①用户可视化选择文件所在目录,并确定;
- ②判断是否可以找到合适的发型图片,如果可以则继续,否则退出;
- ③找到合适的图片进行人脸融合,待所有融合成功后,展示用户脸型与推荐发型,多种效果图供用户选择。
相关代码如下:
1)需要调用的库文件
相关代码如下:
#-*- coding:utf-8 -*-
from tkinter import *
from PIL import Image,ImageTk
from tkinter.filedialog import askopenfilename
import requests
from json import JSONDecoder
import urllib.error
import base64
import os
2)读取用户人脸图片位置
相关代码如下:
#获取可视化打开的文件路径
def getpathfile():root = Tk()
#GUI界面图标设置
root.iconbitmap(r'e:\app\ling.ico')width = 500height = 500
#界面居中显示screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root.geometry(alignstr)def choosepic():global filepathpath_ = askopenfilename()path.set(path_)img_open=Image.open(file_entry.get()).resize((350,400),Image.ANTIALIAS)img = ImageTk.PhotoImage(img_open)image_label.config(image=img)image_label.image = img filepath = path_path = StringVar()Button(root, text='选择图片',font=('Arial', 15),bg="yellow",command=choosepic).pack()Button(root, text='ok',font=('Arial', 15), command=root.destroy).pack()file_entry = Entry(root, state='readonly', text=path)image_label = Label(root)image_label.pack()root.mainloop()
3)判断用户人脸图片是否能成功识别函数
相关代码如下:
#用户人脸图片识别成功显示GUI界面
def yes():root = Tk()
#GUI界面图标设置
root.iconbitmap(r'e:\app\ling.ico')width = 500height = 100
#界面居中显示screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root.geometry(alignstr)root.title('识别成功')#text = StringVar()#text.set("已为您搜索"+str(num)+"种合适的发型。。。")Label(root, text='识别成功,请稍后', font=('Arial', 20)).pack()Button(root, text='继续', command=root.destroy).pack()#Label(root, textvariable=text, font=('Arial', 20)).pack()root.mainloop()
#用户人脸图片识别失败显示GUI界面
def no():root = Tk()
#GUI界面图标设置
root.iconbitmap(r'e:\app\ling.ico')width = 500height = 100screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root.geometry(alignstr)root.title('识别失败')Label(root, text='识别失败,建议您重新选择合适图片!',font=('Arial', 20)).pack()Button(root, text='结束', command=root.destroy).pack()#Button(root, text='返回上一步', command=getpathfile).pack()frm = Frame(root).pack()root.mainloop()
4)最终效果图展示函数
相关代码如下:
def show(sex,face_type):root1 = Tk()
#GUI界面图标设置
root1.iconbitmap(r'e:\app\ling.ico')#设置窗口居中width = 500height = 500
#界面居中显示screenwidth = root1.winfo_screenwidth()screenheight = root1.winfo_screenheight()alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)root1.geometry(alignstr)root1.title('效果展示')
#实现动态参数替换
#即每次改变图片,编号实时更新text = StringVar()image_label = Label(root1)#默认展示第一张图片pilImage_pre1 = Image.open(r"E:\app\picture1\\" + str(cou) + ".jpg")pilImage1 = pilImage_pre1.resize((350, 400), Image.ANTIALIAS)tkImage1 = ImageTk.PhotoImage(image=pilImage1)image_label.config(image=tkImage1)image_label.image = tkImage1 root1.update_idletasks() #更新图片,必须update
text.set(str(cou) + "/" + str(num))#更新图片编号
#下一张功能实现def change_next():global cou
#cou为当前展示图片编号
#num为用户搜索到的所有图片数量if cou<num:cou = cou + 1pilImage_pre = Image.open(r"E:\app\picture1\\" + str(cou) + ".jpg")pilImage = pilImage_pre.resize((350, 400), Image.ANTIALIAS)tkImage = ImageTk.PhotoImage(image=pilImage)image_label.config(image=tkImage)image_label.image = tkImage #保持参考点root1.update_idletasks() #更新图片,必须updatetext.set(str(cou)+"/"+str(num)) #更新图片编号
else:
#达到下限print("error")
#上一张功能实现
def change_prior():global couif cou > 1:cou = cou - 1pilImage_pre = Image.open(r"E:\app\picture1\\" + str(cou) + ".jpg")pilImage = pilImage_pre.resize((350, 400), Image.ANTIALIAS)tkImage = ImageTk.PhotoImage(image=pilImage)image_label.config(image=tkImage)image_label.image = tkImage #保持参考点root1.update_idletasks() #更新图片,必须updatetext.set(str(cou)+"/"+str(num)) #更新图片编号else: #达到上限print("error")Button(root1, text='下一张', command=change_next).pack(side=RIGHT)Button(root1, text='上一张', command=change_prior).pack(side=LEFT)#Label(root1, text="您的脸型为"+face_type, font=('Arial', 20)).pack(side=TOP)if face_type=="long_face":Label(root1, text="您的脸型为长脸" , font=('Arial', 20)).pack(side=TOP)if sex == "Female":Label(root1, text="长脸的你适合俏皮花苞头、蝴蝶结的发箍配上梨花头", font=('Arial', 15)).pack(side=TOP)if sex == "Male":Label(root1, text="长脸的你适合中分刘海的顺直短发发型", font=('Arial', 15)).pack(side=TOP)
Label(root1, text="生产发型已为您自动保存到E\APP\picture1 文件夹", font=('Arial', 10)).pack(side=BOTTOM)Label(root1, textvariable=text, font=('Arial', 20)).pack(side=BOTTOM)Frame(root1).pack()image_label.pack()root1.mainloop()
5)模块拼接
将之前提到的用户体验模型(core ()
函数)与所有函数界面连接。
def main():
#得到图片路径getpathfile()print(filepath)
#得到用户性别与脸型sex = detect_gender(filepath)print(sex)face_type = detect_face_type(filepath)print(face_type)
#判断是否可以进行发型推荐if (sex and face_type):
#继续yes()print("yes")else:
#失败提示no()print("no")
#传递脸型与性别进行人脸融合core(sex,face_type)
#num变量作为全局参数记录所有推荐发型总和 print("共" + str(num) + "张图片可供选择")
#推荐发型数量大于0则进行展示if num > 0:show(sex, face_type)else:print("查找失败")
6)应用打包
使用pyinstaller将程序打包成可执行的.exe文件,将.py文件转换应用命令pyinstaller -F 文件名.py (-w)
。-w代表不显示控制台,如下两图所示。
系统测试
本部分包括测试效果和用户界面。
1. 测试效果
本部分包括控制台效果和融合效果。
1)控制台效果
输出用户性别与脸型判断是否可以融合,如图所示。
2)融合效果
图1为换脸原图,换脸完成,选取如图2作为样例。有着较为理想的换脸效果,并给出了具有可行性的发型建议。
2. 用户界面
将压缩包直接解压,打开/dist文件夹,运行发型推荐.exe
文件,如图所示。
单击ok按钮会显示如图所示,给出推荐发型样式以及保存图片。
工程源代码下载
详见本人博客资源下载页
其它资料下载
如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。
相关文章:
基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集
目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. Face.APl调用1)Face.APl介绍2)调用API 2. 数据爬取1)网络数据爬取步骤2)爬虫实现 3. 模型构建4. 用户界面设计1)需要调用的库文…...
Jetson nano嵌入式平台配置ip记录
背景 Jetson nano平台使用千兆网和PC连接时没有ip地址,在ubuntu的终端输入ifconfig显示eh0未设置ip,需要先在nano平台上配置ip地址,然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中, cd /etc/network…...
前端中的跨域请求及其解决方案
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跨域(Cross-Origin)⭐CORS(跨域资源共享)⭐JSONP(JSON with Padding)⭐代理服务器⭐ WebSocket⭐服务器设置响应头⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:…...
SpringBoot2.0(mybatis-plus初始使用)
目录 一,介绍二,SpringBoot2.x整合MybatisPlus Lombok2.1,添加依赖 pom2.2,配置数据库信息 application.properties2.3,工程结构初始化 三,创建接口返回统一对象四,创建bean五,创建…...
游戏视频录制软件对比,哪款最适合你的需求?
随着电子竞技和游戏直播行业的迅速崛起,越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间。游戏视频录制软件正是满足这一需求的关键工具。本文将针对三款优秀的游戏视频录制软件进行对比分析,以便为读者提供选购建议。 游戏视频录制软件1࿱…...
耐蚀合金连续油管最新版 学习记录
声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…...
LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测
论文地址:https://arxiv.org/abs/2303.03595 论文代码:https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的,无法提供足够的上下文来区分远处的区域,从而造成性能次优。 激光雷达-摄像机融合方法在三…...
Python 多线程、线程池、进程池
线程间的通讯机制 消息队列 event 事件对象 当线程创建完成之后,并不会马上执行线程,而是等待某一事件发生,线程才会启动 import threading# # 创建 event 对象 # event threading.Event() # # 重置代码中的 event 对象,使得所…...
深入浅出了解华为端到端交付流程的概念和5个关键点
如果您或您所在的组织在学习和研究华为,那么对“端到端”这个词语就一点都不陌生。 今天华研荟带着您了解华为端到端的交付流程的思想和一些做法,如果了解了这个,那么对于华为在其他领域提出的端到端要求或做法就一通百通了。 一、什么是端…...
[Linux]进程信号
[Linux]进程信号 文章目录 [Linux]进程信号进程信号的定义信号的特点信号的生命过程发送信号的原理进程处理信号的方式分类使用指令查看Linux系统定义的信号信号产生使用终端按键产生信号使用指令向进程发送信号调用系统调用向进程发送信号由软件条件产生信号硬件异常产生信号 …...
PostgreSQL 数据类型
文章目录 PostgreSQL数据类型说明PostgreSQL数据类型使用单引号和双引号数据类型转换布尔类型数值类型整型浮点型序列数值的常见操作 字符串类型日期类型枚举类型IP类型JSON&JSONB类型复合类型数组类型 PostgreSQL数据类型说明 PGSQL支持的类型特别丰富,大多数…...
智慧港口4G+UWB+GPS/北斗RTK人员定位系统解决方案
港口人员定位系统能够帮助企业实现对港口作业人员的全面监控和管理,不仅可以保障人员的人身安全,还可以提高人员的作业效率,为港口的可持续发展提供有力保障。接下来为大家分享智慧港口人员定位系统解决方案。 方案背景 1、港口作业人员多&a…...
实时时钟和日历电路芯片MS85163/MS85163M
MS85163/MS85163M 是一款 CMOS 实时时钟 (RTC) 和 日历电路,针对低功耗进行了优化,内置了可编程的时钟输出、中断输出和低电压检测器。所有寄存器地址和数据都通过两线双向I 2 C 总线进行串行传输,最大总线传输速度为 400kbit/s 。采用SOP8…...
【Java从入门到精通】这也许就是Java火热的原因吧!
前言:Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类:JavaSE(Standard Edition,标准版):支持面向桌面、嵌入式和移动设备的应用程序开发;JavaEE&…...
zTasker—简洁易用强大的定时热键一体自动化工具,效率倍增器
软件名称 zTasker 应用平台 PC Windows7及以上 一句简介 市面上定时类软件很多,但无一例外功能都很单一,要完成不同的任务,需要不同的软件 市面上的热键软件,要么功能少,要么像是AutoHotKey这样对于一般用户太专业…...
惊艳时装界!AIGC风暴来袭,从设计到生产的全新体验
时尚是一个不断演进的领域,充满创新和独创性,但现在,创新迈入了一个崭新的境界——人工智能生成内容(AIGC)。这个革命性的技术,改变了时装设计的游戏规则。在过去的几年里,人工智能已经深刻地改…...
element -ui table表格内容无限滚动 使用插件vue-seamless-scroll
使用插件 一、安装组件依赖 npm install vue-seamless-scroll 二、引入组件 import vueSeamlessScroll from "vue-seamless-scroll"; components: { vueSeamlessScroll }, <div class"table-list "><vue-seamless-scroll :class-option"…...
如何在windows环境下编译T
一, 安装MYSYS2 1. 去https://www.msys2.org下载 msys2-x86_64-xxxxx.exe; 2. 按照msys2.org主页提示的步骤安装; 3.安装完默认起来的是 UCRT的, 可以根据环境的需要选择, 我选择的 MSYS2 MINGW64 4. 搭建编译环境, 安装对应的软…...
USB接口针式打印机
1 针式打印机原理 - 针式打印机16针是纵向排列,每次打印垂直的16bit,然后右移一bit,继续下列打印;字节的MSB表示最上面的点,字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的,而提供给打印头的信息…...
外贸建站教程步骤有哪些?独立站怎么搭建?
推荐的外贸建站教程?制作国际贸易网站的流程? 对于那些希望将产品或服务推向全球市场的企业来说,建立一个专业、具有吸引力的网站是至关重要的。下面115SHOP将介绍外贸建站教程的关键步骤,帮助您更好地了解如何在国际市场上建立您…...
useGetState自定义hooks解决useState 异步回调获取不到最新值
setState 的两种传参方式 1、直接传入新值 setState(options); const [state, setState] useState(0); setState(state 1); 2、传入回调函数 setState(callBack); const [state, setState] useState(0); setState((prevState) > prevState 1); // prevState 是改变之…...
input子系统框架、外设驱动开发
一、input子系统基本框架 Linux内核为了两个目的: 简化纯输入类外设(如:键盘、鼠标、游戏杆、轨迹球、触摸屏。。。等等)的驱动开发统一输入类外设产生的数据格式(struct input_event),更加方…...
Google Chrome 浏览器以全屏模式打开
目录 前言以全屏模式打开禁止弹出无法更新的提示窗禁止翻译网页Chrome设置禁止翻译网页可能1可能2可能3 网页添加指令禁止Chrome翻译网页 禁用脚本气泡浏览器解决办法html解决办法方法1:鼠标滑过超链接时,使状态栏不出现超链接方法2:方法3&am…...
安装torch113、cuda116并运行demo【Transformer】
文章目录 01. 导读02. 显卡驱动版本03. 创建环境、下载安装必要包04. 运行参考代码: 01. 导读 安装torch113、cuda116并运行demo【Transformer】 02. 显卡驱动版本 C:\Users\Administrator>nvidia-smi -l 10 Wed Sep 13 23:35:08 2023 ----------------------…...
基于scRNA-seq的GRN分析三阴性乳腺癌的肿瘤异质性
三阴性乳腺癌即TNBC是一种肿瘤异质性高的乳腺癌亚型。最近的研究表明,TNBC患者可能包含具有不同分子亚型的细胞。此外,基于scRNA-seq数据构建的GRN已经证明了对关键调控因子研究的重要性。作者使用scRNA-seq对TNBC患者的GRN进行了全面分析。从scRNA-seq数…...
Python:二进制文件实现等间隔取相同数据量并合并
举例:每3byte为一页,每3页为一wl。将所有wl的第一页/第二页/第三页分别合并为一个文件。 data b\x01\x02\x03\x04\x05\x06\x07\x08\x09\x01\x02\x03\x04\x05\x06\x07\x08\x09\x01\x02\x03\x04\x05\x06\x07\x08\x09\x01\x02\x03\x04\x05\x06\x07\x08\x0…...
python使用openvc库进行图像数据增强
以下是使用Python和OpenCV库实现图像数据增强的简单示例代码,其中包括常用的数据增强操作: import cv2 import numpy as np import os# 水平翻转 def horizontal_flip(image):return cv2.flip(image, 1)# 垂直翻转 def vertical_flip(image):return cv2…...
如何利用Api接口获取手机当前的网络位置信息
在移动互联网时代,手机定位已经成为了一个日常化的需求,无论是导航、社交还是打车等服务都需要获取手机的位置信息。而获取手机位置信息最基础的一步就是获取手机当前的网络位置信息,本文将介绍如何利用API接口获取手机当前的网络位置信息。 …...
vue-elementPlus自动按需导入和主题定制
elementPlus自动按需导入 装包 -> 配置 1. 装包(主包和两个插件包) $ npm install element-plus --save npm install -D unplugin-vue-components unplugin-auto-import 2. 配置 在vite.config.js文件中配置,配置完重启(n…...
idea中dataBase模板生成
controller.java.vm ##定义初始变量 #set($tableName $tool.append($tableInfo.name, "Controller")) ##设置回调 $!callback.setFileName($tool.append($tableName, ".java")) $!callback.setSavePath($tool.append($tableInfo.savePath, "/contro…...
做网站买计划书/建设网站的步骤
上一篇文章搭建了一个具有基础功能,权限认证、TLS 的私有仓库,但是Docker Registry 作为镜像仓库,连管理界面都没有,甚至连一些运维必备的功能都是缺失的,还有什么 Docker 镜像仓库管理工具呢?这里有一个简…...
网站开发属于技术合同/中国培训网的证书含金量
参考博文:http://www.blogjava.net/robbie/archive/2009/04/05/264003.html 博文学习重点: 第四种方式:使用tx标签配置的拦截器 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springf…...
西安旅游网站建设/seo排名点击工具
对于Fundebug这样一个没有使用微信JS-SDK的产品来说,我们竟然收到了WeixinJSBridge is not defined 的报错: 去网上一搜,发现很多开发者都遇到类似的问题: 我的微信项目,没有用到微信JS-SDK,但iphone部分手机点击某些功…...
wordpress整站克隆/爱链在线
Async提供了很多针对集合的函数,可以简化我们对集合进行异步操作时的步骤。如下: forEach:对集合中每个元素进行异步操作 map:对集合中的每个元素通过异步操作得到另一个值,得到新的集合 filter:对集合中…...
网站模板前台后台/抖音seo优化软件
Windows配置域名 最近想在Windows 电脑玩玩 Apache2,想用域名来完成做代理,所以涉及Windows配置域名,来记录一下 Apache Linux 的安装查看:Apache2的安装与介绍 Apache Windows 的安装请查看:Apache2 Windows 安装 …...
网站建设维护外包/百度电脑版网页版入口
珍惜自己的所爱世界上没有後悔药妻子是个小尾巴,我走到哪里她都要问到哪里。我厌烦,她却乐此不疲。可是,这个小尾巴却在那个下着大雨的深夜永远消失了……我的心情非常难过,内心充满了内疚和痛楚,我无法原谅自己的过错…...