yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析

来自华盛顿大学的 Joseph Redmon 和 Ali Farhadi 提出的YOLOv3 通过在 YOLO 中加入设计细节的变化,这个新模型在取得相当准确率的情况下实现了检测速度的很大提升,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。

这里附上 YOLOv3 的论文地址:

本文的项目作者是 wizyoung,原 GitHub 项目地址为:

1. 介绍

本文将介绍 YOLO3 的完整 TensorFlow 实现。可在自己的数据集上进行完整的训练和验证操作,pipeline 完整。其特点包括:

高效的 tf.data 管道

权重转换

GPU 提速,无限制

完整的训练管道

使用 kMeans 算法来选择 anchor boxes

多 GPU 同步训练

2. 需求

tensorflow >= 1.8.0(不排除低版本也能工作)

opencv-python

3. 权重转换

预训练的 darknet 权重文件可从下方链接下载:

https://pjreddie.com/media/files/yolov3.weights

把下载好后的文件放在 ./data/darknet_weights/ 目录下,运行下面的命令:

然后,转换后的 TensorFlow checkpoint 文件将被保存在 ./data/darknet_weights/ 目录下。

4. 运行 demos

在 ./data/demo_data/ 目录里有一些图像和视频的 demos 可以运行。

单个图像测试 demo:

视频测试 demo:

结果展示:

5. 运行速度

图片尺寸为 416×416,论文实现与我的模型运行速度比较如下:

为什么会这么快呢?我们看一下论文中 ImageNet 分类情况:

6. 模型结构

为了更好地理解模型体系结构,可以参考下图:

7. 训练

首先是数据准备,分为三步。

1)annotation file

在 ./data/my_data/ 目录下生成 train.txt/val.txt/test.txt 文件。txt 文件中一行表示一张图片,形式为:图片绝对路径 + box_1 + box_2 + … + box_n。Box 的形式为:label_index + x_min + y_min + x_max + y_max,原始坐标为图片左上角。

例如:

xxx/xxx/1.jpg 0 453 369 473 391 1 588 245 608 268

xxx/xxx/2.jpg 1 466 403 485 422 2 793 300 809 320

注意:每个 txt 文件最后一行为空白行。

2)class_names file

在 ./data/my_data/ 目录下生成 data.names 文件,每一行代表一个类别名称。例如:

bird

person

bike

3)prior anchor file

使用 kMeans 算法来选择 anchor boxes:

然后,你将得到 9 个 anchors 和评价 IOU,把 anchors 保存在 txt 文件中。

准备完数据之后就可以开始训练了。

使用 train.py 文件,函数参数如下:

8. 评价

使用 eval.py 来评估验证集和测试集,函数参数如下:

函数返回 loss、召回率 recall、精准率 precision,如下所示:

recall: 0.927, precision: 0.945

total_loss: 0.210, loss_xy: 0.010, loss_wh: 0.025, loss_conf: 0.125, loss_class: 0.050

9. 其它技巧

训练的时候可以尝试使用下面这些技巧:

Data augmentation:使用 ./utils/data_utils.py 中的 data_augmentation 方法来增加数据。

像 Gluon CV 一样混合和 label 平滑。

正则化技巧,例如 L2 正则化。

多尺度训练:你可以像原稿中的作者那样定期改变输入图像的尺度(即不同的输入分辨率)。

完整代码请见 GitHub:

参考文献:

https://github.com/YunYang1994/tensorflow-yolov3

https://github.com/qqwweee/keras-yolo3

https://github.com/eriklindernoren/PyTorch-YOLOv3

https://github.com/pjreddie/darknet

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

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

相关文章

C++ inline 函数简介

1.inline 函数简介inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。2.编译器对 inline 函数的处理办法编译器在编译阶段完成对 inline 函数的处理,即对 inline 函数的调用替换为函数的本体。但 in…

intellij ide_UltraESB的首选IDE – IntelliJ IDEA

intellij ide在AdroitLogic,我们长期以来一直在使用IntelliJ IDEA进行开发。 它是Java和相关语言/技术的最佳IDE(它可能也是许多其他语言的选择,但我的经验主要是Java和相关技术)。 Groovy和IDEA的Grails的集成很棒。 通过自动发…

install npm 到某个文件下执行_如何将npm安装到指定目录?

从npm版本3.8.6开始,您可以使用npm install --prefix ./install/here 安装在指定的目录中。node_modules即使node_modules较高层次结构中已存在目录,NPM 也会自动创建文件夹。您还可以package.json在当前目录中拥有a ,然后使用以下--prefix选…

android 启动界面位置,android 修改默认启动项launcher(一)

需求:不去掉系统自带launcher的前提下,默认启动指定应用作为launcher现象:应用中带有属性"android.intent.category.HOME",开机会弹出选择界面思路:跳过选择界面,直接选中要启动的launcher并直接…

C++抽象类

概念在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征对问题领域进行分…

iview select选中值取值_iView的Select选择框

目录在此先列出解决了那些问题,以防读者看完了没有用处:1、示例,最基础的使用方法2、传参,传多个值的方式3、默认值4、清空重置无效5、可搜索的用法及如何限制搜索字符长度一、示例html:{{item.name}}js:data: {formSend: {name: …

tibco_TIBCO产品的微服务和DevOps

tibco大家都在谈论微服务 ,这些天。 您可以在数百篇文章和博客文章中读到很多有关微服务的信息。 马丁福勒 ( Martin Fowler )的文章是一个很好的起点,该文章引发了有关这种新架构概念的大量讨论。 另一个不错的资源是独立于供应…

android 冰箱 活动,Android活动的使用

创建第一个应用:步骤一:1、Activity :一个页面2、Layout :页面布局3、Res:页面内的资源注意:所有的Activity都是继承与android.app.activity类,通过override实现。简单理解Activity 代表一个用户所能看到的…

C atoi函数

作用atoi()函数将数字格式的字符串转换为整数类型。例如,将字符串1253124127转换成数字1253124127。注意首要注意atoi函数可以转化如下这种字符串1fdafhdjfhkas关于参数的注意事项,atoi()函数的参数是要转换的字符串。该字符串的格式为[空格][符号][数字…

python lock_python多线程Lock和RLock的区别

python多线程Lock和RLock的区别1. 两种锁的不同1.1 定义为了确保对共享资源的访问,python提供了两种锁,一个是上一篇提到的Lock,还有一个就是RLock,他们的区别在于:Lock是可用的最低级别的同步指令,一个线程…

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8

开式蓄冷罐与闭式蓄冷罐借助Java 8 ,已实现了许多新的语言改进,以简化开发人员的生活。 在我看来, Java 8的最大优点之一是,在某些情况下,已开发的代码看起来比使用以前的方法更漂亮,我指的是Lambdas和Meth…

C 预处理指令

C 预处理指令C语言、C 语言的预处理器。用于在编译器处理程序之前预扫描源代码,完成头文件的包含, 宏扩展, 条件编译, 行控制(line control)等操作编译的四个阶段C语言标准规定,预处理是指前4个编译阶段(phases of tra…

将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中

将HTML字符转换为DOM节点并动态添加到文档中将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术。字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题:1 字符串转换为HTML DOM节点的基本方法及…

python 的csr_python的高级数组之稀疏矩阵

稀疏矩阵的定义:具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的…

通过Spring集成进行消息处理

Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。 …

鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品

华为今日官宣,6月2日20:00,将举行鸿蒙操作系统及华为全场景新品发布会。【1、鸿蒙OS2.0】本次发布会的重点将是推出华为今年的重点战略产品——鸿蒙系统。届时鸿蒙OS2.0正式版将陆续推送给手机用户。5月中旬时华为就先行推送了一波鸿蒙OS开发…

C语言结构体字节对齐

默认字节对齐C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不使用宏#pragma…

shell shocked伴奏版_Shell Shocked

【游戏简介】Shell Shocked是一款全新卡牌对战题材的策略类手机游戏。游戏有着丰富的卡牌种类,极具策略性的玩法。游戏中玩家可以将进行真人游戏对战,随机抽取卡牌对战。玩家必须采取适合的策略,才有可能赢取游戏。 游戏操作简单,…

meetup_使用RxNetty访问Meetup的流API

meetup本文将涉及多个主题:响应式编程,HTTP,解析JSON以及与社交API集成。 完全在一个用例中:我们将通过非夸张的RxNetty库实时加载和处理新的metup.com事件,结合Netty框架的强大功能和RxJava库的灵活性。 Meetup提供了…

html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例

HTML5对于表单有着极大程度的优化,无论是语义,小部件,还是数据格式的验证。我猜你肯定会以浏览器兼容作为借口不愿意使用这些“新功能”,但这绝不应该成为使你停滞不前的原因,况且还有像Modernizr和ployfill这样的工具…