import logging
import math
from flask import Flask, request
import numpy as np
import cv2 # opencv包
from ultralytics import YOLO
import base64
from PIL import Image
from io import BytesIO
import urllib.request
import time
from flasgger import Swagger
# 做了一个安全帽和安全服的目标检测算法后端项目,使用python语言开发,框架使用的是flask。算法使用的是YOLOv8。一共做了两个接口,分别对应安全帽和安全服的检测。
# 接收的参数为图片的url,返回告警图片,没带安全帽或没穿安全服的base64截图。
app = Flask(__name__)
Swagger(app)
app.config['SWAGGER'] = {
'title': 'My API',
'description': 'API for my data',
'version': '1.0.0',
'license': {
'name': 'Apache 2.0',
'url': 'http://www.apache.org/licenses/LICENSE-2.0.html'
}
}
# 配置日志级别
app.logger.setLevel(logging.DEBUG)
# 日志处理程序 输出到控制台
handler = logging.StreamHandler()
#formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
#handler.setFormatter(formatter)
app.logger.addHandler(handler)
model1 = YOLO("yolov8/best_hat_20230920.pt")
model2 = YOLO("yolov8/best_vest_230919.pt")
hat_ratio = 0.1
hat_resize_x = 200
hat_resize_y = 200
vest_ratio = 0.1
vest_resize_x = 200
vest_resize_y = 200
def saturate(val, minval, maxval):
if val <= maxval and val >= minval:
return val
elif val > maxval:
return maxval
else:
return minval
def opencvToBase64(image):
ret, buffer = cv2.imencode('.jpg', image)
image_base64string = base64.b64encode(buffer).decode('utf-8')
return image_base64string
def base64ToOpencv(string):
image_b64decode = base64.b64decode(string) # base64解码
image_array = np.fromstring(image_b64decode, np.uint8) # 转换np序列
image = cv2.imdecode(image_array, cv2.COLOR_BGR2RGB) # 转换Opencv格式
return image
def arrayToBase64(image_array):
pil_img = Image.fromarray(image_array[..., ::-1]) # RGB转BGR??[..., ::-1]
buff = BytesIO()
pil_img.save(buff, format="JPEG")
image_base64string = base64.b64encode(buff.getvalue()).decode("utf-8") # base64编码
return image_base64string
def readImageFromUrl(url):
res = urllib.request.urlopen(url)
img = np.asarray(bytearray(res.read()), dtype="uint8")
img = cv2.imdecode(img, cv2.IMREAD_COLOR)
return img
def arrayToOpencv(image_array):
np_array=np.array(image_array[..., ::-1])
mat=cv2.cvtColor(np_array,cv2.COLOR_RGB2BGR) # RGB转BGR??[..., ::-1]
return mat
@app.route('/hello')
def hello_world(): # put application's code here
"""
This is an example of hello world
---
responses:
200:
description: A simple hello world response
content:
text/plain:
schema:
type: string
"""
return 'Hello World!'
# 算法一,安全帽(接收url,返回检测框截图)
@app.route('/detect_post5', methods=['POST']) # POST请求接受参数
def detect_post5(): # put application's code here
'''
tags:
- 安全帽
requestBody:
description: body
required: true
content:
x-www-form-urlencoded:
schema:
example: {"username":TOKEN,"password":PASSWORD,"repassword":PASSWORD,"email":EMAIL,"csrf_token":TOKEN}
responses:
200:
description: index test
content:
raw/html:
schema:
example: <!doctype html><html><head><meta charset="UTF-8" /><title>phpwind 9.0 - Powered by phpwind</title>
'''
start_time = time.time()
print("********************************安全帽检测算法********************************")
message = {"code":200,"boxes": "", "message": "", "alarmType": ""}
# 源ip
print("源ip:"+str(request.remote_addr))
try:
request_data_dict=request.get_json(silent=True)
imageUrl = request_data_dict["imageUrl"]
print("图片url:" + imageUrl)
# imageUrl = "http://" + request.remote_addr + imageUrl
img = readImageFromUrl(imageUrl)
importantLowThreshold = int(request_data_dict["importantLowThreshold"])
urgentLowThreshold = int(request_data_dict["urgentLowThreshold"])
alarmThreshold = int(request_data_dict["alarmThreshold"])
print(request_data_dict)
if "src_x1" in request_data_dict and "src_y1" in request_data_dict and "src_x2" in request_data_dict and "src_y2" in request_data_dict:
print("画框截图")
src_x1 = int(request_data_dict["src_x1"])
src_y1 = int(request_data_dict["src_y1"])
src_x2 = int(request_data_dict["src_x2"])
src_y2 = int(request_data_dict["src_y2"])
img = img[src_y1:src_y2,src_x1:src_x2]
results = model1(img) # YOLO
print("类别:"+str(results[0].names))
except Exception as e:
app.logger.debug("读取或检测图片异常:"+str(e))
message["message"] = str(e)
return message
try:
# dst_image_array = results[0].plot()
# dst_image=arrayToOpencv(dst_image_array)
# #dst_image=cv2.resize(dst_image,(700,700))
# cv2.imshow("dst_image", dst_image)
array = results[0].boxes.data.cpu().numpy().tolist()
print("检测数据:"+str(results[0].boxes.data))
# {0: 'hat', 1: 'person'}
num = len(array)
list = []
for i in range(num):
if array[i][5] == 1 and array[i][4] > alarmThreshold / 100:
list.append(i)
temp_message = []
for i in list:
y1 = math.floor(array[i][1])
y2 = math.floor(array[i][3])
x1 = math.floor(array[i][0])
x2 = math.floor(array[i][2])
width_edge = math.floor((x2 - x1) * hat_ratio)
height_edge = math.floor((y2 - y1) * hat_ratio)
fy1 = saturate(y1 - height_edge, 0, img.shape[0] - 1)
fy2 = saturate(y2 + height_edge, 0, img.shape[0] - 1)
fx1 = saturate(x1 - width_edge, 0, img.shape[1] - 1)
fx2 = saturate(x2 + width_edge, 0, img.shape[1] - 1)
# print(str(i)+" y1:"+str(y1)+",y2:"+str(y2)+",x1:"+str(x1)+",x2:"+str(x2)+",fy1:"+str(fy1)+",fy2:"+str(fy2)+",fx1:"+str(fx1)+",fx2:"+str(fx2)+",width_edge:"+str(width_edge)+",height_edge:"+str(height_edge)+",shape0:"+str(img.shape[0])+",shape1:"+str(img.shape[1]))
crop_img = img[fy1:fy2, fx1:fx2]
resized_img = cv2.resize(crop_img, (hat_resize_x, hat_resize_y), interpolation=cv2.INTER_LINEAR)
image_base64string = opencvToBase64(resized_img)
# image = base64ToOpencv(image_base64string)
# cv2.imshow("image" + str(i), image)
temp_message.append(image_base64string)
message["boxes"] = temp_message
if len(list) == 0:
message["alarmType"] = "无告警"
elif 0 < len(list) <= importantLowThreshold:
message["alarmType"] = "一般"
elif importantLowThreshold < len(list) <= urgentLowThreshold:
message["alarmType"] = "重要"
elif len(list) > urgentLowThreshold:
message["alarmType"] = "紧急"
# message["dst_image"]=dst_image_base64string
message["message"] = "success"
except Exception as e:
app.logger.debug("检测后数据处理异常:"+str(e))
message["message"] = str(e)
message["code"]= 500
return message
end_time = time.time()
app.logger.debug("总运行时间:"+str(end_time - start_time)
没有合适的资源?快使用搜索试试~ 我知道了~
基于YOLOv8的安全帽工作服检测(python源码).zip

共24个文件
jpg:18个
py:2个
pt:2个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码).zip基于YOLOv8的安全帽工作服检测(python源码)..
资源推荐
资源详情
资源评论





























收起资源包目录






























共 24 条
- 1
资源评论

- nangongzhaolu2024-12-19内容与描述一致,超赞的资源,值得借鉴的内容很多,支持!

土豆片片
- 粉丝: 1892
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- golang,微信小程序,电商系统.zip
- 基于Simulink的Clarke变换与Park变换仿真验证项目_三相交流电机磁场定向控制FOC算法中的坐标变换仿真实现与相序调整分析_通过搭建Simulink模型验证Clarke.zip
- 基于Python的任意空间阵列形状与任意声源位置支持的阵列信号处理仿真系统_内置宽带MVDR_宽带CBF_宽带MUSIC算法实现_音频流式处理逻辑_俯仰角抑制算法_声源定位功能_消.zip
- 基于Python3的Shor算法量子计算仿真模拟器_量子因子分解_大数质因数分解_量子傅里叶变换_量子线路模拟_量子态演化_数论与密码学应用_用于教育演示和量子算法研究_帮助理解量.zip
- 微信小程序商城,微信小程序微店,接口基于FaShop.zip
- 微信小程序,一个滑块拼图游戏.zip
- API接口管理工具(目前内置微信公众号、微信小程序、企业微信、飞书、钉钉等).zip
- Wafer - 快速构建具备弹性能力的微信小程序.zip
- 微信小程序_uni-app 实现的ChatGpt 程序.zip
- 微信小程序模块化开发框架.zip
- 微信小程序 蓝牙Demo.zip
- odoo 微信小程序商城后台.zip
- 微信小程序--基于wepy 商城(微店)微信小程序 欢迎学习交流.zip
- 微信小程序demo 仿手机淘宝.zip
- 微信小程序 StartKit.zip
- F2 的微信小程序.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
