基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(二)

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
    • 爬虫
    • 模型训练
    • 实际应用
  • 模块实现
    • 1. 数据准备
      • 1)爬虫下载原始图片
      • 2)手动筛选图片
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目通过爬虫技术获取图片,利用OpenCV库对图像进行处理,识别并切割出人物脸部,形成了一个用于训练的数据集。通过ImageAI进行训练,最终实现了对动漫人物的识别模型。同时,本项目还开发了一个线上Web应用,使得用户可以方便地体验和使用该模型。

首先,项目使用爬虫技术从网络上获取图片。这些图片包含各种动漫人物,其中我们只对人物脸部进行训练,所以我们会对图像进行处理,并最终将这些图像将作为训练数据的来源。

其次,利用OpenCV库对这些图像进行处理,包括人脸检测、图像增强等步骤,以便准确识别并切割出人物脸部。这一步是为了构建一个清晰而准确的数据集,用于模型的训练。

接下来,通过ImageAI进行训练。ImageAI是一个简化图像识别任务的库,它可以方便地用于训练模型,这里用于训练动漫人物的识别模型。

最终,通过项目开发的线上Web应用,用户可以上传动漫图像,系统将使用训练好的模型识别图像中的动漫人物,并返回相应的结果。

总的来说,本项目结合了爬虫、图像处理、深度学习和Web开发技术,旨在提供一个便捷的动漫人物识别服务。这对于动漫爱好者、社交媒体平台等有着广泛的应用前景。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括爬虫、模型训练及实际应用运行环境。

爬虫

安装Python3.6以上及Selenium3.0.2版本。

详见博客。

模型训练

本部分包括安装依赖、安装ImageAI。

详见博客。

实际应用

实际应用包括前端开发环境和后端环境的搭建。

详见博客。

模块实现

本项目包括4个模块:数据准备、数据处理、模型训练及保存、模型测试,下面分别介绍各模块的功能及相关代码。

1. 数据准备

本项目的数据来自于百度图片,通过爬虫获取。

1)爬虫下载原始图片

下图为下载人物的部分列表。

在这里插入图片描述

爬虫可根据列表自动下载指定数量的人物图片存放于指定文件夹,相关代码如下:

#phantomjs设置
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100"
)
#根据关键词爬取并下载图片 
#下载基本参数设置,更多参数设置在main()函数处
NAME_LIST = "characters_name_list.txt"  #导入需要获取关键字文件,每个关键字一行
MAX_NUM = 60  #每个关键字下载数量
OUTPUT_PATH = "./Raw"  #下载图片书保存目录
TIME_OUT = 20  #设置超时
DELAY = 1  #随机下载延迟0~1秒,同样防止被服务器识别出爬虫
#产生随机的header,防止被服务器识别出爬虫
def get_random_headers():ua = UserAgent().random  #产生随机的User-Agentheaders = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Proxy-Connection": "keep-alive","User-Agent": ua,"Accept-Encoding": "gzip, deflate, sdch",}return headersdef get_image_url(keywords, max_number=10000, face_only=False):#获取图像urldef decode_url(url): #解码urlin_table = '0123456789abcdefghijklmnopqrstuvw'out_table = '7dgjmoru140852vsnkheb963wtqplifca'translate_table = str.maketrans(in_table, out_table)mapping = {'_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/'}for k, v in mapping.items():url = url.replace(k, v)return url.translate(translate_table)base_url= "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592"\"&lm=7&fp=result&ie=utf-8&oe=utf-8&st=-1"keywords_str = "&word={}&queryWord={}".format(quote(keywords), quote(keywords))query_url = base_url + keywords_strquery_url += "&face={}".format(1 if face_only else 0)init_url = query_url + "&pn=0&rn=30"res = requests.get(init_url)init_json = json.loads(res.text.replace(r"\'", ""), encoding='utf-8', strict=False)total_num = init_json['listNum']target_num = min(max_number, total_num)crawl_num = min(target_num * 2, total_num)crawled_urls = list()batch_size = 30with futures.ThreadPoolExecutor(max_workers=5) as executor:future_list = list()def process_batch(batch_no, batch_size):  #批处理image_urls = list()url = query_url + \"&pn={}&rn={}".format(batch_no * batch_size, batch_size)try_time = 0while True:try:response = requests.get(url)breakexcept Exception as e:try_time += 1if try_time > 3:print(e)return image_urlsresponse.encoding = 'utf-8'res_json = json.loads(response.text.replace(r"\'", ""), encoding='utf-8', strict=False)for data in res_json['data']:if 'objURL' in data.keys():image_urls.append(decode_url(data['objURL']))elif'replaceUrl'in data.keys() and len(data['replaceUrl'])== 2:image_urls.append(data['replaceUrl'][1]['ObjURL'])return image_urlsfor i in range(0, int((crawl_num + batch_size - 1) / batch_size)):future_list.append(executor.submit(process_batch, i, batch_size))for future in futures.as_completed(future_list):if future.exception() is None:crawled_urls += future.result()else:print(future.exception())return crawled_urls[:min(len(crawled_urls), target_num)]def get_image_url(keywords, max_number=10000, face_only=False):def decode_url(url):  #解码in_table = '0123456789abcdefghijklmnopqrstuvw'out_table = '7dgjmoru140852vsnkheb963wtqplifca'translate_table = str.maketrans(in_table, out_table)mapping = {'_z2C$q': ':', '_z&e3B': '.', 'AzdH3F': '/'}for k, v in mapping.items():url = url.replace(k, v)return url.translate(translate_table)base_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592"\"&lm=7&fp=result&ie=utf-8&oe=utf-8&st=-1"keywords_str = "&word={}&queryWord={}".format(quote(keywords), quote(keywords))query_url = base_url + keywords_strquery_url += "&face={}".format(1 if face_only else 0)init_url = query_url + "&pn=0&rn=30"res = requests.get(init_url)init_json = json.loads(res.text.replace(r"\'", ""), encoding='utf-8', strict=False)total_num = init_json['listNum']target_num = min(max_number, total_num)crawl_num = min(target_num * 2, total_num)crawled_urls = list()batch_size = 30with futures.ThreadPoolExecutor(max_workers=5) as executor:future_list = list()def process_batch(batch_no, batch_size):image_urls = list()url = query_url + \"&pn={}&rn={}".format(batch_no * batch_size, batch_size)try_time = 0while True:try:response = requests.get(url)breakexcept Exception as e:try_time += 1if try_time > 3:print(e)return image_urlsresponse.encoding = 'utf-8'res_json = json.loads(response.text.replace(r"\'", ""), encoding='utf-8', strict=False)for data in res_json['data']:if 'objURL' in data.keys():image_urls.append(decode_url(data['objURL']))elif'replaceUrl' in data.keys() and len(data['replaceUrl']) == 2:image_urls.append(data['replaceUrl'][1]['ObjURL'])return image_urlsfor i in range(0, int((crawl_num + batch_size - 1) / batch_size)):future_list.append(executor.submit(process_batch, i, batch_size))for future in futures.as_completed(future_list):if future.exception() is None:crawled_urls += future.result()else:print(future.exception())return crawled_urls[:min(len(crawled_urls), target_num)]#main函数
def main(list_file, output="./Raw", max_number=100, threads=50, timeout=20, time_delay=3, face_only=True,browser="phantomjs", quiet=False, file_prefix="img"):with open(list_file, encoding="utf-8") as keywords_list:for keywords in keywords_list:keywords = keywords.rstrip()  #去除换行符if keywords == "":  #跳过空行continueif os.path.exists(os.path.join(output, keywords)):  #查看是否已经下载print("[warn: ] [{}] is already downloaded, downloader will skip [{}]".format(keywords, keywords))continuecrawled_urls = crawler.crawl_image_urls(keywords, max_number=max_number, face_only=face_only,browser=browser, quiet=quiet)download_images(image_urls=crawled_urls, dst_dir=output, keywords=keywords,concurrency=threads, timeout=timeout,time_delay=time_delay, file_prefix=file_prefix)img_count = len(os.listdir(os.path.join(output, keywords)))print("[{}]: get {} image(s)".format(keywords, img_count))def download_image(image_url, dst_dir, file_name, timeout=20, time_delay=1):time.sleep(random.randint(0, time_delay))  #暂停0~time_delay的整数秒response = Nonefile_path = os.path.join(dst_dir, file_name)try_times = 0while True:try:try_times += 1response = requests.get(image_url, headers=get_random_headers(), timeout=timeout)with open(file_path, 'wb') as f:f.write(response.content)response.close()file_type = imghdr.what(file_path)if file_type in ["jpg", "jpeg", "png", "bmp"]:new_file_name = "{}.{}".format(file_name, file_type)new_file_path = os.path.join(dst_dir, new_file_name)shutil.move(file_path, new_file_path)print("[OK:]  {}  {}".format(new_file_name, image_url))else:os.remove(file_path)print("[Err:] file type err or not exists {}".format(image_url))breakexcept Exception as e:if try_times < 3:continueif response:response.close()print("[Fail:]  {}  {}".format(image_url, e.args))breakdef download_images(image_urls, dst_dir, keywords, file_prefix="img", concurrency=50, timeout=20, time_delay=1):with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor:future_list = list()count = 0dst_dir = os.path.join(dst_dir, keywords)if not os.path.exists(dst_dir):os.makedirs(dst_dir)for image_url in image_urls:file_name = file_prefix + "_" + "%04d" % countfuture_list.append(executor.submit(download_image, image_url, dst_dir, file_name, timeout, time_delay))count += 1concurrent.futures.wait(future_list, timeout=180)

结果如图所示。
在这里插入图片描述

2)手动筛选图片

部分人物的名称、现实事物或人物有重名现象,加上一些图片质量不佳,需要人为剔除,手动筛选,如图所示。

在这里插入图片描述

相关其它博客

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(一)

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(三)

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为何百兆静态库能打进数兆的可执行文件?

第三方库是工程开发必不可少的部分&#xff0c;而第三方库可以是.a和.framework的静态库&#xff0c;也可以是.framework的动态库&#xff0c;其中静态库是最常用的方式。 静态库往往比较大&#xff0c;可在打包到可执行文件之后&#xff0c;对安装包大小的增加远远小于静态库本…

原生小程序图表

原生小程序使用图表 话不多说直接进入正题 官方文档: https://www.ucharts.cn/v2/#/ 下载文件 首先去gitee上把文件下载到自己的项目中 https://gitee.com/uCharts/uCharts 找到微信小程序和里面的组件 把里面src下的文件全部下载下来放入自己项目中 项目文件 新建文件…

SpringBoot——定制错误页面及原理

优质博文&#xff1a;IT-BLOG-CN 一、SpringBoot 默认的错误处理机制 【1】浏览器返回的默认错误页面如下&#xff1a; ☞ 浏览器发送请求的请求头信息如下&#xff1a; text/html会在后面的源码分析中说到。 【2】如果是其他客户端&#xff0c;默认则响应错误的 JSON字符串&…

git提交报错error: failed to push some refs to ‘git url‘

1.产生错误原因 想把本地仓库提交到远程仓库&#xff0c;报错信息如下 git提交报错信息 error: src refspec master does not match any error: failed to push some refs to git url 错误原因&#xff1a; 我们在创建仓库的时候&#xff0c;都会勾选“使用Reamdme文件初始化…

Android相机性能提高50%

文章目录 应用举例&#xff08;可以不看这一part&#xff0c;直接跳过看具体怎么做&#xff09;&#xff1a;Snapchat 通过 Camera2 Extensions API 将新相机功能的集成速度提高了 50%**Camera2 扩展 API 可以访问高级功能更多设备上的更多机会 正文&#xff1a;开始使用扩展架…

hdlbits系列verilog解答(Exams/m2014 q4h)-44

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (input in,output out);assign out in;endmodule三、仿真结果 转载请注明出处&#xff01;

Vatee万腾科技新高峰:Vatee前瞻性创新的数字化之力

Vatee万腾科技&#xff0c;一家以前瞻性创新为核心驱动力的数字化引领者&#xff0c;正迈向新的高峰。其在科技领域的卓越表现不仅体现在技术实力上&#xff0c;更展现在对未来的深刻洞察和独到思考上。 在Vatee的科技舞台上&#xff0c;前瞻性创新如一道独特的光芒&#xff0c…

【Linux】yum -- 软件包管理器

目录 一、Linux中是如何安装软件的 1.1 安装的方法 1.2 安装的本质(基本理解) 二、软件包 2.1 软件包的概念 2.2 为什么要有软件包 三、yum--软件包管理器 3.1 yum的概念 3.2 yum的使用 3.2.1 搜索一个软件 3.2.2 安装一个软件 3.2.3 卸载一个软件 3.3 yum源更新 …

Node.js入门指南(三)

目录 Node.js 模块化 介绍 模块暴露数据 导入模块 导入模块的基本流程 CommonJS 规范 包管理工具 介绍 npm cnpm yarn nvm的使用 我们上一篇文章介绍了Node.js中的http模块&#xff0c;这篇文章主要介绍Node.js的模块化&#xff0c;包管理工具以及nvm的使用。 Node…

Joint Cross-Modal and Unimodal Features for RGB-D Salient Object Detection

提出的模型 the outputs H i m _i^m im​ from the unimodal RGB or depth branch in MFFM FFM means ‘Feature Fusion Module’ 作者未提供代码

优秀软件设计特征与原则

1.摘要 一款软件产品好不好用, 除了拥有丰富的功能和人性化的界面设计之外, 还有其深厚的底层基础, 而设计模式和算法是构建这个底层基础的基石。好的设计模式能够让产品开发快速迭代且稳定可靠, 迅速抢占市场先机&#xff1b;而好的算法能够让产品具有核心价值, 例如字节跳动…

GPS 定位信息获取(北斗星通 GPS)

GPS 定位信息获取&#xff08;1&#xff09; 首先回顾北斗星通 GPS 数据获取&#xff08;1&#xff09;~&#xff08;5&#xff09; gps_pub.cpp 将接收到的串口数据转化为GPS的经纬度信息gps_path.cpp 将经纬度信息转化为全局坐标系下的XY值&#xff0c;以第一个GPS经纬度为…

【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】

初始前后端交互原生AjaxFetchaxios同源策略解决跨域 1 初识前后端交互2 原生Ajax2.1 Ajax基础2.2 Ajax案例2.3 ajax请求方式 3 Fetch3.1 fetch基础3.2 fetch案例 4 axios4.1 axios基础4.2 axios使用4.2.1 axios拦截器4.2.2 axios中断器 5 同源策略6 解决跨域6.1 jsonp6.2 其他技…

搭配:基于OpenCV的边缘检测实战

引言 计算机中的目标检测与人类识别物体的方式相似。作为人类&#xff0c;我们可以分辨出狗的形象&#xff0c;因为狗的特征是独特的。尾巴、形状、鼻子、舌头等特征综合在一起&#xff0c;帮助我们把狗和牛区分开来。 同样&#xff0c;计算机能够通过检测与估计物体的结构和性…

Linux 常见命令篇

history 获取执行的指令记录 语法格式: history [参数] 常用参数&#xff1a; -a 写入命令记录 -c 清空命令记录 -d 删除指定序号的命令记录 -n 读取命令记录 -r 读取命令记录到缓冲区 -s 将指定的命令添加到缓冲区 -w 将缓冲区信息写入到历史文件 history#获取最近的三条…

C#关键字、特性基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

Hologres性能优化指南1:行存,列存,行列共存

在Hologres中支持行存、列存和行列共存三种存储格式&#xff0c;不同的存储格式适用于不同的场景。 在建表时通过设置orientation属性指定表的存储格式&#xff1a; BEGIN; CREATE TABLE <table_name> (...); call set_table_property(<table_name>, orientation,…

Centos上安装Docker和DockerCompose

安装Docker Docker可以运行在MAC&#xff0c;Windows&#xff0c;CtenOS,UBUNTU等操作系统上。目前主流的版本有Docker CE和Docker EE&#xff0c;CE是免费的开源Docker版本&#xff0c;适用于开发人员和小型团队&#xff0c;EE是适用于企业的容器化解决方案。它基于Docker CE…

2023-11-24 LeetCode每日一题(统计和小于目标的下标对数目)

2023-11-24每日一题 一、题目编号 2824. 统计和小于目标的下标对数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < targe…

开源的文本编辑器Notepad++ 8.6.0版本在Windows系统上的下载与安装配置

目录 前言一、Notepad 安装二、使用配置总结 前言 Notepad 是一款简单而强大的文本编辑工具&#xff0c;通常用于快速创建和编辑文本文件。以下是 Notepad 工具的详细介绍。注&#xff1a;文末附有下载链接&#xff01; 主要特点&#xff1a; ——简洁易用&#xff1a; Note…