コード例 #1
0
ファイル: tools_faceswap.py プロジェクト: dryabokon/tools
    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
コード例 #2
0
ファイル: tools_faceswap.py プロジェクト: dryabokon/tools
    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)


# ---------------------------------------------------------------------------------------------------------------------
コード例 #3
0
    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