树莓派垃圾分类

发布时间 2023-10-06 20:47:16作者: ⭐⭐-fighting⭐⭐

树莓派垃圾分类

舵机控制代码

import time
import Adafruit_PCA9685

# 定义舵机的最小脉冲和最大脉冲
servo_min = 150  # 最小脉冲长度(4096个单位)
servo_max = 670  # 最大脉冲长度(4096个单位)

# 初始化PCA9685舵机驱动
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)  # 设置PWM频率为60Hz

# 函数:将舵机设置为开启状态
def set_servo_open(channel):
    time.sleep(2)  # 延时2秒,可以根据实际情况调整
    pwm.set_pwm(channel, 0, servo_max)  # 设置舵机脉冲长度为最大值
    print(channel, "号舵机开启", servo_max)

# 函数:将舵机设置为关闭状态
def set_servo_close(channel):
    time.sleep(2)  # 延时2秒,可以根据实际情况调整
    pwm.set_pwm(channel, 0, servo_min)  # 设置舵机脉冲长度为最小值
    print(channel, "号舵机关闭", servo_min)

树莓派实时垃圾分类代码

#测试
from keras.models import load_model
from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img
import numpy as np
import os,cv2
from PIL import Image
from motor import set_servo_open, set_servo_close

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

label_1 = ['其他垃圾_PE塑料袋', '其他垃圾_U型回形针', '其他垃圾_一次性杯子', '其他垃圾_一次性棉签', '其他垃圾_串串竹签', '其他垃圾_便利贴', 
'其他垃圾_创可贴', '其他垃圾_厨房手套', '其他垃圾_口罩', '其他垃圾_唱片', '其他垃圾_图钉', '其他垃圾_大龙虾头', '其他垃圾_奶茶杯', '其他垃圾_干果壳', 
'其他垃圾_干燥剂', '其他垃圾_打泡网', '其他垃圾_打火机', '其他垃圾_放大镜', '其他垃圾_毛巾', '其他垃圾_涂改带', '其他垃圾_湿纸巾', '其他垃圾_烟蒂', 
'其他垃圾_牙刷', '其他垃圾_百洁布', '其他垃圾_眼镜', '其他垃圾_票据', '其他垃圾_空调滤芯', '其他垃圾_笔及笔芯', '其他垃圾_纸巾', '其他垃圾_胶带', 
'其他垃圾_胶水废包装', '其他垃圾_苍蝇拍', '其他垃圾_茶壶碎片', '其他垃圾_餐盒', '其他垃圾_验孕棒', '其他垃圾_鸡毛掸', '厨余垃圾_八宝粥', '厨余垃圾_冰糖葫芦', 
'厨余垃圾_咖啡渣', '厨余垃圾_哈密瓜', '厨余垃圾_圣女果', '厨余垃圾_巴旦木', '厨余垃圾_开心果', '厨余垃圾_普通面包', '厨余垃圾_板栗', '厨余垃圾_果冻', 
'厨余垃圾_核桃', '厨余垃圾_梨', '厨余垃圾_橙子', '厨余垃圾_残渣剩饭', '厨余垃圾_汉堡', '厨余垃圾_火龙果', '厨余垃圾_炸鸡', '厨余垃圾_烤鸡烤鸭', '厨余垃圾_牛肉干', 
'厨余垃圾_瓜子', '厨余垃圾_甘蔗', '厨余垃圾_生肉', '厨余垃圾_番茄', '厨余垃圾_白菜', '厨余垃圾_白萝卜', '厨余垃圾_粉条', '厨余垃圾_糕点', '厨余垃圾_红豆', 
'厨余垃圾_肠(火腿)', '厨余垃圾_胡萝卜', '厨余垃圾_花生皮', '厨余垃圾_苹果', '厨余垃圾_茶叶', '厨余垃圾_草莓', '厨余垃圾_荷包蛋', '厨余垃圾_菠萝', '厨余垃圾_菠萝包', 
'厨余垃圾_菠萝蜜', '厨余垃圾_蒜', '厨余垃圾_薯条', '厨余垃圾_蘑菇', '厨余垃圾_蚕豆', '厨余垃圾_蛋', '厨余垃圾_蛋挞', '厨余垃圾_西瓜皮', '厨余垃圾_贝果', '厨余垃圾_辣椒', 
'厨余垃圾_陈皮', '厨余垃圾_青菜', '厨余垃圾_饼干', '厨余垃圾_香蕉皮', '厨余垃圾_骨肉相连', '厨余垃圾_鸡翅', '可回收物_乒乓球拍', '可回收物_书', '可回收物_保温杯', 
'可回收物_保鲜盒', '可回收物_信封', '可回收物_充电头', '可回收物_充电宝', '可回收物_充电线', '可回收物_八宝粥罐', '可回收物_刀', '可回收物_剃须刀片', '可回收物_剪刀', 
'可回收物_勺子', '可回收物_单肩包手提包', '可回收物_卡', '可回收物_叉子', '可回收物_变形玩具', '可回收物_台历', '可回收物_台灯', '可回收物_吹风机', '可回收物_呼啦圈', 
'可回收物_地球仪', '可回收物_地铁票', '可回收物_垫子', '可回收物_塑料瓶', '可回收物_塑料盆', '可回收物_奶盒', '可回收物_奶粉罐', '可回收物_奶粉罐铝盖', '可回收物_尺子', 
'可回收物_帽子', '可回收物_废弃扩声器', '可回收物_手提包', '可回收物_手机', '可回收物_手电筒', '可回收物_手链', '可回收物_打印机墨盒', '可回收物_打气筒', '可回收物_护肤品空瓶', 
'可回收物_报纸', '可回收物_拖鞋', '可回收物_插线板', '可回收物_搓衣板', '可回收物_收音机', '可回收物_放大镜', '可回收物_易拉罐', '可回收物_暖宝宝', '可回收物_望远镜', 
'可回收物_木制切菜板', '可回收物_木制玩具', '可回收物_木质梳子', '可回收物_木质锅铲', '可回收物_枕头', '可回收物_档案袋', '可回收物_水杯', '可回收物_泡沫盒子', '可回收物_灯罩', 
'可回收物_烟灰缸', '可回收物_烧水壶', '可回收物_热水瓶', '可回收物_玩偶', '可回收物_玻璃器皿', '可回收物_玻璃壶', '可回收物_玻璃球', '可回收物_电动剃须刀', '可回收物_电动卷发棒', 
'可回收物_电动牙刷', '可回收物_电熨斗', '可回收物_电视遥控器', '可回收物_电路板', '可回收物_登机牌', '可回收物_盘子', '可回收物_碗', '可回收物_空气加湿器', '可回收物_空调遥控器', 
'可回收物_纸牌', '可回收物_纸箱', '可回收物_罐头瓶', '可回收物_网卡', '可回收物_耳套', '可回收物_耳机', '可回收物_耳钉耳环', '可回收物_芭比娃娃', '可回收物_茶叶罐', '可回收物_蛋糕盒', 
'可回收物_螺丝刀', '可回收物_衣架', '可回收物_袜子', '可回收物_裤子', '可回收物_计算器', '可回收物_订书机', '可回收物_话筒', '可回收物_购物纸袋', '可回收物_路由器', '可回收物_车钥匙', 
'可回收物_量杯', '可回收物_钉子', '可回收物_钟表', '可回收物_钢丝球', '可回收物_锅', '可回收物_锅盖', '可回收物_键盘', '可回收物_镊子', '可回收物_鞋', '可回收物_餐垫', '可回收物_鼠标', 
'有害垃圾_LED灯泡', '有害垃圾_保健品瓶', '有害垃圾_口服液瓶', '有害垃圾_指甲油', '有害垃圾_杀虫剂', '有害垃圾_温度计', '有害垃圾_滴眼液瓶', '有害垃圾_玻璃灯管', '有害垃圾_电池', 
'有害垃圾_电池板', '有害垃圾_碘伏空瓶', '有害垃圾_红花油', '有害垃圾_纽扣电池', '有害垃圾_胶水', '有害垃圾_药品包装', '有害垃圾_药片', '有害垃圾_药膏', '有害垃圾_蓄电池', '有害垃圾_血压计']

label = np.array(label_1)
#载入模型
model = load_model('trash_data3_AlexNet.h5')

def predict(img_path):
    #导入图片
    #image = load_img(img_path)
    image = img_path
    # print("d导入图片是:cat")
    image = image.resize((128,128))
    image = img_to_array(image)
    image = image/255
    image = np.expand_dims(image,0)
    predictions = model.predict(image)
     # 获取预测类别
    predicted_classes = np.argmax(predictions, axis=1)

    # 获取最高概率
    confidence = predictions[0][predicted_classes]

    # 设定置信度阈值
    confidence_threshold = 0.5

    # 判断是否超过置信度阈值
    if confidence > confidence_threshold:
        # 在阈值以上,可以接受预测结果
        
        result = label[predicted_classes]
        print(result)
        
        channel = int(request.args.get("channel"))
        set_servo_open(channel)
        time.sleep(5)
        set_servo_close(channel)

    else:
        print("there is no rubbish.")
        # 置信度不足,表示垃圾桶内无垃圾




def video_test():
    camera = cv2.VideoCapture(0)
    n = 0
    while True:
        ret, frame = camera.read()
        cv2.imshow('frame',frame)
        n = n + 1
        # 这个地方的意思是20帧识别一次 每帧都识别的话实时性可能不好
        if n % 20 == 0:

            frame = Image.fromarray(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
            predict(frame)

        # q键退出,需要点击一下运行窗口再按q键才会生效
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
                break

    camera.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    video_test()

模型是基于AlexNet来进行训练的

AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 设计的一个深度卷积神经网络架构,它在 2012 年的 ImageNet 挑战赛上取得了突破性的成就。ImageNet 挑战赛是一个图像分类任务,有着数百万张标记图像和数千个类别,是计算机视觉领域的重要竞赛之一。

AlexNet 之所以重要,是因为它在图像分类任务上取得了非常显著的性能提升,并且将深度卷积神经网络引入了大众视野。AlexNet 的成功标志着深度学习的崛起,为后续深度学习研究和应用奠定了基础。

以下是 AlexNet 的主要特点和架构要点:

  1. 深度和宽度:AlexNet 是一个相对较深且宽的神经网络,包含 8 层卷积层和 3 层全连接层。

  2. 卷积层和池化层:AlexNet 中交替使用卷积层和池化层,通过卷积提取图像特征,然后通过池化层进行降采样。

  3. ReLU激活函数:AlexNet 使用了非线性激活函数 ReLU(Rectified Linear Unit),相比传统的 Sigmoid 函数,ReLU 提供了更快的训练速度和更好的模型收敛性。

  4. Dropout:为了避免过拟合,AlexNet 使用了 Dropout 技术,随机将一部分神经元输出置为0,以降低模型复杂度。

  5. LRN层:Local Response Normalization(局部响应归一化)用于侧抑制神经元,增强模型的泛化能力。

  6. 多GPU训练:AlexNet 是首个采用多个GPU并行训练的深度卷积网络,这种架构可以加速网络的训练过程。

AlexNet 的架构为后续深度学习模型的设计奠定了基础,并且启发了众多深度学习网络的发展,成为深度学习领域的经典之一。