当前位置: 首页 > news >正文

用TensorFlow训练自己的第一个模型

现在学AI的一个优势就是:前人栽树后人乘凉,很多资料都已完善,而且有很多很棒的开源作品可以学习,感谢大佬们

项目

项目源码地址
视频教程地址
我在大佬的基础上基于此模型还加上了根据特征值缓存进行快速识别的方法,以应对超市某些未能正确识别的场景,针对项目中window.py文件进行修改和补充:

  1. 缓存查询方法
 def query_cache(self, image_features):if not cache:return Nonemax_similarity = -1best_label = Nonefor image_id, (cached_features, label) in cache.items():similarity = self.cosine_similarity(image_features, cached_features)if similarity > max_similarity:max_similarity = similaritybest_label = labelif max_similarity >= 0.5:return best_labelelse:return None
  1. 余弦相邻计算
 def cosine_similarity(self, features1, features2):dot_product = np.dot(features1.flatten(), features2.flatten())norm_features1 = np.linalg.norm(features1)norm_features2 = np.linalg.norm(features2)return dot_product / (norm_features1 * norm_features2)
  1. 缓存更新方法
 def update_cache(self):input_text = self.input_box.text()self.label = input_text or self.labelself.result.setText(self.label)# 如果缓存已满,移除最久未使用的条目if len(cache) >= CACHE_CAPACITY:cache.popitem(last=False)# 添加新条目cache[self.image_id] = (self.image_features, self.label)self.input_box.clear()self.class_names.append(self.label)
  1. 获取图片哈希值
    def get_image_id_from_hash(self, img):buffer = img.tobytes()return hashlib.md5(buffer).hexdigest()
  1. 预测图片
    def predict_img(self):self.input_box.clear()img = Image.open('images/target.png')  # 读取图片self.image_id = self.get_image_id_from_hash(img)img = np.asarray(img)  # 将图片转化为numpy的数组start_time = time.time()  # 记录开始时间outputs = self.model.predict(img.reshape(1, 224, 224, 3), batch_size=1, )  # 将图片输入模型得到结果end_time = time.time()  # 记录结束时间elapsed_time = end_time - start_time  # 计算时间差print("运行时间:", elapsed_time, "秒")self.image_features = outputsresult = self.query_cache(outputs)self.label = resultif result is None:result_index = int(np.argmax(outputs))result = self.class_names[result_index]  # 获得对应的水果名称self.result.setText(result)self.label = resultelse:self.result.setText(result)  # 在界面上做显示
  1. UI改造
    def initUI(self):main_widget = QWidget()main_layout = QHBoxLayout()font = QFont('楷体', 15)# 主页面,设置组件并在组件放在布局上left_widget = QWidget()left_layout = QVBoxLayout()img_title = QLabel("样本")img_title.setFont(font)img_title.setAlignment(Qt.AlignCenter)self.img_label = QLabel()img_init = cv2.imread(self.to_predict_name)h, w, c = img_init.shapescale = 400 / himg_show = cv2.resize(img_init, (0, 0), fx=scale, fy=scale)cv2.imwrite("images/show.png", img_show)img_init = cv2.resize(img_init, (224, 224))cv2.imwrite('images/target.png', img_init)self.img_label.setPixmap(QPixmap("images/show.png"))left_layout.addWidget(img_title)left_layout.addWidget(self.img_label, 1, Qt.AlignCenter)left_widget.setLayout(left_layout)right_widget = QWidget()right_layout = QVBoxLayout()btn_change = QPushButton(" 上传图片 ")btn_change.clicked.connect(self.change_img)btn_change.setFont(font)btn_predict = QPushButton(" 开始识别 ")btn_predict.setFont(font)btn_predict.clicked.connect(self.predict_img)btn_update = QPushButton(" 更新缓存 ")btn_update.setFont(font)btn_update.clicked.connect(self.update_cache)label_result = QLabel(' 果蔬名称 ')self.result = QLabel("等待识别")label_result.setFont(QFont('楷体', 16))self.result.setFont(QFont('楷体', 24))self.input_box = QLineEdit()self.input_box.setPlaceholderText("请输入内容...")right_layout.addStretch()right_layout.addWidget(label_result, 0, Qt.AlignCenter)right_layout.addStretch()right_layout.addWidget(self.result, 0, Qt.AlignCenter)right_layout.addStretch()right_layout.addWidget(self.input_box)right_layout.addStretch()right_layout.addWidget(btn_change)right_layout.addWidget(btn_predict)right_layout.addWidget(btn_update)right_layout.addStretch()right_widget.setLayout(right_layout)main_layout.addWidget(left_widget)main_layout.addWidget(right_widget)main_widget.setLayout(main_layout)# 关于页面,设置组件并把组件放在布局上label_super = QLabel("作者:cpa")  # todo 更换作者信息label_super.setFont(QFont('楷体', 12))# label_super.setOpenExternalLinks(True)label_super.setAlignment(Qt.AlignRight)# 添加注释self.addTab(main_widget, '主页')self.setTabIcon(0, QIcon('images/主页面.png'))

运行:

在这里插入图片描述

待完善:

  1. 缓存部分目前市面上是需要将缓存值存入本地sqllite之类的数据库进行保存的,这样下次开机缓存数据不会丢失,这里只展示思路
  2. 缓存除了保存在本地外还可以上传云端进行增强学习然后下发最新模型在本地进行更新,形成完美闭环
    在这里插入图片描述

打包

  1. pip install pyinstaller
  2. pyinstaller -F -w (-i icofile) filename

说明:
filename表示你的Python程序文件名
-w 表示隐藏程序运行时的命令行窗口(不加-w会有黑色窗口)
括号内的为可选参数,-i icofile表示给程序加上图标,图标必须为.ico格式
icofile表示图标的位置,建议直接放在程序文件夹里面,这样子打包的时候直接写文件名就好

  1. pyinstaller -F -w -i 'test.ico' window.py
  2. 将图片文件和模型文件等window.py中用到的资源在打包后一起移入dist目录中,不然会资源找不到的错
  3. 发给你的小伙伴看看效果吧

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【传知代码】辅助任务改进社交帖子多模态分类(论文复现)
  • 离线安装MeterSphere遇到的问题
  • LabVIEW做二次开发时应该注意哪些方面?
  • TS中什么是字面量类型?
  • 如何用3个月零基础入门网络安全?_网络安全零基础怎么学习
  • Vue.js学习笔记(六)element表单校验规则
  • 雨量气象站:实时、准确地监测并记录降水情况
  • 【基础篇】MySQL数据库详解:基础知识详解
  • 每日一面系列之美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以
  • 从零开始写一个微信小程序
  • 深度学习------------丢弃法dropout
  • Python爬虫技术 第29节 实战案例分析
  • 【Golang】清理Markdown未引用图片
  • PHP如何实现登录认证和鉴权
  • 【Rust光年纪】解锁 Rust 库新姿势:抽象语法树、代码生成与宏处理全解析
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 2017-08-04 前端日报
  • 2017-09-12 前端日报
  • 30天自制操作系统-2
  • canvas绘制圆角头像
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Docker容器管理
  • java取消线程实例
  • leetcode46 Permutation 排列组合
  • node学习系列之简单文件上传
  • PHP 7 修改了什么呢 -- 2
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • socket.io+express实现聊天室的思考(三)
  • Sublime text 3 3103 注册码
  • use Google search engine
  • 初探 Vue 生命周期和钩子函数
  • 动态魔术使用DBMS_SQL
  • 简单实现一个textarea自适应高度
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 区块链共识机制优缺点对比都是什么
  • 如何选择开源的机器学习框架?
  • 设计模式 开闭原则
  • 使用Swoole加速Laravel(正式环境中)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一文看透浏览器架构
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #pragma data_seg 共享数据区(转)
  • #pragma预处理命令
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (5)STL算法之复制
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (ZT)出版业改革:该死的死,该生的生
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)甲方乙方——赵民谈找工作