(开源)2023工训大赛智能垃圾分类项目(可循环播放视频,显示垃圾分类信息,拍照识别,垃圾分类,满载报警,压缩)

本文主要是介绍(开源)2023工训大赛智能垃圾分类项目(可循环播放视频,显示垃圾分类信息,拍照识别,垃圾分类,满载报警,压缩),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

省赛:由于这个比赛是两年一届,并未做足充分的准备,但是通过一定的单片机基础,加上速成能力,也就是熬夜学,通过疯狂的网络搜索,在省赛第5  入选国赛

下面来简单介绍一下我们作品:

主控:因为识别如果你不将图像处理放到主控上处理,就有点麻烦,因为我们是使用的K210作为识别装置的,识别速度很快,如果进行识别发串口,就有点赌,本来速度就快,处理都处理不过来,当然你也可以用个取平均的算法,貌似这样也不是很好,还是得把识别和分类放到一起,这样处理才连贯。

最开始考虑的使用openmv,或者opencv在树莓派上做图像识别。 这个方案现阶段真不建议尝试,说实话,效果很不好。先不说准确率了,光是识别帧率就低到离谱。 所以当时也很巧合,发现一款很不错,上手很简单的开发板。就是Sipeed科技推出的几款k210芯片的开发板,第一眼看到,真是精致,再了解它的功能,简直强大,再看它的价格,wc,好划算(虽然这一年涨价了,还涨了不少)。尤其是这么小巧的一个板子,跑图像识别真是强,还很流畅,为什么呢?自己去看吧。

原文链接:https://blog.csdn.net/GUA8122HOU/article/details/120317568

这是k210总代码:

#2023 10 15 派大星改
# object classifier boot.py
# generated by maixhub.com
from fpioa_manager import *
from modules import ultrasonic
from fpioa_manager import fm
from Maix import GPIO
import math
import struct
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
from Maix import GPIO
from machine import UART
from machine import Timer,PWM
#
#
i= 8
# 定义超声波传感器的触发引脚和回响引脚
trig_pin = 0
echo_pin = 1#控制串口通信
board_info_tx=15
board_info_rx=17
# 将GPIO口初始化为输入/输出模式
fm.register(trig_pin, fm.fpioa.GPIO0)
fm.register(echo_pin, fm.fpioa.GPIO1)
trig = GPIO(GPIO.GPIO0, GPIO.OUT)
echo = GPIO(GPIO.GPIO1, GPIO.IN)
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)               #控制2个云台舵机
S1 = PWM(tim, freq=50, duty=0, pin=21)
tim = Timer(Timer.TIMER1, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S2 = PWM(tim, freq=50, duty=0, pin=23)value = 0xFF
s = struct.pack('B', value)
list_of_values = [255]*3
s = struct.pack('3B', *list_of_values)                                       #串口通信结束符fm.register(board_info_tx,fm.fpioa.UART1_TX,force=True)
fm.register(board_info_rx,fm.fpioa.UART1_RX,force=True)
uart_A = UART(UART.UART1, 115200, 8, None, 1, timeout=1000, read_buf_len=4096)
#uart_A = UART(UART.UART1, 115200,read_buf_len=4096)def Servo_1(servo,angle):S1.duty((angle+90)/180*10+2.5)              #竖直舵机
def Servo_2(servo,angle):S2.duty((angle+90)/270*10+2.5)              #水平舵机
#超声波
def measure_distance():trig.value(0) # 发送触发信号time.sleep_ms(2)trig.value(1)time.sleep_us(10)trig.value(0)start_time = time.ticks_ms()while echo.value() == 0 and time.ticks_diff(time.ticks_ms(), start_time) < 3000:pass# 如果等待超时,返回错误代码 -1if time.ticks_diff(time.ticks_ms(), start_time) >= 3000:print("Error: no echo received!")return -1# 记录回响信号的时间戳t1 = time.ticks_us()while echo.value() == 1:passt2 = time.ticks_us()print(t2)# 计算距离(单位:厘米)duration = t2 - t1distance = duration * 0.017print(distance)if distance < 15:                                 #距离判断write_str = ("t20.bco=63488")uart_A.write(write_str)print("满载")uart_A.write(s)else:write_str = ("t20.bco=34784")uart_A.write(write_str)print("未满载")uart_A.write(s)returndef lcd_show_except(e):import uioerr_str = uio.StringIO()sys.print_exception(e, err_str)err_str = err_str.getvalue()img = image.Image(size=(224,224))img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))lcd.display(img)#开机启动########################################################################################################################
def main(labels = None, model_addr="/sd/m.kmodel", sensor_window=(224, 224), lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):sensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_windowing(sensor_window)sensor.set_hmirror(sensor_hmirror)sensor.set_vflip(sensor_vflip)sensor.run(1)lcd.init(type=1,invert=1)        #小LCD屏幕lcd.rotation(lcd_rotation)lcd.clear(lcd.WHITE)if not labels:with open('labels.txt','r') as f:exec(f.read())if not labels:print("no labels.txt")img = image.Image(size=(320, 240))img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)lcd.display(img)return 1try:img = image.Image("startup.jpg")lcd.display(img)except Exception:img = image.Image(size=(320, 240))img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)lcd.display(img)task = kpu.load(model_addr)try:
####################################循环######################################################################################a= 0while(a<3):print("启动")write_str = ("page main")           #跳到计数主屏幕uart_A.write(write_str)uart_A.write(s)print(write_str)a+=1while(True):Servo_1(S1, i)Servo_2(S2, 0)time.sleep_ms(500)measure_distance()                 #满载检查print("满载jianche ")write_str = ("n5.val=0")           #初始化串口屏幕uart_A.write(write_str)uart_A.write(s)print(write_str)while(True):img = sensor.snapshot()t = time.ticks_ms()fmap = kpu.forward(task, img)t = time.ticks_ms() - tplist=fmap[:]pmax=max(plist)                      #判断最大置信度if pmax < 0.4:                       #检测空物品empty_str = "Not subject"img.draw_string(0, 0, empty_str, scale=2)lcd.display(img)Servo_1(S1, i)Servo_2(S2, 0)breakmax_index=plist.index(pmax)img.draw_string(0,0, "%.2f : %s" %(pmax, labels[max_index].strip()), scale=2)img.draw_string(0, 200, "t:%dms" %(t), scale=2)lcd.display(img)if plist.index(pmax)==0 or plist.index(pmax)==6:  #fruit "vegetable"    厨余垃圾if pmax >= 0.5:time.sleep_ms(50)      #等待垃圾掉落待静止的时间Servo_2(S2,90)time.sleep_ms(1000)Servo_1(S1,-20)time.sleep_ms(1500)#write_str = ()Servo_1(S1,i)time.sleep_ms(400)Servo_2(S2,0)time.sleep_ms(1000)uart_A.write("t7.txt=\"厨余垃圾\"")print("厨余垃圾ok")uart_A.write(s)time.sleep_ms(450)   #舵机归位Servo_1(S1,i)time.sleep_ms(450)break#time.sleep_ms(500)      #等待垃圾掉落待静止的时间if plist.index(pmax)== 1 or plist.index(pmax)==2 or plist.index(pmax)== 7:  #capsule      有害垃圾if pmax >= 0.6:    #0.5time.sleep_ms(50)      #时隔几秒后继续检测垃圾#Servo_2(S2,90)#time.sleep_ms(500)Servo_1(S1,-30)time.sleep_ms(1500)#write_str = ()uart_A.write("t7.txt=\"有害垃圾\"")print("有害垃圾ok")uart_A.write(s)time.sleep_ms(450)   #舵机归位Servo_1(S1,i)Servo_2(S2,0)time.sleep_ms(450)breakif plist.index(pmax)==4 or plist.index(pmax)==8:  #bottle        可回收垃圾if pmax >= 0.5:time.sleep_ms(50)      #等待垃圾掉落待静止的时间Servo_2(S2,180)time.sleep_ms(1000)Servo_1(S1,-20)time.sleep_ms(1500)#write_str = ()Servo_1(S1,i)time.sleep_ms(400)Servo_2(S2,0)time.sleep_ms(1000)uart_A.write("t7.txt=\"可回收垃圾\"")print("可回收垃圾ok")uart_A.write(s)time.sleep_ms(1200)   #舵机归位breakif plist.index(pmax)==3 or plist.index(pmax)== 5 or plist.index(pmax)== 9:  #cigarette      其他垃圾if pmax >= 0.7:  #0.5time.sleep_ms(50)      #等待垃圾掉落待静止的时间Servo_2(S2,-90)time.sleep_ms(1000)Servo_1(S1,-20)time.sleep_ms(1500)#write_str = ()Servo_1(S1,i)time.sleep_ms(400)Servo_2(S2,0)time.sleep_ms(1000)uart_A.write("t7.txt=\"其他垃圾\"")print("其他垃圾ok")uart_A.write(s)time.sleep_ms(450)   #舵机归位Servo_1(S1,i)Servo_2(S2,0)time.sleep_ms(500)breakuart.deinit()                   # uart.deinit()和kpu.deinit(task)用于关闭UART和释放模型资源。del uartexcept Exception as e:raise efinally:if not task is None:kpu.deinit(task)if __name__ == "__main__":try :#labels = ["bottle", "brick", "capsule", "pill", "stone", "vegetable"]#labels = ["chuyu", "dainci", "jiaolang", "shitou", "shuiping", "taoci", "yaobaozhung", "yilaguan"]labels = ["chuyu", "dainci", "jiaolang", "shitou", "shuiping", "taoci", "xiaotudou", "yaobaozhung", "yilaguan", "zhuangtou"]main(labels=labels, model_addr="/sd/m.kmodel")except Exception as e:sys.print_exception(e)lcd_show_except(e)finally:gc.collect()

识别:K210,虽然这东西是挺强的,但是模型有点难训练。我们是根据maixpy 官网的本地环境来进行训练的,环境有点麻烦,也可以直接CPU跑 但是有点发烫 我电脑都跑坏了,修了我300大洋,所以还是使用GPU跑,训练速度也快、

分类装置:初赛直接就是云台加舵机,没啥讲的,k210控制就可以了

满载检测:超声波检查,省赛的时候就做了一个,因为超声波挺费时间的,比赛一个物体识别的时间是有要求的,我们做了一个,结果没用上,没抽到,国赛我把其他三个加上去,结果是我自己选一个,气死,开始我还用小车的红外避障模块来做,简单的一批,后面还是觉得测的不如超声波准。还是用的

import time
from fpioa_manager import fm
from Maix import GPIO# 定义超声波传感器的触发引脚和回响引脚
trig_pin = 0
echo_pin = 1# 将GPIO口初始化为输入/输出模式
fm.register(trig_pin, fm.fpioa.GPIO0)
fm.register(echo_pin, fm.fpioa.GPIO1)
trig = GPIO(GPIO.GPIO0, GPIO.OUT)
echo = GPIO(GPIO.GPIO1, GPIO.IN)def measure_distance():# 发送触发信号trig.value(0)time.sleep_ms(2)trig.value(1)time.sleep_us(10)trig.value(0)# 等待回响信号while echo.value() == 0:passt1 = time.ticks_us()while echo.value() == 1:passt2 = time.ticks_us()# 计算距离(单位:厘米)duration = t2 - t1distance = duration * 0.034 / 2return distancewhile True:distance = measure_distance()print("Distance: %.2f cm" % distance)time.sleep(1)

屏幕:直接使用串口屏,简单的要si,不要十分复杂的代码,你会发串口就可以用。

压缩:我们使用的是电动推杆,用arduino uno 控制 通过监听串口判断是不是可回收垃圾,然后启动

项目地址,求求了点个stars把

这篇关于(开源)2023工训大赛智能垃圾分类项目(可循环播放视频,显示垃圾分类信息,拍照识别,垃圾分类,满载报警,压缩)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491518

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建