TensorFlow+SSD编程实战及模型优化(一)

一.SSD模型详细介绍

1背景:Single Shot MultiBox Detector (one-stage方法)

.Wei Liu在ECCV 2016提出

.端到端的训练,不存在候选框提取这个过程,采用anchor机制

.直接回归目标类别和位置

.不同尺度的特征图上进行预测

2.网络框架

每一个方格为一个卷积层 ,主干网络为VGGNet,将VGG-16最后两个fc层替换为两个卷积层,在经过多次下采样,6个连线对应6种特征图,多尺度Feature Map预测,在检测层对目标区域的目标类别和坐标的预测,定义Default bounding boxes来完成类别分数,偏移量的预测。

3.Anchor

这里的每个正方形格子都代表了当前feature map的一个点 ,anchor就是指特征图(包含了多通道)上的每一个点,每个点我们会将他映射到原图中,1个anchor对应多个region的中心点,多个region通过采取不同尺寸和不同长宽比来提取,具体提取哪些区域呢,我们通过两个参量(scale和长宽比)来决定。

4.Default box

假设一个特征图有m*n个anchor,每个单元对应k个default box,每个default box预测c个类别概率分布和4个坐标,输出有(c+4)*k*m*n个值

实际选择的default box称为Prior box

5.损失函数

分类损失(softmax)+回归损失(Smootn-L1)

6.样本构造

.正样本:1.从GT box出发找到最匹配的prior box放入候选正样本集

                  2.从prior box集出发,寻找与GT box满足IOU>0.5的最大prior box放入候选正样本集

.负样本:难例挖掘(难分的样本,常用方法为OHEM),正负样本比1:3

7.数据增强

(1)随机采样多个区域,与物体之间最小的jaccard overlap(IOU)为:0.1,0.3,0.5,0.7与0.9

(2)采样的区域比例是【0.3,1.0】,aspect ratio(长宽比) 在0.5或2

(3)GTbox中心在采样区域中且面积大于0

(4)Resize到固定大小

(5)以0.5的概率随机的水平翻转

二.TensorFlow+SSD环境搭建

1.安装TensorFlow-gpu版本1.12以上;下载框架:https://github.com/tensorflow/models/tree/master/research/object_detection;安装说明:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md

按照上面的步骤安装

因为我用的是tf1.13.1

说一下我测试遇到的错误:

解决:用pycharm打开mobilenet.py文件,修改:

之后在research文件路径下运行python3 object_detection/builders/model_builder_test.py

出现以下结果,说明环境装好:

三.人脸检测数据清洗与数据打包

我们使用WIDER FACE数据集,由香港中文大学提出的,包括32203个图像和393703个人脸图像,有在尺度,姿势,遮挡,表情,装扮,光照变化的图像,从61个事件中提取的,对于每个事件类别,选取其中的40%作为训练集,10%用于交叉验证,50%作为测试集

对于数据打包呢,我们首先转化为Passcal VOC格式,再转化为TFrecord

Passcal VOC

主要有三个重要的文件夹:Annotations,ImageSets和JPEGImages

在Annotations和JPEGImages文件夹下分别存放标注信息和图片,两文件的命名是相同的,只是格式不同,Annotation会指向JPEGImages下的图片

在ImageSets存放着我们训练和测试要用到的文件列表,我们会根据文件列表将数据集划分为训练集,测试集和验证集

下载数据集:http://shuoyang1213.me/WIDERFACE/

下载下来如下:

其中标注文件在wider_face_split.zip中,打开压缩包:

打开其中一个标注信息(这里打开列表中第5个文件):

第一行是图片的路径,第二行是当前图片人脸的个数,第三行的前4个值(前两个是左上角的坐标,后两个是人脸框的大小)是人脸框的坐标信息,后面6个值对应着

我们会根据后面6个值进行清洗,去掉一些样本,使得我们的模型对当前的任务更加匹配

接下来我们打开WIDER_train文件下的images文件:

一共61个文件,对应到61个不同的场景

接下来我们需要将图片和真值文件转化为VOC格式数据集

完整代码我已上传:https://download.csdn.net/download/zjc20172333086/12456618

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是ESP32+SSD1306实现简单烟花动画的代码,你可以参考一下: 首先,你需要准备好ESP32和SSD1306 OLED屏幕,并在Arduino IDE中安装ESP32和SSD1306的库。 然后,打开Arduino IDE,新建一个空白文件,命名为firework.ino,将以下代码复制粘贴到文件中: ```C++ #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED屏幕宽度 #define SCREEN_HEIGHT 64 // OLED屏幕高度 #define OLED_RESET -1 // OLED屏幕复位引脚 #define SCREEN_ADDRESS 0x3C // OLED屏幕I2C地址 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); // 初始化OLED屏幕 display.clearDisplay(); // 清空屏幕 display.display(); } void loop() { firework(10, 10, 5); // 在(10,10)位置绘制半径为5的烟花 delay(1000); // 等待1秒 } void firework(int x, int y, int r) { int colors[6][3] = { // 定义颜色数组,用于绘制烟花 {255, 255, 255}, // 白色 {255, 0, 0}, // 红色 {0, 255, 0}, // 绿色 {0, 0, 255}, // 蓝色 {255, 255, 0}, // 黄色 {255, 0, 255} // 紫色 }; for(int i=0; i<6; i++) { // 循环绘制6个小圆点 display.fillCircle(x, y, r, SSD1306_WHITE); // 绘制白色小圆点 display.fillCircle(x, y, r-1, colors[i][0]<<16 | colors[i][1]<<8 | colors[i][2]); // 绘制彩色小圆点 display.display(); // 更新屏幕显示 delay(100); // 等待100毫秒 } } ``` 代码中,我们使用Adafruit_SSD1306库实现了OLED屏幕的控制,通过firework函数绘制烟花动画。在loop函数中,我们调用firework函数在屏幕上绘制一个半径为5的烟花,然后等待1秒。 firework函数中,我们使用一个颜色数组来绘制彩色烟花,循环绘制6个小圆点,并依次填充不同的颜色,最后更新屏幕显示。 完成代码编写后,将ESP32连接到电脑上,选择正确的开发板和端口,编译并上传代码。屏幕上将会显示一个简单的烟花动画。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值