探索轻量级模型性能上限,基于GhostNet模型开发构建多商品细粒度图像识别系统

商品图像数据的细粒度识别有别于传统的图像识别任务,本身细粒度识别对于模型特征提取计算能力要求就比较高,在我们前面的一些项目中,涉及到的细粒度识别大多是同一物种下不同亚种的识别,比如:鸟类细粒度识别、狗类细粒度识别等等。

本文的主要目的是想要尝试基于前文中的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)。

扫描二维码关注公众号,回复: 16852281 查看本文章

官方论文地址在这里,如下所示:

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

可以详细阅读官方的代码实例即可,之后可以基于自己的数据集来开发构建模型即可。

这里给出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曲线】

【准确率曲线】

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

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/133321426
今日推荐