我撰寫了一個代碼來洗掉 8000 張影像的背景,但整個代碼大約需要 8 個小時才能給出結果。
- 由于將來必須處理大型資料集,如何提高其時間復雜度?
- 還是我必須撰寫一個全新的代碼?如果是,請建議一些示例代碼。
from rembg import remove
import cv2
import glob
for img in glob.glob('../images/*.jpg'):
a = img.split('../images/')
a1 = a[1].split('.jpg')
try:
cv_img = cv2.imread(img)
output = remove(cv_img)
except:
continue
cv2.imwrite('../output image/' str(a1[0]) '.png', output)
uj5u.com熱心網友回復:
查看U^2Net 存盤庫。像u2net_test.py一樣,撰寫自己的洗掉函式并使用資料加載器可以加快行程。如果沒有必要跳過 alpha matting,否則您可以從 rembg 添加 alpha matting 代碼。
def main():
# --------- 1. get image path and name ---------
model_name='u2net'#u2netp
image_dir = os.path.join(os.getcwd(), 'test_data', 'test_images')
prediction_dir = os.path.join(os.getcwd(), 'test_data', model_name '_results' os.sep)
model_dir = os.path.join(os.getcwd(), 'saved_models', model_name, model_name '.pth')
img_name_list = glob.glob(image_dir os.sep '*')
print(img_name_list)
#1. dataloader
test_salobj_dataset = SalObjDataset(img_name_list = img_name_list,
lbl_name_list = [],
transform=transforms.Compose([RescaleT(320),
ToTensorLab(flag=0)])
)
test_salobj_dataloader = DataLoader(test_salobj_dataset,
batch_size=1,
shuffle=False,
num_workers=1)
for i_test, data_test in enumerate(test_salobj_dataloader):
print("inferencing:",img_name_list[i_test].split(os.sep)[-1])
inputs_test = data_test['image']
inputs_test = inputs_test.type(torch.FloatTensor)
if torch.cuda.is_available():
inputs_test = Variable(inputs_test.cuda())
else:
inputs_test = Variable(inputs_test)
d1,d2,d3,d4,d5,d6,d7= net(inputs_test)
# normalization
pred = d1[:,0,:,:]
pred = normPRED(pred)
# save results to test_results folder
if not os.path.exists(prediction_dir):
os.makedirs(prediction_dir, exist_ok=True)
save_output(img_name_list[i_test],pred,prediction_dir)
del d1,d2,d3,d4,d5,d6,d7
uj5u.com熱心網友回復:
啊,您使用https://github.com/danielgatis/rembg#usage-as-a-library中的示例作為代碼模板。也許嘗試使用 PIL 影像而不是 OpenCV 的另一個示例。后者大多不那么快,但誰知道呢。嘗試使用 10 張影像并比較執行時間。
這是您使用 PIL 而不是 OpenCV 的代碼。未測驗。
import glob
from PIL import Image
from rembg import remove
for img in glob.glob("../images/*.jpg"):
a = img.split("../images/")
a1 = a[1].split(".jpg")
try:
cv_img = Image.open(img)
output = remove(cv_img)
except:
continue
output.save("../output image/" str(a1[0]) ".png")
uj5u.com熱心網友回復:
嘗試multiprocessing
像 Mark Setchell 在他的評論中提到的那樣使用并行化。我根據此處的方法 8 重寫了您的代碼。多處理應該加快您的執行時間。我沒有測驗代碼,試試它是否有效。
import glob
from multiprocessing import Pool
import cv2
from rembg import remove
def remove_background(filename):
a = filename.split("../images/")
a1 = a[1].split(".jpg")
try:
cv_img = cv2.imread(filename)
output = remove(cv_img)
except:
continue
cv2.imwrite("../output image/" str(a1[0]) ".png", output)
files = glob.glob("../images/*.jpg")
pool = Pool(8)
results = pool.map(remove_background, files)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/506734.html
標籤:Python opencv 机器学习 图像处理 图像分割