(开源)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/492221

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖