2 {$ n5 q1 V" R8 ]! O: aPIL4 ?7 ]3 k5 e" R
from torchvision.transforms.functional import to_tensor, to_pil_image) C- k0 u7 ?7 V+ I" r
from PIL import Image: x# z6 W. Q% g1 T% c
import torch$ R9 W" }. O) L* e
import time " i" C% ?. S% G: S+ u + q) f. y6 I/ v4 C/ n) g. d! R- Z0 K& j
def mean_square_loss(a_ts, b_ts):: w: {/ } ]) M$ t# a7 N
# print(a_ts.shape) 3 W- t; a- I" u* N+ C9 ~( `& G # print(b_ts) - w: ?2 g- G- p* f% C+ G sl = (a_ts - b_ts) ** 2 0 _ X: ~) Q- ]6 Z4 X, v: d return sl.sum()/ c' y. `; ]6 H
7 g# y, k% d( H. [: F* x+ ?
! q8 f1 S/ K# y! {9 ~$ B! J9 N8 b
def change_red2blue(origin_png, result_png):* a6 X9 Z5 P5 A6 d2 T
src = Image.open(origin_png)( j$ G S+ u/ w1 K" @' |3 f. q2 D
src = to_tensor(src)+ e4 [3 O0 X/ q; }' l/ A
# print(src.shape) # torch.Size([3, 800, 600]) ) T; T7 ^( U" j8 S# } # channel: (R, G, B) / 255 . S/ g8 T3 C1 k: m. z; q# E h, w = src.shape[1], src.shape[2]5 }7 g% p* H# ^8 L* ]4 d
) M# Y$ T+ d8 ?# F& t' W
pha = torch.ones(h, w, 3)1 K: s, N# M. S
$ ^1 A; z( ~$ y$ I \ bg = torch.tensor([168,36,32]) / 255 2 r6 m6 g' y7 ~5 r, B* p target_bg = torch.tensor([19,122,171]) / 2550 r8 ~# I2 s; f. h; F p
& I7 o8 l+ u( R; H6 D # C, H, W -> H, W, C ) {2 `, E) `; J- F src = src.permute(1, 2, 0); {# a8 I" q( x" C& n$ c
for i in range(h):+ s0 _& e$ j9 v2 J# @2 w1 z/ I, S
for j in range(w): ( E! A, [; N/ r5 c if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数 - [$ D# D- A9 u. j; H9 K pha[j] = torch.tensor([0.0, 0.0, 0.0])2 c i! `7 N' d2 Q' L" q
$ R: D/ T* f" A # H, W, C -> C, H, W# t; m/ I1 t% E
src = src.permute(2, 0, 1)9 J1 \# P9 q& z# o4 z, w& D9 e, `
pha = pha.permute(2, 0, 1)# J: U* ]9 i4 M U! a/ X
com = pha * src + (1 - pha) * target_bg.view(3, 1, 1) 5 L! c# E3 A6 ~- ]* p( ^0 ` to_pil_image(com).save(result_png) ( b+ `6 n6 o/ d. B5 R Y; P* o U' X2 I+ x8 r6 V
: y0 _- F* u7 \0 l" Eif __name__ == '__main__': & q1 U! X) Q2 j. |5 ]1 _* M origin_png = 'origin_png/person.jpg'. `( O# l# V' s. \3 U0 g- E( z
result_png = 'result_png/com.png': Z1 G7 F" r8 b0 ?. y9 C
start_time = time.time() - C$ n' l7 q2 f! a$ ]: B) R" _; h% [9 H change_red2blue(origin_png, result_png) 7 `2 b. ^; q/ p spend_time = round(time.time() - start_time, 2) ; f8 ]3 S& o# s s( L2 S- s print('生成成功,共花了 {} 秒'.format(spend_time)) . _7 F2 N, L6 g d! Q1 : E0 d/ V: c0 @# ~2+ \! m; I" y7 F& X' d
3; a/ y5 a+ v" ^- M: p) N+ C
4( F5 H! w& I O( c8 R X( { f
5 & u$ ?6 x2 [7 }" X6# Z; d/ C9 x$ K. K) A4 `% x' K
7. L$ T w: R1 Q6 y3 E5 p2 j( |
82 S& v9 [: M* q
9 9 d6 I& ~4 W1 ?) t% Q, h10 ' D; p2 ]2 y+ G: X$ s0 T6 `118 {: @5 f: Y2 I/ R; ~# R7 ~0 A3 I2 l
12 % Y# W8 y4 G6 `) D133 u. n. t! b5 S' g$ D! r
14 2 ]$ t7 m0 B0 }3 k& ^15: H! ?6 d9 F" s
167 j! [8 l" B9 d7 c
17 $ y, c' x4 ?, O. N5 r18 H& l2 ^1 @0 H" ~6 h/ e
19 ( L$ m9 X5 q1 c8 l, I4 p7 B! m20% p6 k+ o1 z. m' i# ^% d
21 D* U5 n0 x. h/ g. n1 L220 x! H4 o; W' p8 `7 V0 Q( Z
23 5 ^& X* s* W, I4 u* L/ j Z E. y24, c& @/ S+ R& q( c/ n8 N' N1 P' p1 x
25$ Y0 U: w, f* X( p9 q; \
268 B/ ~/ W4 a& a: f4 J8 o' S; o
272 ^0 q- p" D5 }. q
28$ K0 Y5 v& H% O. u- l
29 2 h, |& p V! R. K6 `7 e) X) c30* M* u1 M; J# ^1 p2 n N# E7 n8 F
31 & {6 D4 p# S: ]; k32/ q# `7 a( j& F2 U7 c5 @8 y4 ]
33 , r' M* q* y2 v* y8 O. ~+ @, w4 ]34 " b5 n0 `2 B8 D8 V+ ?; \35 ; V+ q d' u# T2 z Y2 _360 q4 c! c1 X/ O0 s
37 , X' W& K4 D g: i38: T: n7 y% {1 L$ H1 ?* H8 O" f
39$ S6 x. z* ^) u! q7 F5 Y/ a6 J
401 q- v0 c5 w. k1 ^
41 X9 }8 b. e# M4 p9 Z42 ) S2 `( W' m6 K0 Z) p43 1 j3 G# E# f. E6 `0 u44- b" W# z$ z8 G9 S* r# U! Z4 D
45 * S5 ~. C3 Y; `% S+ \% P46 5 t5 `# n i6 m# y& h# j! P( N该方法质量较好,但一张图片大概需要12秒。2 I D* W- ]7 |
6 j0 r/ B& G- B 8 C' ?' f) K# |# E6 P* ` n# K % f; }; u% X# Y; c; Y5 }4 F方法四: Background MattingV2 4 ]6 i) c1 w* y) u( K% Q2 p [Real-Time High-Resolution Background Matting ' r a$ u$ A3 {$ E% @0 XCVPR 2021 oral * Y5 F3 K- o9 v6 f( k0 I+ P3 e* A& x0 K+ P
论文:https://arxiv.org/abs/2012.07810 5 ~; |0 R: V1 p' d4 [代码:https://github.com/PeterL1n/BackgroundMattingV2 ' s) M( O* K0 y7 U4 T% l* @: P/ D 3 V( p8 M3 h8 s) dgithub的readme.md有inference的colab链接,可以用那个跑 ( R9 v3 o9 y U+ r. `6 K3 l ' h$ w7 z. |# E/ ~由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。$ R/ I2 d d# [5 J6 K) ^