通过深度学习实现安全帽佩戴的检测

2023-11-12

北京 上海巡回站 | NVIDIA DLI深度学习培训
2018年1月26/1月12日
NVIDIA 深度学习学院 带你快速进入火热的DL领域
阅读全文                                                 
>



正文共6736个字,5张图,预计阅读时间17分钟。


前一段时间做企业的智能安全项目,我们在面对一些问题时,大胆采用深度学习的方法,解决传统算法和统计学算法不好实现的问题,今天就和大家分享一下,如何解决通过视频监控检测工人是否佩戴安全帽的深度学习算法。


安全帽检测


企业安全智能监控画面


01

概述


对于图像识别,采用传统的算法(opencv的一些算法),判断形状、颜色等等,我们在实验室和办公场所做测试,效果还不错,和容易识别出来。 一旦到了工业现场,图像完全不行,连人和车都识别不出来。在不同光线下不论采用什么颜色空间(RGB、HSV什么)都无法分离出合理的色彩,更不要提判断和检测了。有感于实际的现场环境,决定放弃传统的算法,拿起深度学习的工具,来搞定这个项目。


02

数据准备


高大上的人工智能背后,一定是苦逼的数据准备,深度学习的模型,需要成千上万的训练和测试数据,这些数据的采集和整理,还有数据的清洗都是体力活啊。


当然,我还是没傻到一张张去拍照片。我通过现场的摄像头做了视频采集,然后拿到录像,做了一个代码从录像中找到人,再把人的上半部分处理一下,变成标准格式的图片。这样子,2-3天的录像就可以产生几十万张图片了,看来训练集的问题解决了。


# -*- coding:utf-8 -*-
 # 录像转换为图片
from time import gmtime, strftime
import cv2
videoFile = '/media/kingstar/kingstardata/safety_eyes/nohatdata/7.mp4'
cap = cv2.VideoCapture(videoFile)
cap.set(3,640)
cap.set(4,480)
 while(True):    
ret, frame = cap.read()    
img = frame    
cv2.imshow('my', img)    
f = strftime("%Y%m%d%H%M%S.jpg", gmtime())    
cv2.imwrite('output/'+ f, img)  
if cv2.waitKey(1) & 0xFF == ord('q'):        
break  
 if img.size == 0:        
break
cap.release
cv2.destroy
AllWindows()


采用SSD的算法(用于物体检测的深度学习主流算法之一)检测出图片中的人。


# -*-coding: utf-8-*-
from keras.preprocessing import image
from keras.applications.imagenet_utils
import preprocess_input from scipy.misc
import imread
import numpy as np
from ssd import SSD300
from ssd_utils import BBoxUtility
import matplotlib.pyplot as plt
import cv2
from os import listdir
 voc_classes = ['Aeroplane', 'Bicycle', 'Bird', 'Boat', 'Bottle',              
 'Bus', 'Car', 'Cat', 'Chair', 'Cow', 'Diningtable',              
 'Dog', 'Horse','Motorbike', 'Person', 'Pottedplant',              
 'Sheep', 'Sofa', 'Train', 'Tvmonitor']
NUM_CLASSES = len(voc_classes) + 1
input_shape=(300, 300, 3)
model = SSD300(input_shape, num_classes=NUM_CLASSES) model.load_weights('weights_SSD300.hdf5', by_name=True)
bbox_util = BBoxUtility(NUM_CLASSES)
 def ssd(img_path):    
global oPath    
inputs = []    
images = []    
#img_path = 'test02.jpg'    
img0 = cv2.imread(img_path)    
img = image.load_img(img_path, target_size=(300, 300))    
img = image.img_to_array(img)  
 images.append(imread(img_path))    
inputs.append(img.copy())    
inputs = preprocess_input(np.array(inputs))    
preds = model.predict(inputs, batch_size=1, verbose=1)    
results = bbox_util.detection_out(preds)    
#print results    
# Parse the outputs.    
for i, img in enumerate(images):        
det_label = results[i][:, 0]        
det_conf = results[i][:, 1]        
det_xmin = results[i][:, 2]        
det_ymin = results[i][:, 3]        
det_xmax = results[i][:, 4]        
det_ymax = results[i][:, 5]        
#print i,det_label,det_conf        
# Get detections with confidence higher than 0.6.        
top_indices = [i for i, conf in enumerate(det_conf) if conf >= 0.5]        
top_conf = det_conf[top_indices]        
top_label_indices = det_label[top_indices].tolist()        
top_xmin = det_xmin[top_indices]        
top_ymin = det_ymin[top_indices]        
top_xmax = det_xmax[top_indices]        
top_ymax = det_ymax[top_indices]      
 #colors = plt.cm.hsv(np.linspace(0, 1, 21)).tolist()        
#plt.imshow(img / 255.)        
#currentAxis = plt.gca()        
#print top_label_indices        
#print top_conf        
#print top_conf.shape[0]        
for i0 in range(top_conf.shape[0]):            
xmin = int(round(top_xmin[i0] * img.shape[1]))            

ymin = int(round(top_ymin[i0] * img.shape[0]))            
xmax = int(round(top_xmax[i0] * img.shape[1]))            
ymax = int(round(top_ymax[i0] * img.shape[0]))            

score = top_conf[i0]          
 label = int(top_label_indices[i0])            
label_name = voc_classes[label - 1]            
#display_txt = '{:0.2f}, {}'.format(score, label_name)            
#coords = (xmin, ymin), xmax-xmin+1, ymax-ymin+1            
#color = colors[label]            
#currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor=color, linewidth=2))            
#currentAxis.text(xmin, ymin, display_txt, bbox={'facecolor':color, 'alpha':0.5})            print label_name,score,xmin,ymin,xmax,ymax            
fileStr0 = img_path.split('.')[-2]            
fileStr0 = fileStr0.split('/')[-1]            
if label_name == 'Person':                
fileStr = '%s/Person5/%s.%d.jpg' %(oPath,fileStr0,i0+1)                
im = img0[ymin:ymax,xmin:xmax]                
r = cv2.imwrite(fileStr,im)                
print 'Person0',fileStr            
if label_name == 'Car1' or label_name == 'Motorbike1':                
fileStr = '%s/Car/%s.%d.jpg' %(oPath,fileStr0,i0+1)                
im = img0[ymin:ymax,xmin:xmax]                
r = cv2.imwrite(fileStr,im)                
print 'Car0',fileStr        
#plt.show()        
#cv2.imshow('im', im)        
#cv2.waitKey(0) if __name__ == "__main__":    img_path = 'test02.jpg'    
mPath = '/media/kingstar/kingstardata/safety_eyes/baidu5'    
oPath = '/media/kingstar/kingstardata/safety_eyes/out'    
trainFileList = listdir(mPath)    
m =len(trainFileList)    
print m    
for i in range(m):        
fileNameStr = trainFileList[i]        
fileStr = fileNameStr.split('.')[-2]        
print i,fileNameStr,fileStr  

     fileNameStr = '%s/%s' % (mPath,fileNameStr)        
print 'step:%d/%d' % (i,m)        
ssd(fileNameStr)


这样就可以建立自己的训练集:


train和test (带不带帽子的标注需要人工去做... 这个还是很苦逼)


训练集


03

搭建模型


考虑到标准的图片只有128*128,特征不是很多,就动手搭建一个不算深的深度学习模型,采用卷积神经网络处理图形特征,搞过cnn的同学会觉得so easy。


model = Sequential() model.add(Convolution2D(32, 3, 3, input_shape=( img_width, img_height, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy',              optimizer='rmsprop',              metrics=['accuracy'])


这是个只有三层的卷积神经网络,我们就拿这个模型进行训练和学习吧。


04

训练神经网络


深度学习的训练是极其需要强大的算力的,多亏我们的模型较小,另外我们还DIY了一台深度学习服务器,有了强大的GPU做运算。


经过了一晚上的训练,终于出了结果,数据上还不错,识别率竟然到了95%以上。


具体代码如下:


# -*-coding: utf-8-*-
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers
import Activation, Dropout, Flatten, Dense
 # dimensions of our images.
img_width, img_height = 128, 128
 train_data_dir = '/media/kingstar/kingstardata/data/train'
validation_data_dir = '/media/kingstar/kingstardata/data/test'
nb_train_samples = 4000
nb_validation_samples = 800
nb_epoch = 60 model = Sequential()
model.add(Convolution2D(32, 3, 3, input_shape=( img_width, img_height, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy',              
optimizer='rmsprop',              
metrics=['accuracy'])
train_datagen = ImageDataGenerator(        rescale=1./255,        
shear_range=0.2,        
zoom_range=0.2,        
horizontal_flip=True)
 test_datagen = ImageDataGenerator(rescale=1./255)
 train_generator = train_datagen.flow_from_directory(        
train_data_dir,        
target_size=(img_width, img_height),        
batch_size=32,      
 class_mode='binary')
 validation_generator = test_datagen.flow_from_directory(        
validation_data_dir,        
target_size=(img_width, img_height),        
batch_size=32,        
class_mode='binary')
 model.fit_generator(        
train_generator,        
samples_per_epoch=nb_train_samples,        
nb_epoch=nb_epoch,        
validation_data=validation_generator,        
nb_val_samples=nb_validation_samples)

model.save('trianHat12801.h5')


现场


05

结论


通过简单的cnn模型和一个小规模的数据集的训练,基本上达到了目标。


不过在实际测试用的识别率还是比较低,感觉还是无法直接用于生产环境。


没关系,下一步我们会采用成熟的模型vgg或resnet,在这个模型后端做修改,进行调优和训练,另外提高训练集的数量和进一步做数据清洗,已达到可以直接在生产环境上使用的目标。


原文链接:https://www.jianshu.com/p/2101f5e5e577


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过深度学习实现安全帽佩戴的检测 的相关文章

  • 使用Spring Boot和EasyExcel的导入导出

    在当今信息化社会 数据的导入和导出在各种业务场景中变得越来越重要 为了满足复杂的导入导出需求 结合Java编程语言 Spring Boot框架以及EasyExcel库 我们可以轻松地构建出强大而灵活的数据处理系统 本文将引导您通过一个案例学
  • Odoo(OpenERP)补货规则笔记整理 - 草稿

    感谢Jeffery Jason ccdos roson 等人分享讨论 推式规则 移库规则 从一个库位推送到另一个库位 拉式规则 补货规则 包括生产 采购 移动 进行仓库设置时 会自动创建默认的拉式规则 最小库存规则 再订货规则 补货 某个库
  • iphone 服务器未响应,iPhone 死机没反应?先试试这些方法!

    iPhone 突然死机了 相信很多果粉都遇过这种情况 通常在手机死机的时候 无论我们怎么点屏幕都没反应 如果在一些紧急情况下发生死机 是很头疼的一件事 那么 iPhone 死机没反应 我们到底应该怎么处理呢 今天 疯师傅教你们三招 自己在家
  • 静态类型

    从程序运行或者二进制的角度 或者说 运行时 的角度来看 静态类型就是 没有类型 因为程序实际上不在运行时保存任何的静态类型 这也是静态类型又被称为 编译时类型 的原因 因为一旦经过编译 静态类型系统就基本上消失殆尽了 为什么又说基本上了呢
  • freemarker+itext5实现用模板方式,导出word和pdf(spring-boot直接可使用)

    第一步 需要引入的jar包
  • PHP$_FILES原生图片上传

    PHP FILES原生图片上传 if empty FILES file name header Content type text html charset utf 8 if FILES file error 0 判断上传是否正确 file
  • 接口自动化测试框架-Python+Requests+Yaml

    零代码极限封装的 接口自动化测试框架 目前已经完全能够实现真正的零代码落地并在企业中推广 其中用到的最核心的封装技术如下 核心技术 1 热加载封装 是全网最早应用于自动化测试框架的封装技术 2 Requests统一请求封装 3 接口关联封装
  • windows下Qt、MinGW、libmodbus源码方式的移植与使用

    windows下Qt MinGW libmodbus源码方式的移植与使用 1 前言 libmodbus官网 https libmodbus org github下载 https github com stephane libmodbus 截
  • element-ui 源码解析,你知道 v-loading 是如何实现的吗?

    前言 相信大家肯定都用过 element ui 里面的 v loading 来写加载 但是如果让你来写一个的话你会怎么写呢 众所周知 element ui 框架的 v loading 有两种使用方式 一种是在需要 loading 的标签上直
  • Yolov5目标检测环境搭建过程(Cuda+Pytorch+Yolov5)

    本文介绍了如何搭建yolov5目标检测代码的环境 详细记录了python虚拟环境 安装pytorch 加载yolov5项目以及运行检测程序的全过程 完成了本文的yolov5项目搭建后 可以查看本文下一篇文章 使用yolov5训练自己的数据集
  • chown、chmod详解

    首先通过ll命令查看目录下文件 主要看最前面一列 我把 drwxr xr x 拿出来说 d 目录 文件类型 rwx 可读 可写 可执行 2 4位 所属者权限 r x 可读 可执行 5 7位 所属组权限 r x 可读 可执行 8 10位 其它
  • OpenTK---空间中单个三维点的绘制

    OpenTK是一个跨平台的包 可以让我们能够使用C 来调用OpenGL来进行三维可视化的开发 因为这是第一篇 所以会写的比较详细 后面重复用到的内容就不再二次说明了 创建主程序中的类 using OpenTK Mathematics usi
  • 关于iptables禁止全部ip访问问题

    关于iptables禁止全部ip访问问题 旁边兄弟在iptables想要实现任何ip禁止访问 只开发个别端口供个别ip访问 开放ip端口 A INPUT s 192 168 1 1 p tcp dport 8848 j ACCEPT A I
  • C++学习(四十一)stderr stdout

    stdout 标准输出设备 stderr 标准错误输出设备 两者默认向屏幕输出 但如果用转向标准输出到磁盘文件 则可看出两者区别 stdout输出到磁盘文件 stderr在屏幕 在默认情况下 stdout是行缓冲的 他的输出会放在一个buf
  • 双向链表为何时间复杂度为O(1)?

    双向链表相比于单向链表 所谓的O 1 是指删除 插入操作 单向链表要删除某一节点时 必须要先通过遍历的方式找到前驱节点 通过待删除节点序号或按值查找 若仅仅知道待删除节点 是不能知道前驱节点的 故单链表的增删操作复杂度为O n 双链表 双向
  • SpringBoot注解大全(超详细)

    一 启动注解 Spring Boot 应用的入口注解 SpringBootApplication SpringBootApplication 是一个注解 它是 Spring Boot 应用的入口注解 用于表示一个应用程序的主类 这个注解通常
  • php设置一分钟访问一次接口,php 如何锁定接口,让一个接口,同一时间只处理同一人的一次请求?...

    最后我是用redis锁解决问题的 锁的代码如下 redis操作 ps 如果没有安装redis 会直接返回false 不会报错 Created by PhpStorm User haua Date 16 10 21 Time 23 02 cl
  • J2Cache的学习

    J2Cache的学习 此教程基于黑马程序员Java品达通用权限项目 哔哩哔哩链接 https www bilibili com video BV1tw411f79E p 97 一 j2cache介绍 j2cache是OSChina 开源中国
  • java高并发

    转载地址 https www cnblogs com lr393993507 p 5909804 html 对于开发的网站 如果网站的访问量非常大 那么我们应该考虑相关的 并发访问问题 并发是绝大部分程序员头疼的问题 为了更好的理解并发和同
  • Java 抽象类能不能实例化

    短回答就是 不能 这里有 2 个概念 什么是抽象类和什么是实例化 实例化 实例化简单来说就是为 Java 中使用的对象分配存储空间 抽象类 从代码上来说 抽象类就是一个用 abstract 关键字来修饰的类 这个类除了不能被实例化以外 其他

随机推荐

  • 若依使用模块窗口时把子页面内容传递给父页面

    在若依开发中 经常需要将子页面的表格中勾选内容传回父页面 本文将具体说明实现方式 1 父页面中存在一个按钮 点击即打开子页面 一个模态窗口 会阻塞父页面的行为 2 在父页面中 需要完成打开子页面和回调给父页面的方法 而且此方法可在若依样例中
  • 【程序人生】从土木专员到网易测试工程师,薪资翻3倍,他经历了什么?

    转行对于很多人来说 是一件艰难而又纠结的事情 或许缺乏勇气 或许缺乏魄力 或许内心深处不愿打破平衡 可对于我来说 转行是一件不可不为的事情 因为那意味着新的方向 新的希望 我是学工程管理的 一个工程类的专业 毕业之后的职业轨迹 土木工程专员
  • 【VSCode】1、VSCode 如何连接服务器

    文章目录 一 安装 remote ssh 插件 二 直接连接 三 配置 SSH 公匙 免密登录 一 安装 remote ssh 插件 点击插件搜索框 搜 remote ssh 点击安装 安装完成后就会出现下面的图标 二 直接连接 点击加号
  • r语言中出现unused argument怎么办

    如果在使用 R 语言时出现 unused argument 的错误提示 通常是因为在调用函数时传入了多余的参数 为了解决这个问题 你需要检查你的代码 确保你只传入了函数所需的参数 例如 如果你调用的函数只有两个参数 但你却传入了三个参数 那
  • 蓝桥杯打卡Day7

    文章目录 阶乘的末尾0 整除问题 一 阶乘的末尾0IO链接 本题思路 由于本题需要求阶乘的末尾0 由于我们知道2 5 10可以得到一个0 那么我们就可以找出2的数和5的数 但是由于是阶乘 所以5的数量肯定是小于2的数量 因此我们只需要知道5
  • Python中configparser读取配置

    Python中的configparser模块可以帮助开发者轻松地读取和写入配置文件 配置文件通常用于存储应用程序的设置 例如数据库连接信息 API密钥等等 在本篇博客中 我们将介绍如何使用configparser模块来读取和写入配置文件 读
  • leetcode No1833 雪糕的最大数量

    题目 题解 贪心 排序 贪心 顾名思义就是贪到最多的 本题要求一定数额的钱 要获得最多数量的雪糕 那以我们平常人的思维去买 就是 先买最便宜的 然后再买次便宜的 因此我们可以先将数组排序 排序后从头开始遍历 一直算到前i个雪糕价钱之和大于c
  • 高效素数判断

    素数是指在大于1的自然数中 除了1和它本身以外不再有其他因数的自然数 那么 对于任意数N 判断其是否是素数 就需要从 2 N 一一枚举整除判断 若都不能整除 则N为素数 public static boolean isprime int n
  • 魔改并封装 YoloV5 Version7 的 detect.py 成 API接口以供 python 程序使用

    文章目录 Introduction Section 1 起因 Section 2 魔改的思路 Section 3 代码 Part 1 参数部分 Part 2 识别 API Part 3 完整的 DetectAPI py Part 4 修改
  • 免费商品信息查询接口(条形码)

    最近公司有一个需求 扫描商品条形码显示商品信息 原以为国内应该会免费提供接口 理想总是美好的 现实都是残酷的 在阿里云 京东等API开放平台找了一番 基本都是按次调用收费 公司的需求每位用户一天可能多次调用接口 这样一算 成本太高 既然没有
  • thrift介绍及应用(二)—简单应用

    原文 http blog csdn net guxch article details 12162131 六 一个最简单的实例 Thrift文件 demo thirft 来自官网 如下 plain view plain copy struc
  • 力扣160链表相交(c++版)

    力扣160链表相交 c 力扣题目链接 思路 如果两个链表相交 又都不存在环 那么不难想象这两个链表共同构成了一个Y型 相交部分全部都相同 两链表交点处指针相等 声明指针A指向链表A的头结点 指针B指向链表B的头结点 我们求出两个链表的长度
  • 【基础】创建react脚手架

    React day01 Hello world 一 升级node 1 进入官网 https nodejs org en 2 重新下载最新版本 3 重新安装 一直选择next 既会被覆盖 4 输入 node v 查看最新版本 注 window
  • vue项目中用 cdn 优化

    在我们写项目中 优化问题是不容忽视的 尤其是首屏优化更是重中之重 这里介绍两种方法优化方法 cdn和异步加载 异步请看 http blog csdn net gang456789 article details 78224751 1 cdn
  • Fiddler 八个实用技巧

    目录 前言 1 双击Session时 使响应页始终显示到 json tab页 使请求页始终显示到 webform tab页 2 显示每个Session 的请求IP地址 3 修改响应Header中的Content Type 4 右键sessi
  • 2023AE软件、Adobe After Effects安装下载教程

    2023AE软件是一款由Adobe公司开发的视频编辑软件 也被称为Adobe After Effects 它在广告 电影 电视和网络视频等领域广泛应用 用于制作动态图形 特效 合成和其他视觉效果 该软件支持多种视频和音频文件格式 具有丰富的
  • mybatis增删改查

    MyBatis 是一款优秀的持久层框架 它支持定制化 SQL 存储过程以及高级映射 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息 将接口和
  • C语言第五章第3节用do...while语句实现循环学习导案

    课 题 5 3 用do while语句实现循环 课时安排 2课时 课 型 新授 学 习目标 掌握do while循环语句的一般形式 掌握do while循环语句的执行过程 掌握do while语句和while语句的区别 重点 do whil
  • STM32F4 IAP实现总结

    目录 IAP相关 IAP概念 IAP与ICP ISP的区别 STM32F4的启动模式 FLASH相关 STM32F4 FLASH简介 STM32的内部闪存组织架构和其启动过程 应用IAP时的FLASH分配 IAP工程在Keil中的设置 跳转
  • 通过深度学习实现安全帽佩戴的检测

    北京 上海巡回站 NVIDIA DLI深度学习培训 2018年1月26 1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 gt