在图像分割领域中有不少优秀出色的网络,DeepLab系列就是其中非常经典的分支之一,在之前的很多项目中陆续都已经有接触到了,在处理图像分割中表现出色。
DeepLabV3Plus是一种用于语义分割任务的深度学习模型,它是DeepLab系列模型的一种改进版本。下面详细解释DeepLabV3Plus的原理:
-
引入空洞卷积(Dilated Convolution):DeepLabV3Plus利用空洞卷积来扩大感受野,以更好地捕捉图像中的上下文信息。传统的卷积操作只关注局部区域,而空洞卷积通过在卷积核中引入间隔(或称为膨胀率),使得卷积核能够跳过一些像素点,从而扩大感受野。
-
多尺度金字塔池化(Multi-scale Atrous Spatial Pyramid Pooling, ASPP):DeepLabV3Plus使用ASPP模块来处理不同尺度的信息。ASPP模块使用多个并行的空洞卷积分支,每个分支具有不同的膨胀率,以捕捉来自不同感受野的特征。最后,将这些特征进行汇总并进行融合,以生成更丰富的特征表示。
-
融合低级特征:为了结合低层次的细节特征,DeepLabV3Plus引入了一个编码器-解码器结构。在编码器部分,通过堆叠多个残差块和降采样操作,提取高层次的语义特征。然而,这会导致空间信息的丢失。因此,在解码器部分,使用反卷积(或上采样)操作来恢复特征图的分辨率,并与对应的低级特征进行融合。
-
融合注意力机制:为了进一步提升融合的效果,DeepLabV3Plus引入了注意力机制。该机制利用辅助监督信号和空间注意力模块,自适应地对不同的特征图进行加权融合。这样可以使网络更加关注重要的特征区域,提升语义分割的准确性。
DeepLabV3Plus通过引入空洞卷积、多尺度金字塔池化、融合低级特征和注意力机制等改进,提升了语义分割任务的性能。它能够准确地标记图像中每个像素的类别,从而在许多计算机视觉领域(如图像分割、自动驾驶等)中发挥着重要作用。
整体网络结构图如下所示:
本文的核心目的就是想要基于DeepLabv3Plus模型开发构建人像分割识别系统,首先来看下最终的效果图。如下所示:
人像人脸分割是指将图像中的人物或人脸从背景中分离出来,形成一个与背景独立的前景层。这个任务在计算机视觉和图像处理领域具有广泛的应用,如图像编辑、虚拟背景替换、人脸识别等。
下面介绍几种常见的人像人脸分割方法:
-
基于传统图像处理技术的方法:包括阈值分割、边缘检测、区域生长等。这些方法利用图像的颜色、纹理、边缘等特征来实现分割,但对于复杂场景和变化光照条件下的图像效果可能不太理想。
-
基于深度学习的方法:近年来,基于深度学习的方法在人像人脸分割任务上取得了显著的进展。主要有以下几种方法:
-
Fully Convolutional Network (FCN):将卷积神经网络(CNN)进行扩展,使其能够输出与输入图像相同尺寸的特征图,通过逐像素分类实现分割。
-
U-Net:采用编码器-解码器结构,通过多级特征融合实现分割。在编码器部分逐渐提取抽象特征,而解码器则将这些特征进行上采样和融合,恢复原始分辨率。
-
Mask R-CNN:结合目标检测和语义分割,通过在候选区域上生成分割掩码,实现对人像或人脸的精确分割。
-
DeepLab系列:如前面提到的DeepLabV3Plus,利用空洞卷积、多尺度金字塔池化等技术,结合编码器-解码器结构和注意力机制,实现高质量的人像或人脸分割。
-
以上方法基于深度学习的人像人脸分割具有更好的性能和鲁棒性,能够处理各种复杂场景,但需要大量的训练数据和计算资源来训练和推断模型。此外,还需注意保护个人隐私和遵守相关法律法规,在使用人像人脸分割技术时要谨慎处理和使用图像数据。
本文使用到的数据集来源于网络数据采集,考虑到隐私等问题,这里就不再开放数据集,有兴趣的话可以采集自己的人像数据进行标注即可,也可以自己获取所需要的数据集,简单看下数据集情况,如下所示:
项目的话我是使用的开源的项目,感兴趣自己可以搜索一下就有很多可用的项目了,这里就不再赘述了。
这里对训练过程loss记录,输出如下:
【训练过程loss】
0.606733886387613
0.5451530520297863
0.5312956986162397
0.5229707437400465
0.5153569176594416
0.5111042044206902
0.5069597844017877
0.5037329255607393
0.5014695850213369
0.4987152876235821
0.4963443066676458
0.49430867842833204
0.49257237531520703
0.491585019632622
0.490325737034833
0.4884220104813576
0.48718978066356095
0.4857246057987213
0.4845155222835364
0.4839324971768591
0.48285760136224604
0.4823990903629197
0.4816572904498489
0.4810293540513074
0.479909280386236
0.48014969675629227
0.4782429775706044
0.47816003894364395
0.4778184459032836
0.4770615481072002
0.47634794495061594
0.4760536521187535
0.47536532789468766
0.47525336522967726
0.47413731544106097
0.4741229054375931
0.47342363812746824
0.473592685730369
0.4730194813675351
0.4729978748736558
0.4722207668798941
0.47126187033564954
0.4722152912462199
0.4719400713532059
0.4714534025280564
0.4725597387552261
0.47105351442540133
0.4704632743817789
0.4706625964729874
0.4700480776164267
0.4705623256939429
0.4703608555043185
0.47048959539996255
0.4695794686189404
0.4702329401484242
0.4698123355794836
0.4698283548310951
0.4700069356582783
0.46982009513731354
0.46908038724131057
0.4688676534979432
0.4699744729112696
0.4692540439698431
0.4694266492812722
0.46868740408729626
0.46882954442059555
0.46816772681253926
0.46973903317363175
0.4690917461404094
0.4677222697491999
0.4683394526110755
0.4682736379128915
0.4685229307324798
0.4675601541907699
0.46799968316378415
0.46828408296682217
0.46808334429175763
0.4683440767129262
0.4676276903042087
0.46854540413838847
0.4678870822058784
0.4688800019290712
0.46860441150488674
0.46716839501813606
0.4692639676663611
0.4682025171672856
0.46774926880333156
0.46816943083869084
0.467910121149487
0.4679397223569729
0.46740188981647846
0.46744765230019886
0.46749446893400615
0.46847197057361956
0.468207284518966
0.4675115166814239
0.4674260204831759
0.4679987247740781
0.4672764806041011
0.46750681177775066
0.4610524634564364
0.4430497716687344
0.4308067981644913
0.42418101248697
0.4179302916151506
0.41094093401343734
0.40740824448400076
0.4054056303324523
0.40121451599068114
0.39721187418478504
0.39433807819419436
0.39200182554456925
0.39041697849167717
0.3873950265314844
0.3848230292973695
0.3834493019293856
0.3810895609259605
0.3797435728797206
0.37972999588648476
0.3775988665995774
0.375126536724744
0.37449268773529265
0.3734198753613013
0.3727285913847111
0.3722336419931164
0.3703744729735233
0.36967343696399974
0.3674778556536745
0.3688265012237761
0.36700428471521096
0.366438580930233
0.36669299064742195
0.36551257621138183
0.3642659715325744
0.3647161818610297
0.3640892456505034
0.3625525557707857
0.36195346475089035
0.36148804857554256
0.3620846286371902
0.3618001574829773
与之对应的每个epoch阶段的验证集loss值如下所示:
0.7363147226174672
0.6476791345278422
0.6269188988606135
0.6518109252850215
0.6363567601442337
0.6108124456803004
0.5660302023887634
0.6123864912589391
0.5911199820836385
0.5770307216246923
0.6037196354468664
0.5832631700436274
0.6019434279600779
0.5977168931563696
0.5589731727043787
0.5962350815931956
0.584779790798823
0.6019311763445536
0.5571765099366506
0.5753734890619914
0.601554860273997
0.5678470953305562
0.568916656335195
0.582502201239268
0.5674247304598491
0.5834379431406657
0.565427275856336
0.5965515422026316
0.5879235327243805
0.5852312157551448
0.5927491906086604
0.572282440384229
0.5753429974317551
0.566869480172793
0.5809106465180714
0.5651940529743831
0.5690218742688496
0.5738445527156194
0.570579530954361
0.5770735333363215
0.5874447878996532
0.5793218000729878
0.5819239114522934
0.578914180835088
0.5836177942355474
0.5850059668620428
0.5773452857335408
0.5924962973594665
0.595604096253713
0.5819054840008417
0.5809926917155583
0.5815007782379786
0.5740332746903102
0.577073024113973
0.5735143412748973
0.5784651318391164
0.5792534666458765
0.5738669501145681
0.5771631151040395
0.5708307991027832
0.577383451739947
0.5749749945004781
0.5746441821654638
0.5699648759365081
0.5746079727013906
0.5722724730571112
0.5769749979972839
0.5778775161504746
0.5726225604216257
0.5714786018133163
0.5711708536148071
0.5703613657553991
0.5722145459254583
0.5741133541663488
0.5688811107873917
0.5702993161678315
0.5718296977678935
0.575028224070867
0.5709250133832295
0.5751660763820012
0.5774899474779764
0.5701479283173879
0.573536010980606
0.5747984119256337
0.571291612346967
0.5710983018477758
0.5723327718178431
0.5725627580881119
0.5755251860221227
0.575767505645752
0.573041660865148
0.5734743138154348
0.5762857339382171
0.5738734103838603
0.5738458364804586
0.5724152154127756
0.5738513347705205
0.5744692078828811
0.5729313603639603
0.5757221702337265
0.4207547032634417
0.4133402276833852
0.4090682305494944
0.3985422770579656
0.4109359646638234
0.4096279754837354
0.3765391613642375
0.37874370960394543
0.3909721949895223
0.3793969687422117
0.3987407827774684
0.37563763177394865
0.38857615647713345
0.3718491301735242
0.36752369912465416
0.3668622848590215
0.3808561844229698
0.3683939206600189
0.38373111416896183
0.3766015217502912
0.38577201998233795
0.3730621130665143
0.3645110250512759
0.36443960805734
0.36273852970202763
0.36943710199991864
0.3635948519905408
0.3739289958278338
0.3694388215144475
0.37423735785484313
0.36813118265072503
0.3720009588201841
0.36932403522729873
0.37261974320809044
0.36806525905927023
0.37184850025177
0.3679776246349017
0.3615932798584302
0.3575896237293879
0.3615605310201645
0.3593589244087537
干巴巴的看数字没有直观的体验,这里对其进行可视化,代码实现如下所示:
from matplotlib import pyplot as plt
with open("train.txt") as f:
train_list = [float(one) for one in f.readlines() if one.strip()]
with open("val.txt") as f:
val_list = [float(one) for one in f.readlines() if one.strip()]
print("train_list_length: ", len(train_list))
print("val_list_length: ", len(val_list))
plt.clf()
plt.figure(figsize=(8, 6))
plt.plot(train_list, label="Train Loss Cruve", c="g")
plt.plot(val_list, label="Val Loss Cruve", c="b")
plt.title("Model Loss Cruve")
plt.savefig("loss.png")
结果如下所示:
可以看到:一共训练迭代了将近150个epoch。
如果想要接入视频进行实时计算推理也是可以的,这里给出模板实现,可以给予我的模板改造适配自己的应用即可,如下所示:
while True:
t1 = time.time()
ref, frame = capture.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = Image.fromarray(np.uint8(frame))
frame = np.array(deeplabv3.detect_image(frame))
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
fps = (fps + (1.0 / (time.time() - t1))) / 2
print("fps= %.2f" % (fps))
frame = cv2.putText(
frame,
"fps= %.2f" % (fps),
(0, 40),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(0, 255, 0),
2,
)
cv2.imshow("video", frame)
c = cv2.waitKey(1) & 0xFF
if video_save_path != "":
out.write(frame)
if c == 27:
capture.release()
break
这里为了方便使用模型,开发了专用的可视化系统界面,实例推理计算效果如下所示:
直观来看效果还是不错的,有兴趣的话都是可以自己动手实践一下的。