【SSD目标检测】3,跟我一起手写EventBus吧

  1. train_model文件夹是用来存储模型的记录与参数的
    这里写图片描述

2、生成.tfrecords文件的代码微调说明

第三步:修改标签项——打开datasets文件夹中pascalvoc_common.py文件,将自己的标签项填入。我之前做的图片标签.xml文件中,就只有一个标签项“watch”,所以要根据你自己数据集实际情况进行修改;
在这里插入图片描述

第四步:修改读取个数、读取方式——打开datasets文件夹中的pascalvoc_to_tfrecords.py文件,

  • 修改67行SAMPLES_PER_FILES的个数;
  • 修改83行读取方式为'rb'
  • 如果你的文件不是.jpg格式,也可以修改图片的类型;这里写图片描述

3、生成.tfrecords文件

第五步:生成.tfrecords文件——打开tf_convert_data.py文件,依次点击:runEdit Configuration,在Parameters中填入以下内容,再运行tf_convert_data.py文件,在面板中得到成功信息,可以在tfrecords_文件夹下看到生成的.tfrecords文件;

--dataset_name=pascalvoc
--dataset_dir=./VOC2007/
--output_name=voc_2007_train
--output_dir=./tfrecords_

这里写图片描述

4、重新训练模型的代码微调说明

第六步:修改训练数据shape——打开datasets文件夹中的pascalvoc_2007.py文件,

  • 根据自己训练数据修改:NUM_CLASSES = 类别数

说明:TRAIN_STATISTICS的数值我并没有深入了解,大于新数据集该标签的总数一般都不会报错。我的数据集是由20张、每张包含一只手表的图片组成,所以下图的值我设定为20,大于20也没有报错,如果你有更精确的想法,请留言告诉大家!
在这里插入图片描述
第七步:修改类别个数——打开nets文件夹中的ssd_vgg_300.py文件,

  • 根据自己训练类别数修改96 和97行:等于类别数+1这里写图片描述

第八步:修改类别个数——打开eval_ssd_network.py文件,

  • 修改66行的类别个数:等于类别数+1
    这里写图片描述

第九步:修改训练步数epoch——打开train_ssd_network.py文件,

  • 修改27行的数据格式,改为'NHWC'
  • 修改135行的类别个数:等于类别数+1
  • 修改154行训练总步数,None会无限训练下去;
  • 说明:60行、63行是关于模型保存的参数;
    这里写图片描述

5、加载vgg_16,重新训练模型

第十步:下载vgg_16模型——下载地址请点击,密码:ge3x;下载完成解压后存入checkpoint文件中;
最后一步:重新训练模型——打开train_ssd_network.py文件,依次点击:runEdit Configuration,在Parameters中填入以下内容,再运行train_ssd_network.py文件

--train_dir=./train_model/
--dataset_dir=./tfrecords_/
--dataset_name=pascalvoc_2007
--dataset_split_name=train
--model_name=ssd_300_vgg
--checkpoint_path=./checkpoints/vgg_16.ckpt
--checkpoint_model_scope=vgg_16
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box
--save_summaries_secs=60
--save_interval_secs=100
--weight_decay=0.0005
--optimizer=adam
--learning_rate=0.001
--learning_rate_decay_factor=0.94
--batch_size=4
--gpu_memory_fraction=0.7

注意:上面是输入参数:

  • --save_interval_secs是训练多少次保存参数的步长;
  • --optimizer是优化器;
  • --learning_rate是学习率;
  • --learning_rate_decay_factor是学习率衰减因子;
  • 如果你的机器比较强大,可以适当增大--batch_size的数值,以及调高GPU的占比--gpu_memory_fraction
  • --model_name:我并没有尝试使用其他的模型做增量训练,如果你有需要,也请留言联系我,我很乐意研究;

若得到下图日志,即说明模型开始训练:
在这里插入图片描述
训练结束可以在train_model文件夹下看到生成的参数文件;
在这里插入图片描述

到这里,训练终于结束了!!!

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

二、结果展示

这是我训练的loss,我的数据集总共就20张图片,进行4.8W次训练用了将近一个小时,我的配置是GTX1060的单显卡;在这里插入图片描述
1、在日志中,选取最后一次生成模型作为测试模型进行测试;
2、在demo文件夹下放入测试图片;
3、最后在notebooks文件夹下建立demo_test.py测试文件,代码如下:
4、注意第48行,导入的新模型的名称是否正确

# -\*- coding:utf-8 -\*-
# -\*- author:zzZ\_CMing CSDN address:https://blog.csdn.net/zzZ\_CMing
# -\*- 2018/07/20; 15:19
# -\*- python3.6
import os
import math
import random
import numpy as np
import tensorflow as tf
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from nets import ssd_vgg_300, ssd_common, np_methods
from preprocessing import ssd_vgg_preprocessing
from notebooks import visualization
import sys

sys.path.append('../')
slim = tf.contrib.slim
# TensorFlow session: grow memory when needed. TF, DO NOT USE ALL MY GPU MEMORY!!!
gpu_options = tf.GPUOptions(allow_growth=True)
config = tf.ConfigProto(log_device_placement=False, gpu_options=gpu_options)
isess = tf.InteractiveSession(config=config)


# 定义数据格式,设置占位符
net_shape = (300, 300)
# 输入图像的通道排列形式,'NHWC'表示 [batch\_size,height,width,channel]
data_format = 'NHWC'
# 预处理,以Tensorflow backend, 将输入图片大小改成 300x300,作为下一步输入
img_input = tf.placeholder(tf.uint8, shape=(None, None, 3))
# 数据预处理,将img\_input输入的图像resize为300大小,labels\_pre,bboxes\_pre,bbox\_img待解析
image_pre, labels_pre, bboxes_pre, bbox_img = ssd_vgg_preprocessing.preprocess_for_eval(
    img_input, None, None, net_shape, data_format, resize=ssd_vgg_preprocessing.Resize.WARP_RESIZE)
# 拓展为4维变量用于输入
image_4d = tf.expand_dims(image_pre, 0)

# 定义SSD模型
# 是否复用,目前我们没有在训练所以为None


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/29b6bfe5e88b6d36328fd25f44ab3893.png)
![img](https://img-blog.csdnimg.cn/img_convert/483964a1b5bdbec424da1d46308b5132.png)
![img](https://img-blog.csdnimg.cn/img_convert/3c7fe82006a739c43102008d87ccc8b3.png)
![img](https://img-blog.csdnimg.cn/img_convert/3087af05523e5523a4ae856eb5f89d26.png)
![img](https://img-blog.csdnimg.cn/img_convert/8464fa7eb7b626f4287911c9ebc5ab11.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/f181f3a2e3904d3c9ec380c2eb745b6f.jpeg)



为了做好运维面试路上的助攻手,特整理了上百道 **【运维技术栈面试题集锦】** ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,**小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。**

![](https://img-blog.csdnimg.cn/img_convert/5591f16c2f7b38afdd77c05d48a8d1ca.png)

本份面试集锦涵盖了

*   **174 道运维工程师面试题**
*   **128道k8s面试题**
*   **108道shell脚本面试题**
*   **200道Linux面试题**
*   **51道docker面试题**
*   **35道Jenkis面试题**
*   **78道MongoDB面试题**
*   **17道ansible面试题**
*   **60道dubbo面试题**
*   **53道kafka面试**
*   **18道mysql面试题**
*   **40道nginx面试题**
*   **77道redis面试题**
*   **28道zookeeper**

**总计 1000+ 道面试题, 内容 又全含金量又高**

*   **174道运维工程师面试题**

> 1、什么是运维?

> 2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

> 3、现在给你三百台服务器,你怎么对他们进行管理?

> 4、简述raid0 raid1raid5二种工作模式的工作原理及特点

> 5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

> 6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

> 7、Tomcat和Resin有什么区别,工作中你怎么选择?

> 8、什么是中间件?什么是jdk?

> 9、讲述一下Tomcat8005、8009、8080三个端口的含义?

> 10、什么叫CDN?

> 11、什么叫网站灰度发布?

> 12、简述DNS进行域名解析的过程?

> 13、RabbitMQ是什么东西?

> 14、讲一下Keepalived的工作原理?

> 15、讲述一下LVS三种模式的工作过程?

> 16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

> 17、如何重置mysql root密码?

[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 中的事件总线 (EventBus) 并不像 Vue 2 中那样直接可用。但是,你仍然可以创建一个类似的全局事件总线,并在应用程序的不同组件之间进行通信。 一种常见的方法是通过创建一个单独的 Vue 实例来实现事件总线。你可以在应用程序的入口文件中创建该实例,并将其导出以供其他组件使用。 下面是一个示例代码,展示了如何在 Vue 3 中实现一个简单的事件总线: ```javascript // event-bus.js import { createApp } from 'vue'; const app = createApp({}); const eventBus = app.config.globalProperties.$eventBus = app.mount('#app'); export default eventBus; ``` 在上面的代码中,我们先创建了一个空的 Vue 应用程序实例 `app`,然后将其作为事件总线 `eventBus` 导出。我们通过 `app.config.globalProperties` 将 `eventBus` 注册为全局属性,这样我们就可以在任何组件中使用它。 然后,在你想要使用事件总线的组件中,你可以通过 `this.$eventBus` 访问该实例,并使用它来发送和接收事件: ```javascript // ComponentA.vue export default { mounted() { this.$eventBus.$emit('eventName', data); } } ``` ```javascript // ComponentB.vue export default { created() { this.$eventBus.$on('eventName', this.handleEvent); }, methods: { handleEvent(data) { // 处理事件数据 } } } ``` 通过上述代码,`ComponentA` 可以通过 `$emit` 方法触发名为 `'eventName'` 的事件,并传递数据。而 `ComponentB` 则通过 `$on` 方法监听该事件,并在事件发生时执行相应的处理函数 `handleEvent`。 这样,你就可以在 Vue 3 中实现一个类似于 Vue 2 中的事件总线。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值