对于想了解objective-c–使用setReturnValue从NSInvocation返回NSString的读者,本文将提供新的信息,我们将详细介绍strncpy返回值,并且为您提供关于.net
对于想了解objective-c – 使用setReturnValue从NSInvocation返回NSString的读者,本文将提供新的信息,我们将详细介绍strncpy返回值,并且为您提供关于.net中的CreateJobObject / SetInformationJobObject pinvoke的工作示例?、Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection、Focal Loss for Dense Object Detection(RetinaNet)、Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs的有价值信息。
本文目录一览:- objective-c – 使用setReturnValue从NSInvocation返回NSString(strncpy返回值)
- .net中的CreateJobObject / SetInformationJobObject pinvoke的工作示例?
- Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection
- Focal Loss for Dense Object Detection(RetinaNet)
- Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs
objective-c – 使用setReturnValue从NSInvocation返回NSString(strncpy返回值)
在我的情况下,我嘲笑从单元测试包含的文件中拉出一个包路径:
[[[_bundlePartial stub] andDo:^(NSInvocation *invocation) { Nsstring* resourceName = [invocation getArgumentAtIndexAsObject:2]; Nsstring* type = [invocation getArgumentAtIndexAsObject:3]; Nsstring* path = [[NSBundle bundleForClass:self.class] pathForResource:resourceName ofType:type]; if (!path) { path = [_bundleOriginal pathForResource:resourceName ofType:type]; } [invocation setReturnValue:(void*)path]; }] pathForResource:Ocmock_ANY ofType:Ocmock_ANY];
我称之为:
Nsstring* jsonPathInBundle = [[NSBundle mainBundle] pathForResource:self.fileName ofType:self.fileExtension];
不幸的是我回来了NSCFString.这是有道理的,因为我的Nsstring由NSCFString支持,但是当我丢失桥时,我不能再在对象上调用Nsstring实例方法.有没有办法可以将值作为Nsstring返回?
解决方法
更改:
[invocation setReturnValue:(void*)path];
至:
[invocation setReturnValue:&path];
我最初的写作方式破坏了一层抽象,因为Nsstring被视为一个地址,而不是使用它的实际地址.
.net中的CreateJobObject / SetInformationJobObject pinvoke的工作示例?
我正在努力拼凑一个拼凑的CreateJobObject和SetInformationJobObject的工作示例。通过各种Google搜索(包括俄语和中文帖子!),我将以下代码拼凑在一起。我认为JOBOBJECT_BASIC_LIMIT_INFORMATION的定义根据平台(32/64位)而变化。CreateJobObject
/ AssignProcessToJobObject 似乎 可以工作。SetInformationJobObject失败-错误24或87。
Process myProcess // POPULATED SOMEWHERE ELSE// Create Job & assign this process and another process to the jobIntPtr jobHandle = CreateJobObject( null , null );AssignProcessToJobObject( jobHandle , myProcess.Handle );AssignProcessToJobObject( jobHandle , Process.GetCurrentProcess().Handle );// Ensure that killing one process kills the others JOBOBJECT_BASIC_LIMIT_INFORMATION limits = new JOBOBJECT_BASIC_LIMIT_INFORMATION();limits.LimitFlags = (short)LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;IntPtr pointerToJobLimitInfo = Marshal.AllocHGlobal( Marshal.SizeOf( limits ) );Marshal.StructureToPtr( limits , pointerToJobLimitInfo , false ); SetInformationJobObject( job , JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation , pionterToJobLimitInfo , ( uint )Marshal.SizeOf( limits ) )... [DllImport( "kernel32.dll" , EntryPoint = "CreateJobObjectW" , CharSet = CharSet.Unicode )] public static extern IntPtr CreateJobObject( SecurityAttributes JobAttributes , string lpName ); public class SecurityAttributes { public int nLength; //Useless field = 0 public IntPtr pSecurityDescriptor; //хз)) public bool bInheritHandle; //Возможность наследования public SecurityAttributes() { this.bInheritHandle = true; this.nLength = 0; this.pSecurityDescriptor = IntPtr.Zero; } } [DllImport( "kernel32.dll" )] static extern bool SetInformationJobObject( IntPtr hJob , JOBOBJECTINFOCLASS JobObjectInfoClass , IntPtr lpJobObjectInfo , uint cbJobObjectInfoLength ); public enum JOBOBJECTINFOCLASS { JobObjectAssociateCompletionPortInformation = 7 , JobObjectBasicLimitInformation = 2 , JobObjectBasicUIRestrictions = 4 , JobObjectEndOfJobTimeInformation = 6 , JobObjectExtendedLimitInformation = 9 , JobObjectSecurityLimitInformation = 5 } [StructLayout( LayoutKind.Sequential )] struct JOBOBJECT_BASIC_LIMIT_INFORMATION { public Int64 PerProcessUserTimeLimit; public Int64 PerJobUserTimeLimit; public Int16 LimitFlags; public UIntPtr MinimumWorkingSetSize; public UIntPtr MaximumWorkingSetSize; public Int16 ActiveProcessLimit; public Int64 Affinity; public Int16 PriorityClass; public Int16 SchedulingClass; } public enum LimitFlags { JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008 , JOB_OBJECT_LIMIT_AFFINITY = 0x00000010 , JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800 , JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400 , JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200 , JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004 , JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 , JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040 , JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020 , JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100 , JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002 , JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080 , JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000 , JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001 } [DllImport( "kernel32.dll" )] [return: MarshalAs( UnmanagedType.Bool )] static extern bool AssignProcessToJobObject( IntPtr hJob , IntPtr hProcess ); [StructLayout( LayoutKind.Sequential )] public struct SECURITY_ATTRIBUTES { public int nLength; public IntPtr lpSecurityDescriptor; public int bInheritHandle; }
答案1
小编典典这可能会晚一点,但仍然如此。
我在这里尝试了所有示例,但是没有人同时在32位和64位模式下为我工作。最后,我需要亲自检查所有签名并创建相应的PInvoke例程。我认为,其他人可能会发现这很有帮助。
免责声明:解决方案基于 Matt Howells的答案。
using System;using System.Diagnostics;using System.Runtime.InteropServices;namespace JobManagement{ public class Job : IDisposable { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] static extern IntPtr CreateJobObject(IntPtr a, string lpName); [DllImport("kernel32.dll")] static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); [DllImport("kernel32.dll", SetLastError = true)] static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); private IntPtr handle; private bool disposed; public Job() { handle = CreateJobObject(IntPtr.Zero, null); var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = 0x2000 }; var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length); Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length)) throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error())); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (disposed) return; if (disposing) { } Close(); disposed = true; } public void Close() { CloseHandle(handle); handle = IntPtr.Zero; } public bool AddProcess(IntPtr processHandle) { return AssignProcessToJobObject(handle, processHandle); } public bool AddProcess(int processId) { return AddProcess(Process.GetProcessById(processId).Handle); } } #region Helper classes [StructLayout(LayoutKind.Sequential)] struct IO_COUNTERS { public UInt64 ReadOperationCount; public UInt64 WriteOperationCount; public UInt64 OtherOperationCount; public UInt64 ReadTransferCount; public UInt64 WriteTransferCount; public UInt64 OtherTransferCount; } [StructLayout(LayoutKind.Sequential)] struct JOBOBJECT_BASIC_LIMIT_INFORMATION { public Int64 PerProcessUserTimeLimit; public Int64 PerJobUserTimeLimit; public UInt32 LimitFlags; public UIntPtr MinimumWorkingSetSize; public UIntPtr MaximumWorkingSetSize; public UInt32 ActiveProcessLimit; public UIntPtr Affinity; public UInt32 PriorityClass; public UInt32 SchedulingClass; } [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public UInt32 nLength; public IntPtr lpSecurityDescriptor; public Int32 bInheritHandle; } [StructLayout(LayoutKind.Sequential)] struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION { public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; public IO_COUNTERS IoInfo; public UIntPtr ProcessMemoryLimit; public UIntPtr JobMemoryLimit; public UIntPtr PeakProcessMemoryUsed; public UIntPtr PeakJobMemoryUsed; } public enum JobObjectInfoType { AssociateCompletionPortInformation = 7, BasicLimitInformation = 2, BasicUIRestrictions = 4, EndOfJobTimeInformation = 6, ExtendedLimitInformation = 9, SecurityLimitInformation = 5, GroupInformation = 11 } #endregion}
Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection
学习目标
- Understand the challenges of Object Localization, Object Detection and Landmark Finding
-
Understand and implement non-max suppression
-
Understand and implement intersection over union
-
Understand how we label a dataset for an object detection application
-
Remember the vocabulary of object detection (landmark, anchor, bounding box, grid, ...)
Objective Localization
分类,分类加定位,检测。前两种问题都是针对一个object, detection 是针对多个object
在classification with localization 问题中,就是在output 的 softmax 输出的基础上在加了4个参数来定位bounding box.
Landmark detection
Object detection
Sliding windown detection 算法最大的缺点是computational cost. 在早期人们用简单的线性分类器去分类的时候还好,现在用conv net 去分类尤其在stride 很小的情况下就cost太高了。幸运的是这个问题有办法解决. 接着往下看
Convolutional implementation of Sliding Windows
下图表示了怎么把fully connected layer 转化为convolutional layer.
下面显示4次计算高度重复,下图第二行演示了使用第一行训练出来的filter parameter 去预测label,这样可以利用图像的share的重合的部分,极大提高计算效率。Convolutional 实现可以一次性求出结果而不是循环很多次.
现在还剩一个问题就是只考虑了分类问题没有考虑定位localization问题. 那么怎么定位呢,我们很容易想到前面介绍的classification+localization, 请继续往下看。
下图演示了用3x3的分割来做分类和定位,实际工作中会更细的分割,比如19x19。
一个对象的midpoint在哪个cell里,就说这个对象属于哪个cell.
YOLO 算法
YOLO 算法就是前面介绍的知识点的集成,对每一个小方框使用了classification+localization, 然后对整个9个小方框并没有循环,而是使用了convolutional 实现一次性计算。
YOLO 算法能更精确的预测bounding box. 因为解决了不能正好框住object的问题.
bounding box 的encoding. bh, bw 是和小框边长的比例,可以>1.
IoU (Intersection over Union)
Non-max suppression
解决同一个对象被多次检测到的情况, 去除那些可能性小的bounding box 只留下最可能的
Anchor Boxes
Anchor Boxes 是干什么的?- 使得可以检测多个Object.
为什么之前讲的就是一个cell 只能检测一个Object呢?因为一个y 向量里面只有一个bounding box.
学习过程了产生了一个问题,为什么一定要预定义一些Anchor Box呢?直接像只处理单个Object那样测量一个bounding box, 只不过对多个object的情况测量多个bounding box 不就行了吗? 这里加一些个人理解,我觉得测量多个bounding box这样做也可以,本质上来说Anchor Box 就是bounding box, 只是Anchor Box 尺寸固定更加容易对input 图片标注. 纯属个人理解,希望有人看到这里指教一下.
2019/11/01 update: 感觉理解了Anchor box, 就是把对象按照形状大小分成几类,就是几个anchor box, 然后把对应大小的对象就到对应的 anchor box 里面,这个我理解主要能提高bbox 边框回归精度.
怎么选Anchor box呢?
人们一般手动选择5-10个可以cover 待检测对象的box. 更好的做法是用K-means算法来归类待检测对象,然后自动选出anchor box.
YOLO Algorithm
前面讲了核心的 YOLO算法,然后又讲了一个特殊情况的处理,已经一个对象多次被检测到的情况就需要 non-max suppression, 多个对象共同属于一个cell的情况就需要 Anchor Box. 所以这里集成了完整的YOLO算法.
R-CNN
Region CNN - 忽略一些明显没有用的grid cell
Focal Loss for Dense Object Detection(RetinaNet)
<divid="content_views"> <p><strong><span><strong>Focal Loss for Dense Object Detection</strong></span></strong></p>
<p><span>ICCV2017</span> <strong><span><strong>RBG和Kaiming大神的新作。</strong></span></strong></p>
<p><strong><span><strong>论文目标</strong></span></strong></p>
<p><span>我们知道object detection的算法主要可以分为两大类:</span><strong><span><strong>two-stage detector和one-stage detector</strong></span></strong><span>。前者是指类似Faster RCNN,RFCN这样需要region proposal的检测算法,这类算法可以达到很高的准确率,但是速度较慢。虽然可以通过减少proposal的数量或降低输入图像的分辨率等方式达到提速,但是速度并没有质的提升。后者是指类似YOLO,SSD这样不需要region proposal,直接回归的检测算法,这类算法速度很快,但是准确率不如前者。</span><strong><span><strong>作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确率,同时不影响原有的速度。</strong></span></strong></p>
<p><strong><span><strong>核心思想</strong></span></strong></p>
<p><span>既然有了出发点,</span><strong><span><strong>那么就要找one-stage detector的准确率不如two-stage detector的原因,作者认为原因是:</strong></span></strong><strong><span><strong>样本的类别不均衡导致的</strong></span></strong><span>。</span><span>我们知道在object detection领域,一张图像可能生成<a href="https://www.baidu.com/s?wd=%E6%88%90%E5%8D%83%E4%B8%8A%E4%B8%87&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd" target="_blank">成千上万</a>的candidate locations,但是其中只有很少一部分是包含object的,这就带来了类别不均衡。那么类别不均衡会带来什么后果呢?引用原文讲的两个后果:</span></p>
<p><strong><span><strong>(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal; </strong></span></strong></p>
<p><strong><span><strong>(2) en masse, the easy negatives can overwhelm training and lead to degenerate models.</strong></span></strong></p>
<p><span> 什么意思呢?</span><strong><span><strong>负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样</strong></span></strong><span>。其实先前也有一些算法来处理类别不均衡的问题,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。</span><strong><span><strong>OHEM算法虽然增加了错分类样本的权重,但是OHEM算法忽略了容易分类的样本。</strong></span></strong></p>
<p><span>因此针对类别不均衡问题,作者提出一种新的损失函数:focal loss,这个损失函数是在标准交叉熵损失基础上修改得到的。</span><strong><span><strong>这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本。</strong></span></strong><span>为了证明focal loss的有效性,作者设计了一个dense detector:RetinaNet,并且在训练时采用focal loss训练。</span><strong><span><strong>实验证明RetinaNet不仅可以达到one-stage detector的速度,也能有two-stage detector的准确率。</strong></span></strong></p>
<p><span>介绍focal loss</span><span>,</span><span>在介绍focal loss之前,先来看看交叉熵损失,这里以二分类为例,</span><strong><span><strong>原来的分类loss是各个训练样本交叉熵的直接求和,也就是各个样本的权重是一样的</strong></span></strong><span>。</span><span>公式如下:</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/2018110715234296.png" width="424" height="72"></p>
<p><span>因为是二分类,</span><span>p表示预测样本属于1的概率</span><span>(范围为0-</span><span>1</span><span>)</span><span>,y表示label,y的取值为{+1,-1}</span><span>。当真实label是1,也就是y=1时,假如某个样本x预测为1这个类的概率p=0.6,那么损失就是-log(0.6),注意这个损失是大于等于0的。如果p=0.9,那么损失就是-log(0.9),所以p=0.6的损失要大于p=0.9的损失,这很容易理解。</span><span>这里仅仅以二分类为例,多分类分类<a href="https://www.baidu.com/s?wd=%E4%BB%A5%E6%AD%A4%E7%B1%BB%E6%8E%A8&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd" target="_blank">以此类推</a></span></p>
<p><span>为了方便,用pt代替p,如下公式2:。这里的pt就是前面Figure1中的横坐标。</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152401131.png" width="485" height="78"></p>
<p><span>为了表示简便,我们用p_t表示样本属于true class的概率。所以(1)式可以写成 </span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152411142.png" width="237" height="30"></p>
<p><span>接下来介绍一个</span><strong><span><strong>最基本的对交叉熵的改进,也将作为本文实验的baseline</strong></span></strong><span>,</span><span>既然one-stage detector在训练的时候正负样本的数量差距很大,那么一种常见的做法就是给正负样本加上权重,负样本出现的频次多,那么就降低负样本的权重,正样本数量少,就相对提高正样本的权重</span><span>。</span><strong><span><strong>因此可以通过设定a的值来控制正负样本对总的loss的共享权重。a</strong></span></strong><strong><span><strong>取比较小的值来降低负样本(多的那类样本)的权重。</strong></span></strong></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152516783.png" width="390" height="45"></p>
<p><strong><span><strong>显然前面的公式3虽然可以控制正负样本的权重,但是没法控制容易分类和难分类样本的权重</strong></span></strong><span>,于是就有了focal loss:</span></p>
<p> <img alt=""src="https://img-blog.csdnimg.cn/20181107152550547.png" width="333" height="37"></p>
<p><span>这里的γ称作focusing parameter,γ>=0。</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152541665.png" width="76" height="27"></p>
<p><span>称为</span><span>调制系数(modulating factor)</span> </p>
<p><span>为什么要加上这个调制系数呢?</span><strong><span><strong>目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。</strong></span></strong></p>
<p><strong><span><strong>绘制图</strong></span></strong><strong><span><strong>看如下Figure1</strong></span></strong><span>,横坐标是pt,纵坐标是loss。CE(pt)表示标准的交叉熵公式,FL(pt)表示focal loss中用到的改进的交叉熵</span><span>。</span><strong><span><strong>Figure1中γ=0的蓝色曲线就是标准的交叉熵损失。</strong></span></strong></p>
<p> </p>
<p> </p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152625125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTk5MzI2,size_16,color_FFFFFF,t_70" width="406" height="371"></p>
<p><br><strong><span><strong>这里介绍下focal loss的两个重要性质:</strong></span></strong></p>
<p><span>1、当一个样本被分错的时候,pt是很小的</span><span>,</span><span>那么调制因子(1-Pt)接近1,损失不被影响;当Pt→1,因子(1-Pt)接近0,那么分的比较好的(well-classified)样本的权值就被调低了。因此调制系数就趋于1,也就是说相比原来的loss是没有什么大的改变的。当pt趋于1的时候(此时分类正确而且是易分类样本),调制系数趋于0,也就是对于总的loss的贡献很小。</span></p>
<p><strong><span><strong>2、</strong></span></strong><span>当γ=0的时候,focal loss就是传统的交叉熵损失,</span><strong><span><strong>当γ增加的时候,调制系数也会增加。</strong></span></strong> <span>专注参数γ平滑地调节了易分样本调低权值的比例。γ增大能增强调制因子的影响,实验发现γ取</span><span>2最好</span><span>。直觉上来说,调制因子减少了易分样本的损失贡献,拓宽了样例接收到低损失的范围。</span><span>当γ一定的时候,比如等于2,一样easy example(pt=0.9)的loss要比标准的交叉熵loss小100+倍,当pt=0.968时,要小1000+倍,但是对于hard example(pt < 0.5),loss最多小了4倍。这样的话hard example的权重相对就提升了很多。这样就增加了那些误分类的重要性</span></p>
<p><strong><span><strong>focal loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。</strong></span></strong></p>
<p><strong><span><strong>作者在实验中采用的是公式5的focal loss(结合了公式3和公式4,这样</strong></span></strong><strong><span><strong>既能调整正负样本的权重,又能控制难易分类样本的权重</strong></span></strong><strong><span><strong>):</strong></span></strong></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152651414.png" width="397" height="36"></p>
<p><span>在实验中a的选择范围也很广,一般而言当γ增加的时候,a需要减小一点(实验中γ=2,a=0.25的效果最好)</span></p>
<p><span>Figure2是在COCO数据集上几个模型的实验对比结果。可以看看再AP和time的对比下,本文算法和其他one-stage和two-stage检测算法的差别。</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152704650.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTk5MzI2,size_16,color_FFFFFF,t_70" width="463" height="459"></p>
<p><span>提出了一个RetinaNet,采用的是Resnet+FPN作为backbone,cls和reg两路subnet分别加在各个Pyramid level上</span><span>,</span><span> Figure3。</span></p>
<p> <img alt=""src="https://img-blog.csdnimg.cn/20181107152714539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTk5MzI2,size_16,color_FFFFFF,t_70" width="554" height="228"></p>
<p><span>Anchors:</span></p>
<p> </p>
<p><span>作者用了</span><span>translation-invariant anchor boxes 平移不变锚与RPN的变体相似。这个anchor在金字塔层P3到P7有相应的 32^2 到 512^2 的区域。在每个金字塔层,作者用的长宽比是{ 1:2,1:1,2:1 }。在每层,对于三个长宽比的anchor,加了anchor的形状的{ 2^0,2^{1/3},2^{2/3} }的anchor。这能够增加AP。对于每层,有A=9个anchor,穿过这些层,它们可以覆盖32-813个输入图片中的像素。</span><strong><span><strong>每个Anchor都是K个分类目</strong></span></strong><strong><span><strong>标的</strong></span></strong><strong><span><strong>one-hot向量(K是目标类别数)和4个box regression目标</strong></span></strong><span>。作者设定anchor的方式是与ground-truth 的intersection-over-union (IoU) 阈值0.5,与背景IOU [0,0.4) 。所有的anchor都被设定为一个box,在预测向量的对应的类位置设1,其他的设为0。如果没有被设定,那么 IoU\in[0.4,0.5) ,它是在训练时候被忽略的。Box regression targets是计算出来的每个anchor和它设定的object box的偏</span><span>移量,如果没有设定那么忽略。</span></p>
<p> </p>
<p><span>Classification Subnet:</span></p>
<p><span>分类子网络在每个空间位置,为</span><span>A个anchor和K个类别,预测object presence的概率。这个子网络是小的FCN(全卷积网络),与FPN中的每层相接;这个子网络的参数在整个金字塔的层间共享。设计方法是:如果一个从金字塔某个层里来的feature map是C个通道,子网络使用 四个3*3 的卷积层,C个<a href="https://www.baidu.com/s?wd=%E6%BB%A4%E6%B3%A2%E5%99%A8&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd" target="_blank">滤波器</a>,每个都接着ReLU激活函数;接下来用 3*3 的卷积层,有 KA 个滤波器。最后用sigmoid激活函数对于每个空间位置,输出 KA 个binary预测。作者用实验中 C=256 A=9 。</span><strong><span><strong>与</strong></span></strong><strong><span><strong>RPN对比,作者的object classification子网络更深,只用 3*3 卷积,且不和box regression子网络共享参数。</strong></span></strong><span>作者发现这种higer-level设计决定比超参数的特定值要重要。</span></p>
<p> </p>
<p><span>Box Regression Subnet:</span></p>
<p> </p>
<p><span>与</span><span>object classification子网络平行,作者在金字塔每个层都接到一个小的FCN上,意图回归每个anchor box对邻近ground truth object的偏移量。回归子网络的设计和分类相同,不同的是它为每个空间位置输出4A个线性输出。对于每个空间位置的A个anchor,4个输出预测anchor和ground-truth box的相对偏移。与现在大多数工作不同的是,作者用了一个class-agnostic bounding box regressor,这样能用更少的参数更高效。Object classification和bounding box regression两个网络共享一个网络结构,但是分别用不同的参数。</span></p>
<p> </p>
<p><span>实验结果:</span><strong> </strong></p>
<p><span>Table1是关于RetinaNet和Focal Loss的一些实验结果</span><span>(</span><span>COCO</span><span>上做的</span><span>)。</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/20181107152731904.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTk5MzI2,size_16,color_FFFFFF,t_70" width="495" height="288"></p>
<p><span>(a)是在交叉熵的基础上加上参数a,a=0.5就表示传统的交叉熵,可以看出当a=0.75的时候效果最好,AP值提升了0.9。</span></p>
<p><span>(b)是对比不同的参数γ和a的实验结果,可以看出随着γ的增加,AP提升比较明显。</span><span>对于固定的</span><span>α</span><span>,当</span><span>γ</span><span>等于2的时候能达到最高的AP</span></p>
<p><span>(c)</span><span>不同的a</span><span>nchor</span><span>的</span><span>scale</span><span>和</span><span>aspect ratio</span><span>,</span><span>选择2scale,3aspect ratio效果最好 </span></p>
<p><span>(d)</span><strong><span><strong>通过和OHEM的对比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。</strong></span></strong><span>这里OHEM1:3表示在通过OHEM得到的minibatch上强制positive和negative样本的比例为1:3,</span><strong><span><strong>通过对比可以看出这种强制的操作并没有提升AP。</strong></span></strong></p>
<p><span>(e)</span><span>作者对比了自己的模型在不同的深度和训练图像scale下的speed/accuracy</span><span>。</span><strong><span><strong>速度方面也有优势!</strong></span></strong> </p>
<p><span>为了更好的观察focal loss在reweighting example的效果,作者随机选取了10^7个负样本window和10^5个正样本window,然后通过网络之后分别计算这些正负样本的loss,最后,分别对于正样本和负样本,把所有window的loss进行归一化(softmax),画出累计loss随样本数目的增长曲线</span><span>。</span><span>Figure4是对比forground和background样本在不同γ情况下的累积误差。纵坐标是归一化后的损失,横坐标是总的foreground或background样本数的百分比。可以看出γ的变化对正(forground)样本的累积误差的影响并不大,但是对于负(background)样本的累积误差的影响还是很大的(</span><strong><span><strong>γ=2时,将近99%的background样本的损失都非常小</strong></span></strong><span>)。</span></p>
<p><img alt=""src="https://img-blog.csdnimg.cn/2018110715275455.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTk5MzI2,size_16,color_FFFFFF,t_70" width="593" height="200"></p>
<p> <span>Conclusion</span></p>
<p><span>作者将类别不平衡作为阻碍</span><span>one-stage方法超过top-performing的two-stage方法的主要原因。为了解决这个问题,作者提出了focal loss,在交叉熵里面用一个调整项,为了将学习专注于hard examples上面,并且降低大量的easy negatives的权值。作者的方法简单高效。并且设计了一个全卷积的one-stage的方法来验证它的高效性。在具有挑战性的COCO数据集上面也达到了state-of-the-art的精度和运行时间。</span></p> </div>
Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs
问题描述:
当SoapUI访问一个webservice时,对于某些webserive服务,如果webserive的输入参数要求是xml格式,如果xml格式输入不正确,会报“Unmarshalling Error: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs. at [row,col {unkNown-source}]: [9,14]”的错误信息。
虽然输入参数已经符合xml的标准格式,但是由于转义符号的原因,所以出现了这样的错误。
因此,在输入xml格式的参数时,首先需要添加<?xml version="1.0" encoding="UTF-8"?>(注意:这一行必须出现在第一行,并且需要顶格,前面没有任何空格或其他字符),使得输入参数符合xml标准;其次对于转义字符,需要进行改变。
在这里,列举出常用的一些转义字符:
特殊符号 |
代码 |
< |
< |
> |
> |
" |
" |
& |
& |
版权标志 |
© |
商标标志 |
® |
空格 |
|
. |
• |
我们今天的关于objective-c – 使用setReturnValue从NSInvocation返回NSString和strncpy返回值的分享就到这里,谢谢您的阅读,如果想了解更多关于.net中的CreateJobObject / SetInformationJobObject pinvoke的工作示例?、Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection、Focal Loss for Dense Object Detection(RetinaNet)、Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs的相关信息,可以在本站进行搜索。
本文标签: