【深度学习】搭建人工智能服务网站(安全帽检测)

news/2024/5/18 19:13:05/文章来源:https://blog.csdn.net/fengdu78/article/details/127470013

电力图像分类最典型的场景就是安全帽佩戴识别。

针对电网作业现场人员行为的图像数据,采用目标检测、图像识别等人工智能技术,对电网作业现场人员是否规范佩戴安全帽进行检测识别。通过计算平均精确率、漏检率、误检率、平均计算时间等指标进行评测。

任务拆解

  1. 输入是图像数据,没有文本、语音等其它数据。

  2. 可将问题拆解为图像识别、目标检测、图像分类等任务。

  3. 具体是谁没有佩戴安全帽就需要用到人脸识别。

  4. 安全帽有佩戴要求和规则,我们需要去标注数据来匹配这个规则:帽子带在头上;帽子固定扣是否扣住。

  5. 对帽子带着头上数据标注的时候,同时标注帽子在头上带的作为正样本,还要标注只有帽子、只有脑袋的负样本,正负样本最好还是在电网作业现场这种场景下。

  6. 我们没有那么多不规范的数据,也没有那么多时间去标注数据。所以本文 问题简化为识别是否佩戴,问题转换为一个图像的二分类问题。

深度学习框架

深度学习框架:tensorflow(比较重)/pytorch(其次)/paddlepaddle(最好用)

很多人工智能开源的项目tensorflow(比较重)/pytorch(其次)这两种实现,也有paddle的实现,如果没有,我们可以参考这个paddle的规范把pytorch代码迁移过来,工作量不大。

常规安全帽检测流程

一. 准备数据

  1. 准备数据要注意场景匹配;如果标注数据的场景和实际使用的场景不一样的话,会有新的干扰因素影响你的准确率。

  2. 正负样本数据量要注意平衡的问题,如果正样本标注1万,负样本标注20万,让人工智能去分类,人工智能就会偷懒,我全部都识别为没有带安全帽就好了。

  3. 单纯的图像采样效果有限,我们最好做多种类型的数据增强。常见的数据增强mixup、cutmix,都是很规则的矩形边界。snapmix这个可以实现非矩形图像的切割填补等处理,对提升准确率有很大帮助。

  4. 数据需要做预处理:数据格式转换(目录结构、标签文件)、图片大小统一。

  5. 数据标注的数据质量问题可由数据标注质检人员完成,但成本高,cleanlab可以实现错误标签自动筛选。

二. 数据标注

  1.  要做目标检测,把我们要找的东西在图片上面自动框出来,才需要做框图标注,如果只是单纯的做图片分类,是不用画框标注的,比如,对鸟类做分类的话,但是把各类图片分门别类放到目录上去,也算是数据标注。

  2. 数据标注,准确率要求不一样,可能标注的方法也不一样,常见的我们就拉四边形的框,但是有的时候,我们可能要多边形。

  3. voc是一种数据规范的格式,这个规范的格式一般来说,包含目录结构、标签文件的格式要求。

三. 选择模型

  1. 常规是目标检测+图像分类,图像二分类能选的模型比较多,重点考虑:准确率、处理速度、模型大小(主要考虑将来产品化了,这个模型的运行环境),作为练习来说,我们基本上考虑准确率、召回率就可以了。

  2. 往往会选择多个模型去比较,并且做模型融合。

四. 训练模型

  1. 训练前,做shuffle洗牌对图片数据做打乱处理。

  2. 图片数据按照训练集、验证集、测试集划分,8:1:1。

  3. 开始训练,不断改进,提升效率,调参,是人工智能训练师、调参侠表演的时刻了,调参也可以用工具自动搜索最好参数:自动调参工具NNI。

  4. 还有一点特别重要的,如果你不是专业学人工智能CV,你不要花太多时间去研究模型的改进,你就选择市面上效果最好的模型就可以了。(这里我暗讽一下浙江大学孟伟,他的课题就是模型改进,发不出论文,菜是原罪)

五. 模型评估

通过计算平均精确率、漏检率、误检率、平均计算时间等指标进行评测。

进阶学习

如果大家需要进阶研究学习,可以多去研究学习kaggle、天池上面的相关的竞赛,这上面经常会有很多创新的模型、算法。

kaggle:全球最顶级的人工智能竞赛平台。https://www.kaggle.com/

天池:阿里提供国内最顶级的人工智能竞赛平台。

本次开发任务

  1. 找到训练好的安全帽检测预测模型,在本地运行起来。

  2. 把这个模型封装成可调用的类。

  3. 用flask搭建网站来调用我们封装好的类实现在线安全帽检测预测业务。

flask网站

  1.  轻量级的web框架,本身采用jinja2模板,这个模板的作用是可以将我们的html代码和数据融合到一起。

  2. @app.route('/xxx')做路径映射(这个映射的就是/xxx这个路径和一个对应函数的映射),我们正常是访问到127.0.0.1:5000/  (这个斜杠代表根目录),所以写路径的时候,一定是/开头的,然后这个@app.route会自动绑定到它最近的这个函数上,所以@app.route里面路径和函数名不一定要完全一致,但是我们一般写成一致,是出于命名规范。函数就是我们常见的函数,是完全一样的。

  3. flask 接受前端参数的几种方式:

    # GET,url参数

    path = request.args.get("imgPath")

    path1 = request.values.get("imgPath")

    # POST,数据包参数

    path2 = request.form.get("imgPath2")

    path3 = "dd" # request.get_data().get("imgPath2")
    path4 = request.get_json()

    path5 = request.get_data()

# header,header参数

path6 = request.headers["Content-Type"]

api封装

  1.  简单粗暴的方法,就是用subprocess直接模拟命令行调用的方式,这种方式好处是简单,干净利落,不用import,所有的麻烦事都交给命令行环境去处理。

  2. 引入包的方式,这种方式比较精准,也不算麻烦,但是得看你用的东西的作者是否给你足够的示例代码。

  3. 直接把项目的源代码整合到我们的flask项目里面,作为其中的模块来使用,这个比较麻烦,会引发一些包路径的问题。

代码实现

https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5/docs/zh_CN/models/PULC/PULC_safety_helmet.md

该案例提供了用户使用 PaddleClas 的超轻量图像分类方案(PULC,Practical Ultra Lightweight image Classification)快速构建轻量级、高精度、可落地的“是否佩戴安全帽”的二分类模型。该模型可以广泛应用于如建筑施工场景、工厂车间场景、交通场景等。

#安装 paddlepaddle
pip install paddlepaddle
#安装 paddleclas
pip install paddleclas

如果安装失败就下载源代码,进入代码目录,执行:python setup.py install进行离线安装。

下载样本来测试:

https://paddleclas.bj.bcebos.com/data/PULC/pulc_demo_imgs.zip

safety_helmet_test_1.png

ae0c0a073f1455dcc6f23faa90f72aab.png

safety_helmet_test_2.png

76fa81bcc313d95e0668a2e30a624d29.png

paddleclas --model_name=safety_helmet --infer_imgs=pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png
[2022/10/18 21:26:47] ppcls INFO: class_ids: [1], scores: [0.9986255], label_names: ['unwearing_helmet'], filename: pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png
[2022/10/18 21:26:47] ppcls INFO: Predict complete!

safety_helmet_test_1.png预测出的标签是:unwearing_helmet。

paddleclas --model_name=safety_helmet --infer_imgs=pulc_demo_imgs/safety_helmet/safety_helmet_test_2.png
[2022/10/18 21:27:41] ppcls INFO: class_ids: [0], scores: [0.9977983916178346], label_names: ['wearing_helmet'], filename: pulc_demo_imgs/safety_helmet/safety_helmet_test_2.png
[2022/10/18 21:27:41] ppcls INFO: Predict complete!

safety_helmet_test_2.png预测出的标签是:wearing_helmet。

我们已经可以利用cmd命令来实现预测,下面我们用python代码来实现预测:

import paddleclas
model = paddleclas.PaddleClas(model_name="safety_helmet")
result = model.predict(input_data="pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png")
print(next(result))
[{'class_ids': [1], 'scores': [0.9986255], 'label_names': ['unwearing_helmet'], 'filename': 'pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png'}]

完美,在MyPredict.py中把预测能力封装成类:

# encoding=utf-8
import os
import subprocess
import paddleclasclass CMD(object):def __init__(self):pass# 直接调用系统cmd命令行去执行。def doPredict1(self, imgPath):cmd = "paddleclas --model_name=safety_helmet --infer_imgs="+imgPathos.system(cmd)# subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。def doPredict2(self,imgPath):cmd = "paddleclas --model_name=safety_helmet --infer_imgs="+imgPathp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,encoding='utf-8')  # 将标准输出重定向到当前子进程p1 = subprocess.Popen("", shell=True, stdout=None, stderr=None, encoding='utf-8')  # 将标准输出还原到ide下的输出content = p.communicate()[0]print(content)  # 正常的一个print,要把内容输出到当前窗口return contentclass FUN(object):def doPredict3(self,imgPath):model = paddleclas.PaddleClas(model_name="safety_helmet")result = model.predict(input_data=imgPath)res = next(result)print(res)return str(res)# 实现三种方式的预测
if __name__ == "__main__":cmd = CMD()cmd.doPredict1("pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png")cmd = CMD()cmd.doPredict2("pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png")fun = FUN()fun.doPredict3("pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png")

运行MyPredict.py可验证三种方式均可正常预测:

[2022/10/18 22:24:05] ppcls WARNING: The current running environment does not support the use of GPU. CPU has been used instead.
e[37m---    Fused 0 subgraphs into layer_norm op.e[0m
[2022/10/18 22:24:05] ppcls INFO: class_ids: [1], scores: [0.9986255], label_names: ['unwearing_helmet'], filename: pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png
[2022/10/18 22:24:05] ppcls INFO: Predict complete![2022/10/18 22:24:13] ppcls WARNING: The current running environment does not support the use of GPU. CPU has been used instead.
e[37m---    Fused 0 subgraphs into layer_norm op.e[0m
[2022/10/18 22:24:13] ppcls INFO: class_ids: [1], scores: [0.9986255], label_names: ['unwearing_helmet'], filename: pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png
[2022/10/18 22:24:13] ppcls INFO: Predict complete![2022/10/18 22:24:13] ppcls WARNING: The current running environment does not support the use of GPU. CPU has been used instead.
e[37m---    Fused 0 subgraphs into layer_norm op.e[0m
[{'class_ids': [1], 'scores': [0.9986255], 'label_names': ['unwearing_helmet'], 'filename': 'pulc_demo_imgs/safety_helmet/safety_helmet_test_1.png'}]

把MyPredict.py放入文件夹core,只需要import设计好的类就可以获得安全帽预测能力。

from core.MyPredict import CMD, FUN

新建一个flask工程,整个工程布局如下:

a1b53e9aba156c8d8cb98d2494663591.png

index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>login</title>
</head>
<body>
{{ msg }}
</body>
</html>

app.py完成flask网站编写:

# encoding=utf-8from flask import Flask
from flask import request
import jsonfrom core.MyPredict import CMD, FUN
from flask import render_template# flask 是python非常轻量级的一个web框架
# 在线的版本,这个代码运行在服务器端,浏览器端、客户端来访问,这个就相当于百度开放的api# 创建应用实例
app = Flask(__name__)# Flask中的route()装饰器用于将URL绑定到函数
# 设置主页显示
@app.route('/', methods=["GET", "POST"])
def index():return render_template("index.html", msg="你好,这是安全帽预测服务网站")# 处理字符串的函数,提取需要的部分
def extractContent(res):return res.split("\n")[-3]@app.route('/predict1', methods=["GET", "POST"])  # 这个注解作用,就是做了一个路径映射,默认只支持GET方法,如果要POST,必须加上
def predict1():#  获得前端传来的参数# GET,url参数path = request.args.get("imgPath")path1 = request.values.get("imgPath")# POST,数据包参数# path2 = request.form.get("imgPath2")# path3 = "dd"  # request.get_data().get("imgPath2")# path4 = request.get_json()# path5 = request.get_data()# header,header参数# path6 = request.headers["Content-Type"]print(path1)# print(path2)# print(path3)# print(path4)# print(path5)# print(path6)# img = request.args.get("imgBase64")cmd = CMD()res = cmd.doPredict2(path)res = extractContent(res)return json.dumps({"status":"ok","result":res})# 路径必须/开头
@app.route('/v1/predict2')
def predict2_v1():cmd = CMD()path = request.args.get("imgPath")res = cmd.doPredict1(path)return json.dumps(res)@app.route('/v2/predict2')
def predict2_v2():cmd = CMD()path = request.args.get("imgPath")res = cmd.doPredict2(path)return json.dumps(res)@app.route('/predict3')
def predict3():fun = FUN()path = request.args.get("imgPath")res = fun.doPredict3(path)return json.dumps(res)# 启动服务
if __name__ == '__main__':app.run()

运行app.py:

49129a1057dcaf63d75627a771db7d49.png

打开网页:http://127.0.0.1:5000/

f957c20aa359de259253d641cbfa7904.png

测试/predict1:

a076695b5ee6a62ae5a3b0738f08b95c.png

测试/v1/predict2:

3b2601fbfbcd3f5b8f828b54c8d577cf.png

返回null是因为doPredict1函数没有返回任何值。

# 直接调用系统cmd命令行去执行。def doPredict1(self, imgPath):cmd = "paddleclas --model_name=safety_helmet --infer_imgs="+imgPathos.system(cmd)

测试/v2/predict2:

ae5b1098b43a2331e559406bed922e34.png

测试/predict3:

720a980f68daa344cd37ec26c9fa87c2.png

至此我们完成了具有安全帽检测预测服务的简单网站搭建,基本功能已经完成,剩下的任务就是做合适的前端设计,让用户方便使用。

d26d4b115c023bb982d3133a3e3be86c.jpeg

往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

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

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

相关文章

[请教]关于超大数据量网站的数据搜索和分页的实现方法

请教像阿里巴巴这样的数据量过百万的网站&#xff0c;其数据搜索和分页是如何实现的&#xff1f;我个人是用全文索引做的&#xff0c;把物品名和物品简介放在一起&#xff0c;检索这个字段。分页是用存储过程做的&#xff0c;CREATEPROCEDUREGetSearchEnterprise(strWherevarch…

如何消除网站安全的七大风险

以工作中某项目的安全改善过程为例&#xff0c;分享了常用网站安全性的典型问题和解决对策&#xff0c;希望对网站开发者有借鉴意义。 有过网站开发经验的朋友都知道网站安全是构建网站时必须要考虑的一个因素&#xff0c;网站安全的重点在于服务器的安全配置管理以及程序脚…

浙江巨丰管业有限公司网站

祝贺浙江巨丰管业网站正式运行2周年&#xff0c; 浙江巨丰管业有限公司&#xff08;以下简称公司&#xff09;成立于2001年&#xff0c;坐落于美丽的西施故里-浙江诸暨-店口工业区&#xff0c;公司距离杭州机场20公里&#xff0c;杭金衢高速公路20公里&#xff0c;沪杭甬高速公…

分享9个最棒的代码片段资源网站

作为一个奋斗在第一线的码农来说&#xff0c;能找到自己能在项目中直接使用的代码无疑是一件天大的喜事。代码片段和代码库到处都有&#xff0c;如何找到自己需要的东西绝对是一个大问题&#xff0c;为了帮助大家更好的找到自己需要的代码&#xff0c;今天我们介绍9个非常不错的…

IIS网站服务器性能优化指南

Windows Server自带的互联网信息服务器&#xff08;Internet Information Server&#xff0c;IIS&#xff09;是架设网站服务器的常用工具&#xff0c;它是一个既简单而又麻烦的东西&#xff0c;新手都可以使用IIS架设一个像模像样的Web站点来&#xff0c;但配置、优化IIS的性能…

Android利用Jsoup解析html 开发网站客户端小记。

这些天业余时间比较多&#xff0c;闲来无事&#xff0c;想起了以前看过开发任意网站客户端的一篇文章&#xff0c;就是利用jsoup解析网站网页&#xff0c;通过标签获取想要的内容。好了废话不多说&#xff0c;用到的工具为 jsoup-1.7.2.jar包&#xff0c;具体jsoup的相关文档&a…

网站架构之架构演化

网站从构建之初的很少有人问津&#xff0c;用户数量较少&#xff0c;并发量较低&#xff0c;到之后的拥有千万上亿用户&#xff0c;数万量级的高并发&#xff0c;之间经历了怎样的过程&#xff0c;小型网站架构是怎样逐步演化的&#xff0c;本文简单探讨下这方面的内容&#xf…

产品推广系统推荐乐云seo_优化推广公司红利产品推荐“爱采购cpc竞价版”

很多优化推广公司都在寻找更好的产品&#xff0c;服务&#xff0c;项目来满足更多客户的需求以及市场认可度&#xff0c;竞争力。有人可能代理过整站优化的产品&#xff0c;有人可能代理过快速排名的产品&#xff0c;有人可能代理过万词霸屏类产品&#xff0c;等等。这些产品都…

网站框构分析 一

Facebook用户量大的问题由它的分布式缓存系统主要解决&#xff0c;剩下的自然是开源的mysql更合适了 &amp;lt;img src"https://pic2.zhimg.com/c6d403f1e89fa46c5567e0cbcbb024ad_b.jpg" data-rawwidth"1310" data-rawheight"333" class&quo…

使用python来批量抓取网站图片

今天"无意"看美女无意溜达到一个网站&#xff0c;发现妹子多多&#xff0c;但是可恨一个page只显示一张或两张图片&#xff0c;家里WiFi也难用&#xff0c;于是发挥"程序猿"的本色&#xff0c;写个小脚本&#xff0c;把图片扒下来再看&#xff0c;类似功能…

发布在IIS的网站,可以用本机IP登录访问,用localhost不可登录访问

之前在IIS发布一个测试的网址&#xff0c;但是用本机IP可以访问&#xff0c;用localhost不可访问 报访问主机名无效的问题&#xff0c;用本机IP访问成功 最后解决方法是&#xff1a; 1&#xff09;打开IIS&#xff0c;找到发布后的网站 2&#xff09;选中网站&#xff0c;右键属…

【wpf WebBrowser 清空网站的CookieSession 清空用户登录状态】

最近做项目遇到了一个说小不小&#xff0c;说大不大的问题&#xff0c;那就是在WebBrowser中清空网站上用户的登陆状态&#xff0c; 一开始心想&#xff0c;那不就清空cookies就行啦&#xff0c;那么简单的事情&#xff0c;百度一下 …… …… 是的&#xff0c;正如你们所百度的…

部分网站公开数据的汇总(2)

数据整理 1、Natural Earth Data Natural Earth Data提供了全球范围内的矢量和影像数据。Natural Earth Data的最大优势就是数据是开放性的&#xff0c;用户有传播和修改数据的权限。 &#xff08;1&#xff09;Natural Earth为制作个性化地图提供方便的资源&#xff0c;而不是…

服务器会自动创建cookie,网站的cookie机制是什么

cookie与session应用于互联网中的一项基本技术——会话(用户与客户端的交互)跟踪技术&#xff0c;用来跟踪用户的整个会话。简单来说&#xff0c;cookie是通过在客户端记录信息确定用户身份的&#xff0c;而session则通过在服务器端记录信息确定用户身份。cookie定义cookie是服…

Httpster –世界各地最潮的网页设计案例聚合网站

Httpster 这个网站聚合了世界各地最新最潮的网页设计案例&#xff0c;展示了创意的设计&#xff0c;精心的策划&#xff0c;优秀的排版。这些作品都按月份和类别进行了很好划分&#xff0c;你可以方便的找到自己感兴趣的网站案例。 立即去看看 您可能感兴趣的相关文章网站开发中…

使用宝塔面板进行wordpress建站

首先你需要自行购买服务器和域名我这里购买的是阿里云的服务器和域名 然后在xshell中对你的服务器进行操作 将自己写的web项目部署到服务器中的方法参考我的上一篇博客 Linux虚拟机或阿里云部署本地Javaweb项目 将宝塔面板的安装命令复制到xshell中在服务器上通过yum安装宝塔面…

网站底部套用模板

写网站时一般都会加上网站底部&#xff0c;使得网站结构更加完整 这里提供一个常用的网站底部形式作为模板&#xff0c;方便套用 修改示例&#xff1a; 相关代码&#xff0c;请到此处下载 网站底部常用模板

反击“猫眼电影”网站的反爬虫策略

001 前言 前两天在百家号上看到一篇名为《反击爬虫&#xff0c;前端工程师的脑洞可以有多大&#xff1f;》的文章&#xff0c;文章从多方面结合实际情况列举了包括猫眼电影、美团、去哪儿等大型电商网站的反爬虫机制。的确&#xff0c;如文章所说&#xff0c;对于一张网页&…

如何搭建个人博客网站

搭建博客流程较复杂&#xff0c;细节比较多&#xff0c;需要记录一下。 一. 在阿里云购买域名 每个网站都需要一个域名&#xff0c;或者通俗地说&#xff0c;网站需要一个网址。就像百度的域名是www.baidu.com&#xff0c;其它人可以通过在浏览器中输入域名来访问这个网站。域…

页面怎么把关键字保留下来_怎么做seo优化,以及网站SEO优化计划!

在工作或寻找工作的过程中。我相信面试官经常会要求你做一个seo优化计划。那你怎么做seo优化&#xff1f;一个好的SEO优化计划包括四个主要组&#xff1a;首先&#xff0c;前端/页面编辑器二&#xff0c;内容修改人员三&#xff0c;推广人员四&#xff0c;数据分析师SEO推广的组…