网站百度seo关键词优化,wordpress 淘客,广东东莞区号,科技有限公司 翻译目录 项目介绍
图像分类网络构建
处理花生豆图片完成预测 项目介绍
这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统
我们有大量的花生豆图片#xff0c;并以及打好了标签#xff0c;可以看一下目录结构和几张具体的图片 同时我们也有几张大的图片…目录 项目介绍
图像分类网络构建
处理花生豆图片完成预测 项目介绍
这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统
我们有大量的花生豆图片并以及打好了标签可以看一下目录结构和几张具体的图片 同时我们也有几张大的图片里面有若干花生豆我们要做的任务就是将花生豆框住并且实现分类可以看一下这些图片 图像分类网络构建
这部分的内容和我上一篇博客几乎大同小异就是把最后的分类个数和类别映射换了换掌握了上一个项目这部分相信也会理解的很快这里附上网址并做简单的回顾
kaggle实战图像分类-Intel Image Classification附源码-CSDN博客https://blog.csdn.net/weixin_62428212/article/details/136059443?spm1001.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 transformspath 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, maskmask) # 根据掩膜提取图像会将花生豆的部分变为黑色然后提取出背景部分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 0for i in range(len(delete_list)):del contours[delete_list[i] - delta]delta delta 1return contoursinverted_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:yh, x:xw, :]img_pred Image.fromarray(img_pred) # 将numpy数组转为PIL图像对象img_pred transform(img_pred) # 调整图像尺寸和转tensor格式img_pred torch.unsqueeze(img_pred, dim0) # 升一个维度pred torch.argmax(net(img_pred), dim1) # 拿到概率最大的分类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_from333.999.0.0