How do human sketch objects?

本文介绍了一种基于梯度方向构建草图特征向量的方法,并详细阐述了特征提取、词汇构建、特征量化及分类预测的过程。通过实验对比多种支持向量机(SVM)分类策略,最终实现了草图的有效分类。

文章的实现,OpenCV2.3.1,VS2010。

题目为“人类怎样画草图”,文章前面论述了一大堆关于人类对草图的识别,在这里略去,有兴趣可以自行阅读。

 

在5 Sketch Representation中开始介绍了如何为sketch构造出合适的histogram:主体的思路是利用梯度信息来构造特征向量,在这里只用到梯度的方向,而忽略梯度大小。

5.1 Extracting local features

我们下下来得dataset的图片分辨率过大,首先采用降采样为256*256。

第一步,求得图片的梯度(利用SCHARR算子),这样之后每一个像素点都有一个梯度方向在0~180度之间,然后我们根据梯度方向构造出四个response images,也就是四个bins(O1,O2,O3,O4,分别代表0-45,45-90,90-135,135-180度),然后根据每个像素点梯度的方向处在的区间放入不同的bin中(可以把response images当作二值图像,也就是一个像素点,只能在一个bin中相应像素点的值为1,而其他三个bins相应点为0,当然也出现了梯度的xy方向都为0,在这里我们不将该点放入bins中)。

第二步,将降采样后的图片确定28*28=784个采样点(每个采样点之间差8个像素,第一个点和左边缘相差16个像素,这样的话就舍弃了最后8个像素没有patch,当初没考虑好),以这784个采样点为中心构建784个patches,每个patch为32*32大小。

第三步,每个patch按空间分为4*4=16个bins,也就是每个bins是8*8的块。接下来就是extract 每个块中的每个response images(O)的局部描述子Li。对于每个response images,计算所属的8*8块内的累计值,也就是把第一步中的为1的点累加起来,然后把patch中的16个块的累计值合起来就形成了一个16维的局部描述子Li。然后对于每个response images计算描述子,然后将四个局部描述子合起来形成了该patch的向量d=[L1,L2,L3,L4],为64维向量,在这里也就是patch的特征,之后再对其进行归一化处理(这里一定要归一化,不然在下文的一个参数选取上会造成很大影响)。(文中提到了用能量累积的方法得到d,但是没有采用这个方法实现)

5.2 Building a visual vocabulary

第四步,如上步所做,一幅图就有784个特征向量,于是很多图的所有的特征向量就构成了所谓的bag-of-features,D={di}。在这里我们对选取了前1,000,000(由于考虑到概率问题,个人认为前100000个向量和随机选取1000000个向量在概率上是相等的,所以就没有采用文中所说的随机选取)个特征向量进行k-means聚类,取k=500,聚类完成之后得到了500个中心向量{ui},这里也可以认为是words。(关于bag-of-features或bag-of-words的问题可以看http://blog.youkuaiyun.com/tinyway/article/details/9240821)

5.3 Quantizing features

第五步,这一步中,我们就要构建出属于一个sketch的histogram。首先还是计算出784个d,之后将每个d与500个ui进行高斯核的计算距离K(d,u),形成了一个500维的距离向量q(d)=[K(d,u1),K(d,u2)....K(d,u500)],然后再将q(d)进行归一化(这里的归一化使用绝对值和来归一化,同第三步里d的归一化不同)。在计算完784个q(di)之后,将所有di累加起来,再除以784,就形成了sketch的histogram。



在这里,关于sketch的特征提取就差不多完成了,接下里就考虑分类问题。

问中还提到了很多分类问题,在这里就利用svm进行分类预测,下文讲的是自己的摸索过程,毕竟从没用过svm,大神绕道。

我暂时只取了25类进行分类训练,第一次是进行多分类训练,也就是只训练出一个模型,之后发现结果超级不行,再重看文章后发现文章不是这样实现的,在7.1中提到了,为每个sketch训练了250个分类器,用于将该sketch和其他类的sketch辨别出来,在预测的时候,通过比较每个分类器的classifier function来确定输入样本所属的类别。

同时,由于高斯核距离的计算中,选择了不同的sigma,有不同的效果,当sigma小的时候,sketch的histogram有很多维为0,但是当sigma取大的时候,预测的结果很差,所以还是取小的sigma。

svm的训练方法:

1.直接训练出多分类器:

该方法很直接,但是准确率也不是很高。

2.训练25个二分类器(样本有25类):

同文中7.1所说的方法进行预测,结果同样很不准。每个类取了60个正样本,而其他24个类取了60*24个负样本,这样子训练之后发现classifier function完全一样,看来是正负样本的比例失常导致,故重新训练,正样本取60个,每个类取2个负样本,一共48个负样本,结果也不怎么好,因为有一个分类器的classifier function总是特别大,于是很容易选到那个类别去。(后来改成10类)

3.训练10*9/2个分类器(共10类,两两一个分类器)

一轮轮判断,类似于二叉树查询,最多10次即可得出适合的预测。

结果同样不准确,在我的观点看来,两两一个分类器,若输入样本不在这两类中,就很容易出现误差,可能出现classifier function的值特别大,从而干扰到预测,只是若预测前几个的话会有正确的预测。

4.训练9*10个二分类器(共十类,两类之间有两个分类器,分别为其中之一的正样本分类器)

结果很不稳定,有的预测很准确能到达90%,有的很不准确,在25%左右。

5.一个二分类器(共两类)

输入为两类中的其中之一,这样的话预测的结果很准。



这个算法的实现花了大概两周的时间,前期看文章看了两天,第三天向的师姐请教,算是了解了整个算法的实现过程。之后花了两天时间把patch descriptor提取出来并利用k-means聚成500类,但是到5.3的quantizing features的时候发现量化后500维几乎都为0了,给文章作者Mathias Eitz发了封邮件询问了这个问题,很开心他回复了,让我调大高斯核函数中的sigma试试看,调大之后发现情况并没有好转,虽然为0的维数减少了,但是都是e-100以上的量级,后来又读了一遍文章发现在patch descriptor的提取中忘了对其进行归一化处理,归一化后在进行quantizing features情况有所好转,但是还是有很大一部分为0(我觉得有可能这里导致了之后分类效果差)。之后就进行svm训练预测,效果不太好。最后根据多个不同的svm的处理方法得到了几个不同的预测方法,然后用mfc做了个界面,让大家简单的试试看吧。

<think>我们正在讨论的是设计软件Sketch,而不是Fusion 360。用户的问题是关于Sketch的含义及其在设计或编程领域中的用途。 根据引用内容: 引用[1]:Sketch是一款专为界面设计而生的矢量绘图软件,它以其简洁的界面和专门为UI设计优化的功能而广受设计师们的青睐。 引用[2]:提到了WeSketch是微信设计团队提供的Sketch插件集合,说明Sketch有插件生态。 引用[3]:提到了Sketch汉化插件,进一步说明Sketch的插件扩展性。 引用[4]:提到了Sketch插件开发的技术难点,说明Sketch支持通过插件扩展功能。 因此,我们可以将回答分为两部分: 1. Sketch的基本含义:一款矢量设计软件,主要用于UI/UX设计。 2. 用途:设计领域(UI设计、图标设计、界面原型设计等)和编程领域(通过插件开发扩展功能,与开发流程整合)。 注意:用户之前的问题是关于合并两个草图(可能是在CAD软件中),但当前问题已经转向了设计软件Sketch,所以我们需要切换上下文。 回答结构: 1. 定义:Sketch是什么 2. 主要用途(设计领域) 3. 在编程领域(插件开发、自动化等) 4. 总结 同时,按照要求,在适当的地方添加引用标记(如[^1])。 另外,根据引用[1]和引用[2],我们可以知道Sketch的插件生态,所以可以提到插件的作用。 注意:引用[5]是关于AI在建筑设计中的应用,与当前问题关联不大,可以忽略。 最后,生成相关问题。</think>### Sketch 的含义与用途解析 #### 1. **Sketch 的基本定义** Sketch 是一款**专为界面设计开发的矢量绘图软件**,主要面向 UI/UX 设计师群体。其核心定位是提供高效的数字产品界面设计工具,具有以下特征: - **矢量绘图引擎**:所有图形元素基于数学公式生成,可无限放大而不失真[^1] - **针对性优化**:专门为网页、移动端界面设计优化的工具集(如画板、符号库、响应式布局) - **轻量化工作流**:相比传统设计软件(如 Photoshop),更专注于界面设计而非图像处理[^1] #### 2. **设计领域的核心用途** 在 UI/UX 设计流程中,Sketch 主要承担: | 功能模块 | 典型应用场景 | |---------|------------| | **界面原型** | 创建可交互的线框图和高保真原型[^1] | | **组件库** | 通过 Symbols 功能实现按钮/导航栏等复用组件 | | **设计规范** | 自动生成间距/颜色/字体等设计系统文档 | | **协作交付** | 导出切图资源并生成开发标注(支持 Zeplin 等工具) | #### 3. **编程领域的延伸应用** 虽然 Sketch 本身是设计工具,但通过**插件生态**与编程深度结合: - **插件开发**:基于 JavaScript 的 API 扩展功能(如微信团队的 WeSketch 插件)[^2] ```javascript // 示例:创建矩形插件 const shape = new ShapePath({ name: 'CustomButton', frame: new Rectangle(0, 0, 120, 40) }); ``` - **自动化流程**:通过脚本实现批量导出、数据填充等操作[^4] - **本地化支持**:汉化插件解决语言障碍(如自动翻译界面元素)[^3] - **技术整合**:结合 Objective-C/AppKit 开发高级功能[^4] #### 4. **行业应用场景** - **UI 设计**:移动端/网页界面设计(核心场景) - **设计系统构建**:维护统一的设计规范库 - **原型验证**:通过 InVision 等工具实现用户测试 - **开发协作**:生成设计交付物供工程师实现($$ \text{设计稿} \xrightarrow{\text{导出}} \text{代码组件} $$) > 提示:Sketch 采用**订阅制**($99/年),仅支持 macOS 系统,最新版已原生支持中文界面[^3]。 --- ### 常见关联问题 1. **Sketch 与 Figma/Adobe XD 的核心差异是什么?** (跨平台支持、协作模式、性能对比等方向) 2. **如何通过 Sketch 插件实现自动化设计任务?** (需 JavaScript 基础,参考官方 API 文档[^4]) 3. **非设计师如何快速掌握 Sketch 基础操作?** (学习路径:界面认知 → 矢量绘制 → 组件系统 → 原型交互[^1]) 4. **Sketch 资源如何融入开发工作流?** (涉及设计交接规范、切图导出设置、标注工具整合)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值