<span style="font-size:18px;">/*链表生成并插入某一个节点*/
#include<iostream>
using namespace std;
struct student
{
long number;
float score;
student * next;
};
student * head;
student * create()
{
student * ps;
student * pEnd;
ps = new student;
cin >> ps->number >> ps->score;
head = NULL;
pEnd = ps;
while (ps->number != 0)
{
if (head == NULL)
head = ps;
else
pEnd->next = ps;
pEnd = ps;
ps = new student;
cin >> ps->number >> ps->score;
}
pEnd->next = NULL;
delete ps;
return(head);
}
void showlist(student * head)
{
cout << "now the iterms of list are \n";
while (head)
{
cout << head->number << "," << head->score << endl;
head = head->next;
}
}
void Delete(student * head, long number)
{
student * p;
if (!head)
{
cout << "\nList null!\n";
return; //表示未作删除
}
if (head->number == number) //该死,怪不得不能删除链表后面指针if (head->number = number)//yao删除的节点在链首
{
p = head;
head = head->next;
delete p;
cout << number << "the head of the listr have been deleted \n";
return;
}
for (student * pguard = head; pguard->next; pguard = pguard->next)
{
if (pguard->next->number == number) //确定下一个节点就是要删除的
{
p = pguard->next; //待删
pguard->next = p->next;
delete p;
cout << number << "have been deleted \n";
return;
}
}
cout << number << "not found!\n";
}
/*假设建设调用create()链表是,结点是按number值由小到大顺序排列,0时结束。则插入结点函数insert()如下*/
void insert(student * head, student * stud)
{
if (head == NULL) //空链表时将结点置在head指针下即可
{
head = stud; //表示链首
stud->next = NULL;//表示链尾
return;
}
if (head->number > stud->number) //节点插入的位置在链首
{
stud->next = head; //指向链首结点
head = stud; //插入结点为链首
return;
}
student * pguard = head; //从头开始向后遍历
while (pguard->next&& pguard->next->number < stud->number) //pguard->next为1表示未到表尾
pguard = pguard->next;
stud->next = pguard->next;
pguard->next = stud;
}
void main()
{
student ps;
ps.number = 36;
ps.score = 3.8;
head = create();
insert(head, &ps);
showlist(head); //先调用create()构造链表。后调用showlist显示
}</span>
<span style="font-size:18px;">
假设建设调用create()链表是,结点是按number值由小到大顺序排列,0时结束。
则输入:</span><span style="font-size:18px;"> </span>
<span style="font-size:18px;"></span><p><span style="font-size:18px;"></span><pre name="code" class="cpp"><p><span style="font-size:18px;"> 15 4.1</span><pre name="code" class="cpp"><pre name="code" class="cpp"><span style="font-size:18px;"> 23 3.2</span><span style="font-size:18px;">
</span><pre name="code" class="cpp"><pre name="code" class="cpp"><span style="font-size:18px;"> 24 3.5</span>
<pre name="code" class="cpp"><span style="font-size:18px;"> <span style="font-size:18px;">54 3.4</span></span><span style="font-size:18px;"> </span>
66 4.0
0 0.0 (0时结束)
输出为:
<span style="font-size:18px;"><span style="font-size:18px;"></span></span><pre name="code" class="cpp"><span style="font-size:18px;"> 15,4.1</span><pre name="code" class="cpp"><pre name="code" class="cpp"><span style="font-size:18px;"> 23,3.2</span><span style="font-size:18px;">
</span><pre name="code" class="cpp"><pre name="code" class="cpp"><span style="font-size:18px;"> 24,3.5
36, 3.8
</span>
<pre name="code" class="cpp"><span style="font-size:18px;"> <span style="font-size:18px;">54,3.4</span></span><span style="font-size:18px;"> </span>
66,4.0
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkkkkkkk
kkkkkkkkk
k
kkkkkkkk
k
k
k
k
k
k
kkkkk
最新看篇关于多尺度下快速目标检测的论文,是UCSD大学的SVCL实验室和IBM研究院一起研究的结果。其代码已经开源到GitHub
跑mscnn ;软硬件需求:
linux 测试需要4G以上显存,训练12G以上
cuda 7.5
cudnn v3(v4不行)
matlab 2014a
这篇文章主要解决多尺度同时存在时的检索问题,设计了MSCNN网络,提出了两点创新和几点技巧:
(1)针对多尺度问题:
类似于FCNT跟踪方法,该文章也是观察到了卷积网络不同层得到的特征特点的不同,对不同层的特征采用不同的利用方式。比如conv-3的低网络层,有更小的感受野,可以进行小目标的检测;而高层如conv-5,对于大目标的检测更加准确。对于不同的输出层设计不同尺度的目标检测器,完成多尺度下的检测问题。
注: 在卷积神经网络中,感受野的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点 在原始图像上映射的区域大小。点击打开链接
(2)针对速度问题:
使用特征的上采样代替输入图像的上采样步骤。设计一个去卷积层,来增加特征图的分辨率,使得小目标依然可以被检测出来。这里使用了特征图的deconvolutional layer(去卷积层)来代替input图像的上采样,可以大大减少内存占用,提高速度。
作者说:去卷积层一直用于分隔和边缘检测,我们第一次用它加速和提高检测率。
文章的网络结构类似RCNN,分为proposal提取和目标检测,两个部分独立进行。
proposal子网络和目标检测子网络结构图分别如下:
注:中间有色部分可以看成CNN trunk(cnn 主干线),一些层延伸了分支,分支由单检测层构成,通过分支的proposal判断为最终proposal。
技巧一:Conv4-3上面有一个缓冲卷积层,因为这一次更靠近主干线的底层(接近输入图),更影响梯度导致学习过程不稳定,缓冲卷积层能防止检测分支的梯度直接反向传播回主干线层。
实验细节:
数据扩展: 在KITTI数据集中,大多数目标很小,候选集差别很大,而最大目标尺寸过小,故把原始图像随机缩放成多个规模。
精调: 图像背景区域消耗计算内存,故在1000*600的大图里裁剪448*448的含目标图片,是12G显存够用
训练技巧: booststrapping 和multi-task loss 使训练在早期迭代过程不稳定,采用两步走,
第一步:随机采样,以学习率0.00005迭代10000次,生成模型
第二部:用生成的模型初始化第二层,自举,以初始学习率0.00005迭代,每迭代一万次学习率下降十倍,一共迭代 25000次。
实验过程与结果:
文章主要在KITTI和Caltech Pedestrian数据集上进行了MSCNN的测试,因为这两个数据集中包含许多小目标。
作者对proposal网络部分和目标检测部分的实验结果分别进行了全部系统的分析和对比,这里仅仅将在KITTI上的检测结果展示:
参考:http://blog.youkuaiyun.com/u012905422/article/details/5245389?locationNum=15