product_recognition.md 4.2 KB
Newer Older
C
cuicheng01 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
# 商品识别

商品识别技术,是现如今应用非常广的一个领域。拍照购物的方式已经被很多人所采纳,无人结算台已经走入各大超市,无人超市更是如火如荼,这背后都是以商品识别技术作为支撑。商品识别技术大概是"商品检测+商品识别"这样的流程,商品检测模块负责检测出潜在的商品区域,商品识别模型负责将商品检测模块检测出的主体进行识别。识别模块多采用检索的方式,根据查询图片和底库图片进行相似度排序获得预测类别。此文档主要对商品图片的特征提取部分进行相关介绍,内容包括:

-  数据集及预处理方式
-  Backbone的具体设置
-  Loss函数的相关设置


## 1 Aliproduct

### 1 数据集

<img src="../../images/product/aliproduct.png" style="zoom:50%;" />

Aliproduct数据是天池竞赛开源的一个数据集,也是目前开源的最大的商品数据集,其有5万多个标识类别,约250万训练图片。相关数据介绍参考[原论文](https://arxiv.org/abs/2008.05359)

### 2 图像预处理

- 图像`Resize`到224x224
- 图像`RandomFlip`
- Normlize:图像归一化  

### 3 Backbone的具体设置

具体是用`ResNet50_vd`作为backbone,主要做了如下修改:

 - 使用ImageNet预训练模型

 - 在GAP后、分类层前加入一个512维的embedding FC层,没有做BatchNorm和激活。

配置文件如下,其中BackboneStopLayer定义了backbone的输出层,在此处为GAP经过flatten后的层,Neck部分为embedding层,也是最后表示特征的层,Head部分为分类层,其输出维度等于训练数据集的类别数。

```yaml
Arch:
  name: RecModel
  Backbone:
    name: ResNet50_vd
    pretrained: True
  BackboneStopLayer:
    name: flatten_0
  Neck:
    name: FC
    embedding_size: 2048
    class_num: 512
  Head:
    name: FC
    embedding_size: 512
    class_num: 50030
```
   
### 4 Loss的设置

在Aliproduct商品识别中,使用了[CELoss](../../../ppcls/loss/celoss.py)训练, 为了获得更加鲁棒的特征,后续会使用其他Loss参与训练,敬请期待。配置文件如下:

```yaml
Loss:
  Train:
    - CELoss:
        weight: 1.0
  Eval:
    - CELoss:
        weight: 1.0
```

## 2 Inshop

### 1 数据集

<img src="../../images/product/inshop.png" style="zoom:50%;" />

Inshop数据集是DeepFashion的子集,其是香港中文大学开放的一个large-scale服装数据集,Inshop数据集是其中服装检索数据集,涵盖了大量买家秀的服装。相关数据介绍参考[原论文](https://openaccess.thecvf.com/content_cvpr_2016/papers/Liu_DeepFashion_Powering_Robust_CVPR_2016_paper.pdf)

### 2 图像预处理

数据增强是训练大规模
- 图像`Resize`到224x224
- 图像`RandomFlip`
- Normlize:图像归一化
- [RandomErasing](https://arxiv.org/pdf/1708.04896v2.pdf)

### 3 Backbone的具体设置

具体是用`ResNet50_vd`作为backbone,主要做了如下修改:

 - 使用ImageNet预训练模型

 - 在GAP后、分类层前加入一个512维的embedding FC层,没有做BatchNorm和激活。
 
 - 分类层采用Arcmargin Head,具体原理可参考[原论文](https://arxiv.org/pdf/1801.07698.pdf)

配置文件如下,其中BackboneStopLayer定义了backbone的输出层,在此处为GAP经过flatten后的层,Neck部分为embedding层,也是最后表示特征的层,Head部分为arcmargin head, 代码实现为[arcmargin.py](../../../ppcls/arch/gears/arcmargin.py),其输出维度等于训练数据集的类别数。

```yaml
Arch:
  name: RecModel
  infer_output_key: features
  infer_add_softmax: False

  Backbone:
    name: ResNet50_vd
    pretrained: False
  BackboneStopLayer:
    name: flatten_0
  Neck:
    name: FC
    embedding_size: 2048
    class_num: 512
  Head:
    name: ArcMargin
    embedding_size: 512
    class_num: 3997
    margin: 0.15
    scale: 30
```
   
### 4 Loss的设置

在Inshop商品识别中,使用了[CELoss](../../../ppcls/loss/celoss.py)[TripletLossV2](../../../ppcls/loss/triplet.py)联合训练。配置文件如下:

```yaml
Loss:
  Train:
    - CELoss:
        weight: 1.0
    - TripletLossV2:
        weight: 1.0
        margin: 0.5
  Eval:
    - CELoss:
        weight: 1.0
```