YOLOv3实现鱼类目标检测

YOLOv3实现鱼类目标检测

我将以一个项目实例,记录如何用YOLOv3训练自己的数据集。

在开始之前,首先了解一下YOLO系列代表性的DarkNet网络。

如下图所示,是YOLOv3中使用的DarkNet-53的结构,几种核心结构是:

DBL: 是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。

resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。

concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

下图是v3著名的Darknet53网络图,它融合了YOLOv2, Darknet19,以及其他新型的残差网络,由连续的3x3和1x1卷积层组合而成,一共有53个卷积层。

任务:鱼类目标检测

数据集描述:3类(tinca,gold_fish,stingray),900张图片

数据集格式:VOC

  1. 准备工作:
  • 进入YOLO官网,跑通Demo

YOLO: Real-Time Object Detection​pjreddie.com​编辑

  • 准备自己的数据集 ,以VOC为例,如果只进行目标检测,下列几个文件夹要准备好,将图片保存在VOC的JPEGImages目录下

  • 利用工具进行图片标注并生成XML文件,将用LabelImg标注好得到的XML文件放到Annotations文件夹下。注意,需要和图片名相同,标注图片类别时要统一用小写字母,否则会出错

这样,VOC格式的数据集制作基本完成。

2. 开始调试模型

  • 修改Makefile

*建议GPU和CUDNN都改为1,会极大地加快训练速度,OPENCV可以有选择的开

*修改完成后记得要重新make才能生效

  • 修改voc_label.py
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]  #替换为自己的数据集
classes = ["tinca", "gold_fish", "stingray"]     #修改为自己的类别def convert(size, box):dw = 1./(size[0])dh = 1./(size[1])x = (box[0] + box[1])/2.0 - 1y = (box[2] + box[3])/2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)
def convert_annotation(year, image_id):in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))  #将数据集放于当前目录下out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')tree=ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult)==1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for year, image_set in sets:if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):os.makedirs('VOCdevkit/VOC%s/labels/'%(year))image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()list_file = open('%s_%s.txt'%(year, image_set), 'w')for image_id in image_ids:list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))convert_annotation(year, image_id)list_file.close()   
os.system("cat 2007_train.txt 2007_val.txt > train.txt")     #修改为自己的数据集用作训练
  • python voc_label.py

  • 修改cfg文件中的voc.data
classes= 3    #修改为自己的类别数
train  = /darknet/data/voc/train.txt   #修改为自己的路径 
valid  = /darknet/data/voc/2007_test.txt   #修改为自己的路径
names =/data/voc.names 
backup = /home/learner/darknet/backup   #修改为自己的路径,输出的权重信息将存储其内
  • 修改data/voc.names

*修改为自己数据集的类别名称

  • 下载预训练卷积层权重,放在项目根目录即可
wget https://pjreddie.com/media/files/darknet53.conv.74

*我也把权重文件上传到了网盘,多一种下载选择

链接: https://pan.baidu.com/s/1ZBICNgOQa4DKSKUnA09jVA 提取码: bymq

  • 修改cfg/yolov3-voc.cfg

*一定看清楚修改的网络层数和数值计算方法,而且,训练过程中,要把testing相关注释掉

# Trainingbatch=64subdivisions=32   #每批训练的个数=batch/subvisions,根据自己GPU显存进行修改,显存不够改大一些
# Testing
# batch=1
# subdivisions=1
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1learning_rate=0.001
burn_in=1000
max_batches = 50200  #训练步数
policy=steps
steps=40000,45000  #开始衰减的步数
scales=.1,.1[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky.....[convolutional]
size=1
stride=1
pad=1
filters=24   #filters = 3 * ( classes + 5 )   here,filters=3*(3+5)
activation=linear[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=3    #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1[route]
layers = -4[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky[upsample]
stride=2[route]
layers = -1, 61[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky[convolutional]
size=1
stride=1
pad=1
filters=24    #filters = 3 * ( classes + 5 )   here,filters=3*(3+5)
activation=linear[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=3  #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1[route]
layers = -4[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky[upsample]
stride=2[route]
layers = -1, 36[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky[convolutional]
size=1
stride=1
pad=1
filters=24    #filters = 3 * ( classes + 5 )   here,filters=3*(3+5)
activation=linear[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=3   #修改为自己的类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
  • 开始训练,权重文件会保存在backup文件夹下
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 gpus 0,1,2 #根据自己机器的实际情况选择gpu数

*利用gpu训练的速度非常快,经过20000次以上迭代后,loss差不多就降到0.1以下

  • 测试

*修改cfg/yolov3-voc.cfg中,将training相关注释掉,打开testing开关

./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_26000.weights xxx.jpg’

总结:

YOLO系列是目标检测领域的标志性网络,它速度快,经过几个版本的进化后,在准确率上也有了很多的提升,希望通过我的介绍,能够对YOLO的思想有所了解,也希望能给您更多的启发,有更多的想法建议,欢迎留言交流

任何程序错误,以及技术疑问或需要解答的,请添加

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

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

相关文章

Xamarin截取/删除emoji表情bug解决方案

大家都知道,一个英文1字节,一个汉字2字节,而一个emoji表情4个字节,在有这三种混用的时候,比如app聊天界面,那么删除和截取便成了很头痛的事情。 问题描述 截取导致乱码,如下图: 解…

Web前端开发工程师必读de设计博客

2019独角兽企业重金招聘Python工程师标准>>> Web设计是一个不断变化的领域,因此掌握最新的发展趋势及技术动向对设计师来说非常重要,无论是学习新技术,还是寻找免费资源与工具,设计博客都是很不错的去处。本文向Web前端…

Qt QtCreator 所有版本官方下载地址

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xiezhongyuan07/article/details/79246556 直接跳过输入账号,选择所需版本。废话不多说&…

Tensorflow 神经网络作业手写数字识别 训练、回测准确率

大白话讲解卷积神经网络工作原理,推荐一个bilibili的讲卷积神经网络的视频,up主从youtube搬运过来,用中文讲了一遍。 这篇文章是 TensorFlow 2.0 Tutorial 入门教程的第五篇文章,介绍如何使用卷积神经网络(Convolutio…

React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)

React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示源码注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法。 本文分文三个部分:一、效果…

open×××+Mysql+PAM构建强大的***系统

openMysqlPAM构建强大的***系统本次为新的生产环境部署系统而采用了这个方案,陆续会将实际的生产架构整理出来.由于涉及到公司的各种敏感信息,已经将IP做了替换中途可能有出入 敬请谅解。等我找时间画图出来一并奉上。如果有根本上的问题,请大…

Linux 下 Qt 5.12无法切换中文输入法

无法切换中文输入的原因是当前下载的QtCreator中没有适配当前输入法框架(ibus、fcitx)的动态库 解决方法: 一、安装对应的输入法插件 1、如果是fcitx: ubuntu18.04:sudo apt-get install libfcitx-qt5-dev 拷贝系统路…

微信中通过页面(H5)直接打开本地app的解决方案

简述 微信中通过页面直接打开app分为安卓版和IOS版,两个的实现方式是完全不同的。 安卓版实现:使用腾讯的应用宝,只要配置了“微下载”之后,打开链接腾讯会帮你判断本地是否已经安装了app,如果本地安装就直接打开&am…

GIMP 基本教程

本文主要记录笔者使用GIMP的心得,有些具体操作内容会省略,读者可以酌情阅读,内容较多,建议通过右边目录查看。 GIMP 是高级图片编辑器。 您可以使用它来编辑,增强和修饰照片 和扫描,创建工程图以及制作自己的图像。 它具有大量的专…

iOS通用链接(Universal Links)突然点击无效的解决方案

接上文《微信中通过页面(H5)直接打开本地app的解决方案》已经把iOS搞定并且已经正常能跑了,突然就再也用不了了... 问题描述 测试告诉我,如果从微信打开App之后,点击App右上角的应用网址之后,iOS通用链接就费了,在也…

如何利用shell脚本和client-go实现自己的k8s调度器

调度器介绍 scheduler 是k8s master的一部分,作为插件存在于k8s生态体系。 自定义调度器方式 添加功能重新编译实现自己的调度器(multi-scheduler)scheduler调用扩展程序实现最终调度(Kubernetes scheduler extender&#xff09…

Linux ubuntu安装搜狗输入法

1.下载搜狗输入法的安装包 下载地址为:http://pinyin.sogou.com/linux/,如下图,要选择与自己系统位数一致的安装包, 我的系统是 64 位,所以我下载 64 位的安装包 sogoupinyin_2.2.0.0108_amd64.deb 安装方法: 1.打开命令终端,输入: sudo apt-get install xxx.deb 路径 2.重启电…

React Native顶|底部导航使用小技巧

导航一直是App开发中比较重要的一个组件,ReactNative提供了两种导航组件供我们使用,分别是:NavigatorIOS和Navigator,但是前者只能用于iOS平台,后者在ReactNative0.44版本以后已经被移除了。 好在有人提供了更好的导航…

Linux QT5.12 一种整体界面字体设置的方法及设置PlainTextEdit组件的字体大小方法

1.在Linux QT5.12开发界面时,经常会涉及到界面字体大小的设置,默认字体一般比较小,解决方法如下: 在main函数中添加代码: // // 一种整体界面字体设置的方法: QFont font a.font(); font.setPointSize(14); a.setFont(font); // 2.在L…

Win7电脑,无法把文件保存到桌面上?

今天有用户反映重装了Win7后&#xff0c;文件无法另存到桌面上&#xff0c;解决方法如下&#xff1a;1、在任何地方打开资源管理器&#xff0c;按<Alt><F>键打开资源管理器的菜单&#xff1b;2、选择“工具”的“文件夹选项”&#xff0c;在“导航窗格”里选上“显…

ReactNative常用组件汇总

导航组件react-navigation: https://github.com/react-community/react-navigation 网络请求asios: https://github.com/mzabriskie/axios 设备信息react-native-device-info: https://github.com/rebeccahughes/react-native-device-info 缓存使用react-native-storage: https…

Yolov5训练自己的数据集之制作数据集

在VOC 2018文件夹下有五个文件夹&#xff0c;搜集好的图片放在JPEGImages文件夹下&#xff1b;标注后数据保存在Annotations文件夹下&#xff1b;labels文件夹在数据集的训练时用到&#xff1b;在ImageSets文件夹下有下面三个文件夹&#xff0c;在Main文件夹中有一个train.txt文…

ReactNative布局样式总结

flex number 用于设置或检索弹性盒模型对象的子元素如何分配空间 flexDirection enum(row, row-reverse ,column,column-reverse) flexDirection属性决定主轴的方向&#xff0c;默认是“column”&#xff1a; row&#xff1a;主轴为水平方向&#xff0c;起点在左端row-rev…

Android 线程池对象-ThreadPoolExecutor浅析

本人最近在已经在91&#xff0c;百度应用等渠道上线的个人应用——铃声酷的代码里用到了ThreadPoolExecutor这一线程池对象去处理并发&#xff0c;个人感觉相当的给力啊&#xff01;它是并发实用程序开放源码库 util.concurrent&#xff0c;它包括互斥、信号量、诸如在并发访问…

Linux kubuntu x64系统下解决QT5.12编辑菜单和工具栏不显示图标问题

Linux kubuntu x64系统下发现QT5.12在设计视图下编辑菜单和工具栏显示图标,但是编译运行后发现菜单和工具栏不显示图标,如下图: 我的解决办法是: 1.在QT项目中,菜单和工具栏图标一定要添加到项目资源文件中(在资源编辑器中Add Prefix后,再添加文件,关闭资源编辑器后自动将图标…