学习笔记:煎蛋质量识别

2024-01-02 09:50

本文主要是介绍学习笔记:煎蛋质量识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

感谢这位作者,以下记录是来自于http://www.aiuai.cn/aifarm268.html,我看到比较好,就转记录到自己的博客了,如果有侵权,立马删掉

原文 – ConvNets Series. Actual Project Prototyping with Mask R-CNN
很有意思,根据图片来识别煎蛋质量,口味.

1. 介绍

以前关注过基于德国交通信号(German traffic signs)数据集的应用,这里着手一个更加实际的现实生活问题:

是否可以利用深度学习,根据只采用图片作为输入,来判断图片中食物质量的好坏?

简单来说,商业问题可能是:
如下图,商人看待机器学习问题时,可能觉得 omelette 是 OK 的.
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》

注:欧姆蛋(Omelette,又称西式煎蛋卷、杏力蛋(新加坡和马来西亚的叫法)或奄列(粤语地区的叫法)是煎熟的鸡蛋,中间或可放些馅料卷著。其发源地为法国。做法是先在平底锅内加进蛋汁煎到凝固,再将煎好的圆形蛋饼对折成半圆形即可.
来自百度百科.

这是一个不适定问题(ill-imposed problem): 不确定是否存在解决方案,也不确定解决方式是否唯一和稳定,因为完成(Done) 的定义十分模糊(更别说具体实现了.)
这篇文章不是关于高效沟通和项目管理的,但必要的一点是,不要提交范围不明确的项目.
模棱两可问题解决的最好方式是,首先构造具有明确定义的原型,然后再继续深入任务(问题抽象).
这里即是如此.

2. 问题定义

原型关注于单一物品:欧姆蛋(omelette),并构建可扩展的数据管道(data pipline), 其输出欧姆蛋的 “感知质量 perceived quality”.
概括如下:

  • 问题类型:多类别分类问题,multiclass classification
    六个不同的质量类别:[good, broken_yolk, overroasted, two_eggs, four_eggs, misplaced_pieces]
  • 数据集:351 张不同的欧姆蛋图片,采用 DSLR 相机手工采集. 数据集随机划分:Train/val/test: 139/32/180.
  • 标签:每张欧姆蛋图片均有一个对应的质量列表标签.
  • 度量方法:分类交叉熵 categorical cross-entropy.
  • 必要知识:”good” 欧姆蛋的定义是,三个蛋黄完整的鸡蛋,一些培根肉,没有烧焦碎片,中间有少量的西芹. 另外,组成应该是视觉正确的,没有散乱的片.
  • “完成 Done” 的定义:经过两周的原型设计,能够在测试集上取得最好的交叉熵.
  • 可视化结果:测试数据集低维表示的 t-SNE.

《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
相机拍摄的输入图片

目标:采用神经网络分类器提取特征,然后计算在测试集上,分类器关于类别概率的 softmax 预测结果.
这样的目标可以使原型可行,且便于后续应用.

以下是提取的有用信息:
– 关键成分mask (Mask R-CNN), Singal #1
– 根据关键成分分组进行计数(基本是不同成分计数的矩阵),Singal #2
– 移除欧姆蛋盛放盘子的 RGB 和背景. 不添加到模型. 即最明显的 Singal – 只对这些图片根据设定的损失函数训练 ConvNet 分类器,并计算选定的典型图片的低维表示和当前图片的 L2 距离. 由于训练数据集只有 139 张图片,无法来验证这个假设.

3. 通用 50K 管道 General 50K Pipeline Overview

忽略了几个重要的阶段,如数据发现,数据探索分析,baseline方案,和 Mask R-CNN 的主动标记(active labeling, 根据半监督实例标注新自定义的命名,启发于 Polygon-RNN demo video)管道. 这里主要关注于 Mask R-CNN.

50K 管道如图:
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
主要关注于 Mask R-CNN 和分类阶段.

[1] – Mask R-CNN, 成分 mask 分割;
[2] – 基于 Keras 实现 ConvNet 分类器;
[3] – t-SNE 可视化结果

3.1 Stage1 – Mask R-CNN 和 Masks 推断

Mask R-CNN 最近比较热门. 从最初的 Mask R-CNN 论文,到 Kaggle 中的 Data Science Bowl 2018, Mask R-CNN 已经被证明是实例分割中很有效的结构.
matterport/Mask_RCNN 的基于 Keras 的版本,代码结构良好,文档完整,实现快速,但与期望的相比仍较慢.

Github项目 – Mask R-CNN 的 Keras 实现之Demo

Mask R-CNN 简述:

Mask R-CNN 主要包括两个部分: backbone 网络和类似于 Faster R-CNN 结构的 head 网络.
卷积 backbone 网络,基于 FPN 或 ResNet101,作为整张图片的特征提取器.
其后是 RPN 网络,来为 head 网络采样多尺度的 RoIs.
head 网络计算每个 RoI 的边界框识别和mask 预测.
此过程中,RoIAlign 精细地将 RoI 提取的多尺度特征和输入内容进行对齐.

《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
Mask R-CNN 结构

在实际应用中,尤其是对于原型,预训练的 ConvNet 模型是很重要的.
很多现实生活场景中,数据科学家对于标注数据集知之甚少的,甚至都没有标注数据.
但是,ConvNets 需要大量标注的数据集来进行训练收敛,如 ImageNet 数据集包含 1.2M 标注图片.
这时,迁移学习 – transfer learning 的重要性显现出来了:
冻结预训练模型的卷积层权重,只重新训练分类器. 对于小规模数据集而言,冻结卷积层权重很重要,以保证模型不出现过拟合.

一个训练 epoch 后的示例:
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
实例分割的结果:所有的关键成分都被检测到.

下一个阶段是,裁剪包含盘子的图片部分,并提取每个成分的 2D 二值 Masks.

《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
裁剪的图片和关键成分的二值 mask.

然后,将所有的二值 masks 组合为 8-通道图片(这里定义了 8 个 mask 类别),即 Singal #1.
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
Singal #1 由二值 masks 组成的 8-通道图片

对于 Singal #2,根据 Mask R-CNN 结果计算每个成分的数量,然后组成每个裁剪图片的一个特征向量.

3.2 Stage2 – 基于 Keras 的 ConvNet 分类器

采用 Singal #1 和 Singal #2,(未来添加更多数据) 作为输入,训练网络来分类关于口味质量类别的预测结果.
初步结构如:
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》

分类器结构的主要特点:

  • 多尺度卷积模块 – 开始时采用的 5×5 kernels 的卷积层,但结果不如人意. 采用 3×3, 5×5, 7×7, 11×11 多种 kernels 卷积层的 AveragePooling2D 取得了更好的结果. 每一层后都添加一个 1×1 卷积层进行降维. 类似于 Inception 模块.
  • 大 kernels – 采用较大的 kernel,是因为能够从输入图片中提取更大尺度的特征(其本身也可以看作是 8 fliters 的激活层,每个成分的二值 mask 是一个基本 filter).

  • Singals 融合 – 初步实现仅采用了单个非线性层来融合两个特征集: 二值 masks(Singal #1) 和成分计数(Singal #2). 虽然比较初步,但 添加 Singal #2 还是取得了提升,将交叉熵由 0.8 提升到了 [0.7, 0.72].

  • Logits – 对于 TensorFlow, 该层是 tf.nn.softmax_cross_entropy_with_logits 计算 batch loss 的.

3.3 Stage3 – t-SNE 可视化结果

t-SNE,流形学习技术,用于数据可视化. 其最小化低维表示的数据点和原始高维数据的联合概率分布的 KL 散度, 基于 非凸损失函数. 具体可见论文 – Visualizing Data using t-SNE- JMLR2008

对于测试集分类结果的可视化,提取了对于测试集图片,分类器的 logits 层,然后采用 t-SNE. 效果还不错,如图:
《Mask R-CNN 应用项目原型之煎蛋质量识别[译]》
分类器预测的测试集结果的 t-SNE.

虽然仍不完美,但该方法的确有效. 需要改进的地方有很多:

  • 更多的数据 – ConvNets 需要大量的数据,但这里只有 139 张训练图片. 虽然数据增强十分有效(采用 D4 或 dihedral, symmetry group 数据增强,得到 2K+ 张增强图片),但更多真实数据十分重要.

  • 合适的损失函数 – 这里为了简单,采用了分类交叉熵损失函数,但会有更合适的损失函数,以更好的利用类内方差(intra-class variance). 如 Face 论文 里的 triplet loss.

  • 更好的分类器结构 – 当前分类器只是基础原型,其目的是为了解释输入二值 masks,并将多种特征集组合为单个推断.

  • 更好的标签 – 这里只是手工选了图片标签,六种食物质量标签,分类器的表现已经在十几个测试集图片上超过了预料.

4. 思考

在实际中更普遍的情况是,商业问题没有数据,没有标注,没有需要完成的清晰和结构良好的技术任务.
这是好事:我们要做的就是,利用工具,足够的 GPU 硬件,商业和技术的结合,预训练模型,以及其它所需要的东西,发掘商业价值.

小事开始做起 – 根据 LEGO 代码块构建的原型有助于进一步的提高交流的生产力. 作为数据科学家,应该为商业提供相应的解决方案.


这篇关于学习笔记:煎蛋质量识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/562089

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个