OpenCV рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд┐рдЯрд┐рдВрдЧ рд░реВрдо

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдореЗрдВ рдкрд╕рдВрдж рдЖрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмрд┐рдирд╛ рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдЦрд░реАрджрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП? рдмреЗрд╢рдХ, рдХреБрдЫ рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рднреБрдЧрддрд╛рди рд╕реЗ рдкрд╣рд▓реЗ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрдкрдбрд╝реЗ рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдСрдирд▓рд╛рдЗрди рдХрдкрдбрд╝реЛрдВ рдФрд░ рдЬреВрддреЗ рдХреА рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рдСрдирд▓рд╛рдЗрди рдСрд░реНрдбрд░ рдХреА рд╣рд┐рд╕реНрд╕реЗрджрд╛рд░реА рд╣рд░ рд╕рд╛рд▓ рдмрдврд╝ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рдЯрд░реНрди рдХреА рд╣рд┐рд╕реНрд╕реЗрджрд╛рд░реА рднреА рдмрдврд╝ рд░рд╣реА рд╣реИ, рдпрд╣ 50-70% рд╣реИ - рдпрд╣ рдПрдХ рдмрдбрд╝реА рд░рд╕рдж рд▓рд╛рдЧрдд рд╣реИ рдЬрд┐рд╕реЗ рдСрдирд▓рд╛рдЗрди рдлрд┐рдЯрд┐рдВрдЧ рд░реВрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдлреА рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдХрдкрдбрд╝реЗ рдЪреБрдирддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреА рдЫрд╡рд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреВрддреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдлрд┐рдЯрд┐рдВрдЧ рд░реВрдо рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ, рд╡реЗ рдХрд╛рдлреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдХрдкрдбрд╝реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рдо рднреА рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдХрдо рд╕рдлрд▓ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдореЗрдВ, рд▓реЗрдЦ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ;рдХреЛрдИ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рдкрдирд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдУрдкрдирд╕реАрд╡реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИvirtual_try_on.py рдирдореВрдирд╛ред



рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд┐рдЯрд┐рдВрдЧ рд░реВрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЙрдбрд▓ рдХреЛ OpenCV рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдХрд┐рди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!


2019 CP-VTON . CP-VTON , , (, ). 3D , 3D-. . github. CP-VTON , , .


.



CP-VTON : GMM (Geometric Matching Module) тАФ TOM (Try-On Module) тАФ .


GMM (I,c,ct), TOM тАФ (I,c^,It), IтАФ , cтАФ , c^тАФ GMM, ItтАФ ground truth ( c), ctтАФ ground truth ( , It). , Itc. VITON, Ip. p, , , , (, , ). . , GMM (p,c)c^, ct. TOM (p,c^), IoIt.


p. , . OpenPose. . LIP_JPPNet. OpenCV () sample human_parsing.py.


, тАФ , : , , . , .


preprocessing


.


GMM . , , L2тИТ. . . , . c^ctL1тИТloss.


рдЬреАрдПрдордПрдо


TOM . Unet. , . Unet , . , Unet . , . Upsample . (encoder) VGG-19. . Unet IrM. cIr, (1тИТM)Io.


Io=MтКЩc+(1тИТM)тКЩIr


тКЩтАФ .


рдЯреЙрдо


Try-On тАФ IoIt. . , , . L1тИТlossperceptual loss. VGG , . VGG тАФ , .


OpenCV


. json , OpenPose Caffe, LIP.


, , .


python3 virtual_try_on.py -i person_img.jpg -c cloth.jpg

OpenCV PIL. . LIP , . CP-VTON . , :


shape = (segm > 0).astype(np.float32)
head  = (segm == 1).astype(np.float32) + \
        (segm == 2).astype(np.float32) + \
        (segm == 4).astype(np.float32) + \
        (segm == 13).astype(np.float32)
cloth = (segm == 5).astype(np.float32) + \
        (segm == 6).astype(np.float32) + \
        (segm == 7).astype(np.float32)

, PIL , . human_colormap.mat. ? Matlab . , scipy . () .


тАУ . 16 , .


mask = mask.resize((width // 16, height // 16), Image.BILINEAR)
mask = mask.resize((width, height), Image.BILINEAR)

. . , OpenCV. PIL resize cv.resize .



, PIL resize, тАФ cv.resize.


, ? .


mask_pil mask_ocv


, PIL resize, тАФ cv.resize.


, . ? , . , тАУ . , bilinear resize bilinear, area. scale factor, 33 = 16 * 2 + 1, OpenCV тАУ 3. , , . . . , . . :


PIL
class BilinearFilter(object):
    """
    PIL bilinear resize implementation
    image = image.resize((image_width // 16, image_height // 16), Image.BILINEAR)
    """
    def _precompute_coeffs(self, inSize, outSize):
        filterscale = max(1.0, inSize / outSize)
        ksize = int(np.ceil(filterscale)) * 2 + 1

        kk = np.zeros(shape=(outSize * ksize, ), dtype=np.float32)
        bounds = np.empty(shape=(outSize * 2, ), dtype=np.int32)

        centers = (np.arange(outSize) + 0.5) * filterscale + 0.5
        bounds[::2] = np.where(centers - filterscale < 0, 0, centers - filterscale)
        bounds[1::2] = np.where(centers + filterscale > inSize, inSize, centers + filterscale) - bounds[::2]
        xmins = bounds[::2] - centers + 1

        points = np.array([np.arange(row) + xmins[i] for i, row in enumerate(bounds[1::2])]) / filterscale
        for xx in range(0, outSize):
            point = points[xx]
            bilinear = np.where(point < 1.0, 1.0 - abs(point), 0.0)
            ww = np.sum(bilinear)
            kk[xx * ksize : xx * ksize + bilinear.size] = np.where(ww == 0.0, bilinear, bilinear / ww)
        return bounds, kk, ksize

    def _resample_horizontal(self, out, img, ksize, bounds, kk):
        for yy in range(0, out.shape[0]):
            for xx in range(0, out.shape[1]):
                xmin = bounds[xx * 2 + 0]
                xmax = bounds[xx * 2 + 1]
                k = kk[xx * ksize : xx * ksize + xmax]
                out[yy, xx] = np.round(np.sum(img[yy, xmin : xmin + xmax] * k))

    def _resample_vertical(self, out, img, ksize, bounds, kk):
        for yy in range(0, out.shape[0]):
            ymin = bounds[yy * 2 + 0]
            ymax = bounds[yy * 2 + 1]
            k = kk[yy * ksize: yy * ksize + ymax]
            out[yy] = np.round(np.sum(img[ymin : ymin + ymax, 0:out.shape[1]] * k[:, np.newaxis], axis=0))

    def imaging_resample(self, img, xsize, ysize):
        height, width, *args = img.shape
        bounds_horiz, kk_horiz, ksize_horiz = self._precompute_coeffs(width, xsize)
        bounds_vert, kk_vert, ksize_vert    = self._precompute_coeffs(height, ysize)

        out_hor = np.empty((img.shape[0], xsize), dtype=np.uint8)
        self._resample_horizontal(out_hor, img, ksize_horiz, bounds_horiz, kk_horiz)
        out = np.empty((ysize, xsize), dtype=np.uint8)
        self._resample_vertical(out, out_hor, ksize_vert, bounds_vert, kk_vert)
        return out


4 , , OpenCV. . , . , . 256 192, . sample . , - , .


P.S. 2020 OpenCV 20-. . !


All Articles