首页 > 其他分享 >CS231N assignment 1 _ 图像特征 学习笔记 & 解析

CS231N assignment 1 _ 图像特征 学习笔记 & 解析

时间:2023-04-10 19:34:57浏览次数:54  
标签:HOG CS231N assignment ori cell 梯度 np 解析 reg

利用图像特征提升准确度

我们之前仅仅是逐个像素的计算, 而忽视和图像在HSV空间的像素集中度和图像纹理特征. 根据别人的博客,准确率进一步从54%提升到58%. 下面进行解析.

HOG/颜色直方图代码解读

本次的作业没有要求我们自己实现, 但是我们还是应该读懂代码.  在前面, 我们一直希望我们的网络能够抓住主要矛盾, 识别出目标而不要基于背景太多权重. 为此, 我们引入了HOG. 首页就能搜到的文章一文讲解方向梯度直方图(hog) - 知乎 (zhihu.com) 讲解的相当好, 其实HOG反应就是图像的亮度梯度的方向, 而HOG利用离散化的角度来反应这个方向.其中的大概步骤再次总结如下:

  • 通过x和y方向的sobel算子来计算梯度
  • 二者结合计算总梯度大小和方向
  • 将图像划分成一定尺寸的cell,根据cell内角度的范围归类到HOG表
  • 对由数个cell组成的block通过滑动窗口方法归一化(这里没做)

下面是对原始代码的注释:

if im.ndim == 3:
        image = rgb2gray(im) # 转换为灰度图,不考虑色度信息
    else:
        image = np.at_least_2d(im)

    sx, sy = image.shape # 图像尺寸
    orientations = 9 # 梯度的角度分类为9, 即按照0~20度/20~40度...
    cx, cy = (8, 8) # cell的大小为8*8

    gx = np.zeros(image.shape) 
    gy = np.zeros(image.shape)
    gx[:, :-1] = np.diff(image, n=1, axis=1) # 生成x向的梯度
    gy[:-1, :] = np.diff(image, n=1, axis=0) # y向梯度
    grad_mag = np.sqrt(gx ** 2 + gy ** 2) # 总梯度大小
    grad_ori = np.arctan2(gy, (gx + 1e-15)) * (180 / np.pi) + 90 # 总梯度方向. 这里+1e-15目的是防止gx=0下arctan求不出来
    n_cellsx = int(np.floor(sx / cx))  # x向cell个数
    n_cellsy = int(np.floor(sy / cy))  # y向cell个数
    orientation_histogram = np.zeros((n_cellsx, n_cellsy, orientations)) # 构造cell为单位的HOG表
    for i in range(orientations):
        temp_ori = np.where(grad_ori < 180 / orientations * (i + 1), # 解算出梯度小于某个格子上限处的点,成立原样返回,否则返回0
                            grad_ori, 0)
        temp_ori = np.where(grad_ori >= 180 / orientations * i,
                            temp_ori, 0)
        cond2 = temp_ori > 0 # 不允许梯度=0
        temp_mag = np.where(cond2, grad_mag, 0) # 获取它们的幅度
        orientation_histogram[:,:,i] = uniform_filter(temp_mag, size=(cx, cy))[round(cx/2)::cx, round(cy/2)::cy].T # 均匀化

    return orientation_histogram.ravel() # 数组展平,和flatten区别在于hist改变,这个值也会同步变化

 而颜色直方图仅仅是对色相进行直方图统计. 这个代码相对简单, 就不解读了. 关键是这里hue也是正则化为0-255,和opencv有所不同, 此外imhist = imhist * np.diff(bin_edges) 这句考虑了格子长度的影响. 

下面我们需要将两个特征合并成单个行向量. 因为HOG表的长度为(32/8)^2*9 = 144, 而颜色直方图的长度为10, 结果就是154长度, 对SVM还需要加上最后一项用于去除偏置项. 这里的extract_features函数通过传入lambda函数, 一行一行叠加,生成最终矩阵规模为49000*154, 从lambda原始形式直到其是按HOG 0~143, 颜色直方图144~153摆放的, 因为分类器应可以针对不同数据基于不同权重,所以摆放顺序不重要. 此外这里并没有对HOG做后处理, 因为理想情况下神经网络就应该由神经网络决策喂进去的信息对于结果贡献程度, 我们只需要显式放进去信息就行.  但也正因此, 超参数的选取只会更重要.

调参

 下面要做的本质上就是利用不同的超参数来进行探究. 这里的代码和前面类似, 也不多写了. 参考其他博客选取, 结果如下:

需要注意的是,我实验了数次,曾得到了一次lr=1.2e-7,reg=5e4(注意不是5e-4)下准确率为43.0%的例子, lr影响不算很大,这个答案不是唯一的, 但是reg影响会非常大. 下面是我自己的另一个实验,按照lr=1.2e-7计算,考察reg的不同结果:

这里不难看出, 这里过拟合带来的后果是很严重的, 所以上升reg初期会使得准确度大幅上升, 但是后面就不明显了,可能是我这里reg取得不是很大,增大reg后的欠拟合不明显. 下面附上reg=0,1e-4,2e-4的loss变化: (※不同图片间的误差不能互相比较!!)

下面是另一个博主实验神经网络获得的结果(其隐含层数很大, 不致造成瓶颈):

我们看出, 学习率的影响同样不算很大(除非太大导致不能收敛!), reg太大出现了欠拟合,准确率急剧下降, 但是Reg很小影响反而又不大(上面的图说明不了, 我自己reg=0下其他参数最优准确率为56.8%). 只能说, 这东西着实是玄学, 超参数对于不同场景, 不同模型都必须依靠实践才能获得, 不同场景下的结论是不能通用的! 最终reg=1e-3,lr=0.5,和前面不是一个数量级.

问题

回答: 我们回顾一下正确分类的图片: (左正确右错误)

首先, 部分错误在色调分布上和正确的明显类似, 典型的包含frog和plane的部分图片, 当然其中有些是色调和颜色梯度分布都很类似的, 例如:

仅仅亮度梯度类似的,色调明显不同的:

不过有一些是结果明显但依然分类错的:

上面的图片青蛙特征明显, 但是和马的梯度接近, 所以马的打分也会比较高.

标签:HOG,CS231N,assignment,ori,cell,梯度,np,解析,reg
From: https://www.cnblogs.com/360MEMZ/p/17303171.html

相关文章

  • mp2 音频文件解析播放
    FFmpeg读取文件解码播放intPlayMP2Audio(){ char*file="audio.mp2"; AVCodecContext*pCodecCtx=NULL; AVCodec*pCodec=NULL; AVFrame*pFrame=NULL; AVPacket*pPacket; uint8_t*pOutputAudioBuffer; structSwrContext*pAudioConvertContext; AV......
  • 使用 Nginx 实现域名解析到不同端口的应用
    作为个人网站的服务器,一般都是一台。上面部署了各种应用,都是不同的端口。但是域名只能解析到80端口,而且如果你使用隐形URL转发的话,又需要另外加钱(TX的就是几百块一条....),这就很尴尬了。另一种显性URL又会直接301跳转,体验非常不好。这可如何是好呢?这就需要用到Nginx做反向代理了......
  • js:模板解析实现2 -- 支持子列表
    难度是对于子循环列表的解析,比第一个实现有更好的解析效果和应用-----解析代码---/**调用形式tags.call({sid:'含解析html父级id',endFunc:解析结束执行Func},{listsObj});*能够使用注释的位置可以使用注释格式,不能使用时可以使用@.---photo--@来代替<!---photo-->......
  • 56、K8S-监控机制-Prometheus-配置解析、标签管理
    Kubernetes学习目录1、配置文件1.1、配置简介1.1.1、简介Prometheus可以通过命令行或者配置文件的方式对服务进行配置。一般情况下,命令行方式一般用于不可变的系统参数配置,例如存储位置、要保留在磁盘和内存中的数据量等;配置文件用于定义与数据动态获取相关的配置选项和文件......
  • powershell-json文件解析
    .psobject.properties.name可以获取当前节点下的name(***)而.***获取该name冒号后的内容$path="C:\Users\2\Desktop\R360_TCM_Report_Annie\Local\AnnieCaseReport.json"#$path="C:\Users\2\Desktop\DDDDD\De1.json"$content=(Get-Content$path-Encod......
  • 分布式计算技术(上):经典计算框架MapReduce、Spark 解析
    当一个计算任务过于复杂不能被一台服务器独立完成的时候,我们就需要分布式计算。分布式计算技术将一个大型任务切分为多个更小的任务,用多台计算机通过网络组装起来后,将每个小任务交给一些服务器来独立完成,最终完成这个复杂的计算任务。本篇我们介绍两个经典的计算框架MapReduce和Sp......
  • 分布式存储技术(下):宽表存储与全文搜索引擎的架构原理、特性、优缺点解析
    对于写密集型应用,每天写入量巨大,数据增长量无法预估,且对性能和可靠性要求非常高,普通关系型数据库无法满足其需求。对于全文搜索和数据分析这类对查询性能要求极高的场景也是如此。为了进一步满足上面两类场景的需求,有了宽表存储和搜索引擎技术,本文将对他们的架构、原理、优缺点做......
  • Collection - LinkedList源码解析
    简介:LinkedList集合底层是一个双向链表结构,具有增删快,查询慢的特点,内部包含大量操作首尾元素的方法。适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用。链表结构的节点新增、删除都非常简单,仅仅把前后节点的指向修改下就好了,所以LinkedList新增和删除速度很......
  • 实现正向解析的DNS服务器
    配置修改区域配置文件$vim/etc/named.rfc1912.zoneszone"hxg.com"IN{#添加域名对应的数据库文件 typemaster;file"hxg.com.zone";};新建数据库文件$touch/var/named/hxg.com.zone$chgrpnamed/var/named/......
  • 实现DNS的反向解析
    反向区域区域名称:网络地址反写.in-addr.arpa.172.16.100.-->100.16.172.in-addr.arpa.定义区域zone"ZONE_NAME"IN{type{master|slave|forward};file"网络地址.zone"};定义区域解析库文件注意:不需要MX,以PTR记录为主反向区域示例$TTL86400$ORIGIN10.0.0......