首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SSD目标检测】3:训练自己的数据集「建议收藏」

【SSD目标检测】3:训练自己的数据集「建议收藏」

作者头像
全栈程序员站长
发布于 2022-11-01 08:09:05
发布于 2022-11-01 08:09:05
3K00
代码可运行
举报
运行总次数:0
代码可运行

前言:

上两章已经详细介绍了SSD目标检测(1):图片+视频版物体定位(附源码)SSD目标检测(2):如何制作自己的数据集(详细说明附源码)。由于SSD框架是开源的代码,自然有很多前辈研究后做了改进。我也不过是站在前辈的肩膀上才能完成这篇博客,在这里表示感谢。 这一章就是讲解如何使用自己的数据集,让SSD框架识别。

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

申明:

  1. 本博客用的测试数据集在这,只有20张标记图片。并不包含最后训练得到的模型。测试数据集只是测试程序的可行性,数据规模很小,有需要的同学自己下载。
  2. 博主没有物体检测的项目需求,本篇博客只是博主闲暇无聊研究如何用自己的数据集外测SSD,写博客的初衷一是为了记录二也是为后来人填坑——效果好坏受算法结构、受数据集、受训练次数因素影响,留言板处因为你的结果表现不优良而无视博主无偿付出的人,我劝你善良。

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

行文说明:

要用SSD训练自己的数据集,首先要知道怎样制作自己的数据集,上一章已经有详细的介绍。有了准备好了的数据集后,再怎样调整代码可以使SSD框架运行得到结果,这一章都有详细介绍。所以行文大致分如下三个部分:

  1. 第一部分:SSD目标检测(2):如何制作自己的数据集(详细说明附源码)
  2. 第二部分:SSD框架细节调整
  3. 第三部分:模型展示

在本文中,笔者的操作系统是win10,用的IDE是PyCharm,python3.6 + GTX1060 + cuda9 + cudnn7,在此情况下以下的步骤都是运行完好。Linux系统下笔者也成功运行,只是小部分实现的方式不相同,这里不做详细讲解,还望包涵。

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

一、SSD框架细节调整说明

1、前期准备工作

第一步:先将SSD框架下载到本地,解压出来;SSD源码下载

第二步:在解压出来的主目录下依次创建tfrecords_train_modelVOC2007文件夹,再将之前在SSD目标检测(2):如何制作自己的数据集(详细说明附源码)中制作的三个文件夹AnnotationsImageSetsJPEGImages全都拖入VOC2007文件夹内;

第2.5步:为方便操作不易混淆,请在PyCharm里建立工程;得到的截图如下,截图说明如下:

  1. 请注意红色框VOCxxx使用的是具体的名字,不过一般都是VOC2007
  2. 目录对应的从属关系不要出错
  3. tfrecords_文件夹是用来存储.tfrecords文件(后面有程序可以直接生成)
  4. 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文件;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--dataset_name=pascalvoc
--dataset_dir=./VOC2007/
--output_name=voc_2007_train
--output_dir=./tfrecords_

Jetbrains全家桶1年46,售后保障稳定

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文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--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行,导入的新模型的名称是否正确

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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
reuse = True if 'ssd_net' in locals() else None
# 调出基于VGG神经网络的SSD模型对象,注意这是一个自定义类对象
ssd_net = ssd_vgg_300.SSDNet()
# 得到预测类和预测坐标的Tensor对象,这两个就是神经网络模型的计算流程
with slim.arg_scope(ssd_net.arg_scope(data_format=data_format)):
predictions, localisations, _, _ = ssd_net.net(image_4d, is_training=False, reuse=reuse)
# 导入新训练的模型参数
ckpt_filename = '../train_model/model.ckpt-xxx'   # 注意xxx代表的数字是否和文件夹下的一致
# ckpt_filename = '../checkpoints/VGG_VOC0712_SSD_300x300_ft_iter_120000.ckpt'
isess.run(tf.global_variables_initializer())
saver = tf.train.Saver()
saver.restore(isess, ckpt_filename)
# 在网络模型结构中,提取搜索网格的位置
# 根据模型超参数,得到每个特征层(这里用了6个特征层,分别是47891011)的anchors_boxes
ssd_anchors = ssd_net.anchors(net_shape)
""" 每层的anchors_boxes包含4个arrayList,前两个List分别是该特征层下x,y坐标轴对于原图(300x300)大小的映射 第三,四个List为anchor_box的长度和宽度,同样是经过归一化映射的,根据每个特征层box数量的不同,这两个List元素 个数会变化。其中,长宽的值根据超参数anchor_sizes和anchor_ratios制定。 """
# 主流程函数
def process_image(img, select_threshold=0.6, nms_threshold=.01, net_shape=(300, 300)):
# select_threshold:box阈值——每个像素的box分类预测数据的得分会与box阈值比较,高于一个box阈值则认为这个box成功框到了一个对象
# nms_threshold:重合度阈值——同一对象的两个框的重合度高于该阈值,则运行下面去重函数
# 执行SSD模型,得到4维输入变量,分类预测,坐标预测,rbbox_img参数为最大检测范围,本文固定为[0,0,1,1]即全图
rimg, rpredictions, rlocalisations, rbbox_img = isess.run([image_4d, predictions, localisations, bbox_img],
feed_dict={ 
img_input: img})
# ssd_bboxes_select()函数根据每个特征层的分类预测分数,归一化后的映射坐标,
# ancohor_box的大小,通过设定一个阈值计算得到每个特征层检测到的对象以及其分类和坐标
rclasses, rscores, rbboxes = np_methods.ssd_bboxes_select(
rpredictions, rlocalisations, ssd_anchors,
select_threshold=select_threshold, img_shape=net_shape, num_classes=21, decode=True)
""" 这个函数做的事情比较多,这里说的细致一些: 首先是输入,输入的数据为每个特征层(一共6个,见上文)的: rpredictions: 分类预测数据, rlocalisations: 坐标预测数据, ssd_anchors: anchors_box数据 其中: 分类预测数据为当前特征层中每个像素的每个box的分类预测 坐标预测数据为当前特征层中每个像素的每个box的坐标预测 anchors_box数据为当前特征层中每个像素的每个box的修正数据 函数根据坐标预测数据和anchors_box数据,计算得到每个像素的每个box的中心和长宽,这个中心坐标和长宽会根据一个算法进行些许的修正, 从而得到一个更加准确的box坐标;修正的算法会在后文中详细解释,如果只是为了理解算法流程也可以不必深究这个,因为这个修正算法属于经验算 法,并没有太多逻辑可循。 修正完box和中心后,函数会计算每个像素的每个box的分类预测数据的得分,当这个分数高于一个阈值(这里是0.5)则认为这个box成功 框到了一个对象,然后将这个box的坐标数据,所属分类和分类得分导出,从而得到: rclasses:所属分类 rscores:分类得分 rbboxes:坐标 最后要注意的是,同一个目标可能会在不同的特征层都被检测到,并且他们的box坐标会有些许不同,这里并没有去掉重复的目标,而是在下文 中专门用了一个函数来去重 """
# 检测有没有超出检测边缘
rbboxes = np_methods.bboxes_clip(rbbox_img, rbboxes)
rclasses, rscores, rbboxes = np_methods.bboxes_sort(rclasses, rscores, rbboxes, top_k=400)
# 去重,将重复检测到的目标去掉
rclasses, rscores, rbboxes = np_methods.bboxes_nms(rclasses, rscores, rbboxes, nms_threshold=nms_threshold)
# 将box的坐标重新映射到原图上(上文所有的坐标都进行了归一化,所以要逆操作一次)
rbboxes = np_methods.bboxes_resize(rbbox_img, rbboxes)
return rclasses, rscores, rbboxes
# 测试的文件夹
path = '../demo/'
image_names = sorted(os.listdir(path))
# 文件夹中的第几张图,-1代表最后一张
img = mpimg.imread(path + image_names[-1])
rclasses, rscores, rbboxes = process_image(img)
# visualization.bboxes_draw_on_img(img, rclasses, rscores, rbboxes, visualization.colors_plasma)
visualization.plt_bboxes(img, rclasses, rscores, rbboxes)

结果展示:这是我自己拍的照片,得到的识别效果还算勉强吧(请自动忽略我那性感的手毛!)

如果你的测试结果是下面这样的:

导致的原因:

  1. 训练次数太少,loss过高——解决方法除了优化数据集外,就是增大训练次数(要明白谷歌公布的模型都是在大型集群上训练好多天的结果,我们就在GTX1060单显卡上训练4.8W次就想出非常好的结果?偶然的成功比失败更可怕,而且想弯道超谷歌不太可能吧!)
  2. 另外上面程序65行的select_thresholdnms_threshold参数你也可以做调整;观察下图可以发现误标框框的预测值都小于0.55,而唯一正确的框框预测值等于0.866。所以认真理解上面程序66、67行我写的注释,对你的问题会有帮助;

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—- 本博客用的测试数据集在这,只有20张标记图片。并不包含最后训练得到的模型。 申明:测试数据集只是测试程序的可行性,数据规模很小,有需要的同学自己下载。—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

如有不明白,欢迎留言咨询!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200771.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
7.SSD目标检测之一:运行SSD模型
需要在跟踪模型的前面把检测模型加进去,传统使用一些背景建模和轨迹建模的方式来做,对于动摄像头以及复杂背景的适应性都比较差,所以考虑用深度学习的方法来做。我以前也只是大概看过这些东西,具体动手只做过分类,并没有搞过检测,所以找到一篇SSD训练自己数据的参考,自己也来实现一下。 参考:SSD目标检测 SSD的原理介绍可以参见:SSD原理介绍
和蔼的zhxing
2018/11/09
3.9K2
9.SSD目标检测之三:训练失败记录(我为什么有脸写这个……)
这个大概折腾了三四天,反正我能想到改的地方都改了,笔记本上试过了,宿舍的电脑上也试过了,反正就是不行,我也没什么办法了,后面就转向YoloV3了。尽管失败了,还是记录一下。 我具体怎么做的就写在下面:
和蔼的zhxing
2018/12/06
1.5K0
9.SSD目标检测之三:训练失败记录(我为什么有脸写这个……)
python开发:基于SSD下的图像内容识别(二)
感谢 @zcl1122指出的倒数第三节代码中的i错误的被简书转行成大写的I的问题。
sladesal
2018/08/27
2.3K1
python开发:基于SSD下的图像内容识别(二)
目标检测算法之SSD
作者:叶 虎 编辑:祝鑫泉 前言 目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:(1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归
机器学习算法工程师
2018/03/06
15.6K0
目标检测算法之SSD
使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
本文以如何识别马路上的行人、车辆为主题,介绍了基于 Tensorflow 的 SSD 模型如何应用在物体识别定位项目中。
集智
2018/01/15
2.6K2
使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
睿智的目标检测23——Pytorch搭建SSD目标检测平台
SSD是一种非常优秀的one-stage目标检测方法,one-stage算法就是目标检测和分类是同时完成的,其主要思路是利用CNN提取特征后,均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,物体分类与预测框的回归同时进行,整个过程只需要一步,所以其优势是速度快。 但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。 SSD的英文全名是Single Shot MultiBox Detector,Single shot说明SSD算法属于one-stage方法,MultiBox说明SSD算法基于多框预测。
全栈程序员站长
2022/07/02
2.2K0
睿智的目标检测23——Pytorch搭建SSD目标检测平台
基于PaddlePaddle实现的目标检测模型SSD
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO V1又有明显的mAP优势。本开源是基于PaddlePaddle实现的SSD,参考了PaddlePaddle下的models的ssd ,包括MobileNetSSD,MobileNetV2SSD,VGGSSD,ResNetSSD。使用的是VOC格式数据集,同时提供了预训练模型和VOC数据的预测模型。
夜雨飘零
2020/06/02
1.2K0
基于PaddlePaddle实现的目标检测模型SSD
SSD源码解析
- SSD理论总结(SSD: Single Shot MultiBox Detector)
机器学习算法工程师
2018/07/27
3.7K0
SSD源码解析
【目标检测】SSD目标检测
场景文字识别 目标检测任务的目标是给定一张图像或是视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。对于人类来说,目标检测是一个非常简单的任务。然而,计算机能够“看到”的仅有一些值为0 ~ 255的矩阵,很难解图像或是视频帧中出现了人或是物体这样的高层语义概念,也就更加难以定位目标出现在图像中哪个区域。与此同时,由于目标会出现在图像或是视频帧中的任何位置,目标的形态千变万化,图像或是视频帧的背景千差万别,诸多因素都使得目标检测对计算机来说是一个具有挑战性的问题。 【目标检测】 SSD目标
用户1386409
2018/04/02
4.5K1
【目标检测】SSD目标检测
8.SSD目标检测之二:制作自己的训练集
最近秋色甚好,一场大风刮散了雾霾,难得几天的好天气,周末回家在大巴上看着高速两旁夕阳照射下黄澄澄的树叶,晕车好像也好了很多。 特地周六赶回来为了周末去拍点素材,周日天气也好,去了陕师大拍了照片和视频。 说正经的,如何来制作数据集。
和蔼的zhxing
2018/12/06
6791
【目标检测】YOLOX训练王者荣耀数据集
最近想跑一下旷世开源的YOLOX,本想着属于YOLO系列,代码大致都和YOLOv5差不多,没想到代码整体差异还是挺大的,跑通的过程中踩了不少坑,这篇就来记录一下整个流程。
zstar
2022/09/23
1.2K0
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
2020年6月10日,Ultralytics在github上正式发布了YOLOv5。YOLO系列可以说是单机目标检测框架中的潮流前线了,YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s(最小)、YOLOv5m、YOLOv5l、YOLOv5x(最大)。目前v6.0版本又新增一层YOLOv5n模型,代替YOLOv5s成为最小模型,在所有模型中速度更快但精度也更低。
全栈程序员站长
2022/07/01
5.4K0
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
从零开始学Pytorch(十七)之目标检测基础
目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边缘从而更准确地预测目标的真实边界框(ground-truth bounding box)。不同的模型使用的区域采样方法可能不同。这里我们介绍其中的一种方法:它以每个像素为中心生成多个大小和宽高比(aspect ratio)不同的边界框。这些边界框被称为锚框(anchor box)。我们将在后面基于锚框实践目标检测。
墨明棋妙27
2022/09/23
1.2K0
零基础入门深度学习(十一):目标检测之YOLOv3算法实现下篇
本课程是百度官方开设的零基础入门深度学习课程,主要面向没有深度学习技术基础或者基础薄弱的同学,帮助大家在深度学习领域实现从0到1+的跨越。从本系列课程中,你将学习到:
用户1386409
2020/02/19
1.3K0
目标检测模型从训练到部署!
目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。目标检测已应用到诸多领域,比如如安防、无人销售、自动驾驶和军事等。在许多情况下,运行目标检测程序的设备并不是常用的电脑,而是仅包含必要外设的嵌入式设备。别看嵌入式设备简陋,但在上面照样能够跑程序,实现我们的想法。设计一个嵌入式AI产品产品,一般会首先考虑成本,在有限的成本内充分利用硬件的性能。因此,不同高低性能的硬件使用场景各不同。
Datawhale
2022/02/17
1.6K0
目标检测模型从训练到部署!
目标检测算法之SSD代码解析(万字长文超详细)
前面的推文已经介绍过SSD算法,我觉得原理说的还算清楚了,但是一个算法不深入到代码去理解是完全不够的。因此本篇文章是在上篇SSD算法原理解析的基础上做的代码解析,解析SSD算法原理的推文的地址如下:https://mp.weixin.qq.com/s/lXqobT45S1wz-evc7KO5DA。今天要解析的SSD源码来自于github一个非常火的Pytorch实现,已经有3K+星,地址为:https://github.com/amdegroot/ssd.pytorch/
BBuf
2019/12/04
5.5K0
目标检测算法之SSD代码解析(万字长文超详细)
睿智的目标检测29——Keras搭建YoloV4目标检测平台
YOLOV4是YOLOV3的改进版,在YOLOV3的基础上结合了非常多的小Tricks。 尽管没有目标检测上革命性的改变,但是YOLOV4依然很好的结合了速度与精度。 根据上图也可以看出来,YOLOV4在YOLOV3的基础上,在FPS不下降的情况下,mAP达到了44,提高非常明显。
全栈程序员站长
2022/09/12
6670
睿智的目标检测29——Keras搭建YoloV4目标检测平台
Github 项目 - YOLOV3 的 TensorFlow 复现
原文:Github 项目 - YOLOV3 的 TensorFlow 复现 - AIUAI
AIHGF
2019/02/27
4.5K0
使用YOLOv5模型进行目标检测!
目标检测是计算机视觉领域的一大任务,大致分为一阶段目标检测与两阶段目标检测。其中一阶段目标检测模型以YOLO系列为代表。最新的YOLOv5在各个数据集上体现出收敛速度快、模型可定制性强的特点,值得关注。本文主要讲解如何从零训练自己的YOLOv5模型与一些重要参数的含义。
Datawhale
2021/07/12
11.5K0
使用YOLOv5模型进行目标检测!
用YOLOv5模型识别出表情!
本文整体思路如下。提示:本文含完整实践代码,代码较长,建议先看文字部分的实践思路,代码先马后看
Datawhale
2021/09/22
1.3K0
推荐阅读
相关推荐
7.SSD目标检测之一:运行SSD模型
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档