基于图像掩膜和深度学习的花生豆分拣(附源码)

目录

项目介绍

图像分类网络构建

处理花生豆图片完成预测


项目介绍

这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统

我们有大量的花生豆图片,并以及打好了标签,可以看一下目录结构和几张具体的图片

 

同时我们也有几张大的图片,里面有若干花生豆,我们要做的任务就是将花生豆框住并且实现分类,可以看一下这些图片 

图像分类网络构建

这部分的内容和我上一篇博客几乎大同小异,就是把最后的分类个数和类别映射换了换,掌握了上一个项目,这部分相信也会理解的很快,这里附上网址并做简单的回顾

kaggle实战图像分类-Intel Image Classification(附源码)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_62428212/article/details/136059443?spm=1001.2014.3001.5501

1,数据集加载

2,构建网络

3,定义超参数训练网络

这里小编使用的是resnet18这个网络,因为花生豆数据集的训练,一不小心就会过拟合,用一些更深更强的网络很容易导致过拟合,resnet18好像也有点过拟合,这里附上训练结果图片

处理花生豆图片完成预测

我们训练好网络后,并不能直接将网络用于预测整个花生豆的大图,因为里面有很多的花生豆,所以我们可以取出并预测,那么怎么单独取出来呢,这里用到了掩膜用以分割花生豆(一些注释写在了代码里)

首先导入相应的库和定义一下参数

# -*- coding: GB2312 -*-
import os
import cv2
import numpy as np
import torch
from PIL import Image
from utils.model import ResNet18
from torchvision import transforms

path = 'data/pic'
image_path = os.listdir(path)

classify = {0: 'baiban', 1: 'bandian', 2: 'famei', 3: 'faya', 4: 'hongpi', 5: 'qipao', 6: 'youwu', 7: 'zhengchang'}

transform = transforms.Compose([
    transforms.Resize((64, 64)),
    transforms.ToTensor()])

net = ResNet18(8)
net.load_state_dict(torch.load('model_weights/ResNet18.pth'))

min_size = 30
max_size = 400

然后我们加载整个大图的文件夹并遍历处理每张图片

for i in image_path:
    img = cv2.imread(os.path.join(path,i))
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 转HSV色彩空间

    # 定义背景颜色区间(蓝色区间)
    lower_blue = np.array([100, 100, 8])
    upper_blue = np.array([255, 255, 255])

    mask = cv2.inRange(hsv, lower_blue, upper_blue)  # 创建掩膜(在上述颜色范围内(背景)为白色,不在(花生豆)则为黑色)

    result = cv2.bitwise_and(img, img, mask=mask)  # 根据掩膜提取图像,会将花生豆的部分变为黑色,然后提取出背景部分
    result = result.astype(np.uint8)

    _, binary_image = cv2.threshold(result, 1, 255, cv2.THRESH_BINARY)  # 三通道二值化。背景会全为白色,花生豆部分为黑色

    # 到这里我们就得到了经过掩膜过滤的图片,其中白色的为背景,黑色的为花生豆,我们可以看一下
    cv2.namedWindow('HSV_Result', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('HSV_Result', 2840, 1000)
    cv2.imshow('HSV_Result', binary_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

我们发现这些花生豆的背景是蓝色的,所以我们创建了一个用以区分背景和花生豆的掩膜用来分割二者,其分割完后的图片为

通过掩膜处理完后,我们可以清晰的观察到图片里的花生豆,后面我们就可以在这幅图片上画出轮廓并分割出花生豆部分依次放入网络预测

# 过滤边框
def delet_contours(contours, delete_list):
    delta = 0
    for i in range(len(delete_list)):
        del contours[delete_list[i] - delta]
        delta = delta + 1
    return contours


inverted_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)  # 转灰度图
    _, binary_image = cv2.threshold(inverted_image, 1, 255, cv2.THRESH_BINARY)  # 单通道二值化

    contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    contours = list(contours)

    delete_list = []
    for i in range(len(contours)):
        # 通过框的周长去过滤边框
        if (cv2.arcLength(contours[i], True) < min_size) or (cv2.arcLength(contours[i], True) > max_size):
            delete_list.append(i)
    contours = delet_contours(contours, delete_list)

    # 遍历每一个框(取出每一个单独的花生豆进行预测)
    for i in range(len(contours)):
        x, y, w, h = cv2.boundingRect(contours[i])
        img_pred = img[y:y+h, x:x+w, :]
        img_pred = Image.fromarray(img_pred)  # 将numpy数组转为PIL图像对象
        img_pred = transform(img_pred)  # 调整图像尺寸和转tensor格式
        img_pred = torch.unsqueeze(img_pred, dim=0)  # 升一个维度
        pred = torch.argmax(net(img_pred), dim=1)  # 拿到概率最大的分类
        preds = classify[int(pred)]  # 数字映射为字符串
        cv2.putText(img, preds, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1, cv2.LINE_AA)  # 写类别标签
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 画矩形框

    cv2.namedWindow('Result', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('Result',2840,1000)
    cv2.imshow('Result', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

展示一下预测结果

小编这里发现这个方法可以预测成功中间大多数的花生豆,但是边缘处的花生豆因不会被画出轮廓故不会被放入网络预测,大体预测的效果还算可以。

源码及数据集请查看:https://github.com/jvyou/Peanut-and-bean-sorting

视频讲解请查看:https://www.bilibili.com/video/BV13F4m1g7Wp/?spm_id_from=333.999.0.0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java强训day16(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main { public static boolean res(int m) {int sum 0;for(int i1;i<m;i) {if(i!m && m%i 0) {sumi;}}if(sum m)return true;elsereturn false;}public static void main(String[] args) {Scanne…

js手写Promise(上)

目录 构造函数resolve与reject状态改变状态改变后就无法再次改变 代码优化回调函数中抛出错误 thenonFulfilled和onRejected的调用时机异步then多个then 如果是不知道或者对Promise不熟悉的铁铁可以先看我这篇文章 Promise 构造函数 在最开始&#xff0c;我们先不去考虑Promi…

FFmpeg中的Color颜色参数解析、转码和HDR

前言 视频中帧的颜色信息非常重要&#xff0c;表示着编码时用到的标准&#xff0c;意味着解码时也要对应上&#xff0c;或者要使用正确的转换函数&#xff0c;否则就会带来色差问题。 关于FFmpeg中的颜色参数&#xff0c;有下边几个重要的结构体&#xff1a; 颜色参数相关的结…

Git远程仓库的使用(Gitee)及相关指令

目录 1 远程仓库的创建和配置 1.1 创建远程仓库 1.2 设置SSH公钥 2 指令 2.1 git remote add 远端名称(一般为origin) 仓库路径 2.2 git remote 2.3 git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]] 2.3 git clone url 2.4 git fetch 2.5 git p…

巴尔加瓦算法图解:算法运用(上)

目录 树反向索引傅立叶变换 并行算法MapReduce函数 树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个…

微信小程序上传代码教程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 小程序上传代码到gogs上面来 整体架构流程 小程序也要远程连接仓库&#xff0c;实现代码上传 技术名词解释 微信开发者工具gogs 技术细节 连接gogs仓库地址 微信小程序需要head将本地代码和gogs代码同步 小结 …

java学习(多态)

一、多态 含义&#xff1a;方法或对象具有多种形态。是面向对象的第三大特征&#xff0c;多态是建立在封装和继承基础上的。 多态的具体体现&#xff1a; 1&#xff09;方法的多态 &#xff08;例如重写和重载&#xff09; 2&#xff09;对象的多态 多态注意事项&#xff1…

SpringCloud--Gateway解析

一、Gateway简介 Gateway是Spring Cloud官方推出的第二代微服务网关&#xff0c;它旨在提供统一的路由方式以及为微服务应用提供强大的负载均衡能力。与第一代Spring Cloud Netflix Zuul相比&#xff0c;Spring Cloud Gateway在性能、可扩展性、易用性等方面都有了显著的提升。…

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式&#xff0c;把程序或者项目分为三个主要组成部分&#xff0c;Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…

使用Launch4j将jar包转成.exe可执行文件

Launch4j官网:Launch4j - Cross-platform Java executable wrapper 然后点击上面按钮 随便写个文件名

分享66个相册特效,总有一款适合您

分享66个相册特效&#xff0c;总有一款适合您 66个相册特效下载链接&#xff1a;https://pan.baidu.com/s/1jqctaho4sL_iGSNExhWB6A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

FastDFS安装并整合Openresty

FastDFS安装并整合Openresty 一、安装环境准备【CentOS7.9】二、FastDFS--tracker安装2.1.下载fastdfs2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.安装之后文件目录介绍2.8.错误处理2.9.配…

Android SystemConfig相关

SystemConfig在哪里初始化 它声明在PackageManagerService类的静态方法main()中。在该方法中间定义Injector类对象时&#xff0c;作为它的构造参数。它是调用的SystemConfig.getInstance()实现初始化&#xff0c;之后能通过Injector类对象的getSystemConfig()得到SystemConfig类…

Python贝尔多项式

文章目录 Bell数和Bell多项式第二类Bell多项式 Bell数和Bell多项式 Bell&#xff0c;即所有包含 n n n个对象的有限集合的子集数之和&#xff0c;可通过递推式进行定义 B n ∑ k 0 n − 1 ( n − 1 k ) B k , B 0 1 B_n\sum^{n-1}_{k0}\begin{pmatrix} n-1\\k \end{pmatrix…

Select 选择器 el-option 回显错误 value

离谱 回显的内容不是 label 而是 value 的值 返回官方看说明&#xff1a; v-model的值为当前被选中的el-option的 value 属性值 value / v-model 绑定值有3种类型 boolean / string / number 根据自身代码猜测是&#xff1a;tableData.bookId 与 item.id 类型不一致导致 &…

LabVIEW伺服阀性能参数测试

LabVIEW伺服阀性能参数测试 伺服阀作为电液伺服系统中的核心元件&#xff0c;其性能参数的准确测试对保证系统整体性能至关重要。开发了一种基于LabVIEW软件开发的伺服阀性能参数测试系统&#xff0c;提高测试的自动化程度和精确性&#xff0c;同时降低操作复杂度和成本。 传…

python + numpy test

1. 2. What is the correct syntax to output the type of a variable or object in Python? Syntax of the Python type() functionThe type() function 3. upper() 全大写 lower() 全小写 4. 接下来是Numpy部分 1. What is a correct syntax to check the number of di…

一条 SQL 查询语句是如何执行的

MySQL 的基本架构示意图 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等…

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

VitePress-12-markdown中使用vue的语法

前言 VitePress 中&#xff0c;markdown文档最终都会转换成为 html文件&#xff0c;我们在访问的时候&#xff0c;也是直接访问的 xxx.html 文件。而且&#xff0c;markdown文档会被作为 [vue单文件] 进行处理&#xff0c;因此&#xff0c;我们我们可以在文档中使用 vue 语法&…