Package: nbnb
NBPlease installnbwithpip install nbnb, thenbname was taken already, so we usingnbnbinstead!Neural Network Blocks (aka:NB, or neural network builder). This library provides massive fancy blocks for you to quick build your powerful networks! Some SOTA tricks and connections such as CSP, ASFF, Attention, BaseConv, Hardswish, Mish all included for quick prototype your model. This is anArsenal for deeplearning forge.nbis an idea comes from engineering, we build model with some common blocks, we exploring new ideas with SOTA tricks, but all those thing can be gathered into one single place, and for model quick design and prototyping.this project is under construct for now, I will update it quickly once I found some new blocks that really works in model.And you are very welcome to send me a pull request and add more features!Updates2022.06.29: Now we addEfficientFormer(unofficial) support! Also, insideYOLOv7, will have adetection modeltrained with EfficientFormer-L1;2022.06.27: Now we addMobileOnebackbone support!2021.03.16: Added some blocks used inside Scaled-YoloV4 (P5,P6,P7). List are:HarDBlock;SPPCSP;VoVCSP;Installnbcan be installed from PIP, remember the name isnbnb:sudo pip3 install nbnbUsageHere is an example of using NB to build YoloV5!updates: We have another YoloV5-ASFF version added in example!importtorchfromtorchimportnnfromnb.torch.blocks.bottleneck_blocksimportSimBottleneckCSPfromnb.torch.blocks.trans_blocksimportFocusfromnb.torch.blocks.head_blocksimportSPPfromnb.torch.blocks.conv_blocksimportConvBasefromnb.torch.utilsimportdeviceclassYoloV5(nn.Module):def__init__(self,num_cls=80,ch=3,anchors=None):super(YoloV5,self).__init__()assertanchors!=None,'anchor must be provided'# divid bycd=2wd=3self.focus=Focus(ch,64//cd)self.conv1=ConvBase(64//cd,128//cd,3,2)self.csp1=SimBottleneckCSP(128//cd,128//cd,n=3//wd)self.conv2=ConvBase(128//cd,256//cd,3,2)self.csp2=SimBottleneckCSP(256//cd,256//cd,n=9//wd)self.conv3=ConvBase(256//cd,512//cd,3,2)self.csp3=SimBottleneckCSP(512//cd,512//cd,n=9//wd)self.conv4=ConvBase(512//cd,1024//cd,3,2)self.spp=SPP(1024//cd,1024//cd)self.csp4=SimBottleneckCSP(1024//cd,1024//cd,n=3//wd,shortcut=False)# PANetself.conv5=ConvBase(1024//cd,512//cd)self.up1=nn.Upsample(scale_factor=2)self.csp5=SimBottleneckCSP(1024//cd,512//cd,n=3//wd,shortcut=False)self.conv6=ConvBase(512//cd,256//cd)self.up2=nn.Upsample(scale_factor=2)self.csp6=SimBottleneckCSP(512//cd,256//cd,n=3//wd,shortcut=False)self.conv7=ConvBase(256//cd,256//cd,3,2)self.csp7=SimBottleneckCSP(512//cd,512//cd,n=3//wd,shortcut=False)self.conv8=ConvBase(512//cd,512//cd,3,2)self.csp8=SimBottleneckCSP(512//cd,1024//cd,n=3//wd,shortcut=False)def_build_backbone(self,x):x=self.focus(x)x=self.conv1(x)x=self.csp1(x)x_p3=self.conv2(x)# P3x=self.csp2(x_p3)x_p4=self.conv3(x)# P4x=self.csp3(x_p4)x_p5=self.conv4(x)# P5x=self.spp(x_p5)x=self.csp4(x)returnx_p3,x_p4,x_p5,xdef_build_head(self,p3,p4,p5,feas):h_p5=self.conv5(feas)# head P5x=self.up1(h_p5)x_concat=torch.cat([x,p4],dim=1)x=self.csp5(x_concat)h_p4=self.conv6(x)# head P4x=self.up2(h_p4)x_concat=torch.cat([x,p3],dim=1)x_small=self.csp6(x_concat)x=self.conv7(x_small)x_concat=torch.cat([x,h_p4],dim=1)x_medium=self.csp7(x_concat)x=self.conv8(x_medium)x_concat=torch.cat([x,h_p5],dim=1)x_large=self.csp8(x)returnx_small,x_medium,x_largedefforward(self,x):p3,p4,p5,feas=self._build_backbone(x)xs,xm,xl=self._build_head(p3,p4,p5,feas)returnxs,xm,xlA simple example to build a layer of conv:fromnb.torch.base.conv_blockimportConvBasea=ConvBase(128,256,3,1,2,norm_cfg=dict(type="BN"),act_cfg=dict(type="Hardswish"))Be note that, the reason for us usingcfgto specific norm and activation is for users dynamically switch their configuration of model in yaml format rather than hard code it.RoadMapMore Transformers backbone;Favor of more light-weighted but powerful models;Pull request are very welcomed!CopyrightLucas Jin @2022 all rights reserved.