- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563399 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174243
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python将红底证件照转成蓝底
9 T' p# ]7 z" ]' x& a# H5 O# a前言: k, j. n1 q9 Z& T; I' c# {6 F3 T
emmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。
3 M7 w) ]$ s( q# D6 I5 U% W
6 g# d/ j+ I" b- e# o
6 T3 o- H7 k& m9 J
4 P% A- Q" J# P9 _/ l
- N7 j8 c; p! Y7 B7 j1 R方法一: lableme
- Y# X/ @4 {" b* Z0 y }" s- \& [0 elableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.7 H6 V6 B. y- Q
9 T4 W1 E$ p" N" s# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/120130155 @) U. u3 o3 \3 o i( l( k9 O. \
import json9 z) ]9 e5 g' \
import numpy as np7 Q# {5 n* y. A+ e! S
import cv20 I7 B! B) ?* z4 `
# read json file# w$ f+ q# l1 M9 B. R, t
with open("origin_json/mypic.json", "r") as f:
( k7 O7 p/ J+ b+ h4 l' e1 B data = f.read()
" y: S7 s5 J8 B* r! [2 M* Z
, L) }4 z; v4 ]: D- }# convert str to json objs0 f/ ?* v* F2 R$ T$ w
data = json.loads(data)# \3 _5 W, A. C" \% B$ A
7 N' H3 ` J- @: [6 g& ]
# get the points : R2 \4 K4 x( z( C) d; l
points = data["shapes"][0]["points"]
' X9 {- y$ N! r; O- opoints = np.array(points, dtype=np.int32) # tips: points location must be int32
5 d: W! X# s4 P# R7 E! U! i& V( D. D: o# k$ T) m8 ]+ N- P
# read image to get shape
6 p; g0 W% p- c8 b! Oimage = cv2.imread("origin_png/person.jpg")- e) m7 G8 c& w; b) q
0 P5 P$ S8 V5 x: C1 R* R3 O- @
# create a blank image
9 n9 [0 q. }$ [, O: V! |: }mask = np.zeros_like(image, dtype=np.uint8)) V9 N* f% q% Z) n
' g8 h. D2 E- `3 v- B4 V4 S
# fill the contour with 255
6 o; [+ ~+ ~3 L3 {1 i9 t# @7 Tcv2.fillPoly(mask, [points], (255, 255, 255))% s0 d9 g2 T. _! ~
3 ~0 U9 q4 n3 s; H1 C: w& P7 W: r# save the mask
' z4 v8 N2 C; i: Fcv2.imwrite("mask/person_mask.png", mask). l2 z$ B* O, ^5 M7 C7 R1 s- r% f
10 w( m8 ^8 m. h" _+ y
2% p; e, D! }( p R) f" z+ K s
3, ?9 N- V1 @8 r C1 b
4
% a: I( r9 f- C' E+ b- H3 |3 N58 }7 Q" b. n& N
6
# j' x3 T* P; l% \7) w" u: T0 G6 L' @
8
5 i( d; L$ \* l; j9
4 u5 L( i7 I. w8 n; T107 F/ k9 W4 S6 i8 h& [8 g( f
11
, P d6 C" W8 W9 ^7 ^6 H120 j( a4 i% P, J8 j( j% O
13
; l2 z# g6 v9 o14
- _2 x( ]( ]+ P8 f3 P15
& |0 W! Q( Z4 P164 Z" g( }; K9 _. v8 g( e
170 J7 S$ V a4 ~2 x: f
18) B( m& t# ^' J: r8 b
19
/ Z( P3 O2 X$ ? ?, W20
4 o* \! h5 X; r( ^9 c210 r! B' _. j6 e( B+ B
224 o K0 j* o( g1 z* M* k
23
( v! A( Z1 `1 B; C9 w. B3 g. j24
, R8 V6 K; I h* f) H4 j! A25
# f3 E- z8 m" s3 |. \3 [26. j5 J+ y6 _- g: M
大概是这样:5 h; a0 I/ ?, T9 H) l' Q) O+ S5 k9 R
" b/ d% r( V3 { m6 {, {
' I$ o6 |- n S然后利用这个mask生成图片
( {) D- r3 s5 Z' P
9 I. v' X" X$ G" b3 o# 参考自: https://www.jianshu.com/p/1961aa0c02ee/ V/ M4 |) Y& O9 H8 a
import cv2! b! R" X, h+ N( h' a r* j, N( [
import numpy as np: a) W) W0 P9 s, M) y
, L5 x, E T, J0 C" d, X% ] z
; Q% [% q# a. K; f# ^7 }
origin_png = 'origin_png/person.jpg'
9 t. _( |. z6 Q: Q: N# maskPath = 'mask/person_mask.png'
4 c* ]% {3 {9 ]3 h$ R9 {. ]5 ymaskPath = 'mask/bmv2.png'' i( E" i+ F2 t' T
result_png = 'result_png/result_png.png'
: B" c$ D) ]; z2 w: G9 W* j! `, k/ n; c% z$ i: I% v
1 X' r: I; Z( h; X5 i& d& ymaskImg = cv2.imread(maskPath)
4 @; g. I! q/ [; U) N B/ bimg = cv2.imread(origin_png)
- `% ?5 W8 _; W$ @) Z' Z2 n; [assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'
" O) M3 ]8 q3 @( B& ^% n' {% x* N% g/ z' {
h, w = img.shape[0], img.shape[1]
4 i0 Q# O: X4 T0 T- p% wprint('图片宽度: {}, 高度: {}'.format(h, w))3 |7 e, u7 b: n: a% s
/ b. `# {6 [; Crgb = (19,122,171)
0 U& S6 H8 }' g% _6 T5 K, |4 o# hbgr = (rgb[2], rgb[1], rgb[0])
6 u \" A3 Z5 P' u. l8 R4 w# (B, G, R)7 M: o/ H0 l- W, X0 y/ K/ J- z( g
for i in range(h):
, X8 U; U' H) M: A# f! ^# D for j in range(w):' _: ^7 D" q- G7 k7 g
if (maskImg[i, j] == 0).all():
4 u2 u0 g9 |! C8 r! A- c. f2 T/ R img[i, j] = bgr1 c1 x$ u* b8 f/ W$ l, r t q6 g
cv2.imwrite(result_png, img)
7 ^3 F5 r' A# o8 zprint('图片写入 {} 成功'.format(result_png))
9 q9 i# v; k7 p# y" A# n1 }; ~" i19 @* p/ I6 V8 j# f
2! D- k, X1 m$ i- b
3, n+ q, v% R' Z; W5 [1 I8 I
4
& y0 [' T0 X# n0 w/ T6 m) w% r5/ {: [) i6 G9 B$ p
6
" u. e# C+ N; z. b7 n8 V7
. {7 Q; q7 h# q8
0 m) `$ {7 u- }) c* j) u" I' u9
! i$ i8 H" V+ T9 M1 c10
1 L7 a4 o' ]# s; I6 I' v3 E- j* ^11
4 E! C0 T, ]8 A. r2 V1 M12
* R2 a l# I9 ?) p13
( n* p7 @7 L- U0 n& }$ }14/ p7 Y, r* g0 \6 b) W
15
' J; j6 \$ n( z+ \3 T16
% G9 ^; b( z+ P9 m" s V/ c+ D17
' c) H7 s U3 a, F18/ W) e2 R; ]9 I, n. A
19) y3 S$ k6 G# `6 H) ~$ K! O. a* t
20
* D% m. E. a) C5 N21 L% X# s+ I: `6 t! M
22( v# g: \+ }7 P3 x# B) w9 U
23' O% I. n; |! n, \! Q6 T3 m8 u
24
5 D+ r* A. L5 n) A% s/ t( c0 q3 x25
' \* K7 J3 T* R* H1 b( C6 k26' Y+ @& v y: S+ N
27+ \+ _: f) J4 O/ r% v! B
由于人长得一般,就不放图了…
( i. s/ ~ n6 o- z" q5 X7 Q, X. U5 g
3 J$ x5 W0 @0 |, p I缺点:
+ C; C# ?& P6 xlableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。0 b. l% U0 D6 `
( Z( P9 ^; d W: N6 }9 S4 U# C p' F' _ {( f! J. \+ L
& o% h0 ]3 k- }0 w3 N4 h. u' N( q, [4 ?- Q2 E; C. H
( a4 j3 R, d" ^7 I5 ]. E( a0 t
方法二: 阈值
8 C8 q. f& _8 c0 z! \! l该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。
2 V! t2 T, |$ _# s |* C
/ i( N% u) E# R [Opencv, z- M- _6 ?. j- w% p+ w
import cv2
# Q) G5 [" { J3 p: s" qimport numpy as np: l. g2 O3 @: m) ?* m6 V0 }
- J8 m/ Y4 K/ t8 J# [8 r) i
, G* d- l: f0 k9 c; odef mean_square_loss(a_np, b_np):
. q5 ]. c `2 B6 @3 t) C sl = np.square(a_np - b_np)3 ]/ Q4 e1 D9 [+ e( Q; \* P
return np.mean(sl)8 m$ i* y3 m& x$ V3 U) ?4 c2 l8 p
0 R" A! Z5 `8 I" O
" K' t7 ^7 |; |7 H9 V- f' I. O
def change_red2blue(origin_png, result_png):6 j! f2 K" e' d- _+ b9 E
img = cv2.imread(origin_png)- @7 a9 p: _9 b
L& ^- D( S ~1 [- G" [ h, w = img.shape[0], img.shape[1]
1 `1 |9 ~ d/ Y1 y5 \1 V9 t! }& A; m print('图片宽度: {}, 高度: {}'.format(h, w))
U' Y4 H( e( @1 \4 O4 @5 y6 _4 T" d$ @
origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值4 d5 {$ G/ c/ j% C, d& `* Z5 S+ n
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
# a/ a1 Y% Z n target_rgb = (19,122,171) # 蓝底RBG" Z- B. I7 N+ c4 H; P1 Y: K
target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])& _" f. d) Y! Z& h6 X/ |3 ~3 A
4 p, i. T7 t9 F0 Q. ?* Y for i in range(h):/ L" z5 n- K6 ^1 i4 Q
for j in range(w):
) }2 L, w/ a* e # (B, G, R)- @$ D( t% B3 p4 Q% \; B) N
if mean_square_loss(img[i, j], origin_bgr) < 50:
3 x) h3 o$ V/ w( Q) q7 ? img[i, j] = target_bgr
9 t7 {& h3 [+ p2 ^/ U
. b' S& [; w( V" L/ [, G, E; I% v cv2.imwrite(result_png, img)
( P) g7 y# a5 s' k8 ?9 U& n print('图片写入 {} 成功'.format(result_png))3 C8 z; f9 N, |
1 Y/ H2 C$ w1 n% x% B6 f1 r
5 n% w0 i/ x4 }if __name__ == '__main__':) A2 Y) V. Y j- p8 e
# origin_png = 'result_png/result_png.png': Q! Y6 g1 R( g4 c: y- ~6 q
origin_png = 'origin_png/person.jpg'
. P9 n7 \2 T% z) p result_png = 'result_png/result_refine.png'
; d( A, Y3 }# M. {. y change_red2blue(origin_png, result_png)# I$ E+ r* v! p$ H6 a3 l0 T6 _
13 @ V$ P" C J, |9 d% z6 e
29 S4 t4 E9 ?9 d9 t. ^6 f! C7 b7 }
3
5 `2 G9 E! v2 v. E2 ^+ U) u; v4: Q2 p# Y. r6 X8 Q2 A7 a
5
6 {" T9 H' H% b! ~. Y+ l6* i: o3 I: k0 r& R. q i" o
7
0 [6 x" h" |* }# K1 a- Y82 C; ^5 z1 @% o+ g. _6 R
9
- b4 a8 ^8 ]3 D) Y' _) E106 g. m" t* q3 ~
11
?! J/ n6 @) }+ Z) ~: b/ p# m12) X- Z9 L, }. ]1 P, i0 L! X
13
8 H. ]4 Y) q/ q( ?8 j14" e# `9 i! y* z9 t3 H v2 Q. s9 G/ c
156 a- v( H7 q( c; O! J' ~7 u
169 r+ t% g* A4 C6 n2 _
172 n# S. {2 r5 j h
18) s& {2 [* v+ b, j* D( z4 {/ z4 }( R
19
; N X% M0 U" ~. ]1 Z20
' k) ~* a/ C Q+ _. Z- r" l5 ^* m+ `$ h212 N: U1 |3 ^4 ~* ?- i* v& Q( \5 \1 P
224 S, _5 M) A9 [0 Z; w1 t
232 D) h: J2 f4 p5 v& f
24, ]9 S" s$ b" K( B
259 a" N# g, o/ d N* o
268 b }# U1 x9 {% k4 s& v$ M
27' c u' Y' ]( A) z
28 R2 J) T) ]3 K" v
29% b* W. c6 Q% f$ M7 q+ G
30
. L5 @6 c& M. X7 O31+ ]6 {+ V: e, `# S" q+ J
32' f3 C) [. V0 Y- u: U4 W
33
4 e9 T% i: M$ d: L34# V) g" h0 Q; x& R6 `1 `) h
35. K1 B- j |9 {6 H) j& ~0 `8 r5 F
结果人与背景边缘仍会存在红色像素残留
% b& K( Y; L' }1 q1 p
$ G7 d1 D8 ~! v- d* ?9 f( E
$ F2 V: V. z. i' y/ l
" w: N4 {) f: m* W! R c! y4 h' z$ j) Q6 |
9 ]! G8 ]& H6 Y# Q" [& x
PIL
8 R* P3 @+ L, l) S' h$ v. vfrom torchvision.transforms.functional import to_tensor, to_pil_image* h; U5 N1 X3 p0 d' ?
from PIL import Image
& E! r; k0 {( w/ t* Limport torch" [7 j: d, W9 @3 ?
import time
/ ~7 u' m6 w _
" T- K. W$ ?# U$ ?9 K" V% u* d3 v- _8 T f
def mean_square_loss(a_ts, b_ts):
( E0 |4 ^" y# S, l # print(a_ts.shape)
& m+ k4 _8 r' Y# T9 ?3 ^, e # print(b_ts)
6 K! Y. g: {4 q/ m3 F sl = (a_ts - b_ts) ** 2: t' a. I" {: T
return sl.sum(), W& U: I; J- q, j0 G W! V. p
5 @4 D6 \! L$ d b D5 g
/ l1 h' ?: W7 {' U7 o. l3 a$ Idef change_red2blue(origin_png, result_png):
5 c6 ^! P1 J, z7 j y, F src = Image.open(origin_png)* N+ {+ r( ]" R" ~
src = to_tensor(src)
7 S$ p+ P2 I1 z # print(src.shape) # torch.Size([3, 800, 600])
& g6 g5 J. K& }3 V% u. ] k0 X( I2 ^ # channel: (R, G, B) / 255, C. N N: g1 }( f
h, w = src.shape[1], src.shape[2]
0 s. \' ~+ P# ]0 G! i# X& W5 U/ w! Y3 o0 Z+ n% D
pha = torch.ones(h, w, 3)( D) m- A; n& e' [; Z' C
/ k) U. y8 W' Q) r7 A8 K& Y bg = torch.tensor([168,36,32]) / 255
' v& k o) _+ G target_bg = torch.tensor([19,122,171]) / 255
. J* y2 ^2 D1 @& Y, w7 ?9 G+ o/ q) w# i" c A! A
# C, H, W -> H, W, C
1 h& j. w# U' x7 Q) A src = src.permute(1, 2, 0)$ j Z; q8 Q6 _" A1 @7 A6 i) N. Y
for i in range(h):" Q, U% y+ R) ~# P
for j in range(w):( Z4 \4 y) D* u
if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数 o u- U0 n) |% x% m" L
pha[j] = torch.tensor([0.0, 0.0, 0.0])
0 `) z U# V* K& m" N4 i- q. H! Z" j) P) G# y5 O; r
# H, W, C -> C, H, W3 a n4 `3 o& G* {. o
src = src.permute(2, 0, 1)
3 N6 a: X" ?, a pha = pha.permute(2, 0, 1)
2 x5 T- }, k! m6 c" C com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)) c; }! p+ s; V/ S! _& Q
to_pil_image(com).save(result_png); ?) i3 P% W; i/ p
# w, ` Q$ h0 \. X% k: J: ^3 k2 A4 T9 i% F& ~$ b- A. X
if __name__ == '__main__':& N- d' n& p2 g& o. a8 j( P
origin_png = 'origin_png/person.jpg'% K9 g7 k# P8 ]8 r% S3 [& V. M( v
result_png = 'result_png/com.png'- i a, ~4 y. |# ^7 G* a, w
start_time = time.time()
0 k) u+ j! f/ m5 J4 w change_red2blue(origin_png, result_png)+ d6 p! V( ~( H' e% R
spend_time = round(time.time() - start_time, 2)3 m& B k8 f4 o1 A
print('生成成功,共花了 {} 秒'.format(spend_time))0 @6 G! }# n3 @+ Z+ r9 g5 m
11 n2 B" b1 u# c( n) H
28 f- G( s/ i c+ l1 d/ u5 Z
3# Q: U7 Y5 Y" i; Z0 [" ~4 e
4
. Q: G# f. y9 R5% Z& e* o! B# U
6, w/ R& A7 x, {
7
' t, U& N& m0 g8 n1 h8
3 J. b$ z- M# j h) a1 Q8 r' @* S9; C& z( Q: S, n! E* Q+ s/ b8 e& F
10
, K/ O7 c i- S7 T118 u3 e1 a% S. e
12; Z% g/ b2 `/ i
13
M5 M4 O/ X+ G8 D! T! N. n14
/ _8 ]* p7 O$ p8 t1 ~5 Z2 V15* r3 S; x5 p0 h9 x+ b$ b
169 e; v( U3 u% [8 h* N s0 i
17# O5 B- M6 I' R+ v# b
18
3 c& q- Q; l! `% k19* b" n6 X1 u, U* g0 Q" V
20
" k. l c1 o5 d21
) I& x2 o; t" W9 A225 z6 h8 y( x" X/ M) X
23: T. N/ Q0 J1 P. q0 |- H
24
5 Y8 {( G* O/ t, m25
, s8 S4 t' a) [5 A4 Q& O* l26
6 h; o0 o% |/ h+ P7 Q27
4 l4 ~2 b+ ~+ D- x8 n; Z28# U4 `9 B0 }. m" I
29
' s. d' c' q9 F k8 B1 N30* D4 v: D- s5 C2 R7 X5 i7 s% p
31
% b" |9 \# c4 X0 J- l" N32
% a0 F" r. ~; V" R33
) m% Y; m( u- r4 r( y( H34, }( k$ q, J1 O5 k3 V; e
359 B L1 S6 ]7 \2 e2 a
36% H/ ]; w, x' {6 U
372 U, }9 G# O7 O3 p$ p j
38
# J' k1 T8 b9 B% L5 @39! [1 I: ?# f" p3 M
40' a+ H7 w$ e' S m% o0 ^4 V
41; a) B% X* ]( y6 W0 _- H
423 D* n) c3 c! m: N, O7 b' k& B
439 P- H g1 W$ }; S' q4 }8 R
44- r' i; d4 _# n4 U
45$ K: _" A* U. D5 L- u
467 M% H; r S; V; m- i, n
该方法质量较好,但一张图片大概需要12秒。) j2 J6 {( A: d+ F% O4 ]
" C4 q4 d/ z7 h9 t
8 O' V+ s5 X' e: R3 L) o
& C7 X( Q& L9 g% y7 }% W; G) J方法四: Background MattingV25 r0 S) {3 h. O8 Z
Real-Time High-Resolution Background Matting9 O( D" g @$ ?
CVPR 2021 oral
# j& u, K2 e8 G& r" C8 E8 c2 F
6 P4 T* s8 P! i, }6 S* ~( t6 g论文:https://arxiv.org/abs/2012.07810) Q$ c! H- B% E; t1 Q1 J
代码:https://github.com/PeterL1n/BackgroundMattingV2; j$ \% F+ |, v# \$ G
7 T7 o2 F1 m9 p8 z
github的readme.md有inference的colab链接,可以用那个跑
. j' d8 O$ {, V# c; ]/ w5 S* a$ B( s( n2 g
由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。
$ C" [) Z; v& b( l7 j2 Y7 O
( h. G5 ?: {4 k- Z' z$ ^8 i于是这里我需要生成一个背景图片。
& `7 |4 Z1 t8 N" D首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。& E/ q3 v# V- \ O
8 J7 D4 w6 M" y- i7 B! A
然后生成一个背景图片。
/ Z4 G/ E$ A1 }7 A- @7 b
4 h- C5 \8 H/ e9 N1 @' @3 x, | bimport cv2
1 k4 y- H) t5 ]7 i( C! U7 N+ S# U' mimport numpy as np* I. h3 k2 `$ y' q' h9 n0 v
5 o8 n% x# ?; G- K7 e0 P" B2 _8 Z5 ^! e+ ~) N- L9 H
image = cv2.imread("origin_png/person.jpg")
- d/ o, u: [8 jorigin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值
) J2 I, E& J8 \, k6 \. G, ~origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])/ N' i6 Y ?+ ?
image[:, :] = origin_bgr) u7 N7 G' O' t, }
" P& [! n: d; v& E9 g2 k1 `7 jcv2.imwrite("mask/bg.png", image)& R* ?6 y5 O, i5 ^
16 p: _$ z ~. V2 K" n5 a
24 s3 l2 |; S) c' |# b* G6 v3 s
3, L# c0 @4 ` w) |) K
4
9 s5 `) }4 u$ u# ~) N3 V5
- B- M9 F5 U2 n4 Z3 x v6
* [* Q$ {9 C( b) Q" L0 D' f7
. f {) ^: q w8
! b2 X* C+ ?3 v% {& r4 @9
* \# o- k0 u+ w3 o1 s. i! {10
0 |! ~5 z, h) g H j3 C! g4 @7 H E, H
需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码( _' y+ `6 F6 w+ x
. {1 o3 {" x7 p! S$ p1 ?/ X8 ~src = Image.open('src.png')
, P+ c8 a, f( h* O* Z& F4 Dbgr = Image.open('bgr.png')5 m, c' k5 b) n2 x7 N2 z$ U
1! N; u0 c: R/ g* e2 v* i
2
5 a" U; h9 E) _! i另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)
! U: m& d8 |6 w& ]; `
/ e/ n4 i/ M" z* U% ~) F% Scom = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)
' W2 o- ]) _0 c3 H4 G6 W17 z; {. t7 X& P/ v0 Y
) @- I Z: H# ?5 V" ?! {3 J
那么加入我要换白底(255, 255, 255),就是
1 m6 i# _9 f5 a& u, w# B& d7 ] T" B+ i9 M& F6 W
com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)# n2 @) ?% q; ~) P1 m P
1
g% c% n9 i& S5 b# E% \+ V! b* A0 ^/ K, q" r: \
假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是9 O ]9 W1 o* U+ W) ^
! O( ?) d$ T8 U. P; }7 u9 S
com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
1 p9 S9 V1 L) I3 J! ~2 a. e, o1
7 o) V% Z7 z" _* k总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.: w9 e" [$ n. g" N' t
. \0 h1 W0 ^* p5 c* O1 j
然后就输出图片了。可以看到效果相当好。不愧是oral。
1 M, ]2 M: S) V; {8 b' T
0 Q) k! N' u8 H( O# C6 k- a- e" _; u* O& f# c
原论文可以实现发丝级效果
5 M5 S- y& [5 C
& s& l+ L# O' G8 I& h
4 ^2 s; w+ E9 x8 l/ r4 S. {7 Q4 Z5 J7 v+ Y1 [# \5 u
! a4 t" {, {; A* E; @: ]$ j7 w* d
0 N; {6 C( G1 ?( [& z% h- E; h报错解决方案
6 P9 h. G' j3 e- ican’t divided by 4 / can’t divided by 16
+ @ d5 W' O- t4 y由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。
2 {4 }, C3 N3 A5 O- e* P这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize. w( @- ~+ }3 g( `) C5 n& P' g" v
————————————————/ E( p9 B9 c6 w9 ?
版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& Q* B, a- d3 ]; {1 Y* @) p- B原文链接:https://blog.csdn.net/weixin_43850253/article/details/1263767679 u5 H/ x1 G' ^8 Z5 C
; q8 n8 B- \# n0 [/ H, X) i0 U4 r% V
: U4 b' Q5 R2 c2 @) J- f |
zan
|