IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> YOLO(2) —— 门外汉的初瞄 -> 正文阅读

[人工智能]YOLO(2) —— 门外汉的初瞄

? ? ? ? 在专业介绍上,网上有一大堆,但真的是直接把门外汉挡门外,让我们这种成为了名副其实的“门外汉”。

基础认识:

????????像我这种探索型的人,看吴恩达的使用,(先前从图像清晰度评价了解到边缘检测,进而了解到“卷积”,只是了解,没有深入学习,但有了直观感受)直接从卷积神经网络开始,然后对其中的重要点有疑问,再向前看前面的视频,再有疑问,再向前。

? ? ? ? 慢慢会发现,虽然YOLO本质上还是神经元那一套,但已经不能直接去替代了解了。

? ? ? ? 看完吴恩达视频中对YOLO说法,再结合其他人的分析和图片说明,YOLOv1整体做的事就是

输入一张448x448的RGB三通道图像数据,划分了7x7个区域,使用分类定位,确认物体中心点在那个区域,则这几个区域再预测输出两种框,每个框包含【每一类物理是否“概率性存在”,如果“概率性存在”,则给出这个“概率”及框出它的边框信息】。然后使用“概率”高的那个框做为结果。

CNN做了什么:

? ? ? ? 在门外汉看来,输入是图像,输出给定了框选信息,那么你得从图像角度说你的算法做了什么。

? ? ? ? 但是呢,“一个师傅”出来的,都是一个模子。不说100%吧,99.99%在解释的时候只会给个论文原图那个的结构,告诉你是几x几x几的数字数据,这几个是什么矩阵数据,估计连他们自己都不知道怎么去对应的图像数据,就只能说几x几x几

? ? ? ? 所以,想要去理解,不可能,还是只能从几x几x几开始。

? ? ? ? YOLO1有24个卷积层,那么一个卷积层是什么

? ? ? ? 视频 卷积的认识--》 卷积的计算 --》 多维卷积 --》 卷积层

边缘检测的卷积 (视频截取)

RGB三通道卷积(视频截取)

?单个卷积层(视频截取)

?

一个简单的CNN网络(视频截取)

????????那么问题来了,每一层卷积层都要有卷积核来卷积操作,这些卷积核具体数值是多少?

? ? ? ? 在视频中有提到,3x3滤波器(卷积核),人工设计的检测边缘类型少,

(网络资源)

需要检测复杂图像时,相应的滤波器也会比较复杂,这时想着把这9个值当参数,让算法去学习记录,最后的学习结果作为滤波器去检测。

? ? ? ? 而在论文中也说明了,使用ImageNet数据集训练前20个卷积层,那么训练结果就应该是每一层的卷积核。

乱入一个matlab上的“胡乱测试”

?

?

?

这里有 double 与 uint8转换的问题

darknet使用C写,那么它是怎么进行卷积的

(网络资源)

(https://github.com/pjreddie/darknet) ?darknet/cfg/yolov1.cfg 中

第一个卷积层 模型参数
[convolutional]
batch_normalize=1 {是否进行BN}
filters=64 {64个卷积核,总7x7x64}
size=7 {每个卷积核大小,总7x7x64}
stride=2 {步幅,在卷积过程中每次移动的像素距离大小}
pad=1 {填充,为了可以更好地识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则pad为多少}
activation=leaky {网络层激活函数,Leaky ReLU}

448 / 7 = 64

该怎么理清关系?filters=64 是指64个卷积核吗?一个卷积核7x7这个是论文图中明确的

? ? 卷积层有多种卷积方式,常见的有五种:Valid、Same、Full、Strided、Fractional_strided,区别在于输出的长宽不同。
? ? ? ? Wcalid = Winput - Wkernel + 1, Hcalid = Hinput - Hkernel + 1
? ? ? ? Wsame = Winput, Hsame = Hinput
? ? ? ? Wcalid = Winput + Wkernel - 1, Hcalid = Hinput + Hkernel - 1
? ? ? ? Wstrided = ((Winput - Wkernel) / 2) + 1, Hstrided = ((Hinput - Hkernel) / 2) + 1
? ? ?由此可见,使用了strided方式

pad=1,stride=2,7x7 卷积,结果是 |(448 + 2 * 1 - 7) / 2|?+ 1 = 222 (除以2时向下取整)

按照操作,

[1][2][3][4][5][6][7]

? ? ? ? [3][4][5][6][7][8][9]

看作

[1][2][3][4][5][6][7][ ]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [9][ ]

一个两单元长的尺去丈量,从[7]开始翻滚到[9]再翻...

转换公式 (size - 1?+ stride * N) <= (Width?+ 2 * pad)

N <= (Width + 2 * pad - size + 1) / stride = (448 + 2 * 1 - 7 + 1) / 2 = 222

6单元 + 222 个2单元 = 6 + 444 = 450单元

[maxpool]
size=2
stride=2

222 / 2 = 111,可以论文图中是112,还漏了一个什么?

只能让它自己给答案

darknet创建时会打印

写测试文件 yolo1.c

#include <stdio.h>

#include <darknet.h>

int main(int argc, char *argv[])
{
?? ?const char *cfg = "yolo1.cfg";
?? ?if(argc > 1) {
?? ??? ?cfg = argv[1];
?? ?}
?? ?network *yolo = parse_network_cfg(cfg);?? ?
?? ?return 0;
}

gcc yolo.c -I ./darknet/include/ -L ./darknet/ -ldarknet -o yolo1test -static -lm -pthread

$ ./yolo1test ./darknet/cfg/yolov1.cfg
layer???? filters??? size????????????? input??????????????? output
??? 0 conv???? 64? 7 x 7 / 2?? 448 x 448 x?? 3?? ->?? 224 x 224 x? 64? 0.944 BFLOPs
??? 1 max????????? 2 x 2 / 2?? 224 x 224 x? 64?? ->?? 112 x 112 x? 64
??? 2 conv??? 192? 3 x 3 / 1?? 112 x 112 x? 64?? ->?? 112 x 112 x 192? 2.775 BFLOPs
??? 3 max????????? 2 x 2 / 2?? 112 x 112 x 192?? ->??? 56 x? 56 x 192
??? 4 conv??? 128? 1 x 1 / 1??? 56 x? 56 x 192?? ->??? 56 x? 56 x 128? 0.154 BFLOPs
??? 5 conv??? 256? 3 x 3 / 1??? 56 x? 56 x 128?? ->??? 56 x? 56 x 256? 1.850 BFLOPs
??? 6 conv??? 256? 1 x 1 / 1??? 56 x? 56 x 256?? ->??? 56 x? 56 x 256? 0.411 BFLOPs
??? 7 conv??? 512? 3 x 3 / 1??? 56 x? 56 x 256?? ->??? 56 x? 56 x 512? 7.399 BFLOPs
??? 8 max????????? 2 x 2 / 2??? 56 x? 56 x 512?? ->??? 28 x? 28 x 512
??? 9 conv??? 256? 1 x 1 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x 256? 0.206 BFLOPs
?? 10 conv??? 512? 3 x 3 / 1??? 28 x? 28 x 256?? ->??? 28 x? 28 x 512? 1.850 BFLOPs
?? 11 conv??? 256? 1 x 1 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x 256? 0.206 BFLOPs
?? 12 conv??? 512? 3 x 3 / 1??? 28 x? 28 x 256?? ->??? 28 x? 28 x 512? 1.850 BFLOPs
?? 13 conv??? 256? 1 x 1 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x 256? 0.206 BFLOPs
?? 14 conv??? 512? 3 x 3 / 1??? 28 x? 28 x 256?? ->??? 28 x? 28 x 512? 1.850 BFLOPs
?? 15 conv??? 256? 1 x 1 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x 256? 0.206 BFLOPs
?? 16 conv??? 512? 3 x 3 / 1??? 28 x? 28 x 256?? ->??? 28 x? 28 x 512? 1.850 BFLOPs
?? 17 conv??? 512? 1 x 1 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x 512? 0.411 BFLOPs
?? 18 conv?? 1024? 3 x 3 / 1??? 28 x? 28 x 512?? ->??? 28 x? 28 x1024? 7.399 BFLOPs
?? 19 max????????? 2 x 2 / 2??? 28 x? 28 x1024?? ->??? 14 x? 14 x1024
?? 20 conv??? 512? 1 x 1 / 1??? 14 x? 14 x1024?? ->??? 14 x? 14 x 512? 0.206 BFLOPs
?? 21 conv?? 1024? 3 x 3 / 1??? 14 x? 14 x 512?? ->??? 14 x? 14 x1024? 1.850 BFLOPs
?? 22 conv??? 512? 1 x 1 / 1??? 14 x? 14 x1024?? ->??? 14 x? 14 x 512? 0.206 BFLOPs
?? 23 conv?? 1024? 3 x 3 / 1??? 14 x? 14 x 512?? ->??? 14 x? 14 x1024? 1.850 BFLOPs
?? 24 conv?? 1024? 3 x 3 / 1??? 14 x? 14 x1024?? ->??? 14 x? 14 x1024? 3.699 BFLOPs
?? 25 conv?? 1024? 3 x 3 / 2??? 14 x? 14 x1024?? ->???? 7 x?? 7 x1024? 0.925 BFLOPs
?? 26 conv?? 1024? 3 x 3 / 1???? 7 x?? 7 x1024?? ->???? 7 x?? 7 x1024? 0.925 BFLOPs
?? 27 conv?? 1024? 3 x 3 / 1???? 7 x?? 7 x1024?? ->???? 7 x?? 7 x1024? 0.925 BFLOPs
?? 28 Local Layer: 7 x 7 x 1024 image, 256 filters -> 7 x 7 x 256 image
?? 29 dropout?????? p = 0.50?????????????? 12544? ->? 12544
?? 30 connected??????????????????????????? 12544? ->? 1715
?? 31 Detection Layer
forced: Using default '0'

再对着图去看就发现问题了,少画了第一层输出结果

448 x 448 x?? 3?? ->?? 224 x 224 x? 64 这样看就清楚了,64个卷积核,输出 x64,那么使用了3维卷积核

那么第一步,448 x 448 x 3 一个7x7x3卷积核卷积 怎么到 224 x 224

修改下打印,就知道哪里不对了

layer???? filters??? size????????????? input??????????????? output
??? 0 calc out = (w448 + 2 * pad3 - size7) / stride2 + 1 = 224
calc out = (h448 + 2 * pad3 - size7) / stride2 + 1 = 224
conv???? 64? 7 x 7 / 2?? 448 x 448 x?? 3?? ->?? 224 x 224 x? 64? 0.944 BFLOPs
??? 1 max????????? 2 x 2 / 2?? 224 x 224 x? 64?? ->?? 112 x 112 x? 64

看下代码

convolutional_layer parse_convolutional(list *options, size_params params)
{
??? int n = option_find_int(options, "filters",1);
??? int size = option_find_int(options, "size",1);
??? int stride = option_find_int(options, "stride",1);
??? int pad = option_find_int_quiet(options, "pad",0);
??? int padding = option_find_int_quiet(options, "padding",0);
??? int groups = option_find_int_quiet(options, "groups", 1);
??? if(pad) padding = size/2;

??? ...

}

pad为1时 padding = size / 2, pad为0时,解析padding,默认为0

所以pad只是标志位,不是实际pad值

下一步:训练又是怎么一回事?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:54:39  更:2022-06-26 16:56:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:53:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码