商品图像数据的细粒度识别有别于传统的图像识别任务,本身细粒度识别对于模型特征提取计算能力要求就比较高,在我们前面的一些项目中,涉及到的细粒度识别大多是同一物种下不同亚种的识别,比如:鸟类细粒度识别、狗类细粒度识别等等。
本文的主要目的是想要尝试基于前文中的GhostNet模型来开发构建商品图像数据的细粒度识别系统,另外,在这里的商品是多种商品,而不只是单个类型下的不同子品牌的商品数据,首先看下实例效果,如下所示:

这里简单看下商品类别清单,如下所示:
- 1 东古酱油一品鲜
- 2 东古黄豆酱750G
- 3 东鹏特饮罐装
- 4 中华(硬)
- 5 中华(软)
- 6 乳酸菌600亿_2
- 7 乳酸菌600亿_3
- 8 乳酸菌600亿原味
- 9 乳酸菌600亿芒果
- 10 乳酸菌600亿芦荟
- 11 乳酸菌600亿草莓
- 12 乳酸菌600亿西瓜
- 13 云烟(紫)
- 14 仲景香菇酱
- 15 伊利安慕希瓶装原味230g
- 16 伊利安慕希高端原味230ml
- 17 伊利安慕希高端橙凤梨味230ml
- 18 伊利纯牛奶250ml
- 19 优倍
- 20 优酪乳健康大麦180g_4麦香原味
- 21 优酪乳健康大麦180g草莓味
- 22 优酪乳健康大麦180g麦香原味
- 23 优酪乳唯果粒230g芒果黄桃
- 24 优酪乳唯果粒230g芦荟
- 25 优酪乳唯果粒230g草莓
- 26 优酪乳四季鲜选180g_4芦荟
- 27 优酪乳四季鲜选180g_4黄桃
- 28 优酪乳四季鲜选180g芦荟
- 29 优酪乳四季鲜选180g黄桃
- 30 优酪乳慢一点100g_8原味
- 31 优酪乳旅行优格220g丹麦芝士味
- 32 优酪乳旅行优格220g保加利亚玫瑰味
- 33 优酪乳简单点100g_8原味
- 34 优酪乳简单点230g半糖
- 35 优酪乳简单点原味
- 36 优酪乳简单点烤酸奶
- 37 优酪乳顺畅点230g原味
- 38 伴侣酱油1L
- 39 伴侣酱油2L
- 40 光明藜麦
- 41 光明鲜牛奶
- 42 六个核桃
- 43 六月鲜柠檬蒸鱼酱油
- 44 六月鲜特级原汁酱油
- 45 六月鲜特级淡盐酱油375ML
- 46 六月鲜红烧酱油1L
- 47 六月鲜酱油1L
- 48 六神花露水
- 49 养乐多
- 50 养乐多组合装
- 51 农夫山泉17.5
- 52 农夫山泉NFC
- 53 农夫山泉维他命水乳酸菌风味
- 54 农夫山泉维他命水柑橘风味
- 55 农夫山泉茶π柠檬红茶
- 56 冠益乳
- 57 凯旋1664blanc啤酒瓶装
- 58 凯旋1664blanc啤酒罐啤
- 59 利群(蓝天)
- 60 加加上等蚝油715G
- 61 加加味极鲜
- 62 加加红烧酱油
- 63 加加面条鲜
- 64 千岛湖超爽罐啤
- 65 千禾135高鲜酱油
- 66 千禾东坡红纯酿红烧
- 67 千禾头道原香
- 68 千禾年份料酒
- 69 千禾有机酱油
- 70 千禾糯米白醋
- 71 千禾糯米香醋
- 72 千禾鼎鼎鲜135头道原香
- 73 千禾鼎鼎鲜红烧酱油
- 74 厨邦味极鲜
- 75 厨邦渔女蚝油700G
- 76 厨邦美味鲜
- 77 厨邦草菇老抽
- 78 厨邦葱姜汁料酒500ML
- 79 厨邦蚝油
- 80 厨邦酱油晒制180天特级生抽
- 81 厨邦金品生抽
- 82 厨邦陈醋王420ML
- 83 厨邦黄豆酱
- 84 可口可乐罐装
- 85 可口可乐黑魔爪
- 86 味事达味极鲜
- 87 味事达纯味鲜
- 88 味达美冰糖老抽酱油
- 89 味达美冰糖老抽酱油1.8L
- 90 味达美冰糖老抽酱油1L
- 91 味达美压锅酱600G
- 92 味达美味极鲜酱油1L
- 93 味达美味极鲜酱油3.78L
- 94 味达美尚品生抽
- 95 味达美尚品生抽2L
- 96 味达美尚品老抽王1.8L
- 97 味达美尚品蚝油6.18KG
- 98 味达美海鲜捞汁2L
- 99 味达美清香米醋
- 100 味达美臻品料酒
- 101 味达美臻品生抽特级酱油
- 102 味达美臻品老抽酱油
- 103 味达美臻品蚝油
- 104 味达美酸汤酱
- 105 味达美酸辣捞汁2L
- 106 味达美鲜味生抽2L
- 107 哈尔滨冰爽330ml(件_6)
- 108 哈尔滨冰纯罐啤组合包
- 109 哈尔滨小麦王罐啤
- 110 哈尔滨小麦王罐啤牛卡纸组合装
- 111 哈尔滨清爽330ml组合装
- 112 喜力啤酒330ml(件_6)组合装
- 113 喜力啤酒瓶装
- 114 嘉士伯特醇罐啤
- 115 嘉士伯特醇罐啤牛卡纸组合装
- 116 四季宝花生酱
- 117 娃哈哈AD钙奶
- 118 家安空调清洗剂360ml
- 119 尖叫多肽型
- 120 山水啤酒8度330罐啤
- 121 崂山啤酒9度罐啤
- 122 崂山啤酒清爽8度330ml罐啤
- 123 崂山啤酒清爽8度500ml罐啤
- 124 崔字牌小磨香油448ML
- 125 巧媳妇原汁酱油1.3L
- 126 巧媳妇味极鲜
- 127 巧媳妇小米醋
- 128 巧媳妇臻蚝蚝油500G
- 129 巧媳妇黄豆酱818G
- 130 广式菠萝啤
- 131 康师傅冰糖雪梨
- 132 康师傅绿茶
- 133 康师傅茉莉清茶
- 134 建华纯芝麻油
- 135 怡宝矿泉水
- 136 恒顺9度米醋
- 137 恒顺料酒
- 138 恒顺料酒桶
- 139 恒顺精制料酒
- 140 恒顺葱姜(圆瓶)料酒480ML
- 141 恒顺酿造白醋
- 142 恒顺镇江香醋
- 143 恒顺香醋
- 144 恒顺黄酒
- 145 新松辣酱
- 146 旺仔牛奶
- 147 明治醇壹_优漾
- 148 星巴克250ml咖啡拿铁
- 149 星巴克250ml抹茶拿铁
- 150 星巴克250ml香草拿铁
- 151 有所思柠檬沙拉汁160ML
- 152 李锦记凉拌汁
- 153 李锦记味极鲜
- 154 李锦记味蚝鲜蚝油480G
- 155 李锦记秘制酱油410ML
- 156 李锦记精选生抽
- 157 李锦记精选老抽
- 158 李锦记纯香芝麻油410ML
- 159 李锦记草菇老抽
- 160 李锦记蒸鱼豉油750ML
- 161 李锦记薄盐味极鲜
- 162 李锦记薄盐生抽
- 163 李锦记薄盐醇味鲜
- 164 李锦记财神蚝油510G
- 165 李锦记锦珍老抽
- 166 李锦记鲜香红烧
- 167 桶装六月鲜特级酱油
- 168 桶装六月鲜红烧酱油
- 169 桶装味达美味极鲜
- 170 植选浓香豆乳
- 171 椰树牌椰汁
- 172 欣和寿司醋245ML
- 173 每日C果蔬汁300ml树莓红甜菜
- 174 每日C果蔬汁300ml百香果南瓜
- 175 每日C果蔬汁300ml金桔羽衣甘蓝
- 176 每日C橙汁300ml
- 177 每日C纯果汁果纤橙
- 178 每日C纯果汁桃汁
- 179 每日C纯果汁橙汁
- 180 每日C纯果汁胡萝卜汁
- 181 每日C纯果汁芒果
- 182 每日C纯果汁苹果
- 183 每日C纯果汁葡萄
- 184 每日C纯果汁葡萄柚
- 185 每益添
- 186 水动乐桃味600ml
- 187 海天上等蚝油700G
- 188 海天古道料酒450ml
- 189 海天味极鲜1.9L
- 190 海天味极鲜750ML
- 191 海天招牌拌饭酱香辣香菇味300G
- 192 海天招牌拌馅蚝油700G
- 193 海天招牌炒菜蚝油700G
- 194 海天招牌蚝油火锅蘸料725G
- 195 海天果真好醋450ML
- 196 海天海鲜酱油500ML
- 197 海天特级一品鲜500ML
- 198 海天特级味极鲜500ML
- 199 海天特级草菇老抽500ML
- 200 海天珍酿生抽
- 201 海天白米醋
- 202 海天白醋450ml
- 203 海天红烧酱油500ML
- 204 海天经典金标生抽1.9L
- 205 海天经典金标生抽500ML
- 206 海天经典鲜味生抽1.9L
- 207 海天经典鲜味生抽500ML
- 208 海天草菇老抽1.9L
- 209 海天草菇老抽500ML
- 210 海天蒸鱼豉油450ML
- 211 海天财宝蚝油
- 212 海天辣黄豆酱800G
- 213 海天金标生抽500ML
- 214 海天金标蚝油715G
- 215 海天陈醋
- 216 海天香醋
- 217 海天鲜味蚝油
- 218 海天鲜金标生抽500ML
- 219 海天黄豆酱2KG
- 220 海天黄豆酱800G
- 221 牛栏山41.6度小牛白酒500ml
- 222 牛栏山42.8度十八年陈酿500ml(大青牛)
- 223 牛栏山42度二锅头白酒2L
- 224 牛栏山42度陈酿白酒500ml
- 225 牛栏山53度二锅头净爽500ml
- 226 牛栏山56度二锅头白酒500ml
- 227 玉溪(软)
- 228 王致和料酒
- 229 王致和特制料酒
- 230 珍极米醋
- 231 瓶装六月鲜红烧酱油
- 232 瓶装六月鲜酱油
- 233 瓶装味达美味极鲜
- 234 白沙(天天向上)
- 235 百事可乐瓶装
- 236 百事可乐罐装塑封
- 237 百威美式拉格
- 238 皇厨鸡精袋
- 239 禾然乐童有机酱油160ML
- 240 禾然有机糙米醋
- 241 禾然有机豆瓣酱
- 242 禾然有机酱油
- 243 紫林白醋
- 244 红旗渠(芒果)
- 245 红旗渠(雪茄型)
- 246 红牛
- 247 纯甄
- 248 统一冰红茶
- 249 维他柠檬茶罐装
- 250 美年达橙味瓶装
- 251 美年达橙味罐装
- 252 美汁源果粒橙
- 253 老干妈
- 254 老恒和料酒系列
- 255 老才臣料酒
- 256 芙蓉王(硬75mm)
- 257 芬达橙味组合装v1
- 258 苏烟(软金砂)
- 259 营养快线
- 260 葱伴侣六月香甜面酱
- 261 葱伴侣六月香豆瓣酱
- 262 葱伴侣六月香豆瓣酱1.5KG
- 263 葱伴侣六月香豆瓣酱2KG
- 264 葱伴侣六月香辣椒酱
- 265 葱伴侣椒麻黄豆酱718G
- 266 葱伴侣活力时蔬酱342G
- 267 葱伴侣蒜蓉豆瓣酱300G
- 268 葱伴侣蒜蓉黄豆酱718G
- 269 葱伴侣袋装豆瓣酱
- 270 葱伴侣黄豆酱(辣味)718G
- 271 葱伴侣黄豆酱1.5KG
- 272 葱伴侣黄豆酱2.2KG
- 273 葱伴侣黄豆酱300G
- 274 葱伴侣黄豆酱500G
- 275 葱伴侣黄豆酱5KG
- 276 葱伴侣黄豆酱718G
- 277 葱伴侣黄豆酱800G
- 278 葱伴侣黄豆酱900G
- 279 蒙牛优益c
- 280 蒙牛纯甄瓶装红西柚味酸奶230g
- 281 谷物牛乳饮品300g燕麦谷粒
- 282 谷物牛乳饮品300g红豆紫米
- 283 谷物牛乳饮品300g藜麦玉米
- 284 谷物牛乳饮品950g燕麦谷粒
- 285 谷物牛乳饮品950g红豆紫米
- 286 豪格登啤酒
- 287 贝瑞斯塔barista
- 288 贝纳颂经典系列250ml拿铁
- 289 贝纳颂经典系列250ml摩卡
- 290 贝纳颂经典系列250ml蓝山
- 291 遵循自然原酿酱油
- 292 醇香米醋2L
- 293 醯官醋原浆米醋
- 294 醯官醋原浆苹果醋
- 295 金威啤酒
- 296 金龙鱼小磨香油220ML
- 297 金龙鱼香芝麻油400ML
- 298 钻石(细支荷花)
- 299 银鹭花生牛奶
- 300 键能
- 301 长白山(777)
- 302 阿萨姆奶茶
- 303 雀巢美极鲜
- 304 雪碧罐装
- 305 雪花8度勇闯天涯500ml瓶装
- 306 雪花8度勇闯天涯500ml罐啤
- 307 雪花8度勇闯天涯罐啤_6组合装
- 308 雪花8度清爽
- 309 雪花9度勇闯天涯500ml瓶装
- 310 雪花冰酷330ml箱装
- 311 雪花冰酷9度罐啤
- 312 雪花勇闯天涯superX
- 313 雪花清爽8度330_6罐啤组合装
- 314 雪花清爽8度箱装
- 315 雪花精制9度500_6罐啤组合装
- 316 雪花纯生500ml瓶装
- 317 雪花纯生500ml组合装
- 318 雪花纯生罐啤
- 319 雪花脸谱花旦系列8度500罐啤
- 320 青岛啤酒全麦白啤500罐啤
- 321 青岛啤酒奥古特500ml
- 322 青岛啤酒小棕金296瓶装
- 323 青岛啤酒淡爽8度330罐啤
- 324 青岛啤酒清醇330ml
- 325 青岛啤酒纯生500ml罐啤
- 326 青岛啤酒纯生600ml瓶装
- 327 青岛啤酒经典10度500罐啤
- 328 青岛啤酒经典11度330罐啤
- 329 青岛啤酒经典11度罐啤牛卡纸组合装
- 330 青岛啤酒经典(1903)10度330_6罐啤
- 331 青岛啤酒鸿运当头355瓶装
- 332 青岛啤酒黑啤酒500罐啤
- 333 鲁花凉拌香醋
- 334 鲁花料酒
- 335 鲁花生鲜蚝油518G
- 336 鲁花糯米白醋
- 337 鲁花自然鲜炒菜香酱油
- 338 鲁花自然鲜红烧酱油
- 339 鲁花自然鲜酱香酱油
- 340 鲁花黑糯米醋
- 341 黄金叶(乐途)
- 342 黄金叶(名扬天下)
- 343 黄金叶(大M)
- 344 黄金叶(大金圆)
- 345 黄金叶(天香细支)
- 346 黄金叶(小目标)
- 347 黄金叶(小黄金)
- 348 黄金叶(悦尚)
- 349 黄金叶(浓香细支)
- 350 黄金叶(爱尚)
- 351 黄金叶(牛仔)
- 352 黄金叶(豫烟2号)
- 353 黄金叶(豫香)
- 354 黄金叶(金满堂)
- 355 黄金叶(黄金眼)
- 356 黄鹤楼(天下名楼)
- 357 黄鹤楼(软蓝)
可以看到:覆盖面是很广的,有将近400种的商品类型。
接下来简单看几个类别的数据实例,如下所示:




本文使用的是前面应用到的GhostNet模型,GhostNet 是一种轻量级卷积神经网络,是专门为移动设备上的应用而设计的。其主要构件是 Ghost 模块,一种新颖的即插即用模块。Ghost 模块设计的初衷是使用更少的参数来生成更多特征图 (generate more features by using fewer parameters)。
官方论文地址在这里,如下所示:


官方也开源了项目,地址在这里,如下所示:

可以详细阅读官方的代码实例即可,之后可以基于自己的数据集来开发构建模型即可。
这里给出GhostNet的核心实现部分,如下所示:
- class GhostNet(nn.Module):
- def __init__(self, cfgs, num_classes=1000, width_mult=1.0):
- super(GhostNet, self).__init__()
- self.cfgs = cfgs
- output_channel = _make_divisible(16 * width_mult, 4)
- layers = [
- nn.Sequential(
- nn.Conv2d(3, output_channel, 3, 2, 1, bias=False),
- nn.BatchNorm2d(output_channel),
- nn.ReLU(inplace=True),
- )
- ]
- input_channel = output_channel
- block = GhostBottleneck
- for k, exp_size, c, use_se, s in self.cfgs:
- output_channel = _make_divisible(c * width_mult, 4)
- hidden_channel = _make_divisible(exp_size * width_mult, 4)
- layers.append(
- block(input_channel, hidden_channel, output_channel, k, s, use_se)
- )
- input_channel = output_channel
- self.features = nn.Sequential(*layers)
- output_channel = _make_divisible(exp_size * width_mult, 4)
- self.squeeze = nn.Sequential(
- nn.Conv2d(input_channel, output_channel, 1, 1, 0, bias=False),
- nn.BatchNorm2d(output_channel),
- nn.ReLU(inplace=True),
- nn.AdaptiveAvgPool2d((1, 1)),
- )
- input_channel = output_channel
- output_channel = 1280
- self.classifier = nn.Sequential(
- nn.Linear(input_channel, output_channel, bias=False),
- nn.BatchNorm1d(output_channel),
- nn.ReLU(inplace=True),
- nn.Dropout(0.2),
- nn.Linear(output_channel, num_classes),
- )
- self._initialize_weights()
-
- def forward(self, x, need_fea=False):
- if need_fea:
- features, features_fc = self.forward_features(x, need_fea)
- x = self.classifier(features_fc)
- return features, features_fc, x
- else:
- x = self.forward_features(x)
- x = self.classifier(x)
- return x
-
- def forward_features(self, x, need_fea=False):
- if need_fea:
- input_size = x.size(2)
- scale = [4, 8, 16, 32]
- features = [None, None, None, None]
- for idx, layer in enumerate(self.features):
- x = layer(x)
- if input_size // x.size(2) in scale:
- features[scale.index(input_size // x.size(2))] = x
- x = self.squeeze(x)
- return features, x.view(x.size(0), -1)
- else:
- x = self.features(x)
- x = self.squeeze(x)
- return x.view(x.size(0), -1)
-
- def _initialize_weights(self):
- for m in self.modules():
- if isinstance(m, nn.Conv2d):
- nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
- elif isinstance(m, nn.BatchNorm2d):
- m.weight.data.fill_(1)
- m.bias.data.zero_()
-
- def cam_layer(self):
- return self.features[-1]
这里我们默认执行100次的epoch迭代计算,结果如下:
【loss曲线】

【准确率曲线】

这里因为类别数量过于庞大,所以这里就不再绘制混淆矩阵了。感兴趣的话可以自行尝试一下。