- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564506 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174575
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python将红底证件照转成蓝底2 T+ z2 Z9 \# V/ ?" D z! w
前言' h% C9 P( p' X4 Q0 U
emmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。
6 ?, B# K5 s' u0 A+ G$ `
3 l" m% s* H; M* `
# C$ [& v5 G: @$ Y2 Z+ V
, _4 _9 m1 L- T# b) L
5 L1 I3 s! `" {方法一: lableme0 z9 i _, G) l
lableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.
( c) U, w' Z: z& D" o
( Y: J. y& R( C& p0 V) g5 A# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/1201301557 E; j; o' D: _& @! n4 b' ^
import json: U% h H2 s( K4 L* o, ~- F& c
import numpy as np8 q: v( t3 S) C7 C# v- d0 E' b% z
import cv2+ K0 T$ p$ J" S) v8 r" _) [. P
# read json file F1 @3 w! E9 f6 `, H. N! M
with open("origin_json/mypic.json", "r") as f:9 h2 c3 W1 [2 ~+ H
data = f.read() g" O2 m+ z+ T6 X: m+ [- Q1 {
. D! C' F+ O, A6 a5 u# convert str to json objs2 ~, H2 o/ @! [% T3 M& R
data = json.loads(data)
' v! T4 g, q- a, m% D) a$ R# C4 w0 z$ P4 q
# get the points ( M/ p1 Q' u3 t9 N2 W+ d2 N
points = data["shapes"][0]["points"]
: k H8 Y8 x6 l9 L, G. gpoints = np.array(points, dtype=np.int32) # tips: points location must be int32 P4 r" u: D6 Z9 V
9 E* v' e0 R B$ s. f# read image to get shape
, r/ Z% z: B; _$ Ximage = cv2.imread("origin_png/person.jpg")+ Y) t# o8 D7 }5 W2 A7 `
( a& @. B& k: |6 k, o+ a( z# create a blank image" S, L8 E$ w {( e8 N
mask = np.zeros_like(image, dtype=np.uint8)2 x$ M4 ^. b% |' x
( ^- Q! `. R ?( y& H9 x# fill the contour with 255
! j" h) ~; Q0 j) ~& Ecv2.fillPoly(mask, [points], (255, 255, 255))% v" O1 K3 E3 H% Y4 K
h$ b6 w4 W2 Y
# save the mask ' O+ P( L) S4 Q3 z. \: v
cv2.imwrite("mask/person_mask.png", mask)
% Q- g( ?# l7 z1% F: p- `- {. [1 m" t
2
/ q- q" L4 A& L" t, h3
. C' Q* F) m. s2 y40 d( Q# J1 N( i5 c* R3 `
5+ U* E: _9 J/ H, h& ]
6
Z( V% l ]( d5 z7/ N; n d( E4 t( O% B' w# h
8
. U% ?5 G+ t+ a1 n- c9 W+ N4 `2 j* z9
% W, |& C5 M2 h1 A1 V g10
6 Q4 a) v; U+ A9 I6 }113 j, g( C: d' B( Z8 v; A
125 u9 e. R# c8 Z9 Y; }
13" w, O& m' R, q1 \* ^/ Y* }$ M# J
14+ t4 y1 n( T" {8 `3 ^; l
151 S' N; `2 e( J3 O! {
166 w9 x/ i/ J. A- A3 x) X, V/ q
17, K1 y/ u+ @1 z4 s7 w1 u* O8 D$ H
18* i2 L8 I. _$ L
193 Q3 L: ?" T6 c6 g
20
- C' n2 x( b% _2 Q* {# `21
3 a( A1 E s% Y7 a; `+ c222 g; Q- L! N2 Y: ^" [5 g- b+ w" G6 w
23
% T: e6 ^. y3 q e24
- }( B2 d) z/ |' N# m4 j, O25, o( F8 N9 X1 o. X. H
26( ]# ~1 U. a* i7 @
大概是这样:
& A6 @- I8 f( Z9 N
& x( a! S9 w/ G2 v" l* q
. {8 S! D+ k- o* F8 D! o! B然后利用这个mask生成图片
) U7 ?; @4 t5 d1 Z3 j# Z8 f# N( _* |6 }
# 参考自: https://www.jianshu.com/p/1961aa0c02ee5 ?$ b5 U& B4 P3 T# Q6 z* F, P, U
import cv2- z+ h+ c" i7 E' i
import numpy as np' |5 e6 y) T: Q" K0 r$ n f
( G; |- {0 `7 t3 l- S' Z# m& ^5 a, a
origin_png = 'origin_png/person.jpg'
3 P9 E( [3 G6 e8 q" c# maskPath = 'mask/person_mask.png'7 q$ c) X5 M/ U& ? ^
maskPath = 'mask/bmv2.png'2 X1 j# G; m+ S. `& N, t8 I
result_png = 'result_png/result_png.png'
; j4 a9 s5 s* \+ S6 M# S/ l0 d' T
, {5 Z3 O; @/ x4 r5 k
maskImg = cv2.imread(maskPath)& H( D; c9 M9 x' F
img = cv2.imread(origin_png)* ]' v3 c) f, ~" c" T
assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'
; D. Q& ~# \" v9 ]( ~4 a& n& L7 u( q" h7 ~1 ~+ ~& i1 V
h, w = img.shape[0], img.shape[1]1 |( P% o2 ^3 `2 {
print('图片宽度: {}, 高度: {}'.format(h, w))
4 u' d6 }" z4 `, ?3 R9 N+ l0 p0 O/ ~& A/ l: a0 u9 R1 G
rgb = (19,122,171)
0 j7 _9 y3 V7 [bgr = (rgb[2], rgb[1], rgb[0])
7 c' _6 W) s( b7 r2 U# (B, G, R)
" c5 P! Q) ?: ~9 T# Y7 tfor i in range(h):
4 ?& O2 R$ E: T3 ^6 i6 ^' H for j in range(w):0 K" _7 U0 \: w3 r5 q' }
if (maskImg[i, j] == 0).all():
x& d N! m* ~; c; z img[i, j] = bgr0 z; @5 a' O9 K2 n, V( V7 A
cv2.imwrite(result_png, img)
' D% o6 t4 s+ C# P3 w* Vprint('图片写入 {} 成功'.format(result_png))
2 \; U8 t G" v& J8 Q# @1( X5 ?' E6 \2 ]5 r
2
- p) j+ q; n [$ ?( T% w3, h( Q. H8 w2 n; K& M
43 s7 \$ Z. h$ p
5
4 u) L( a! {! h/ b2 I6
" Z3 n0 `7 I5 P5 z, {4 m7
+ |7 f; D) r8 F. V0 f82 q/ C. [ W/ D
9
/ ^4 k, c& q/ W7 h( k103 A, g! A' x' s
11( D6 o7 T/ k+ K" w# }/ r* [ P
12 U/ W. a; ^% l5 N2 r! ]
136 w9 b: v/ |' u, X( `, w7 q7 ]
14
0 G* T5 o3 A; I. |3 M5 c15
: e& C) l1 c& y3 e; F163 r0 d/ ?1 W$ _5 n
17
) K) \- w. |8 i+ z+ F" F& ?' r18
w& }# @$ [; t' m' X196 I; T5 M! j7 }8 o
20
5 M J! ?9 F( X: H21
/ Z, T9 ^# q. {2 s229 d$ ]. M( ]: N+ a+ J8 W
23: T9 O9 |3 c( Q. N8 R4 R
24/ c1 q2 X4 B, r! J
25
0 \- x2 }9 y- r2 e, U K264 N! D. }4 m! G' M
27
- ]& s7 e& ?! p# v2 P# M由于人长得一般,就不放图了…+ X; E8 L: ^$ [- E+ Q L; \
/ z6 e' A4 i+ }" a/ s缺点:& L& f! _# z" w/ T
lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。0 U( Q( ]4 I& e8 ?4 x+ ~
7 ? e/ C- A2 b; ^+ i* K2 j* o) j' G- e( _
' h4 v; s8 a$ j2 L, u& `* g2 x/ d
. ]$ R& |# N) A1 [. s
: y/ V d- [8 T5 C方法二: 阈值
) ] y7 u, e) t0 r! e/ C该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。
$ h$ m( H/ T( l2 o
0 H1 ^) P0 x4 y' gOpencv+ O% R P- W2 I5 I! m9 T
import cv2
, P) S$ g$ s/ F( M, A: bimport numpy as np* p% g. _2 s9 F$ q9 Q
& C; |! a& _$ z4 l- S% r: b; {9 f! S
def mean_square_loss(a_np, b_np):
$ E5 R4 S: O) l+ W, w) E sl = np.square(a_np - b_np)
+ m5 K0 {! s6 ~/ d return np.mean(sl)9 Q. F4 Y3 h) P) g) p0 d
7 Q+ {, h$ A; j6 D" a
) X( J1 [9 H! S* `
def change_red2blue(origin_png, result_png):
( {6 X. y3 a0 G7 a6 `6 q img = cv2.imread(origin_png): r, a* y: _ r- U: P% A% J
" h# _ v" f! J4 M* d: O
h, w = img.shape[0], img.shape[1]
: _2 U# J9 z: f print('图片宽度: {}, 高度: {}'.format(h, w))& C- t# ^$ Y* [) k$ r8 X
# D, G# o5 [( m& I origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值
6 |( ? N0 d' F# E9 }% ^ origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
6 J: q0 [& A' p9 `$ G target_rgb = (19,122,171) # 蓝底RBG$ z, t* f$ l" w! x, B/ ]
target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])! a( o2 S" \; c3 V( E4 |
/ } m; o" T- u
for i in range(h):
' o7 z3 v3 e$ v( E j for j in range(w):
9 D Z: z& n* E7 G7 Y9 Q # (B, G, R)
z p4 q$ w3 m+ W) a if mean_square_loss(img[i, j], origin_bgr) < 50:5 C" }- L: ~% @9 P; N
img[i, j] = target_bgr ) ^& O6 l6 y2 w& u5 J0 B2 _4 j# n( @
% N6 G! ?6 A( Q- @3 d; M R cv2.imwrite(result_png, img)
0 w( P- g l- z# E print('图片写入 {} 成功'.format(result_png))4 R) H5 [1 U$ S& t( X" Z( ]. ?
2 D: @6 @1 P( \6 s, x( v
" k: v" O1 i9 q* c% r4 c
if __name__ == '__main__':6 u3 r8 f7 H- g @2 r
# origin_png = 'result_png/result_png.png'5 M$ D, t: h" I- X7 o$ j
origin_png = 'origin_png/person.jpg'
; R* s) g' ?- d4 _) I: J result_png = 'result_png/result_refine.png'& q ^5 t) F4 K/ C" q! y% u
change_red2blue(origin_png, result_png)
4 E/ x4 ~1 z4 M1% ~1 n. Q* f4 k: S- n
2% }3 [ k! g: R( w# U: R
30 r9 n+ ~' ]# V* I3 u$ d! W3 w/ T
4
9 q" ^9 p! l @' J8 V1 s! P5; r: O# L2 H4 O3 ]- f3 p
6 p8 K% b& z- x* W# Y3 Z
7
- Y5 F& c L5 D# C% |4 ?) {) ^8 L4 d3 f8' [9 o5 ]" B9 U4 O p1 ^7 [
9
: J+ D3 i/ K1 q# L* q10- a$ L$ s: i, ?) h- Z4 O
119 W5 j4 E ?4 l8 I
12
* R& j7 Q* u; j9 E8 T) W9 ]13% e. e2 L# V, A$ h! ]
14; V" y. B0 h! Y# Y9 @2 }
15" H0 y3 `/ V: V: `# i5 @4 {
16" F1 c" G( u& E" _' u. n) N% N
17& r; T" B3 i) E
18
& C2 m& W' A4 Y+ I7 @8 }/ s: u1 _19
# m- o/ j8 v) g- ]20
+ B8 w- l, d" u+ {0 h' z21
( ?2 ^) O) O) x, m; p7 W% A22
6 O* k% w, y8 w5 {& }* \23
+ N, T/ o5 a5 n$ t+ d7 k: h24% G% B+ E1 R7 U. v
25
8 d* l8 N2 Y. c) o26
& C1 F. _' ~5 r/ a$ C* f6 a27
5 H$ D' ^& O. q! H6 ]: Q28
8 g" ~) D) ^6 b1 j29* g* i0 u0 ~& J
30; O+ L9 h) A3 z; S- ~" ?( U/ f" n T
31
1 a- x2 o' Z4 e# ?- H$ a32" d! |' A: S$ R; u4 o! B! B
33
: n) |$ Z+ _; [5 E9 f, D34& n4 P1 g& M s, N' w! p h W
35
' b# d/ s( t! F3 ~0 C9 B$ l, P结果人与背景边缘仍会存在红色像素残留; l3 I4 L. [2 s) J
0 y& j$ [+ b7 V9 e! @& t
$ I4 o' [3 r) O: Q s
) U' t4 U/ O; }3 ~' t+ T
, f7 G8 Y5 J9 d; k2 F- Z( c1 [
8 J* I# m9 f1 Y3 W' z5 lPIL
% C+ E4 |5 }1 G' j+ ^- B3 }) dfrom torchvision.transforms.functional import to_tensor, to_pil_image
" M* C5 d0 c0 ifrom PIL import Image
+ [+ z0 r; c' }* b3 iimport torch3 @# J+ E& T( o+ j/ E* r2 Q: `
import time( b/ R! t- V+ B% f# _
2 Q: y0 n! l5 Q, h7 X( C8 T: e
9 N0 X, h6 M" H2 F9 Xdef mean_square_loss(a_ts, b_ts):
* Z Z8 H! b y3 | # print(a_ts.shape)/ u, _1 i1 O# S- p ^
# print(b_ts)" J, l) T: |+ Z+ J, O
sl = (a_ts - b_ts) ** 2
' W5 l; D! I/ v- s ^7 d5 X; D return sl.sum()4 C: Z6 N, A! M! x9 Q
; d# Z# n5 R$ [ z+ b4 [
8 l3 b# Y7 |9 u3 ]; ^4 i3 Edef change_red2blue(origin_png, result_png):
: k( {% l m: _: @; |) ?$ @$ ?# @3 F7 u src = Image.open(origin_png)# E# v7 v6 u+ I6 v; q5 _
src = to_tensor(src)6 z1 u% u h$ R2 i# T+ e& x
# print(src.shape) # torch.Size([3, 800, 600])
3 L4 e S G0 q8 z8 ?1 e # channel: (R, G, B) / 255
, V5 A. [& y2 O( q+ V k. K h, w = src.shape[1], src.shape[2]
8 @- B; Q$ H( W0 `+ }# ?0 M7 g, A' u$ a; B9 B
pha = torch.ones(h, w, 3)
- W3 k6 [6 \1 A& l- a# p# a: ^( ]. B
bg = torch.tensor([168,36,32]) / 255
9 j* x8 E+ _( Q0 m6 i target_bg = torch.tensor([19,122,171]) / 255, y7 G# b3 L# B v$ p. K J+ U3 A* I
* S1 j; n g) e: {' F! u b # C, H, W -> H, W, C
" n8 J: O! n; w. j src = src.permute(1, 2, 0)
1 j2 r! X6 x) a: O for i in range(h):" |$ j) ~ L# ]% }
for j in range(w):
5 e, D3 X9 \8 X/ t) }- S if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数* [* m/ {7 Q$ j
pha[j] = torch.tensor([0.0, 0.0, 0.0])/ `$ }+ @2 G, ]: }
7 @9 V( y7 I( _" Y( n
# H, W, C -> C, H, W# d4 i4 @8 x9 s5 a
src = src.permute(2, 0, 1)# j& [7 M. N- ] n9 U# ^0 C
pha = pha.permute(2, 0, 1)4 N# n8 {# c& h$ k3 _! t# {$ V
com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)* }3 a& `1 F9 A) N! o' i. B; v7 U* T
to_pil_image(com).save(result_png)( s3 t4 e# d. L* c3 |
/ }) `# d0 S6 v3 D: f Q$ |
- I5 K8 @2 x5 Bif __name__ == '__main__':
0 d: P6 `6 v* m2 ^( n# J origin_png = 'origin_png/person.jpg'
: Z$ z; m3 J( f/ Q0 k result_png = 'result_png/com.png'0 w. V% q, C- h1 @6 l
start_time = time.time()2 `9 [4 }; P# J9 m
change_red2blue(origin_png, result_png)+ d) j/ G5 G9 R2 p. L8 v; J
spend_time = round(time.time() - start_time, 2)! T; H; i5 \( z+ |/ X. f
print('生成成功,共花了 {} 秒'.format(spend_time))
% I. G4 q/ j5 {6 _! R4 h1' e v5 {/ c* V/ ?9 ~& E9 f
2
, ]( z8 H; e' S7 X3 Z3
0 n: e2 E& B$ O9 h4* C: i. e2 n }$ u- P7 F. K
5% C$ v9 N# F6 Y h2 c
6
1 n* E4 Y1 s/ T2 o7; u, W! I) }- P0 c: W: S% K
8& w i' h( m1 N- `7 _; e
98 x; G/ S( u! D! s
10
! _" t4 t$ p8 ]11
7 X+ p: ]: b( Q% a3 k12# j( B& w" ?2 L& Y ?
13! l i1 \. d$ x* t8 f" M
14) r* g5 K; j: ^% ?
15
! X% K3 v! J- V: X- W3 G16
9 j S0 c2 H T! T171 S8 U* U+ D, u
183 o4 x* ^5 |8 e7 U8 E3 P
19
# k& e4 l% i* Q# d& L0 n20
2 F; N5 I" Z3 P. E; W; v212 |; n7 _3 N* o, w
220 E4 E7 M7 l+ }1 y* A: T z
23
! d: } e& X# O' a3 ~+ x24( u$ a, N6 M) t. i* l0 D$ Z+ g
25
! M! c. r! H2 {263 T, q/ @3 K# ?9 P! @
27
5 R. n* _- t N+ ?# P2 e9 ?5 W286 l) @" Q6 _! e6 c3 ]/ I. j5 O
29
8 q0 y6 u1 H" y7 S30
( S% m5 w' Q% N' K& \# O9 l318 ^3 Y0 H! |9 v
32
! s1 B; j- X5 B9 _33
" } Z3 ]% z K2 J \34
* E% x, o9 E) `4 g) r# t. a6 j35
% [& C9 `+ ^2 G0 m& \% y( d& K36/ [6 h) R) a3 L8 \" g
37- j F6 r$ n- ^7 y, o# _$ Z
38; |2 m& ~% x8 l* J( W5 C- r2 W- x
396 h! A& R5 c, _. W/ K" l5 f
40
2 t C( T5 e" L- y* J+ ~41
, H8 y) w, J2 L0 z' d42+ w) e3 a# k6 f+ n
43
4 w; N+ o2 e7 B44
8 x4 H( j; v: n2 T7 p( W4 N45/ d! p. x$ `. Q9 B# f* V9 p R
46( F4 w- ~9 c! q
该方法质量较好,但一张图片大概需要12秒。$ w0 [$ R# a4 P2 ]6 O' ^
& p2 M. g, e& T7 H: Q
# y& Q) C# T- ]% t; @
6 R3 h7 H1 q5 z. R# }9 m方法四: Background MattingV2
2 [5 j: M% ]8 s3 O1 k7 X" ?+ u- TReal-Time High-Resolution Background Matting
1 \1 s, L" W) [; {; u- k, |CVPR 2021 oral& g' {& C( Z8 G, M5 W* c
" \$ v. d( }; o6 P
论文:https://arxiv.org/abs/2012.07810. _8 g% J0 C4 p Y
代码:https://github.com/PeterL1n/BackgroundMattingV25 q" t H& [/ Z' ~
9 ]* p& z! S1 a0 n1 Tgithub的readme.md有inference的colab链接,可以用那个跑
% m5 f% @! r, D6 T
0 N8 j8 E7 @9 _ Z- [. C3 L( O由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。+ c0 n D$ P3 G8 V0 H) ~9 B
* G- `9 F3 N- z/ U
于是这里我需要生成一个背景图片。
8 w- x/ G: J1 Y& }7 P' I首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。
8 a8 d& e- X+ F
3 K. `- ~) o0 q' g9 J4 F' d% k7 m然后生成一个背景图片。
, Y6 v& D% x- [, l j$ [; L" W8 r4 W. `
import cv2
; o: k3 h/ h! u& ^, b3 _! Eimport numpy as np
. b) N# b5 f/ S, k7 A. n2 q* I: P8 T1 `
; ?3 l. `# o$ g4 ]* L) k" @
image = cv2.imread("origin_png/person.jpg")) Z+ U, w1 m7 |, T2 ^
origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值
: e7 @$ s! m: s& M1 Uorigin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0]) y6 K3 C, |8 c3 a6 w/ `; g' C
image[:, :] = origin_bgr9 w$ [1 i. |9 x- w! G
$ Q4 N% T( C4 y; t" C- P" Q0 r1 Qcv2.imwrite("mask/bg.png", image)
8 @4 {; x# K# P17 L1 t) r4 r: W0 r6 X1 l5 h
2& }& Z' B9 v2 z# H9 U. I$ V6 O0 _
3
- o+ b9 ^; o# z) Y4
/ A& V/ e, V. n' }0 g8 U1 U5 [9 F3 v8 l& l9 i4 n& t
66 N* c0 @% H! W: B) o3 c' W
7* b1 ~* M* d8 w. V
8! w) @# i+ l) U& r H. H' y7 l
9' @6 S1 ~0 {% y" k
108 `2 o3 D5 N) C* Y1 i, }3 l
' k3 x' j; w% h+ @ g: c* S/ o- B0 v
需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码
% Q% g# `0 U$ @9 q! `
8 [* i5 ~& X- A# m8 s' d/ ]src = Image.open('src.png')( Y1 r% `8 ~ ~6 q" g- k4 Z
bgr = Image.open('bgr.png')
. K$ ^6 n( G$ i1
) a) f: D: X y' b# z) W( a# l2! N( E) V2 M* ^4 @
另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)5 \/ N/ t7 E0 T
- R6 [4 E: a# Q# m4 K$ `
com = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1) _; @) K8 E3 I8 V. N& [2 Z0 G6 z
1
+ e% j+ M9 w0 }$ _$ c2 e
' F* i3 z- |# i' |2 Z+ `! e* Z那么加入我要换白底(255, 255, 255),就是
$ i$ B/ Y" X1 k8 e1 n0 _' N5 {" c# p9 e' V: r; n
com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)6 z; m) ]' x0 h. F6 A
1+ |+ X" f( B2 p; T$ S- q. m
! J0 u6 V! s1 [0 ~8 W1 l
假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是
# d( m. c$ R. `1 G' e! Y
) ^* {, Q8 W; ~4 f9 }& F8 G4 i6 Ucom = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
& r5 f/ b5 b& B M1 W16 O# \: ~& [3 y, Q$ K% J \/ P# m
总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.
5 M0 G% _8 o9 S+ q; c0 j2 T( C$ m) r/ B/ Q6 r
然后就输出图片了。可以看到效果相当好。不愧是oral。
- v2 b( T8 D y- p) \! C8 `( I
1 r" v7 U7 T' a
. W; S8 @: [" j* w; n5 `! v [+ r原论文可以实现发丝级效果9 i1 k* J" d& \2 D; \& y d
9 Y1 `( k6 e8 O# C
7 K. h. y9 w/ w" F% G1 O
7 r3 Z* P7 p( d$ U8 `
1 C5 v( b- `# N: ~6 b0 S: Z. s
! s7 U! |0 S. x/ \; m报错解决方案
/ i$ ~& J1 e: z% xcan’t divided by 4 / can’t divided by 16
( u! s1 L1 y6 c' E6 c由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。) F/ ^. R$ z+ r6 l
这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize
4 i) {, _+ T2 Y9 x0 ^+ |- h————————————————
" n; I3 s! u3 v& ~版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( n9 F' f( }6 S! }, c1 k原文链接:https://blog.csdn.net/weixin_43850253/article/details/126376767
* E( ?: |! n9 J) K; J& i" h0 O- U2 }* Z* D
@; _& n4 p& q0 T& v |
zan
|