商品图像数据的细粒度识别有别于传统的图像识别任务,本身细粒度识别对于模型特征提取计算能力要求就比较高,在我们前面的一些项目中,涉及到的细粒度识别大多是同一物种下不同亚种的识别,比如:鸟类细粒度识别、狗类细粒度识别等等。
本文的主要目的是想要尝试基于前文中的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曲线】
【准确率曲线】
这里因为类别数量过于庞大,所以这里就不再绘制混淆矩阵了。感兴趣的话可以自行尝试一下。