ResNeSt: Split-Attention Networks
ResNeSt系列网络的预处理操作可以按照如下步骤进行:
transform_val = transforms.Compose([
ECenterCrop(args.crop_size),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
class ECenterCrop:
"""Crop the given PIL Image and resize it to desired size.
Args:
img (PIL Image): Image to be cropped. (0,0) denotes the top left corner of the image.
output_size (sequence or int): (height, width) of the crop box. If int,
it is used for both directions
Returns:
PIL Image: Cropped image.
"""
def __init__(self, imgsize):
self.imgsize = imgsize
self.resize_method = transforms.Resize((imgsize, imgsize), interpolation=PIL.Image.BICUBIC)
def __call__(self, img):
image_width, image_height = img.size
image_short = min(image_width, image_height)
crop_size = float(self.imgsize) / (self.imgsize + 32) * image_short
crop_height, crop_width = crop_size, crop_size
crop_top = int(round((image_height - crop_height) / 2.))
crop_left = int(round((image_width - crop_width) / 2.))
img = img.crop((crop_left, crop_top, crop_left + crop_width, crop_top + crop_height))
return self.resize_method(img)
ResNeSt系列网络的后处理操作是对网络输出进行softmax作为每个类别的预测值,然后根据预测值进行排序,选择topk作为输入图片的预测分数以及类别
本网络主要受ResNeXt、SENet和SKNet。ResNeXt采用统一的多路径group卷积操作;SENet通过自适应地重新校正各个特征响应,引入了通道维度的注意力机制;SKNet则是利用两个分支实现了特征图内部(空间维度)注意力机制。ResNeSt将通道维度的注意力机制扩展到特征图组表示,可以使用统一的CNN操作符进行模块化和加速
ResNeSt系列网络的backbone结构是由Split-Attention Block
堆叠而成,此处借鉴了SENet和SKNet
- 首先是借鉴了ResNeXt网络的思想,将输入分为K个,每一个记为Cardinal1-k ,然后又将每个Cardinal拆分成R个,每一个记为Split1-r,所以总共有G=KR个组
- 然后是对于每一个Cardinal中的
split attention
具体是什么样的: - 接着将每一个Cardinal的输出拼接起来
V = Concat{v1, v2,…vk}
📝 上述结构很难使用标准CNN操作符进行模块化和加速。为此,我们引入一个等价的基数主要实现:
ResNeSt系列网络的head层由AvgPool2d
层和Flatten
组成
- AvgPool2d
- SEBlock & SKBlock
- ReLU
- Channel Split
- softmax
模型 | 源码 | top1 | top5 | flops(G) | params(M) | input size | dataset |
---|---|---|---|---|---|---|---|
resnest50 | official | 81.04 | - | 12.065 | 27.483 | 224 | imagenet |
resnest101 | official | 82.83 | - | 29.861 | 48.275 | 256 | imagenet |
resnest200 | official | 83.84 | - | 79.762 | 70.202 | 320 | imagenet |
resnest269 | official | 84.54 | - | 173.421 | 110.929 | 416 | imagenet |
ImageNet 是一个计算机视觉系统识别项目,是目前世界上图像识别最大的数据库。是美国斯坦福的计算机科学家,模拟人类的识别系统建立的。能够从图片中识别物体。ImageNet是一个非常有前景的研究项目,未来用在机器人身上,就可以直接辨认物品和人了。超过1400万的图像URL被ImageNet手动注释,以指示图片中的对象;在至少一百万张图像中,还提供了边界框。ImageNet包含2万多个类别; 一个典型的类别,如“气球”或“草莓”,每个类包含数百张图像。
ImageNet数据是CV领域非常出名的数据集,ISLVRC竞赛使用的数据集是轻量版的ImageNet数据集。ISLVRC2012是非常出名的一个数据集,在很多CV领域的论文,都会使用这个数据集对自己的模型进行测试,在该项目中分类算法用到的测评数据集就是ISLVRC2012数据集的验证集。在一些论文中,也会称这个数据叫成ImageNet 1K或者ISLVRC2012,两者是一样的。“1 K”代表的是1000个类别。
- top1准确率: 测试图片中最佳得分所对应的标签是正确标注类别的样本数除以总的样本数
- top5准确率: 测试图片中正确标签包含在前五个分类概率中的个数除以总的样本数
-
official
python ./source_code/official_export.py --model_name resnest50 --size 224
-
本模型使用ImageNet官网ILSVRC2012的5万张验证集进行测试,针对
int8
校准数据可从该数据集中任选1000张,为了保证量化精度,请保证每个类别都有数据,请用户自行获取该数据集,ILSVRC2012├── ImageNet | ├── val | | ├── ILSVRC2012_val_00000001.JPEG │ | ├── ILSVRC2012_val_00000002.JPEG │ | ├── ...... | ├── val_label.txt
sh ./data_prep_sh_files/valprep.sh
# label.txt tench, Tinca tinca goldfish, Carassius auratus ...
-
使用模型转换工具vamc,根据具体模型修改模型转换配置文件, 以下为示例
vamc build ./vacc_code/build/official_resnest.yaml
-
生成推理数据
npz
以及对应的datalist.txt
python ../common/utils/image2npz.py --dataset_path /path/to/ILSVRC2012_img_val --target_path /path/to/input_npz --text_path npz_datalist.txt
-
性能测试
./vamp -m resnest50-int8-percentile-3_256_256-vacc/resnest50 --vdsp_params ./vacc_code/vdsp_params/official-resnest50-vdsp_params.json -i 8 -p 1 -b 16
-
获取精度信息
./vamp -m resnest50-int8-percentile-3_256_256-vacc/resnest50 --vdsp_params ./vacc_code/vdsp_params/official-resnest50-vdsp_params.json -i 8 -p 1 -b 16 --datalist npz_datalist.txt --path_output output
-
结果解析及精度评估
python ../common/eval/vamp_eval.py --result_path output --datalist npz_datalist.txt --label data/label/imagenet.txt