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

PaddleHub/hub_module/modules/image/semantic_segmentation/deeplabv3p_xception65_humanseg内存溢出问题 #603

Open
livingbody opened this issue May 16, 2020 · 7 comments

Comments

@livingbody
Copy link

环境:截止2020年5月17日
模块:paddlehub人像分割模块
PaddleHub/hub_module/modules/image/semantic_segmentation/deeplabv3p_xception65_humanseg
错误现象:数据量很大的情况下内存溢出
错误原因分析:该模块进行分割时,能够设置batch size ,使用少量多次的办法处理图像,但是返回值是一次性返回所有数据,包括处理后的图像numpy二进制数据,这个量特别大,所以很容易就内存溢出了。
代码看了,问题就在那。
mmexport1589652217272
mmexport1589650377401

@Steffy-zxf
Copy link
Contributor

Steffy-zxf commented May 18, 2020

你好!deeplabv3p_xception65_humanseg segmentation接口返回的是所有输入的images分割后的结果。如果返回结果出现内存溢出的情况,可以尝试分批量处理,如images只传入一张图片数据。

@livingbody
Copy link
Author

你好!deeplabv3p_xception65_humanseg segmentation接口返回的是所有输入的images分割后的结果。如果返回结果出现内存溢出的情况,可以尝试分批量处理,如images只传入一张图片数据。

你说的很对,分批传入可以解决问题的。
但是,这个segmentation对输入都做了batch size了,感觉分批传入,batch size基本就没啥用了。或者返回的话,直接只返回保存的image地址,或许会好点。
就看选哪个思路了,要么就手动分批少量多次传入;要么就维持现状,segment大量数据传入,但返回的话只返回生成的image保存后的文件名。

@livingbody
Copy link
Author

我的临时办法:

def GetHumanSeg(in_path, out_path):
    # load model
    module = hub.Module(name="deeplabv3p_xception65_humanseg")
    # config
    frame_path = in_path
    test_img_path = [os.path.join(frame_path, fname) for fname in os.listdir(frame_path)]
    input_dict = {"image": test_img_path}
    print('file len: %d'% len(test_img_path))

   **一个批次传入10张图片**
    total_num = len(test_img_path)
    loop_num = int(np.ceil(total_num / 10))


    for iter_id in range(loop_num):
        batch_data=list()
        handle_id=iter_id *10
        for image_id in range(10):
            try:
                batch_data.append(test_img_path[handle_id +image_id])
                print(handle_id +image_id)
                print(test_img_path[handle_id +image_id])
            except:
                pass
        batch_input_dict={"image": batch_data}
        **segmentation的batch size基本没用了**
        results = module.segmentation(data=batch_input_dict, use_gpu=True, visualization=True,  output_dir=out_path)

@Steffy-zxf
Copy link
Contributor

但是,这个segmentation对输入都做了batch size了,感觉分批传入,batch size基本就没啥用了。或者返回的话,直接只返回保存的image地址,或许会好点。

感谢反馈!batch_size的意义是运行program一次处理的样本数量,这个预测接口segmentation 返回的是所有样本预测结果(分割结果以及分割图片保存路径)。

@livingbody
Copy link
Author

livingbody commented May 18, 2020 via email

@livingbody
Copy link
Author

livingbody commented May 18, 2020 via email

@sunjunling666
Copy link

追加一问,每次都要运行这个模块吗

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

3 participants