yatengLG / ISAT_with_segment_anything

Labeling tool with SAM(segment anything model),supports SAM, SAM2, sam-hq, MobileSAM EdgeSAM etc.交互式半自动图像标注工具
https://www.yatenglg.cn/isat/
Other
1.19k stars 129 forks source link

[Functional]选区功能增强 #167

Closed XieDeWu closed 3 months ago

XieDeWu commented 3 months ago

书接此回 https://github.com/yatengLG/ISAT_with_segment_anything/issues/164#issuecomment-2136537666 选区功能不好用故增强 额外功能 "扁平化选区", 在我本地因为Qt不熟UI是乱改的故只放关键画布代码变更,也多了两个依赖keyboard,shapely 我就不放PR了,注释已补上,大概就这么个事简单描述下,gif后面我补几个 canvas.txt

XieDeWu commented 3 months ago

image 增 减 交 异或 待学习完gif制作后放出

XieDeWu commented 3 months ago

image 这就是我不放PR的原因

yatengLG commented 3 months ago

-- coding: utf-8 --

@Author : LG

import cv2 from PIL import Image import os

def video_to_frams(video_path:str, save_root:str, frame_ferquency:int=1, scale:float=1.): """ 视频拆帧 :param video_path: 视频路径 :param save_root: 图片保存目录 :param frame_ferquency: 抽帧间隔 :param scale: 保存图像的尺寸比例 :return: """ camera = cv2.VideoCapture(video_path) frame_count = int(camera.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(camera.get(cv2.CAP_PROP_FPS)) print('总帧数:{} | fps:{}'.format(frame_count, fps)) for index in range(frame_count): res, image = camera.read() if index % frameferquency == 0: h, w, = image.shape image = cv2.resize(image, (int(w scale), int(h scale))) cv2.imwrite(os.path.join(save_root, '{:0>8}.jpg'.format(index)), image) camera.release() return True

def generate_gif(images_root:str, save_path:str, duration=1000): """ 图片合成gif :param images_root: 图标目录 :param save_path: gif保存路径 :param duration: 间隔,默认1000=1秒 :return: """ image_paths = sorted([os.path.join(images_root, image_name) for image_name in os.listdir(images_root)]) gif_frames = [] for filename in image_paths: img = Image.open(filename) gif_frames.append(img) gif_frames[0].save(save_path, save_all=True, append_images=gif_frames[1:], duration=duration, loop=0) return True

XieDeWu commented 3 months ago

2024-05-31-16-09-17 随便找了个网站mkv转gif了 功能大概就这样,跟PS一样

XieDeWu commented 3 months ago

至于那个内存泄漏的Bug,因为对Python不熟与逆向工程不熟,只能说抓瞎,开摆,大不了20分钟重启一次

yatengLG commented 3 months ago

至于那个内存泄漏的Bug,因为对Python不熟与逆向工程不熟,只能说抓瞎,开摆,大不了20分钟重启一次

内存泄露应该不是代码层面的问题。我昨天也在window11上试了,内存占用一直在800M左右,没有明显变化。(不过我图分辨率比较小,用的项目的示例图片;但在linux上用2000w像素的图,也没有内存占用问题)。

可以排查下运行环境或者其他因素。


对于添加了 "增, 减, 交, 异或"四种对多边形的操作

  1. '增减',你可以尝试下 repaint功能,那个功能应该可以满足增减多边形的需求,并且会更好用一些(对于单多边形的编辑需求)。
  2. 对于'交 异或',我觉得这个功能挺好,但是大概率会换一种实现方式。 初步的设想是这样的:先选定多个多边形,然后点击'交 / 异或' 按钮,完成多个多边形的合并操作。

你看这个样的处理方式会不会更好一些。

XieDeWu commented 3 months ago

至于那个内存泄漏的Bug,因为对Python不熟与逆向工程不熟,只能说瞎搞,开摆,大不了20分钟重启一次

内存泄露应该不是代码先锋问题。我昨天也在windows11上试用了,内存占用一直在800M左右,没有明显变化。(不过我图分辨率比较小,用的项目的示例图片;但在linux上用2000w像素的图,也没有内存占用问题)。

可以调查运行环境或者其他因素。

对于“增、减、交、异或”四个对多边形的一些操作

  1. '增减',你可以尝试重新绘制功能,该功能应该可以满足增减多边形的需求,并且会更好地用一些针对单一多边形的编辑需求。
  2. 对于“交/异或”,我觉得这个功能好,但是大概率会换一种实现方式。 初步的设想是这样的:先选定多个多边形,然后点击“交/异或”按钮,完成多个多边形的合并操作。

你看这个样子处理方式会不会更好一些。

都行,反正顶多多了个可选项, 我现在是按扁平化处理, 多组选取能塞右键上下文,当然一般都是快捷键就是了 我是本地开了个可选配置项 Flatten Section 扁平化选区, 只是对原功能的增强. 主仓得大佬你来啦

yatengLG commented 3 months ago

至于那个内存泄漏的Bug,因为对Python不熟与逆向工程不熟,只能说瞎搞,开摆,大不了20分钟重启一次

内存泄露应该不是代码先锋问题。我昨天也在windows11上试用了,内存占用一直在800M左右,没有明显变化。(不过我图分辨率比较小,用的项目的示例图片;但在linux上用2000w像素的图,也没有内存占用问题)。 可以调查运行环境或者其他因素。 对于“增、减、交、异或”四个对多边形的一些操作

  1. '增减',你可以尝试重新绘制功能,该功能应该可以满足增减多边形的需求,并且会更好地用一些针对单一多边形的编辑需求。
  2. 对于“交/异或”,我觉得这个功能好,但是大概率会换一种实现方式。 初步的设想是这样的:先选定多个多边形,然后点击“交/异或”按钮,完成多个多边形的合并操作。

你看这个样子处理方式会不会更好一些。

都行,反正顶多多了个可选项, 我现在是按扁平化处理, 多组选取能塞右键上下文,当然一般都是快捷键就是了 我是本地开了个可选配置项 Flatten Section 扁平化选区, 只是对原功能的增强. 主仓得大佬你来啦

这个功能应该很好加,有空的话,下周应该就可以完成。

XieDeWu commented 3 months ago

嗯嗯,期待大佬你这边的功能增强入仓 现在主要就两个功能,这两个作用范围不是相同的,我个人还是挺期待我这边的功能完整入仓 总之两个可选功能强化 1.扁平化选区 2.增强组选取

XieDeWu commented 3 months ago

至于那个内存泄漏的Bug,因为对Python不熟与逆向工程不熟,只能说抓瞎,开摆,大不了20分钟重启一次

内存泄露应该不是代码层面的问题。我昨天也在window11上试了,内存占用一直在800M左右,没有明显变化。(不过我图分辨率比较小,用的项目的示例图片;但在linux上用2000w像素的图,也没有内存占用问题)。

可以排查下运行环境或者其他因素。

对于添加了 "增, 减, 交, 异或"四种对多边形的操作

  1. '增减',你可以尝试下 repaint功能,那个功能应该可以满足增减多边形的需求,并且会更好用一些(对于单多边形的编辑需求)。
  2. 对于'交 异或',我觉得这个功能挺好,但是大概率会换一种实现方式。 初步的设想是这样的:先选定多个多边形,然后点击'交 / 异或' 按钮,完成多个多边形的合并操作。

你看这个样的处理方式会不会更好一些。

就是因为repaint不好用就写的,一般懒得写代码,一般都是对一个标签做非重叠选区做编辑,直接扁平化就事少了

XieDeWu commented 3 months ago

为什么用起来觉得不好用,额我举几个例子 1.对于毛发,组合特征如头发+脸+眼睛耳朵 之类的 SAM也没办法一次扣好复杂边缘,更别指望repaint能做好,工作量贼大 往往需要多次进行分开进行SAM,叠加取并集 或者直接全选,然后直接扣掉背景,效率最高 2.repaint的既不能双击拆点,也不能双击删点 3.主要原因 可能是bug我用不了,只会画小红点,所以没办法只能改代码,一般没事都不会动代码,能跑就行 现在跑不了 image

XieDeWu commented 3 months ago

image 有个BUG,数据集可能出现点线之类,需要限制为仅需多边形数据就好,或buffer设置为>0,常见于场景边框

yatengLG commented 3 months ago

为什么用起来觉得不好用,额我举几个例子 1.对于毛发,组合特征如头发+脸+眼睛耳朵 之类的 SAM也没办法一次扣好复杂边缘,更别指望repaint能做好,工作量贼大 往往需要多次进行分开进行SAM,叠加取并集 或者直接全选,然后直接扣掉背景,效率最高 2.repaint的既不能双击拆点,也不能双击删点 3.主要原因 可能是bug我用不了,只会画小红点,所以没办法只能改代码,一般没事都不会动代码,能跑就行 现在跑不了 image

你这个红点是啥?绿色的部分又是啥?

绿色是sam的分割效果?

另外回复下你提到的几个点:

  1. sam没法一次扣好,这个你可以发我一个原图,然后在发一个你想要的最终效果。我看下是不是你使用有问题
  2. repaint的目的是局部重绘,为什么要双击拆点和双击删点? 你所说的拆点,应该就是两点之间添加额外点,repaint完全满足啊;删点这个功能不是一直都有吗?
  3. bug用不了,只能画小红点,小红点是啥?
XieDeWu commented 3 months ago

关于第一点,现在是要分开几个选区扣几次才行,最后叠加到单通道图,如果是一次扣就如下图, 打 image 而目标效果图 image 这是原图 98664300_p0

XieDeWu commented 3 months ago

关于第二第三点的回复,因为这边从未正常使用过此功能故无法回复 这是卖家秀 重绘 这边买家秀 2024-06-03-08-42-15

XieDeWu commented 3 months ago

2024-06-03-08-53-44 因为我直接按扁平化同标签组选区来写的,所以不等价 repaint 可以等价,但是需要额外写一个实现, 允许在选中状态下进入选区模式 且若有选取,则只对仅需对所选区域操作

XieDeWu commented 3 months ago

不好意思我得改一下,现在与我用不了的repoint功能不等价 image

XieDeWu commented 3 months ago

image

XieDeWu commented 3 months ago

不好意思我得改一下,现在与我用不了的repoint功能不等价 image

对Qt不熟,估计得晚点

yatengLG commented 3 months ago

关于第二第三点的回复,因为这边从未正常使用过此功能故无法回复 这是卖家秀 重绘 重绘 这边买家秀 2024-06-03-08-42-15 2024-06-03-08-42-15

重绘必须是顶点起始,顶点结束

对于你后面展示的情况,我了解了。

我之前表述的是,多边形的增减可以通过 repaint模式实现,但你的使用情况是可能需要在边上直接进行截断(但repaint需要以另一个顶点结束,不过这种情况实际上还是可以通过repaint实现的,就是多拉一条线。)

对于后面的多边形交/异或操作是没有异议的。

后续我会添加多边形的 增/减/交/异或等操作,这个应该特别好实现,你提的pr就先不合并了,

XieDeWu commented 3 months ago

嗯嗯,到时候我关闭pr就好 因为Qt不太熟, 若等效repoint,所以需要写若存在选中,则只对选中部分操作,这部分我还在摸索,希望到时候也加上

yatengLG commented 3 months ago

嗯嗯,到时候我关闭pr就好 因为Qt不太熟, 若等效repoint,所以需要写若存在选中,则只对选中部分操作,这部分我还在摸索,希望到时候也加上

实现了,回复你。应该会很快的。 到时候你试一下看能不能满足你要的需求。

XieDeWu commented 3 months ago

好的,谢谢

yatengLG commented 3 months ago

好的,谢谢

https://github.com/yatengLG/ISAT_with_segment_anything/blob/master/docs/%E5%8A%9F%E8%83%BD%E8%AF%B4%E6%98%8E.md#16%E4%BA%A4%E5%B9%B6%E5%B7%AE%E5%BC%82%E6%88%96

功能已经添加,你可以尝试一下。

XieDeWu commented 3 months ago

看到了 我fetch merge看看

XieDeWu commented 3 months ago

简单测试了下,功能是有的 只是说 .... 很难用吧. 1.只针对 "两个" 之间的操作,如果选区太散,或者多选就不支持了 2.必须进行选取两个选区的动作,影响效率,操作过于精细化了 不过UI有了,我这边瞅瞅代码看下怎么改比较合适,毕竟这边的意图是仅局限与对选中部分操作 毕竟我是粗操作,这边细操作,结合一下会舒服点

yatengLG commented 3 months ago

简单测试了下,功能是有的 只是说 .... 很难用吧. 1.只针对 "两个" 之间的操作,如果选区太散,或者多选就不支持了 2.必须进行选取两个选区的动作,影响效率,操作过于精细化了 不过UI有了,我这边瞅瞅代码看下怎么改比较合适,毕竟这边的意图是仅局限与对选中部分操作 毕竟我是粗操作,这边细操作,结合一下会舒服点

主要你的需求和我软件的功能需求不一致。

在标注过程中,实际上很少会用到这个功能,只存在与一些调整情况。

你不能强求我把标注软件,改成专为你需求定制的T.T

但还是非常感谢你的建议,软件功能更完善了!!!

XieDeWu commented 3 months ago

毕竟我的功能如题"扁平化选区" ,会抛弃深度信息, 对于应用场景 同标签多物品 分开标注且选区重叠的 需要深度信息的 不适配 我rebase一下做成冗余参数,在不需要深度信息时候,作为冗余参数打开增加效率,毕竟应用场景不一样.

XieDeWu commented 3 months ago

用了一会,效率还可以接受就懒得改了 qwq