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

news2024/11/24 7:01:07

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

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

【准确率曲线】

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试打底稿② 专业技能的第二部分

简历原文 抽查部分 比较熟悉Nacos、Feign、SpringCloud Gateway等微服务的使用,有实际上手项目使用的经验;基本掌握Linux常用命令,了解Linux系统管理、网络管理、生产环境等必用服务,了解Docker的使用,在博客中多有关…

基于微信小程序的宠物用品商城设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

echarts 地图 visualMap 图例点击事件监听

一、切换位置 二、切换监听 // 切换事件监听 this.myChart.off(datarangeselected); // 为了不触发两次 this.myChart.on(datarangeselected,(e) > {// visualMap change });// 配置如下 visualMap: {type: piecewise,showLabel: true,inverse: true,pieces: [{value: 1,…

2023测试开发必知必会:Pytest框架实战!

应用场景: pytest 框架可以解决我们多个测试脚本一起执行的问题。 它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose,开箱即用。接下来我们详细了解下pyte…

数字孪生在智慧城市应用场景中的五大特点

数字孪生城市提出至今,已从概念、框架走向落地深耕,逐渐演变成为城市变革新动力和城市转型新路径,是智慧城市发展演进的重要方向。 数字孪生城市建设现已加速步入“技术多维集成、场景创新重构、市场成效导向”的落地实施时期。这一时期&…

HTML的学习 Day02(列表、表格、表单)

文章目录 一、列表列表主要分为以下三种类型:1. 无序列表(Unordered List):2. 有序列表(Ordered List):将有序列表的数字改为字母或自定义内容li.../li 列表项标签中value属性,制定列…

【RabbitMQ实战】06 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群,开始。 前提条件,docker安装了docker-compose。如果没安装的话,参考这里 docker-compose文件参考bitnami官网:https://github.com/bitnami/contai…

JetBrains 产品安装插件(plugins)的两种方式

安装分为在线、离线两种方式: 在线方式: File > Settings > Plugins 搜索插件 Install 即可 离线方式: 官网:https://plugins.jetbrains.com/ 搜索到插件后,点击 "Get",选择自己安装的…

obsidian加git备份,同时忽略掉自己不想同步的文件夹

最近想用这个语雀进行知识库的分享,但是这个语雀的会员费太贵了,思来想去还是用 git 比较好,因为这个知识库的内容都是自己的笔记,为了能够访问的更加方便我选择了这个 gitte,而不是 github 我的知识库链接 knowledge …

报错 - 找不到模块“@/...“或其相应的类型声明

项目是vue3jsvite,在 vite.config.js 和 jsconfig.json 的配置无误的情况下,报错找不到模块。 解决方法:卸载重新安装 Error Lens 插件 报错没有啦。可能是插件内部错误?

opencv之利用gpu进行编程

很多朋友工作中会遇到需要使用gpu的例子,gpu就是显卡,大部分对gpu有个模糊的概念,即图像渲染会使用到他,但是它是如何生效的,又说不清楚。本篇文章主要介绍opencv下如何使用gpu进行编程。 基本介绍 opencv下存在gpu可…

软件测试:全链路追踪工具 Zipkin导入、安装(Windows版本)

1.0全链路追踪技术出现的原因 公司内部一个功能的实现,底层可能调用多个应用系统 在调用这个功能的同时,可能会出现多种情况,比如访问较慢,出现错误,可能需要进行定位 所以,我们需要快速定位服务错误点 大…

外汇天眼:SEC起诉“现金流之王”播客主持人涉嫌1100万美元庞氏骗局

美国证券交易委员会(SEC)今天指控了“现金流之王”播客主持人马修莫蒂尔,涉嫌通过一个庞氏骗局欺骗超过50名投资者,非法筹集了约1100万美元,涉及的票据据称由住宅物业支持。 根据SEC的投诉,俄亥俄州北奥尔姆…

openstack中通过主机mac地址查询主机id

问题: 客户给vm配置了子接口,并且接口上的ip可以ping通,客户需要从众多的主机中找到这台主机 解决办法 一 、通过子接口开放的端口让客户自行匹配自己业务进行查找 此处让客户自行查找即可 二 、通过数据库查找 注意:由于子接…

力扣:110. 平衡二叉树(Python3)

题目: 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 来源:力扣(LeetCode) 链接&#xff…

课题学习(二)----倾角和方位角的动态测量方法(基于磁场的测量系统)

磁性测量工具安装在非磁性钻铤内,如图1,以避免磁性随钻测量工具测量时受到外部干扰。 测量系统采用三轴加速度计和三轴磁通门,并采用冗余设计,由于井下振动剧烈,陀螺仪的可靠性将大大降低。为了保证整个钻井过程中系统…

XC2028A CC/CV降压车充芯片,12V降5V,24V降5V,2.5A带限流功能的降压IC

XC2028A具有最佳输入电压、降压转换器,可在CV(恒定输出电压)模式或CC(恒定输出电流)模式下工作,OCP电流值由电流感应电阻设置。最大输入电压高达32V,MOSFET,什么是建立在50mΩ高侧和…

搭建BP神经网络

1.数据集下载 2.C语言代码 BP.h #ifndef BP_H_INCLUDED #define BP_H_INCLUDED const int INPUT_LAYER 784; //输入层维度 const int HIDDEN_LAYER 40; //隐含层维度 const int OUTPUT_LAYER 10; //输出层维度 const double LEARN_RATE 0.3; //学习率 const int TRAIN_TIM…

Sringcloud:一、微服务介绍+常用技术框架和技术对比+服务拆分demo

微服务介绍 单体架构 简介 将业务所有功能集中在一个项目中开发,打成一个包部署优点 架构简单部署成本低 缺点 耦合度高,不利于后续更新迭代 分布式架构 简介 每个业务模块作为一个独立项目开发,称为一个服务,但通常仍共用一…

Spark集成ClickHouse(笔记)

目录 前言: 一.配置环境 1.安装clickhouse驱动 2.配置clickhouse环境 二.spark 集成clickhouse 直接上代码,里面有一些注释哦! 前言: 在大数据处理和分析领域,Spark 是一个非常强大且广泛使用的开源分布式计算框架…