def do_faceswap_cpu(self, folder_out='./images/output/', do_debug=False): if do_debug and folder_out is not None: tools_IO.remove_files(folder_out, create=True) if self.L_actor.min() == self.L_actor.max() == 0 or self.L_clbrt.min( ) == self.L_clbrt.max() == 0: return self.image_actor H = tools_calibrate.get_transform_by_keypoints(self.L_clbrt, self.L_actor) LC_aligned, LA_aligned = tools_calibrate.translate_coordinates( self.image_clbrt, self.image_actor, H, self.L_clbrt, self.L_actor) # face face = self.R_c.morph_2D_mesh(self.image_actor.shape[0], self.image_actor.shape[1], LA_aligned[self.D.idx_removed_eyes], self.L_clbrt[self.D.idx_removed_eyes], self.del_triangles_C) if self.do_narrow_face: face = self.narrow_face(face, LA_aligned) if do_debug: cv2.imwrite(folder_out + 's03-face.jpg', face) if do_debug: cv2.imwrite(folder_out + 's03-face_masked.jpg', face) filter_face_size = int( 0.2 * (LA_aligned[:, 0].max() - LA_aligned[:, 0].min())) result = tools_image.blend_multi_band_large_small( self.image_actor, face, (0, 0, 0), adjust_colors=self.adjust_every_frame, filter_size=filter_face_size, do_debug=do_debug) if do_debug: cv2.imwrite(folder_out + 's03-result.jpg', result) # mouth LA_aligned_mouth = LA_aligned[numpy.arange(48, 61, 1).tolist()] del_mouth = Delaunay(LA_aligned_mouth).vertices temp_mouth = self.R_a.morph_2D_mesh(self.image_actor.shape[0], self.image_actor.shape[1], LA_aligned_mouth, LA_aligned_mouth, del_mouth) if do_debug: cv2.imwrite(folder_out + 's03-temp_mouth.jpg', temp_mouth) filter_mouth_size = filter_face_size // 2 result = tools_image.blend_multi_band_large_small( result, temp_mouth, (0, 0, 0), adjust_colors=False, filter_size=filter_mouth_size) if do_debug: cv2.imwrite(folder_out + 's03-result-mouth.jpg', result) if do_debug: cv2.imwrite(folder_out + 's06-result2.jpg', result) cv2.imwrite(folder_out + 's06-original.jpg', self.image_actor) return result
def do_faceswap_gpu(self): if self.L_actor.min() == self.L_actor.max() == 0 or self.L_clbrt.min( ) == self.L_clbrt.max() == 0: return self.image_actor H = tools_calibrate.get_transform_by_keypoints(self.L_clbrt, self.L_actor) LC_aligned, LA_aligned = tools_calibrate.translate_coordinates( self.image_clbrt, self.image_actor, H, self.L_clbrt, self.L_actor) face = self.R_c.morph_2D_mesh(self.image_actor.shape[0], self.image_actor.shape[1], LA_aligned[self.D.idx_removed_eyes], self.L_clbrt[self.D.idx_removed_eyes], self.del_triangles_C) if self.do_narrow_face: face = self.narrow_face(face, LA_aligned) filter_face_size = int( 0.2 * (LA_aligned[:, 0].max() - LA_aligned[:, 0].min())) result = tools_cupy.blend_multi_band_large_small( self.image_actor, face, (0, 0, 0), adjust_colors=self.adjust_every_frame, filter_size=filter_face_size) LA_aligned_mouth = LA_aligned[numpy.arange(48, 61, 1).tolist()] del_mouth = Delaunay(LA_aligned_mouth).vertices temp_mouth = self.R_a.morph_2D_mesh(self.image_actor.shape[0], self.image_actor.shape[1], LA_aligned_mouth, LA_aligned_mouth, del_mouth) result = tools_cupy.blend_multi_band_large_small( result, temp_mouth, (0, 0, 0), adjust_colors=False, filter_size=filter_face_size // 2) return tools_cupy.asnumpy(result) # ---------------------------------------------------------------------------------------------------------------------
def adjust_colors_clbrt(self,avg_size=50): if self.L_actor.min() == self.L_actor.max() == 0 or self.L_clbrt.min() == self.L_clbrt.max() == 0: return H = tools_calibrate.get_transform_by_keypoints(self.L_clbrt,self.L_actor) LC_aligned, LA_aligned = tools_calibrate.translate_coordinates(self.image_clbrt, self.image_actor, H, self.L_clbrt, self.L_actor) face = self.R_c.morph_2D_mesh(self.image_actor.shape[0], self.image_actor.shape[1], LA_aligned[self.D.idx_removed_eyes], self.L_clbrt[self.D.idx_removed_eyes], self.del_triangles_C) self.filter_face_size = int(0.2*(LA_aligned[:,0].max()-LA_aligned[:,0].min())) mask_bin = 1 * (face[:, :] == (0,0,0)) mask_bin = numpy.array(numpy.min(mask_bin, axis=2), dtype=numpy.int) cnt_face = tools_filter.sliding_2d(1 - mask_bin, avg_size, avg_size, 'cnt') scale = numpy.zeros(face.shape) face = face.astype(numpy.long) for c in range(3): avg_actor = tools_filter.sliding_2d(self.image_actor[:, :, c], avg_size, avg_size, 'avg') sum_face = tools_filter.sliding_2d(face[:, :, c], avg_size, avg_size, 'cnt') avg_face = sum_face/ cnt_face s = avg_actor / avg_face s = numpy.nan_to_num(s) s[s==0]=1 scale[:,:,c] = s #scale -> im #[] scale = numpy.clip(scale,0,3) minvalue = scale.min() scale-=minvalue maxvalue = scale.max() scale*=255/maxvalue scale = scale.astype(numpy.uint8) #cv2.imwrite(self.folder_out + 'scale.png', scale) R = tools_GL.render_GL(scale) reverce_scale = R.morph_2D_mesh(self.image_clbrt.shape[0], self.image_clbrt.shape[1], self.L_clbrt[self.D.idx_removed_eyes], LA_aligned[self.D.idx_removed_eyes], self.del_triangles_C) mask = 1 * (reverce_scale[:, :] == (0,0,0)) #cv2.imwrite(self.folder_out + 'scale_inv.png', reverce_scale) reverce_scale=reverce_scale.astype(float) reverce_scale /= (255 / maxvalue) reverce_scale += minvalue reverce_scale[numpy.where(mask==1)]=1 self.image_clbrt = self.image_clbrt.astype(float) self.image_clbrt*= reverce_scale self.image_clbrt = numpy.clip(self.image_clbrt,0,255) self.image_clbrt =self.image_clbrt.astype(numpy.uint8) #cv2.imwrite(self.folder_out + 'image_clbrt_scaled.png', self.image_clbrt) self.R_c.update_texture(self.image_clbrt) return