core.py 8.9 KB
Newer Older
H
hypox64 已提交
1 2 3 4 5 6 7 8
import os
import numpy as np
import cv2

from models import runmodel,loadmodel
from util import mosaic,util,ffmpeg,filt,data
from util import image_processing as impro

9 10 11
'''
---------------------Video Init---------------------
'''
H
hypox64 已提交
12 13
def video_init(opt,path):
    util.clean_tempfiles()
14 15 16
    fps,endtime,height,width = ffmpeg.get_video_infos(path)
    if opt.fps !=0:
        fps = opt.fps
H
hypox64 已提交
17
    ffmpeg.video2voice(path,'./tmp/voice_tmp.mp3')
18
    ffmpeg.video2image(path,'./tmp/video2image/output_%05d.'+opt.tempimage_type,fps)
H
hypox64 已提交
19 20
    imagepaths=os.listdir('./tmp/video2image')
    imagepaths.sort()
21
    return fps,imagepaths,height,width
H
hypox64 已提交
22

23 24 25
'''
---------------------Add Mosaic---------------------
'''
H
hypox64 已提交
26
def addmosaic_img(opt,netS):
H
hypox64 已提交
27 28 29
    path = opt.media_path
    print('Add Mosaic:',path)
    img = impro.imread(path)
H
hypox64 已提交
30
    mask = runmodel.get_ROI_position(img,netS,opt)[0]
H
hypox64 已提交
31
    img = mosaic.addmosaic(img,mask,opt)
32
    impro.imwrite(os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_add.jpg'),img)
H
hypox64 已提交
33

H
hypox64 已提交
34
def addmosaic_video(opt,netS):
H
hypox64 已提交
35
    path = opt.media_path
36
    fps,imagepaths = video_init(opt,path)[:2]
H
hypox64 已提交
37 38
    # get position
    positions = []
H
hypox64 已提交
39
    for i,imagepath in enumerate(imagepaths,1):
H
hypox64 已提交
40
        img = impro.imread(os.path.join('./tmp/video2image',imagepath))
H
hypox64 已提交
41
        mask,x,y,size,area = runmodel.get_ROI_position(img,netS,opt)
H
hypox64 已提交
42 43
        positions.append([x,y,area])      
        cv2.imwrite(os.path.join('./tmp/ROI_mask',imagepath),mask)
44
        print('\r','Find ROI location:'+str(i)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
H
hypox64 已提交
45
    print('\nOptimize ROI locations...')
H
hypox64 已提交
46 47 48 49
    mask_index = filt.position_medfilt(np.array(positions), 7)

    # add mosaic
    for i in range(len(imagepaths)):
H
hypox64 已提交
50
        mask = impro.imread(os.path.join('./tmp/ROI_mask',imagepaths[mask_index[i]]),'gray')
H
hypox64 已提交
51
        img = impro.imread(os.path.join('./tmp/video2image',imagepaths[i]))
H
hypox64 已提交
52 53
        if impro.mask_area(mask)>100:    
            img = mosaic.addmosaic(img, mask, opt)
H
hypox64 已提交
54
        cv2.imwrite(os.path.join('./tmp/addmosaic_image',imagepaths[i]),img)
55
        print('\r','Add Mosaic:'+str(i+1)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
H
hypox64 已提交
56
    print()
H
hypox64 已提交
57 58 59 60 61
    ffmpeg.image2video( fps,
                        './tmp/addmosaic_image/output_%05d.'+opt.tempimage_type,
                        './tmp/voice_tmp.mp3',
                         os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_add.mp4'))

62 63 64
'''
---------------------Style Transfer---------------------
'''
H
hypox64 已提交
65 66 67 68 69
def styletransfer_img(opt,netG):
    print('Style Transfer_img:',opt.media_path)
    img = impro.imread(opt.media_path)
    img = runmodel.run_styletransfer(opt, netG, img)
    suffix = os.path.basename(opt.model_path).replace('.pth','').replace('style_','')
70
    impro.imwrite(os.path.join(opt.result_dir,os.path.splitext(os.path.basename(opt.media_path))[0]+'_'+suffix+'.jpg'),img)
H
hypox64 已提交
71 72 73 74

def styletransfer_video(opt,netG):
    path = opt.media_path
    positions = []
75
    fps,imagepaths = video_init(opt,path)[:2]
H
hypox64 已提交
76 77 78 79 80

    for i,imagepath in enumerate(imagepaths,1):
        img = impro.imread(os.path.join('./tmp/video2image',imagepath))
        img = runmodel.run_styletransfer(opt, netG, img)
        cv2.imwrite(os.path.join('./tmp/style_transfer',imagepath),img)
81
        print('\r','Transfer:'+str(i)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
H
hypox64 已提交
82 83 84 85 86 87 88
    print()
    suffix = os.path.basename(opt.model_path).replace('.pth','').replace('style_','')
    ffmpeg.image2video( fps,
                './tmp/style_transfer/output_%05d.'+opt.tempimage_type,
                './tmp/voice_tmp.mp3',
                 os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_'+suffix+'.mp4'))  

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
'''
---------------------Clean Mosaic---------------------
'''
def get_mosaic_positions(opt,netM,imagepaths,savemask=True):
    # get mosaic position
    positions = []
    for i,imagepath in enumerate(imagepaths,1):
        img_origin = impro.imread(os.path.join('./tmp/video2image',imagepath))
        x,y,size,mask = runmodel.get_mosaic_position(img_origin,netM,opt)
        if savemask:
            cv2.imwrite(os.path.join('./tmp/mosaic_mask',imagepath), mask)
        positions.append([x,y,size])
        print('\r','Find mosaic location:'+str(i)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
    print('\nOptimize mosaic locations...')
    positions =np.array(positions)
    for i in range(3):positions[:,i] = filt.medfilt(positions[:,i],opt.medfilt_num)
    return positions

H
hypox64 已提交
107 108
def cleanmosaic_img(opt,netG,netM):

H
hypox64 已提交
109 110 111
    path = opt.media_path
    print('Clean Mosaic:',path)
    img_origin = impro.imread(path)
H
hypox64 已提交
112
    x,y,size,mask = runmodel.get_mosaic_position(img_origin,netM,opt)
H
hypox64 已提交
113
    cv2.imwrite('./mask/'+os.path.basename(path), mask)
H
hypox64 已提交
114 115 116
    img_result = img_origin.copy()
    if size != 0 :
        img_mosaic = img_origin[y-size:y+size,x-size:x+size]
117 118 119 120
        if opt.traditional:
            img_fake = runmodel.traditional_cleaner(img_mosaic,opt)
        else:
            img_fake = runmodel.run_pix2pix(img_mosaic,netG,opt)
H
hypox64 已提交
121
        img_result = impro.replace_mosaic(img_origin,img_fake,mask,x,y,size,opt.no_feather)
H
hypox64 已提交
122 123
    else:
        print('Do not find mosaic')
124
    impro.imwrite(os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_clean.jpg'),img_result)
H
hypox64 已提交
125

H
hypox64 已提交
126
def cleanmosaic_video_byframe(opt,netG,netM):
H
hypox64 已提交
127
    path = opt.media_path
128
    fps,imagepaths = video_init(opt,path)[:2]
H
hypox64 已提交
129
    positions = get_mosaic_positions(opt,netM,imagepaths,savemask=True)
H
hypox64 已提交
130 131 132 133 134 135 136
    # clean mosaic
    for i,imagepath in enumerate(imagepaths,0):
        x,y,size = positions[i][0],positions[i][1],positions[i][2]
        img_origin = impro.imread(os.path.join('./tmp/video2image',imagepath))
        img_result = img_origin.copy()
        if size != 0:
            img_mosaic = img_origin[y-size:y+size,x-size:x+size]
137 138 139 140
            if opt.traditional:
                img_fake = runmodel.traditional_cleaner(img_mosaic,opt)
            else:
                img_fake = runmodel.run_pix2pix(img_mosaic,netG,opt)
H
hypox64 已提交
141 142
        mask = cv2.imread(os.path.join('./tmp/mosaic_mask',imagepath),0)
        img_result = impro.replace_mosaic(img_origin,img_fake,mask,x,y,size,opt.no_feather)
H
hypox64 已提交
143
        cv2.imwrite(os.path.join('./tmp/replace_mosaic',imagepath),img_result)
144
        print('\r','Clean Mosaic:'+str(i+1)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
H
hypox64 已提交
145
    print()
H
hypox64 已提交
146 147 148 149 150
    ffmpeg.image2video( fps,
                './tmp/replace_mosaic/output_%05d.'+opt.tempimage_type,
                './tmp/voice_tmp.mp3',
                 os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_clean.mp4'))  

H
hypox64 已提交
151
def cleanmosaic_video_fusion(opt,netG,netM):
H
hypox64 已提交
152 153
    path = opt.media_path
    N = 25
H
HypoX64 已提交
154 155 156 157
    if 'HD' in os.path.basename(opt.model_path):
        INPUT_SIZE = 256
    else:
        INPUT_SIZE = 128
158 159 160
    fps,imagepaths,height,width = video_init(opt,path)
    positions = get_mosaic_positions(opt,netM,imagepaths,savemask=True)
    
H
hypox64 已提交
161
    # clean mosaic
162
    img_pool = np.zeros((height,width,3*N), dtype='uint8')
H
hypox64 已提交
163 164
    for i,imagepath in enumerate(imagepaths,0):
        x,y,size = positions[i][0],positions[i][1],positions[i][2]
165 166
        
        # image read stream
H
hypox64 已提交
167
        mask = cv2.imread(os.path.join('./tmp/mosaic_mask',imagepath),0)
168 169 170 171 172 173 174
        if i==0 :
            for j in range(0,N):
                img_pool[:,:,j*3:(j+1)*3] = impro.imread(os.path.join('./tmp/video2image',imagepaths[np.clip(i+j-12,0,len(imagepaths)-1)]))
        else:
            img_pool[:,:,0:(N-1)*3] = img_pool[:,:,3:N*3]
            img_pool[:,:,(N-1)*3:] = impro.imread(os.path.join('./tmp/video2image',imagepaths[np.clip(i+12,0,len(imagepaths)-1)]))
        img_origin = img_pool[:,:,int((N-1)/2)*3:(int((N-1)/2)+1)*3]
H
hypox64 已提交
175
        
176
        if size==0: # can not find mosaic,
H
hypox64 已提交
177 178
            cv2.imwrite(os.path.join('./tmp/replace_mosaic',imagepath),img_origin)
        else:
179

H
hypox64 已提交
180
            mosaic_input = np.zeros((INPUT_SIZE,INPUT_SIZE,3*N+1), dtype='uint8')
181
            mosaic_input[:,:,0:N*3] = impro.resize(img_pool[y-size:y+size,x-size:x+size,:], INPUT_SIZE)
H
hypox64 已提交
182 183
            mask_input = impro.resize(mask,np.min(img_origin.shape[:2]))[y-size:y+size,x-size:x+size]
            mosaic_input[:,:,-1] = impro.resize(mask_input, INPUT_SIZE)
184

H
hypox64 已提交
185 186 187
            mosaic_input = data.im2tensor(mosaic_input,bgr2rgb=False,use_gpu=opt.use_gpu,use_transform = False,is0_1 = False)
            unmosaic_pred = netG(mosaic_input)
            img_fake = data.tensor2im(unmosaic_pred,rgb2bgr = False ,is0_1 = False)
H
hypox64 已提交
188
            img_result = impro.replace_mosaic(img_origin,img_fake,mask,x,y,size,opt.no_feather)
H
hypox64 已提交
189
            cv2.imwrite(os.path.join('./tmp/replace_mosaic',imagepath),img_result)
190
        print('\r','Clean Mosaic:'+str(i+1)+'/'+str(len(imagepaths)),util.get_bar(100*i/len(imagepaths),num=35),end='')
H
hypox64 已提交
191
    print()
H
hypox64 已提交
192 193 194 195
    ffmpeg.image2video( fps,
                './tmp/replace_mosaic/output_%05d.'+opt.tempimage_type,
                './tmp/voice_tmp.mp3',
                 os.path.join(opt.result_dir,os.path.splitext(os.path.basename(path))[0]+'_clean.mp4'))