Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一头栽进了tensorflow lite的巨坑里

一头栽进了tensorflow lite的巨坑里

作者头像
云水木石
发布于 2019-07-01 09:42:09
发布于 2019-07-01 09:42:09
1.2K0
举报

之前写过一篇《这个中秋,我开发了一个识别狗狗的app》。图片识别可以算作是深度学习领域烂大街的主题,几乎每本书和教程都会拿来作为入门示例。移动端的图片识别的教程也很多,大多数都脱胎于Google的教程《TensorFlow for Poets》和《TensorFlow for Poets 2: Android》。有了现成的教程,我对实现狗狗的图像识别信心满满,认为重点在于信息的展示及狗狗信息的收集。

然而多年的开发经验告诉我,真正自己做起来,一定会碰到问题,特别是像tensorflow lite这种频繁迭代的产品。果然,我就一头栽进了tensorflow lite 的巨坑里。下面我就说道说道这个坑。

参考上面提到的教程,将基本功能实现出来还算顺利。然而,等代码build出来,安装到手机上一测试,拿一张狗狗的图片识别,结果的top 1概率都是0.0 ~ 0.02之间,使用训练的图片测试也是如此。为了更好的进行测试,我写了一个测试用例:predictSingleImage(),直接测试sd卡上的图片。排查问题过程如下:

  1. 确认传递给ImageClassifier的bitmap是正常的,这个可以通过将bitmap保存到文件确认。经过人眼观察,送到ImageClassifier的bitmap中狗狗的图像还是很明显的。
  2. 确认模型问题。我开始采用的是Google Inception V3模型,换成教程中使用的mobilenet模型,问题依旧。将我训练出来的mobilenet模型放到TensorFlow for Poets 2: Android的示例代码中,工作正常,虽然准确率不高,但至少top 1的概率大于0.4。可以确认模型没有问题。
  3. 确认代码,基本上复制的TensorFlow for Poets 2: Android示例代码,不可能出现问题。

到了这一步,就非常郁闷了,于是上网搜索,看有没有和我碰到同样问题的。果然,有个哥们在stackoverflow上提了一个问题:Accuracy score of inceptionV3 tflite model is not good as of retrained_graph.pb file,链接在此:https://stackoverflow.com/questions/49952165/accuracy-score-of-inceptionv3-tflite-model-is-not-good-as-of-retrained-graph-pb

这个帖子将问题步骤描述得很详细,最后贴出了测试结果:

然而,这个问题没有人回答。这一下子又陷入了困顿,有一阵子甚至开始怀疑人生:识别静态照片和camer流中一帧图像难道有本质区别吗?

一次搜索中,我无意中看到一个帖子:TfLite Image classification score is not consistent it keeps increasing for same image untill it reaches to some saturation(actual score)。链接地址:https://groups.google.com/a/tensorflow.org/forum/#!topic/tflite/fREwHb4rAPM

外国人提问题都比较严谨,这个帖子也贴了代码,大意就是说对于同一张图片,Tflite的图片分类的结果不一样,每识别一次,top 1概率就会提升,直到到达一个固定值。

看到这里,我才恍然大悟。回想我的代码和教程代码不同之处就在于:我只调用了一次识别过程,而教程是针对图像帧进行识别,会反复调用识别过程,可能之前的概率很低,但很快被后面的结果给覆盖了。

开始,我猜测是代码中tensorflow lite没有初始化好就调用其识别过程。但我在测试代码中加入延时,没有效果。加入循环,对一个图片反复识别几次,后面的识别就正常了。值得一提的是,不需要反复识别同一图片,换几个图片识别,后面再换其他的图片识别一样没问题。为此我添加了predictImages()方法,测试一系列图片,可以看到开始的top 1 score很低,但识别了几张之后,后面的top 1概率就正常了。

这时,我算是明白,我真的跌进tensorflow lite的巨坑里面了。Tensorflow Lite出现这样一个问题也真是匪夷所思,同样的输入和同样的处理,输出结果却不同,真的颠覆了我对编程的理解。

当年爱因斯坦面对量子力学,提出了“上帝是在执骰子吗?”的疑问。

深度学习也是如此?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
powershell批量远程示例,批量给多台机器安装dotnet和iis
对服务端机器(被远程的机器),除过termservice服务正常运行、远程端口正常监听外,还要额外以管理员身份执行一句powershell命令:
Windows技术交流
2021/11/26
1.7K0
OpenCloudOS Server 7通过pip3安装ansible和pywinrm访问Windows机器
yum install libffi-devel -y 这一步必不可少,否则ansible --version 会报ERROR: No module named '_ctypes'
Windows技术交流
2024/06/28
4710
基于Packer打包Windows镜像的避坑指南
2023年我第一次用腾讯云Packer的时候,当时还是1.8.6版本,那时第一次用,并没有吃透Packer,比如:
Windows技术交流
2024/12/04
2720
Windows远程执行cmd命令的9种方法
IPC$+AT 445 PSEXEC 445 WMI 135 Winrm 5985(HTTP)&5986(HTTPS)
HACK学习
2019/08/15
34.5K0
Windows远程执行cmd命令的9种方法
Win10 Win11如何通过命令开启WinRM
通用Windows Server2012~2025系统的开启WinRM的命令在Win11上报错如下:
Windows技术交流
2024/12/11
3380
AWS的Windows机器通过UserData设置密码并开启winrm
要看winrm状态,看监听是其次,主要得看防火墙状态,尤其是netsh.exe firewall show state显示的RemoteAdminMode(说白了有没有执行winrm quickconfig -q -force,有没有在防火墙放行RemoteAdmin)
Windows技术交流
2024/12/04
1660
如何制作sysprep镜像,确保同一镜像买的不同机器的SID不一样
制作sysprep镜像的步骤主要就2步:下载自动应答文件 → 执行sysprep命令
Windows技术交流
2022/05/19
1.6K0
横向移动之WinRM横向移动
"Windows远程管理(WinRM)"是WS-Management协议(Web Services for Management,又名WSMan)的Microsoft实现,WS-Management Protocol是基于标准简单对象访问协议(SOAP)的对防火墙友好的协议。运行来自不同硬件和操作系统的硬件和操作供应商,以实现互操作(Microsoft Docs)。
黑白天安全
2021/03/16
4.8K0
横向移动之WinRM横向移动
使用 Ansible 批量管理 Windows
Ansible是自动化运维工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块(module)和剧本(playbook)工作。
东风微鸣
2022/04/21
3.8K0
使用 Ansible 批量管理 Windows
工具使用 | WinRM远程管理工具的使用
WinRM是Windows Remote Managementd(Windows远程管理)的简称。它基于Web服务管理(WebService-Management)标准,WinRM2.0默认端口5985(HTTP端口)或5986(HTTPS端口)。如果所有的机器都是在域环境下,则可以使用默认的5985端口,否则的话需要使用HTTPS传输(5986端口)。使用WinRM我们可以在对方有设置防火墙的情况下远程管理这台服务器,因为启动WinRM服务后,防火墙默认会放行5985端口。WinRM服务在Windows Server 2012以上服务器自动启动。在WindowsVista上,服务必须手动启动。WinRM的好处在于,这种远程连接不容易被察觉到,也不会占用远程连接数!
谢公子
2022/01/19
9.4K0
工具使用 | WinRM远程管理工具的使用
关于腾讯云windows更新
没有公网的机器,内网 windows update参考https://cloud.tencent.com/document/product/213/2758
Windows技术交流
2023/10/18
6530
一文打尽 Linux/Windows端口复用实战
场景:内网渗透中,搭建隧道时,服务器仅允许指定的端口对外开放。利用端口复用可以将3389或22等端口转发到如80端口上,以便外部连接。
Ms08067安全实验室
2020/12/14
4.7K0
Ansible 客户端需求–设置Windows主机
为了使Ansible与Windows主机通信并使用Windows模块,Windows主机必须满足以下要求:
好派笔记
2021/09/13
10.3K0
计划任务开机时对C分区extend volume
正常情况下,cloudbase-init会自动对系统盘新增空间自动extend volume,但有些自定义镜像在C分区后面有Recovery分区阻挡导致无法extend volume,见https://cloud.tencent.com/developer/article/2160759
Windows技术交流
2024/02/02
1530
禁止或卸载可能影响渲染的系统服务和计划任务
HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\Global\CoProcManager\AutoDownload,它是用于控制 NVIDIA 协处理器驱动程序的自动下载的。如果您不需要控制 NVIDIA 协处理器驱动程序的自动下载,可以将 AutoDownload 的值设置为 0 来禁用它。
Windows技术交流
2023/10/18
7740
渲染镜像优化
一、如果需要非sysprep(即不入域)的镜像,现有镜像买一台带公网的机器,做如下几个优化:
Windows技术交流
2023/03/23
8740
T1028: WinRM for Lateral Movement
WinRM(Windows Remote Management是WS-Management Protocol Microsoft 实现(具体体现为Win RM 服务)。
鸿鹄实验室
2021/04/15
2.1K0
T1028: WinRM for Lateral Movement
本地windows2008R2镜像上腾讯云迁移解决方案--实践技术文档
【实践目的】实现本地的windows2008R2等镜像上云迁移,让迁移后的云机保持本地的业务环境。
TCS-F
2019/01/27
3.9K0
本地windows2008R2镜像上腾讯云迁移解决方案--实践技术文档
如何验证Windows WinRM通不通
https://docs.vmware.com/en/VMware-Aria-Automation/8.12/Using-Automation-Orchestrator-Plugins/GUID-79518969-9B73-48E3-8B05-72C78179F555.html
Windows技术交流
2024/12/04
1600
持续交付之Jenkins+Ansible+Python搭建自动化部署框架(win版)
无论是为新需求添加的代码,还是静态配置的变更,应用的任何变动都要经过部署这道工序才能最终落地。但通常,新的部署意味着应用重启、服务中断。工程师和测试人员经常在深夜搞得筋疲力尽,甚至焦头烂额。进入持续交付的时代后,这个痛点只会更加突显,因为持续交付意味着持续部署。例如,在测试环境小时级的持续集成场景中,如果没有办法将部署过程流程化、自动化,显然会频繁打断最终的交付过程,大幅降低开发测试效率。
高楼Zee
2019/11/25
2.9K0
持续交付之Jenkins+Ansible+Python搭建自动化部署框架(win版)
推荐阅读
相关推荐
powershell批量远程示例,批量给多台机器安装dotnet和iis
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档