尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

毕设项目分享 基于深度学习的抽烟行为检测算法实现(源码分享)

毕设项目分享 基于深度学习的抽烟行为检测算法实现(源码分享) 文章目录0 简介1 系统概述系统设计原则3 实现效果4 Yolov5算法4.1 简介4.2 相关技术5 数据集处理及实验6 部分核心代码最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于深度学习的抽烟行为检测算法实现(源码分享)项目运行效果毕业设计 深度学习的抽烟行为检测算法实现项目分享见主页任意置顶文章通过目前应用比较广泛的 Web 开发平台将模型训练完成的算法模型部署部署于 Web 平台。并且利用目前流行的前后端技术在该平台进行整合实现运营车辆驾驶员吸烟行为检测系统方便用户使用。1 系统概述本系统是一种运营车辆驾驶员吸烟行为检测系统为了降低误检率对驾驶员视频中的吸烟烟雾和香烟目标分别进行检测若同时检测到则判定该驾驶员存在吸烟行为。进行流程化处理以满足用户的需要。驾驶员吸烟行为检测系统结合了当前机器学习技术以及深度学习技术通过对真实拍摄的驾驶员车内视频数据进行测试最终实现吸烟检测功能。针对目前驾驶员开车吸烟现状人工监控困难的问题本系统为监控人员提供辅助监控功能降低监控人员失误率解决监控人员因为疲劳作业出现工作失误。本系统的主要工作流程如下系统设计原则为了使本次设计的吸烟检测系统具有更好的实用性、准确性和稳定性同时能够让相关操作人员在使用时感受到便捷并且容易上手在设计本系统时主要遵循了以下五项基本原则1规范性原则在系统开发的过程当中所用到的控制协议、传输协议编码类型等都应该符合国家标准和行业标准。在代码撰写时应该符合一般的技术规范。2模块化设计原则模块化设计是指在系统设计时尽可能的将多个基本功能设计为多个独立运行的模块并且每一个模块只负责一件事情。这样就可以让系统结构更加清晰同时在实际的运行过程中可以实现不同模块之间的调用大大增加了系统的灵活性。这样做既可以用有限的模块来最大限度的完成用户的要求同时对系统后期的维护以及功能的增加都非常有利。3可操作性与可维护性原则一个好的系统应该具有很好的可操作性所以在符合用户使用习惯的基础上对每一个具体操作进行简化。同时为了使系统可以更加便于维护在系统设计的过程当中应该提前想清楚各个功能模块之间的难点与逻辑这样才能在日后的维护当中减少工作量。4可拓展性原则系统开发将多个基本功能尽可能的设计为多个独立运行的模块大大增加了系统的可拓展性。与此同时开发过程当中前端和后端的功能是分开进行的通过提前设计好的可供数据传输的接口以 JSON 数据格式在各个模块之间进行数据交换操作使前后端之间具有解耦关系这样做可以保证了系统具有比较良好的可扩展能力和稳定能力。5经济性原则在系统设计的时候首先是要考虑用户的具体需求设计实用的功能发挥系统的最大性能。但是在满足用户所需的功能后也应该尽可能的减少开发成本采用更加经济的技术设备不能只是一味地追求更高级更复杂的设计方案要充分利用现有的设备和资源综合考虑系统建设、升级以及维护时所需的费用在有限的成本下更好的去完成任务。3 实现效果左图为原图右图为推理后的图片以图片方式展示视频流和实时流也能达到这个效果由于视频转GIF大小原因这里暂不演示。4 Yolov5算法4.1 简介YOLO系列是基于深度学习的回归方法。该系列陆续诞生出YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5。YOLOv5算法它是一种单阶段目标检测的算法该算法可以根据落地要求灵活地通过chaneel和layer的控制因子来配置和调节模型所以在比赛和落地中应用比较多。同时它有YOLOv5x、YOLOv5l、YOLOv5m、YOLOv5s四种模型。具有以下优点在pytorch环境下编写可以很容易编译成ON⁃NX和Core ML;运行速度很快每秒可以达到140FPS的速度模型精度高集成了YOLOv3和YOLOv4的部分优秀特性进行了推陈出新的改进。4.2 相关技术Mosaic数据增强Mosaic数据增强技术采用了四张图片的随机缩放、随机剪裁、随机排布的方式对数据进行拼接相比CutMix数据增强多用了两张图片。在目标识别过程中要识别的目标有大目标、中等目标、小目标并且三种目标的占比例不均衡其中小目标的数量是最多的但是出现的频率很低这种情况就会导致在bp时对小目标的优化不足模型正确识别小目标的难度比识别中、大目标的难度要大很多于是对于小目标来说很容易出现误检和漏检的情况。Mosaic数据增强技术做出改进后上述的问题得到有效的解决。该技术的优点是丰富了数据集采用“三个随机”的方式对数据进行拼接丰富了检测的数据集尤其是随机缩放增加了很多小目标克服了小目标的不足让网络的鲁棒性得到提高减少GPU的使用在Mosaic增强训练时四张图片拼接在一起GPU可以直接计算四张图片的数据让Mini-batch的大小减少了很多这使得一个GPU就可以达到比较可观的效果。自适应anchor自适应anchor是checkanchors函数通过遗传算法与Kmeans迭代算出的最大可能召回率的anchor组合。在网络模型的训练过程中网络在初始化的锚框的基础上输出预测框然后与真实框groundtruth进行对比计算两个框之间的差值再根据差值进行反向更新迭代网络参数最后求出最佳的锚框值。自适应的anchor能够更好地配合网络训练提高模型的精度减少对anchor的设计难度具有很好的实用性。自适应图片缩放为了提高模型的推理速度YOLOv5提出自适应图片缩放根据长宽比对图像进行缩放并添加最少的黑边减少计算量。该方法是用缩放后的长边减去短边再对32进行取余运算求出padding。在训练时并没有采用缩减黑边的方法该方法只是在测试模型推理的时候才使用这样提高了目标检测的准确率和速度。Focus结构该结构采用切片操作将特征切片成四份每一份将当成下采样的特征然后在channel维度进行concat。例如原始6086083的数据图片经过切片操作先变成30430412的特征图再经过一次32个卷积核的卷积操作变成30430432的特征图。CSP结构YOLOv5中的CSP[5]结构应用于两处一处是CSP1X结构应用于Backbone的主干网络中另一处的CSP2X结构应用于Neck中用于加强网络的特征融合的能力。CSPNet主要从网络结构设计的角度解决推理中从计算量很大的问题。该结构的优点有1)增强CNN的学习能力使得模型在轻量化的同时保持较高的准确性2)减低计算的瓶颈问题3)减低内存的分险。PFNPAN结构这个结构是FPN和PAN的联合。FPN是自顶向下的将高层的特征信息通过上采样的方式进行传递融合得到进行预测的特征图而PAN正好与FPN的方向是相反的方向它是自底向上地采取特征信息。两个结构各自从不同的主干层对不同的检测层进行参数聚合。两个结构的强强联合让得到的特征图的特征更加明显和清楚。Bounding box的损失函数Bounding box损失函数[6]增加了相交尺度的衡量方式有效缓解了当两个框不相交和两个框大小完全相同的两种特殊情况。因为当预测框和目标框不相交时IOU0无法反应两个框距离的远近的时候此时的损失函数不可导两个框大小完全相同两个IOU也相同IOULOSS无法区分以上两种特殊情况。nms非极大值抑制在目标检测过程的后续处理中对于大量的目标框的筛选问题通常会进行nms操作以此来达到一个不错的效果。YO⁃LOv5算法同样采用了加权的nms操作。5 数据集处理及实验数据集准备由于目前针对吸烟图片并没有现成的数据集我们使用Python爬虫利用关键字在互联网上获得的图片数据编写程序爬了1w张筛选下来有近1000张可用以及其他途径获取到的暂时可用数据集有5k张深度学习图像标注软件众多按照不同分类标准有多中类型本文使用LabelImg单机标注软件进行标注。LabelImg是基于角点的标注方式产生边界框对图片进行标注得到xml格式的标注文件由于边界框对检测精度的影响较大因此采用手动标注并没有使用自动标注软件。考虑到有的朋友时间不足博主提供了标注好的数据集和训练好的模型需要请联系。数据标注简介通过pip指令即可安装pip install labelimg在命令行中输入labelimg即可打开6 部分核心代码# data/smoke.yaml# COCO 2017 dataset http://cocodataset.org# Download command: bash yolov5/data/get_coco2017.sh# Train command: python train.py --data ./data/coco.yaml# Dataset should be placed next to yolov5 folder:# /parent_folder# /coco# /yolov5# train and val datasets (image directory or *.txt file with image paths)train:data\train.txt# 上面我们生成的train根据自己的路径进行更改val:data\test.txt# 上面我们生成的test#test: ../coco/test-dev2017.txt # 20k images for submission to https://competitions.codalab.org/competitions/20794# number of classesnc:1#训练的类别# class namesnames:[smoke]# Print classes# with open(data/coco.yaml) as f:# d yaml.load(f, Loaderyaml.FullLoader) # dict# for i, x in enumerate(d[names]):# print(i, x)# model/yolov5s.yaml# parametersnc:1# number of classesdepth_multiple:0.33# model depth multiplewidth_multiple:0.50# layer channel multiple# anchorsanchors:-[116,90,156,198,373,326]# P5/32-[30,61,62,45,59,119]# P4/16-[10,13,16,30,33,23]# P3/8# YOLOv5 backbonebackbone:# [from, number, module, args][[-1,1,Focus,[64,3]],# 0-P1/2[-1,1,Conv,[128,3,2]],# 1-P2/4[-1,3,BottleneckCSP,[128]],[-1,1,Conv,[256,3,2]],# 3-P3/8[-1,9,BottleneckCSP,[256]],[-1,1,Conv,[512,3,2]],# 5-P4/16[-1,9,BottleneckCSP,[512]],[-1,1,Conv,[1024,3,2]],# 7-P5/32[-1,1,SPP,[1024,[5,9,13]]],]# YOLOv5 headhead:[[-1,3,BottleneckCSP,[1024,False]],# 9[-1,1,Conv,[512,1,1]],[-1,1,nn.Upsample,[None,2,nearest]],[[-1,6],1,Concat,[1]],# cat backbone P4[-1,3,BottleneckCSP,[512,False]],# 13[-1,1,Conv,[256,1,1]],[-1,1,nn.Upsample,[None,2,nearest]],[[-1,4],1,Concat,[1]],# cat backbone P3[-1,3,BottleneckCSP,[256,False]],[-1,1,nn.Conv2d,[na*(nc5),1,1]],# 18 (P3/8-small)[-2,1,Conv,[256,3,2]],[[-1,14],1,Concat,[1]],# cat head P4[-1,3,BottleneckCSP,[512,False]],[-1,1,nn.Conv2d,[na*(nc5),1,1]],# 22 (P4/16-medium)[-2,1,Conv,[512,3,2]],[[-1,10],1,Concat,[1]],# cat head P5[-1,3,BottleneckCSP,[1024,False]],[-1,1,nn.Conv2d,[na*(nc5),1,1]],# 26 (P5/32-large)[[],1,Detect,[nc,anchors]],# Detect(P5, P4, P3)]# 训练部分主函数if__name____main__:check_git_status()parserargparse.ArgumentParser()parser.add_argument(--epochs,typeint,default300)parser.add_argument(--batch-size,typeint,default16)parser.add_argument(--cfg,typestr,defaultmodels/yolov5s.yaml,help*.cfg path)parser.add_argument(--data,typestr,defaultdata/smoke.yaml,help*.data path)parser.add_argument(--img-size,nargs,typeint,default[640,640],helptrain,test sizes)parser.add_argument(--rect,actionstore_true,helprectangular training)parser.add_argument(--resume,actionstore_true,helpresume training from last.pt)parser.add_argument(--nosave,actionstore_true,helponly save final checkpoint)parser.add_argument(--notest,actionstore_true,helponly test final epoch)parser.add_argument(--noautoanchor,actionstore_true,helpdisable autoanchor check)parser.add_argument(--evolve,actionstore_true,helpevolve hyperparameters)parser.add_argument(--bucket,typestr,default,helpgsutil bucket)parser.add_argument(--cache-images,actionstore_true,helpcache images for faster training)parser.add_argument(--weights,typestr,default,helpinitial weights path)parser.add_argument(--name,default,helprenames results.txt to results_name.txt if supplied)parser.add_argument(--device,default0,helpcuda device, i.e. 0 or 0,1,2,3 or cpu)parser.add_argument(--adam,actionstore_true,helpuse adam optimizer)parser.add_argument(--multi-scale,actionstore_true,helpvary img-size /- 50%)parser.add_argument(--single-cls,actionstore_true,helptrain as single-class dataset)optparser.parse_args()opt.weightslastifopt.resumeelseopt.weights opt.cfgcheck_file(opt.cfg)# check fileopt.datacheck_file(opt.data)# check fileprint(opt)opt.img_size.extend([opt.img_size[-1]]*(2-len(opt.img_size)))# extend to 2 sizes (train, test)devicetorch_utils.select_device(opt.device,apexmixed_precision,batch_sizeopt.batch_size)ifdevice.typecpu:mixed_precisionFalse# Trainifnotopt.evolve:tb_writerSummaryWriter(commentopt.name)print(Start Tensorboard with tensorboard --logdirruns, view at http://localhost:6006/)train(hyp)# Evolve hyperparameters (optional)else:tb_writerNoneopt.notest,opt.nosaveTrue,True# only test/save final epochifopt.bucket:os.system(gsutil cp gs://%s/evolve.txt .%opt.bucket)# download evolve.txt if existsfor_inrange(10):# generations to evolveifos.path.exists(evolve.txt):# if evolve.txt exists: select best hyps and mutate# Select parent(s)parentsingle# parent selection method: single or weightedxnp.loadtxt(evolve.txt,ndmin2)nmin(5,len(x))# number of previous results to considerxx[np.argsort(-fitness(x))][:n]# top n mutationswfitness(x)-fitness(x).min()# weightsifparentsingleorlen(x)1:# x x[random.randint(0, n - 1)] # random selectionxx[random.choices(range(n),weightsw)[0]]# weighted selectionelifparentweighted:x(x*w.reshape(n,1)).sum(0)/w.sum()# weighted combination# Mutatemp,s0.9,0.2# mutation probability, sigmanprnp.random npr.seed(int(time.time()))gnp.array([1,1,1,1,1,1,1,0,.1,1,0,1,1,1,1,1,1,1])# gainsnglen(g)vnp.ones(ng)whileall(v1):# mutate until a change occurs (prevent duplicates)v(g*(npr.random(ng)mp)*npr.randn(ng)*npr.random()*s1).clip(0.3,3.0)fori,kinenumerate(hyp.keys()):# plt.hist(v.ravel(), 300)hyp[k]x[i7]*v[i]# mutate# Clip to limitskeys[lr0,iou_t,momentum,weight_decay,hsv_s,hsv_v,translate,scale,fl_gamma]limits[(1e-5,1e-2),(0.00,0.70),(0.60,0.98),(0,0.001),(0,.9),(0,.9),(0,.9),(0,.9),(0,3)]fork,vinzip(keys,limits):hyp[k]np.clip(hyp[k],v[0],v[1])# Train mutationresultstrain(hyp.copy())# Write mutation resultsprint_mutation(hyp,results,opt.bucket)# Plot results# plot_evolution_results(hyp)项目运行效果毕业设计 深度学习的抽烟行为检测算法实现最后项目分享见主页任意置顶文章
返回列表