opencv调用自己训练的yolo3模型
一 实现流程
1.准备好自己的数据集,通过yolo3结构框架训练好自己的模型文件(loss值一般训练到10就OK)yolov3源码:https://github.com/qqwweee/keras-yolo3
2.基于keras框架训练出来的模型是.h5格式的文件。把.h5格式的文件转化为darknet形式的.weight文件。
.h5转换成.weight资源:https://download.csdn.net/download/qq_20265187/10973085?ops_request_misc=&request_id=&biz_id=103&utm_source=distribute.pc_search_result.none-task-download-2allsobaiduweb~default-1
3.通过opencv.dnn模块实现对模型的调用。opencv( 3.4.2+版本)的dnn(Deep Neural Network-DNN)模块封装了Darknet框架,可以使用opencv方便地使用yolo的各个版本。把模型解码成预测图片所需要的坐标点和分类及置信度,并标注出来。
二 训练模型
在训练是时候可以添加限制GPU的使用率,防止显存不够。
config = tf.ConfigProto()
config.gpu_options.allocator_type = 'BFC' #A "Best-fit with coalescing" algorithm, simplified from a version of dlmalloc.
config.gpu_options.per_process_gpu_memory_fraction = 0.6 # 显存利用率60%
config.gpu_options.allow_growth = True # 动态显存申请
set_session(tf.Session(config=config))
先创建数据集格式。
JPEGImages:存放目标图片
Annotations:存放标注好的XML文件,需与图片名称相对应
ImageSets/main:生成一个txt格式文件,里面存放需要训练的图片名称
训练好的yolo.h5文件转化成yolo.weight文件
然后修改draknet网络结构yolov3.cfg格式文件。
按Ctrl+F在文件内查找‘yolo’(有3处,分别是每个特征层的输出),需要修改filters,classes,random三个地方。
三 调用opencv.dnn加载网络结构
参考:https://blog.csdn.net/qq_32761549/article/details/90402438
import cv2
import numpy as np
import timestart = time.time()
with open('./model/coco.names','r') as file:LABELS = file.read().splitlines() #变为列表形式['person', 'bicycle', 'car']COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")args = {"image": "0497.jpg","confidence": 0.5, # minimum bounding box confidence"threshold": 0.3, # NMS threshold
}
weightsPath = './model/yolo.weights'
configPath = './model/yolov3.cfg'image = cv2.imread(args['image'])
(H, W) = image.shape[:2]#将图像转化为输入的标准格式
#对原图像进行像素归一化1/255.0,缩放尺寸 (416, 416),,对应训练模型时cfg的文件 交换了R与G通道
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416),swapRB=True, crop=False)
net = cv2.dnn.readNetFromDarknet(configPath,weightsPath) #加载模型权重文件
net.setInput(blob) #将blob设为输入
ln = net.getUnconnectedOutLayersNames() #找到输出层 draknet中有三个输出层‘yolo_82’, ‘yolo_94’, ‘yolo_106’
layerOutputs = net.forward(ln) # ln此时为输出层名称,向前传播,得到检测结果'''''
解码过程,就是对检测结果进行处理与显示
在检测结果中会有很多每个类的置信度为0的矩形框,要把这些与置信度较低的框去掉
'''''
boxes, confidences, classIDs = [], [], []
for output in layerOutputs: #对三个输出层 循环for detection in output: #对每个输出层中的每个检测框循环# [5:] 代表从第6个开始分割scores = detection[5:] #detection=[x,y,h,w,c,class1,class2,class3,class4。。。。。。]classID = np.argmax(scores) #找出最大值的索引,即哪一类是最大值confidence = scores[classID] #得到置信度的最大值#根据置信度筛选if confidence > args['confidence']:# 得到box框的(x,y,h,w)box = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int")# 把预测框中心坐标转换成框的左上角坐标(x,y)x = int(centerX - (width / 2))y = int(centerY - (height / 2))boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)# 提取出来的框有重复,所以要进行非极大值抑制处理
#[1.需要操作的各矩形框 2.矩形框对应的置信度 3.置信度的阈值,低于这个阈值的框直接删除 4.NMS的阈值]
idxs = cv2.dnn.NMSBoxes(boxes, confidences, args["confidence"],args["threshold"])
print('idxs形状为:',idxs.shape)if len(idxs) > 0 :for i in idxs.flatten():# indxs是二维的,第0维是输出层,所以这里把它展平成1维(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])color = [int(c) for c in COLORS[classIDs[i]]]cv2.rectangle(image,(x,y),(x+w,y+h),color,2)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 2)print('程序运行时间:', time.time() - start,'秒')
cv2.imshow('Image',image)
cv2.waitKey(0)
运行结果:
opencv调用自己训练的yolo3模型相关推荐
- 使用OpenCV调用Caffe-SSD训练好的模型
前言 1.OpenCV3之后的dnn模型可以可以调用好多用深度学习框架的训练好的模型. 2.这里我演示是我自己训练的一个围棋棋盘识别模型,使用的神经网络是VGG16,OpenCV3.3,IDE是VS2 ...
- opencv调用pytorch训练好的模型
根据官方文档知 cv2.dnn.readNetFromTorch() 中使用 torch.save() 方法保存的文件. 加载文件必须包含带有导入网络的序列化 nn.Module 对象,尝试从序列化数 ...
- 如何调用 caffe 训练好的模型对输入图片进行测试
如何调用 caffe 训练好的模型对输入图片进行测试 该部分包括两篇文章 win10 下 caffe 的第一个测试程序(附带详细讲解) 主要讲解如何利用 caffe 来训练模型. 如何调用 caffe ...
- OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型
七月 上海| 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习 快速带你入门阅读全文> 正文共2073个字,2张图,预计阅读时间10分钟. 一.初得模型 那是一个月之前的事情了 ...
- 调用lssvm训练好的模型
最近要实现异步电机的LSSVM逆控制,参考文献<基于LS-SVM的异步电机解耦控制方法>已附.遇到的问题是:训练得到的模型model挺好的,为什么单独拿出来调用,效果却很差?我的程序贴出来 ...
- TensorFlow 调用预训练好的模型—— Python 实现
1. 准备预训练好的模型 TensorFlow 预训练好的模型被保存为以下四个文件 data 文件是训练好的参数值,meta 文件是定义的神经网络图,checkpoint 文件是所有模型的保存路径,如 ...
- C++利用opencv调用pytorch训练好的分类模型
pytorch保存模型 import torch.onnxd = torch.rand(1, 3, 224, 224,dtype=torch.float,device = 'cuda') m = mo ...
- 如何用java语言调用tensorflow训练好的模型
1.TensorFlow的训练模型在Android和Java的应用及调用 2.tensorflow的python离线训练java在线预测方案 3.tensorflow训练的模型在java中的使用 4. ...
- 基于DarkNet和 OpenCV的 YOLOv3 训练雪人检测模型
下载样例 opencv- yolo3代码雪人检测处理. GitHub git clone https://github.com/BillyLearn/opecv-yolo3-snowman.git 下 ...
最新文章
- spoolsv.exe占CPU100% 的解决方法
- pycharm控制台调试程序
- Python操作Redis中的hash
- luogu1355 神秘大三角
- arm ida 伪代码 安卓 符号表_IDA 制作 sig文件 gdb 导入符号表
- pdf 改变页面大小 python_python – 裁剪.pdf文件的页面
- Python使用递归法和函数式编程计算整数各位之和
- 沉睡两三年,醒来又一春
- php输出内容到页面,php实时输出内容
- spark笔记之Scala中的协变、逆变、非变
- 计算机体系结构实验1——计算机性能评测
- 计量经济学笔记2---最大似然估计
- SPSS篇—卡方检验
- OpenCv图像处理实战——银行卡卡号识别
- Kubernetes(k8s) 对象使用
- 软件测试职位概要,系统测试工程师职位描述
- 初识 GitHub · 简介篇
- win10计算机里的工具在哪里设置,win10系统桌面上添加自带日历小工具的设置办法...
- Alist挂载百度网盘
- 出大事了!IBM的数仓项目黄了,赔了好几亿!
热门文章
- java 装饰模式(大话设计模式)
- 使用jQuery实现图书菜单导航栏
- 买蓝牙耳机什么牌子好用?平价好用的蓝牙耳机推荐
- 跟我学SpringBoot之Logging
- 如何利用Citespace和vosviewer既快又好地写出高质量的论文及快速锁定热点和重点文献进行可视化分析?
- LeetCode1005.Maximize Sum Of Array After K Negations(K 次取反后最大化的数组和)
- 关于联想电脑亮度无法调节的问题
- C#图解教程 第二十五章 其他主题
- 2022-2027年中国数码印花行业市场调研及未来发展趋势预测报告
- echarts---多个柱子一组的柱状图 使用