Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议和bug #241

Open
poxiao33 opened this issue Jan 10, 2025 · 11 comments
Open

建议和bug #241

poxiao33 opened this issue Jan 10, 2025 · 11 comments

Comments

@poxiao33
Copy link

快捷键繁琐,建议改为快捷键 “Q”为双重功能按键,按下“Q”进入标注编辑状态,再次按下“Q”完成标注(“E”键功能)并保存("S"键功能)。快捷键“A”(上一张图片)和“D”(下一张图片)改为 自动检测当前是否是标注编辑状态,如果是的话自动完成标注状态并保存,然后在载入下一张图片或者上一张图片。然后载入上一张或者下一张图片后自动进入上次的状态,例如 自动进入标注编辑状态(“Q”键)这样的话标注起来效率能提升不少,只需要按下一个快捷键(D或者A)就能完成标注并且保存。

bug:

使用 工具-数据转换-自动分割[基于标注框] 的时候生成的 ISAT格式的json文件中的 info.width、info.height、info.depth字段的数据类型是字符串,和工具手动标注生成的 ISAT格式的json不一致,导致使用 自动分割[基于标注框] 生成的 ISAT格式文件无法进行使用其他工具栏里面的数据转换工具。例如VOC。

@yatengLG
Copy link
Owner

  1. Q 的双重功能
    软件还有其他标注方式,Q只是其中sam的点提示功能。
  2. AD键附带保存
    菜单栏-编辑-自动保存,勾选即可。
  3. 所说的这个,进入自动开始标注,然后只剩下ad键......
    你需要的应该是这个: 如何单键触发实现多个子功能,例如W=ESD+Q #106
    该功能由于每个人需求都不一样,自己修改吧,代码已经给出了。
  • bug
    后续修复

@poxiao33
Copy link
Author

感谢回复,已修改源码达到效果。

@yatengLG
Copy link
Owner

bug已修复

@poxiao33
Copy link
Author

poxiao33 commented Jan 14, 2025

还有两个问题:
1.模型重复初始化。

切换模型的时候会初始化一次,当使用视频分割的时候,似乎又初始化了一次。软件开启后必须先选择模型,然后在载入图片才不会出错,如果先载入了图片,而且图片又有很多的话在选择模型就会报错。

2.非常严重的问题,模型初始化导致内存分配失败。

代码似乎是一次性把全部的图片都读入到内存进行初始化了,如果当前有很多图片的话就会导致内存分配失败,不管是使用 视频分割1帧或者5帧又或者全部,都会报错。能否改成分批次加载啊。

@yatengLG

@yatengLG
Copy link
Owner

  1. 模型没有重复初始化
    sam2的视频分割,需要先对所有视频帧做一次读取,然后才可以视频分割。
    你提到的‘又一次初始化’,其实是Sam2视频分割时的init_state操作
  2. 需要一次把所有视频帧读进去
    视频分割一帧、五帧这是ISAT自己做的功能,为了方便标注时检查。sam2只有分割全部帧功能

@poxiao33
Copy link
Author

  1. 模型没有重复初始化
    sam2的视频分割,需要先对所有视频帧做一次读取,然后才可以视频分割。
    你提到的‘又一次初始化’,其实是Sam2视频分割时的init_state操作
  2. 需要一次把所有视频帧读进去
    视频分割一帧、五帧这是ISAT自己做的功能,为了方便标注时检查。sam2只有分割全部帧功能

我的意思是能改成分批处理吗?例如每100帧看作一个视频?这样是不是就能解决大量图片情况下内存分配失败?

@yatengLG
Copy link
Owner

我的意思是能改成分批处理吗?例如每100帧看作一个视频?这样是不是就能解决大量图片情况下内存分配失败?

直接一百帧分一个文件夹标注不就好了?

身为一个很多人都在用的软件,代码逻辑没法改成你说的这个样子的。

@poxiao33
Copy link
Author

我的意思是能改成分批处理吗?例如每100帧看作一个视频?这样是不是就能解决大量图片情况下内存分配失败?

直接一百帧分一个文件夹标注不就好了?

身为一个很多人都在用的软件,代码逻辑没法改成你说的这个样子的。

逻辑改成这样也不会影响sam分割视频的连贯性啊,而且还能解决内存分配失败的问题,这么优秀的软件存在这么低级的错误很不合理呀。

@yatengLG
Copy link
Owner

yatengLG commented Jan 14, 2025

逻辑改成这样也不会影响sam分割视频的连贯性啊,而且还能解决内存分配失败的问题,这么优秀的软件存在这么低级的错误很不合理呀。

这个不是逻辑错误。

假设情景,标注一个有1k帧的视频。

按提供的那个逻辑,一次加载100张,这时就会有问题:

  1. 单次最多标注100张,全视频分割功能基本废了。
  2. 每标注100张就需要init_state操作(你前面提到这个问题了,应该对这个速度有一些估计)
  3. 按100张去划分处理,是直接裁分就好,还是要存在重叠部分?如果直接裁分,如[0-99、100-199],就会出现第101张未标注,需要手动标注后继续;如果存在重叠部分,如[0-99,80-179],这样可以不用手动标注,但是会出现问题,每次标注存在些微差别(不同数量的重叠部分,可以认为是不同的视频,标注结果不一致,该取哪一个作为最终的?)
  4. 每个人内存都不一样,最终该100一次,还是200一次?

不论是时间,还是稳定性,都不是一个标注软件能接受的。


按现在逻辑是没有任何问题。只有一个问题:视频帧太多时,对内存要求会比较高。

针对这个问题ISAT已经优化过了,计算以后就把特征卸载到内存中,现在只是占用内存高,否则占用显存,会有更多设备跑不了的。

并且这个问题很好解决:用户只需要针对自己设备性能,手动划分个文件夹就解决了。

@poxiao33
Copy link
Author

逻辑改成这样也不会影响sam分割视频的连贯性啊,而且还能解决内存分配失败的问题,这么优秀的软件存在这么低级的错误很不合理呀。

这个不是逻辑错误。

假设情景,标注一个有1k帧的视频。

按提供的那个逻辑,一次加载100张,这时就会有问题:

  1. 单次最多标注100张,全视频分割功能基本废了。
  2. 每标注100张就需要init_state操作(你前面提到这个问题了,应该对这个速度有一些估计)
  3. 按100张去划分处理,是直接裁分就好,还是要存在重叠部分?如果直接裁分,如[0-99、100-199],就会出现第101张未标注,需要手动标注后继续;如果存在重叠部分,如[0-99,80-179],这样可以不用手动标注,但是会出现问题,每次标注存在些微差别(不同数量的重叠部分,可以认为是不同的视频,标注结果不一致,该取哪一个作为最终的?)
  4. 每个人内存都不一样,最终该100一次,还是200一次?

不论是时间,还是稳定性,都不是一个标注软件能接受的。

按现在逻辑是没有任何问题。只有一个问题:视频帧太多时,对内存要求会比较高。

针对这个问题ISAT已经优化过了,计算以后就把特征卸载到内存中,现在只是占用内存高,否则占用显存,会有更多设备跑不了的。

并且这个问题很好解决:用户只需要针对自己设备性能,手动划分个文件夹就解决了。

感谢您的详细解答和对问题的分析!针对您提到的分批处理可能引发的连贯性与逻辑复杂性问题,我想进一步补充我的观点,并说明我的优化建议如何避免这些问题。

  1. 关于帧重叠与连贯性问题
    您提到帧重叠可能导致标注结果冲突和连贯性问题,但我的方案中并不存在这种情况:

分割 1 帧或少量帧(如 5 帧)时:
默认多加载一帧(例如:分割 5 帧时加载 6 帧),首帧手动标注,后续帧基于首帧标注结果自动分割。
此过程完全独立,不涉及帧重叠,也不会引发标注冲突。
分割完整视频时:
将视频按固定帧数(如 100 帧)分批,每批首帧使用上一批的最后一帧标注结果作为初始化,保证帧间连贯性。
不存在帧重叠问题,每帧只处理一次,逻辑清晰且高效。
2. 关于内存分配与设备适配问题
您提到不同设备的内存限制可能导致批次划分难以统一,我的建议如下:

默认批次大小(如 100 帧):
软件提供默认值,用户无需手动划分文件夹即可运行。
动态调整机制:
批次大小可以作为可配置参数,用户根据设备性能自行调整(例如 50 帧或 200 帧),以适配各种硬件环境。
此方案兼顾了灵活性和易用性,用户无需复杂的操作即可完成任务。

  1. 关于运行时间与稳定性
    分批处理确实会增加一些初始化操作,但影响非常有限,且相比一次性加载所有帧,以下优化更能提升整体稳定性:

分批释放内存:每处理完一批帧,立即释放该批次的数据,避免内存占用累积。
标注结果传递:通过缓存上一批最后一帧的标注结果,减少重复计算,保证分割连贯性的同时优化性能。
4. 优化建议的整体优点
我的方案在功能和性能上都有一定的改进空间:

解决内存分配失败的问题:通过分批加载,降低内存占用,适配更多设备。
保持功能一致性:不同分割需求(1 帧、5 帧、完整视频)都基于统一逻辑,减少用户操作复杂度。
兼顾灵活性与易用性:批次大小可调,用户无需额外手动划分文件夹。
希望我的补充可以帮助更好地优化分批处理的逻辑,同时降低开发和维护的复杂性。如果您觉得这套方案可行,我也愿意进一步讨论具体的实现细节。

再次感谢您的时间和耐心解答!

@yatengLG
Copy link
Owner

yatengLG commented Jan 14, 2025

主要问题出在于SAM2需要将视频分割的帧加载一次,也就是init_state操作。
这个操作其实很费时间,你可以先加载sam2模型,然后再打开文件夹,这时的卡死就是由于init_state操作造成的。

现在的逻辑,卡顿一次,后续的标注操作会特别流畅;如果改动了,标注过程中不定时的卡顿会特别难受。

核心问题只存在于init_state操作,想分割哪些帧,就必须对这些帧做一次init_state。把这个操作放到标注过程中,没规律的卡死真的很影响体验。

并且这个操作,没法放到一个单独的线程中去计算。(如果你看过代码,应该发现,sam单图分割的特征计算都是单独的线程在后台计算的,这是ISAT标注过程中不卡顿的主要原因)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants