williamfzc/stagesepx

为什么分拣出来的结果会包含其他阶段

ssfanli opened this issue · 17 comments

现象

人工按照如下阶段分拣照片:
0 - 手机桌面
1 - App启动过程中的logo
2 - 闪屏广告
3 - 首页框架出现
4 - 首页完全加载
但是,无论是用SVMClassifier还是KerasClassifier分类器,分拣出来的结果总还包含其他内容,如下面的0阶段(0阶段本来应该只有1~21帧)

SVMClassifier分拣结果

('0',
              [[<ClassifierResult stage=0 frame_id=1 timestamp=0.0>,
                <ClassifierResult stage=0 frame_id=2 timestamp=0.016666666666666666>,
                <ClassifierResult stage=0 frame_id=3 timestamp=0.03333333333333333>,
                <ClassifierResult stage=0 frame_id=4 timestamp=0.05>,
                <ClassifierResult stage=0 frame_id=5 timestamp=0.06666666666666667>,
                <ClassifierResult stage=0 frame_id=6 timestamp=0.08333333333333334>,
                <ClassifierResult stage=0 frame_id=7 timestamp=0.1>,
                <ClassifierResult stage=0 frame_id=8 timestamp=0.11666666666666667>,
                <ClassifierResult stage=0 frame_id=9 timestamp=0.13333333333333333>,
                <ClassifierResult stage=0 frame_id=10 timestamp=0.15000000000000002>,
                <ClassifierResult stage=0 frame_id=11 timestamp=0.16666666666666669>,
                <ClassifierResult stage=0 frame_id=12 timestamp=0.18333333333333335>,
                <ClassifierResult stage=0 frame_id=13 timestamp=0.2>,
                <ClassifierResult stage=0 frame_id=14 timestamp=0.21666666666666667>,
                <ClassifierResult stage=0 frame_id=15 timestamp=0.23333333333333334>,
                <ClassifierResult stage=0 frame_id=16 timestamp=0.25>,
                <ClassifierResult stage=0 frame_id=17 timestamp=0.26666666666666666>,
                <ClassifierResult stage=0 frame_id=18 timestamp=0.2833333333333333>,
                <ClassifierResult stage=0 frame_id=19 timestamp=0.30000000000000004>,
                <ClassifierResult stage=0 frame_id=20 timestamp=0.3166666666666667>,
                <ClassifierResult stage=0 frame_id=21 timestamp=0.33333333333333337>],
               [<ClassifierResult stage=0 frame_id=60 timestamp=0.9833333333333334>,
                <ClassifierResult stage=0 frame_id=61 timestamp=1.0>]])

KerasClassifier分拣结果

('0',
              [[<ClassifierResult stage=0 frame_id=1 timestamp=0.0>,
                <ClassifierResult stage=0 frame_id=2 timestamp=0.016666666666666666>,
                <ClassifierResult stage=0 frame_id=3 timestamp=0.03333333333333333>,
                <ClassifierResult stage=0 frame_id=4 timestamp=0.05>,
                <ClassifierResult stage=0 frame_id=5 timestamp=0.06666666666666667>,
                <ClassifierResult stage=0 frame_id=6 timestamp=0.08333333333333334>,
                <ClassifierResult stage=0 frame_id=7 timestamp=0.1>,
                <ClassifierResult stage=0 frame_id=8 timestamp=0.11666666666666667>,
                <ClassifierResult stage=0 frame_id=9 timestamp=0.13333333333333333>,
                <ClassifierResult stage=0 frame_id=10 timestamp=0.15000000000000002>,
                <ClassifierResult stage=0 frame_id=11 timestamp=0.16666666666666669>,
                <ClassifierResult stage=0 frame_id=12 timestamp=0.18333333333333335>,
                <ClassifierResult stage=0 frame_id=13 timestamp=0.2>,
                <ClassifierResult stage=0 frame_id=14 timestamp=0.21666666666666667>,
                <ClassifierResult stage=0 frame_id=15 timestamp=0.23333333333333334>,
                <ClassifierResult stage=0 frame_id=16 timestamp=0.25>,
                <ClassifierResult stage=0 frame_id=17 timestamp=0.26666666666666666>,
                <ClassifierResult stage=0 frame_id=18 timestamp=0.2833333333333333>,
                <ClassifierResult stage=0 frame_id=19 timestamp=0.30000000000000004>,
                <ClassifierResult stage=0 frame_id=20 timestamp=0.3166666666666667>,
                <ClassifierResult stage=0 frame_id=21 timestamp=0.33333333333333337>],
               [<ClassifierResult stage=0 frame_id=48 timestamp=0.7833333333333334>,
                <ClassifierResult stage=0 frame_id=49 timestamp=0.8>,
                <ClassifierResult stage=0 frame_id=50 timestamp=0.8166666666666668>,
                <ClassifierResult stage=0 frame_id=51 timestamp=0.8333333333333334>,
                <ClassifierResult stage=0 frame_id=52 timestamp=0.8500000000000001>],
               [<ClassifierResult stage=0 frame_id=60 timestamp=0.9833333333333334>,
                <ClassifierResult stage=0 frame_id=61 timestamp=1.0>],
               [<ClassifierResult stage=0 frame_id=89 timestamp=1.4666666666666668>,
                <ClassifierResult stage=0 frame_id=90 timestamp=1.4833333333333334>,
                <ClassifierResult stage=0 frame_id=91 timestamp=1.5>,
                <ClassifierResult stage=0 frame_id=92 timestamp=1.5166666666666668>,
                <ClassifierResult stage=0 frame_id=93 timestamp=1.5333333333333334>,
                <ClassifierResult stage=0 frame_id=94 timestamp=1.55>,
                <ClassifierResult stage=0 frame_id=95 timestamp=1.5666666666666669>,
                <ClassifierResult stage=0 frame_id=96 timestamp=1.5833333333333335>,
                <ClassifierResult stage=0 frame_id=97 timestamp=1.6>]])

问题

所以想请教一下几个问题,也是使用过程中的几个疑惑:

  1. 像如上描述的这种情况应该如何修改参数呢?
  2. 训练模型的时候同一个阶段相似度较高的帧是要越多越好还是只取几张就行呢?
  3. 训练好的模型能使用于不同机型,如iPhone XR和iPhone 7,或者安卓和iOS呢?(#88提到是不是可以用keras训练解决这个问题)

报告

reporter.zip

Thanks~

  1. 像如上描述的这种情况应该如何修改参数呢?

最好附一下你取的训练集(截几个图也可以),不然也没法判断选的训练集对不对。
不过我猜是因为1阶段的图形态太单一导致的,使得在60帧的时候模型认为这帧长得比较像0阶段。

训练模型的时候同一个阶段相似度较高的帧是要越多越好还是只取几张就行呢?

一般情况来说是越多越好,有个原则是,阶段形态越复杂(该阶段可能发生的情景越多),你需要扔进去的训练集要相应增加。如果是非常静态且固定的,不用太多。

训练好的模型能使用于不同机型,如iPhone XR和iPhone 7,或者安卓和iOS呢?(#88提到是不是可以用keras训练解决这个问题)

是的,keras分类器目前是可以适应不同分辨率。后续对于固定场景的全自动化,也更推荐使用keras。
但是至于说安卓与ios能否用一个模型,取决于你的app在这两者上运行形态的差异大小。

好的,非常感谢,如下是我截的训练集的图
0
1
2
3
4

看起来应该就是我上面说的那个原因,因为阶段1并不是静态的,还包含了一个动画过程:

image

image

最好将这些过程都加入到阶段1的训练集中,让模型将他们都拟合到同一个类别中。

嗯嗯,我试下,3Q~

还有一个疑问,虽然看stagesepx的相关wiki都提到最好使用外置设备或高速摄像设备采集视频,但这毕竟有较高的成本,也不是很方便,所以我这目前都是用手机自带录屏功能来录取视频。
那像这种情况需要在初始化VideoObject时候用ffmpeg处理fps么,比如XR通常录屏的帧率是58左右,是否需要调整到60帧或30帧,还是说默认即可?

软件录制+ffmpeg是目前比较推荐的方式,平衡了使用成本与准确度。这种方式目前在实验中表现不错,与外置摄像机的误差较小。但值得注意的一点就是必须使用 ffmpeg,否则在一些情况下(例如直接用adb录制)结果差异会非常大。

当然如果有外置摄像头也是很好的,目前软件录制可能存在的问题有两个:

  • 低端机器在极端情况下可能会掉帧(一些东西录不到)
  • 游戏等高fps场景可能帧数不足

嗯了解,那用ffmpeg把视频的fps转换到多少合适呢?
我下午试了下将iPhone7录制的24帧转成30/60/120,结果差别还不小~
所以,这块应该如何把握呢?

嗯了解,那用ffmpeg把视频的fps转换到多少合适呢?
我下午试了下将iPhone7录制的24帧转成30/60/120,结果差别还不小~
所以,这块应该如何把握呢?

差别是指什么差别?
一般60够用。理论上fps越高,误差越小,计算量越大。可以根据实际需要调节。
至于想知道这种方法是否可靠,其实最好是用这种办法跟你之前用其他方法的测量值去对比。

我尝试过后和提问者遇到的情况类似:使用例子里面的long.mp4,并直接使用stagespex自己生成的第一、第二阶段约40张视频图片进行机器训练,发现最后分类出的结果和实际还是有比较大的差距,有很多不属于该阶段的帧被分进去了。看到回答说要越多越好,想问一下实际落地的时候每阶段要约多少图片数才可以基本保证准确分类呢?

我尝试过后和提问者遇到的情况类似:使用例子里面的long.mp4,并直接使用stagespex自己生成的第一、第二阶段约40张视频图片进行机器训练,发现最后分类出的结果和实际还是有比较大的差距,有很多不属于该阶段的帧被分进去了。看到回答说要越多越好,想问一下实际落地的时候每阶段要约多少图片数才可以基本保证准确分类呢?

附一下结果跟训练集(截图也可)?

Hi, 我这边是直接使用示例视频生成出0-5共计6个阶段(附件中“原结果”),然后选择其中的1、2两个阶段的组图作为训练集进行训练(附件中zip文件),并根据该训练集跑出结果(附件中“训练后结果”)。 原结果中的stage1、stage2帧数为,stage1:frame_id 59 -frame_id 62;stage2:frame_id 95 -frame_id 226。 训练后结果中的stage1是从frame_id 1开始到frame_id 229的不连续帧,stage2的情况也是类似,还是有一定偏差的。 这边想问一下大概要多少图片集进行训练才可以达到基本准确呢?谢谢。 原始邮件 发件人: williamfzcnotifications@github.com 收件人: williamfzc/stagesepxstagesepx@noreply.github.com 抄送: CiaraCai574944901@qq.com; Commentcomment@noreply.github.com 发送时间: 2020年3月13日(周五) 00:07 主题: Re: [williamfzc/stagesepx] 为什么分拣出来的结果会包含其他阶段 (#100) 我尝试过后和提问者遇到的情况类似:使用例子里面的long.mp4,并直接使用stagespex自己生成的第一、第二阶段约40张视频图片进行机器训练,发现最后分类出的结果和实际还是有比较大的差距,有很多不属于该阶段的帧被分进去了。看到回答说要越多越好,想问一下实际落地的时候每阶段要约多少图片数才可以基本保证准确分类呢? 附一下结果跟训练集(截图也可)? — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

你的附件被github拦截了。直接发我邮箱 (fengzc@vip.qq.com) 或者在网页端上传才行。

好的,我这边发到你的QQ邮箱了 原始邮件 发件人: williamfzcnotifications@github.com 收件人: williamfzc/stagesepxstagesepx@noreply.github.com 抄送: Ciara574944901@qq.com; Commentcomment@noreply.github.com 发送时间: 2020年3月13日(周五) 10:04 主题: Re: [williamfzc/stagesepx] 为什么分拣出来的结果会包含其他阶段 (#100) Hi, 我这边是直接使用示例视频生成出0-5共计6个阶段(附件中“原结果”),然后选择其中的1、2两个阶段的组图作为训练集进行训练(附件中zip文件),并根据该训练集跑出结果(附件中“训练后结果”)。 原结果中的stage1、stage2帧数为,stage1:frame_id 59 -frame_id 62;stage2:frame_id 95 -frame_id 226。 训练后结果中的stage1是从frame_id 1开始到frame_id 229的不连续帧,stage2的情况也是类似,还是有一定偏差的。 这边想问一下大概要多少图片集进行训练才可以达到基本准确呢?谢谢。 原始邮件 发件人: williamfzcnotifications@github.com 收件人: williamfzc/stagesepxstagesepx@noreply.github.com 抄送: CiaraCai574944901@qq.com; Commentcomment@noreply.github.com 发送时间: 2020年3月13日(周五) 00:07 主题: Re: [williamfzc/stagesepx] 为什么分拣出来的结果会包含其他阶段 (#100) 我尝试过后和提问者遇到的情况类似:使用例子里面的long.mp4,并直接使用stagespex自己生成的第一、第二阶段约40张视频图片进行机器训练,发现最后分类出的结果和实际还是有比较大的差距,有很多不属于该阶段的帧被分进去了。看到回答说要越多越好,想问一下实际落地的时候每阶段要约多少图片数才可以基本保证准确分类呢? 附一下结果跟训练集(截图也可)? — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe. 你的附件被gitlab拦截了。直接发我邮箱 (fengzc@vip.qq.com) 或者在网页端上传才行。 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

不太明白你的需求是什么,这样看运作其实没什么问题。
模型只会将图片分类到它最符合的类别,即使两个都不像,它也会归类为它认为最接近的那一类。

因为自动化的目标就是尽可能的归到正确的一类,但是我这边实验下来无法由此来计算冷启动时间并落地到项目中,因为偏差实在是太大了。我想问一下你们有使用机器学习落地的经验吗?需要多少图片或者如何训练才能保证基本上模型选择的是精准的呢?

  • 归到正确的一类没问题呀,但是你希望将一个复杂的视频强行压成两个类别这不太现实,效果肯定会很差的。你们的实验是怎么样进行的?
  • 落地的话我们已经在实验室中确认过它的效果,误差与高速相机方案差距很小,并在多个业务落地运行中;
  • 这套方案可能产生误差的地方其实在录制方案上,属于软件录制与硬件录制的误差。而对于阶段分得不对,这种都是有办法可以解决的;
  • 可以QQ联系我沟通,方式在 README 末尾