How do human sketch objects?

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章的实现,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模板来创建设计文件。根据用户提供的引用内容,特别是引用[1],里面提到了sketchplugin-webview-template的使用方法,而引用[2]则介绍了Sketch的基本功能。我需要结合这些信息,给出一个清晰的教程步骤。 首先,我应该先确认用户提到的Sketch模板具体指的是什么。根据引用[1],这个模板是用于构建Sketch插件的,使用HTML作为用户界面,包含Sketch和Resources文件夹。但用户的问题是关于“创建设计文件教程”,可能更偏向于使用Sketch的设计模板,而不是插件开发。不过,也有可能用户混淆了两种模板,所以需要仔细分析。 可能需要分两种情况:一种是使用现有的设计模板来创建设计文件,另一种是创建自定义的插件模板。根据引用[1]的描述,模板主要是插件开发相关的,但用户的问题可能更侧重于设计文件的创建。不过,引用[2]提到Sketch的动态布局创建步骤,这可能更相关。 需要先理清楚用户的需求。用户的问题可能分为两部分:如何使用Sketch模板(可能指设计模板)创建设计文件,以及可能的插件模板使用。但根据引用内容,可能用户更关注的是插件模板的使用,但描述有偏差。或者,用户可能想了解如何利用现有的模板文件来设计界面。 可能需要先回答如何使用Sketch模板创建设计文件,结合引用[2]中的步骤,同时如果涉及到插件模板,引用[1]中的信息也要涉及。需要明确步骤,比如安装模板、启动项目、使用资源等。 另外,用户提供的引用[1]中提到了安装依赖,这可能涉及node.js等环境配置,需要说明。同时,Sketch插件的manifest.json文件需要配置元数据,用户可能需要了解如何修改这些内容来创建自己的插件模板。 但用户的问题可能更偏向于设计文件,而非插件开发。所以需要区分开。假设用户是想利用现有的设计模板(比如UI套件或组件库)来开始设计,那么步骤可能包括下载模板、在Sketch中打开、使用组件等。但根据引用内容,提供的引用是关于插件开发的,所以可能需要调整回答方向。 可能用户有混淆,需要明确回答:如果用户是想使用Sketch模板来创建设计文件,通常是指利用现有的设计资源模板,如UI kits,然后指导如何应用这些模板。但根据引用[1],模板是用于插件开发的,所以需要澄清这一点,并给出相应的步骤,如如何安装插件模板,配置项目,运行插件等。 所以,结合引用[1]的内容,回答应侧重于如何使用sketchplugin-webview-template来创建自己的插件,并利用HTML作为界面。这可能包括安装依赖、修改manifest.json、构建插件等步骤。同时,引用[2]提到Sketch的动态布局创建步骤,可以补充设计文件的结构安排。 因此,回答的结构可能如下: 1. 安装模板和依赖:克隆仓库,安装npm包。 2. 配置插件元数据:修改manifest.json。 3. 开发用户界面:在Resources文件夹中编辑HTML/CSS/JS。 4. 编写插件逻辑:在Sketch文件夹中编写JavaScript代码。 5. 调试和测试:运行npm start并重启Sketch。 6. 打包和分发:使用npm run build生成插件。 同时,生成相关问题,如模板结构、动态布局创建、插件调试技巧等。 需要确保回答符合系统级指令,比如正确使用LaTeX格式(虽然这里可能用不到数学公式),但按照用户提供的示例结构,可能不需要使用。但需要检查是否有变量或公式需要处理,否则可能不需要。 现在需要将引用内容自然地融入回答中,并在末尾添加引用标识。例如,在步骤1中提到安装依赖时引用[^1],在提到动态布局时引用[^2]。 可能还需要确认用户是否需要同时了解插件模板和设计模板的使用,但根据问题中的“Sketch模板”和引用内容,可能主要是插件模板。因此,回答应围绕如何使用该特定模板来创建插件,可能用户的问题需要更明确的引导,但根据现有信息,只能基于引用内容进行回答。</think>### 如何使用 Sketch 模板创建设计文件教程 根据引用内容,Sketch 模板可分为两种类型:**插件开发模板**(如 `sketchplugin-webview-template`)和**设计资源模板**。以下分别说明其使用方法: --- ### 一、使用插件开发模板(以 `sketchplugin-webview-template` 为例) 此模板用于快速构建 Sketch 插件,通过 HTML 页面实现用户交互[^1]。 #### 步骤 1:安装依赖与启动项目 1. 克隆仓库到本地: ```bash git clone https://github.com/your-repo/sketchplugin-webview-template.git ``` 2. 安装 Node.js 依赖: ```bash cd sketchplugin-webview-template npm install ``` 3. 启动开发服务器: ```bash npm start ``` #### 步骤 2:配置插件元数据 - 修改 `Sketch/manifest.json` 文件,填写插件名称、标识符、版本等信息[^1]: ```json { "name": "My Plugin", "identifier": "com.example.myplugin", "version": "1.0.0" } ``` #### 步骤 3:开发用户界面 - 在 `Resources/webview` 文件夹中编辑 HTML、CSS 和 JavaScript 文件,设计插件的交互界面。 #### 步骤 4:编写插件逻辑 - 在 `Sketch` 文件夹中编写 JavaScript 文件,定义插件功能(如生成图形、修改图层等): ```javascript export default function(context) { const sketch = require('sketch'); const UI = sketch.UI; UI.message("插件已运行!"); } ``` #### 步骤 5:调试与测试 1. 重启 Sketch 并加载插件。 2. 通过快捷键触发插件功能,观察控制台日志进行调试。 #### 步骤 6:打包与分发 - 运行以下命令生成 `.sketchplugin` 文件: ```bash npm run build ``` --- ### 二、使用设计资源模板(如 UI Kits) 若需利用现成的设计模板(如组件库、图标库),可参考以下步骤: #### 步骤 1:下载模板文件 - 从 Sketch 社区(如 Sketch App Sources)下载 `.sketch` 格式的模板文件。 #### 步骤 2:导入模板至 Sketch 1. 打开 Sketch,选择 `File > Open` 载入模板文件。 2. 通过 `Insert > Library` 将模板中的符号(Symbols)或组件添加到当前设计文件。 #### 步骤 3:自定义设计 - 使用模板中的预置组件(如按钮、卡片)快速搭建界面。 - 通过 `Override` 功能修改文本、颜色等属性,适应项目需求。 --- ### 三、动态布局创建(补充) 引用[2]提到,Sketch 支持通过以下步骤创建动态布局: 1. 使用 **Smart Layout** 定义组件的响应式规则。 2. 通过 **Resizing** 属性设置图层固定或拉伸行为。 3. 结合 **Symbols** 和 **Overrides** 实现高效复用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值