8249浏览
查看: 8249|回复: 11

安全眼——自行车智能安全辅助系统

[复制链接]
【设计意图】
安全眼——自行车智能安全辅助系统图3

随着经济的快速发展,生活节奏日益加快,由于缺少运动许多人被亚健康所困扰,再者随着城市交通压力的增加,人们意识到汽车出行尾气等弊处,开始提倡绿色出行,因此越来越多人选择自行车作为出行或者上班的交通工具,近来年,中国自行车年产量8000多万辆,中国自行车社会保有量近4亿辆。但是自行车过程中安全系数仍有待提高。

【作品功能】
安全眼——自行车智能安全辅助系统图1
自行车行车安全除了个人良好的行驶习惯,而各种辅助装备更能帮助我们提升安全性。增加警示灯、方向灯,而今天这设计将安全更升一级,也更科技化。
1、“安全眼”自行车安全系统由把手按钮和后置摄像头、环型方向灯组成
2、主控使用开源硬件“行空板”,通过连接把手按钮和后置摄像头,可实现一键查看摄像头的实时后方视频,无需回头,如此更安全。
3、可通过人工智能算法判断是否有物体靠近,如汽车,会通过行空板上蜂鸣器提醒驾驶者,并让环型闪烁提醒后方来车。
4、通过按钮可控制转向灯闪烁,提醒后方来车、行人注意。

【制作元器件与材料】
安全眼——自行车智能安全辅助系统图4
行空板
行空板是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学。


安全眼——自行车智能安全辅助系统图2
安全眼——自行车智能安全辅助系统图5

电路连接图
安全眼——自行车智能安全辅助系统图6
实物图】
安全眼——自行车智能安全辅助系统图7
制作过程】
1.行空板底座
安全眼——自行车智能安全辅助系统图8

安全眼——自行车智能安全辅助系统图9

保护行空板背面电子元器件
2.安装行空板
安全眼——自行车智能安全辅助系统图10

安全眼——自行车智能安全辅助系统图11

行空板安装在车把正中间,方便查看采集的后面图像。
3.安装按钮
安全眼——自行车智能安全辅助系统图12

安全眼——自行车智能安全辅助系统图13

按钮安装在车把上,左转向与右转向按钮与左右车把对应。
4.安装摄像头与灯环
安全眼——自行车智能安全辅助系统图14

安全眼——自行车智能安全辅助系统图15

摄像头与灯环安装在自行车车座后
5.安装电源
安全眼——自行车智能安全辅助系统图16

6.装置整体图
安全眼——自行车智能安全辅助系统图17

安全眼——自行车智能安全辅助系统图18
7.安装过程
安全眼——自行车智能安全辅助系统图19

安全眼——自行车智能安全辅助系统图20

安全眼——自行车智能安全辅助系统图21

安全眼——自行车智能安全辅助系统图22

【技术实现过程】
1.Google Teachable Machine
Google Teachable MachineGoogle Teachable Machine是Google免费的无代码深度学习模型创建网络平台。使用该平台你可以构建模型来对图像,音频甚至姿势进行分类。完成上述操作后,你可以下载经过训练的模型并将其用于你的应用程序。你可以使用Tensorflow或PyTorch之类的框架来构建自定义的卷积神经网络,或者如果你想要一种简单的无代码方式进行此操作,则可以使用 Google Teachable Machine
https://teachablemachine.withgoogle.com/)平台为你完成相同的操作。
国内可通过英荔 AI 训练平台:
https://train.aimaker.space/train/image
2.通过英荔 AI 训练平台中训练识别车辆的模型
安全眼——自行车智能安全辅助系统图23

安全眼——自行车智能安全辅助系统图24

安全眼——自行车智能安全辅助系统图25

安全眼——自行车智能安全辅助系统图26

训练好的模型,下载到电脑中“keras_model.h5”,放到程序所在目录下。
3.加载模型
  1. import numpy as np
  2. import cv2
  3. from pinpong.extension.unihiker import *
  4. from pinpong.board import Board,Pin
  5. import tensorflow.keras
  6. model = tensorflow.keras.models.load_model('keras_model.h5')
  7. labels=['car','background']
  8. font= cv2.FONT_HERSHEY_SIMPLEX
  9. u_gui=GUI()
  10. Board().begin()
  11. p_p23_in=Pin(Pin.P23, Pin.IN)
  12. cap = cv2.VideoCapture(0)
  13.        if p_p23_in.read_digital()==True:
  14.             cap = cv2.VideoCapture(0)
  15.             success, image = cap.read()   
  16.             if success == False:
  17.                      print("Ignoring empty camera frame.")
  18.                      continue
  19.         image = cv2.flip(image,1)
  20.         img = cv2.resize(image,(224,224))
  21.         img = np.array(img,dtype=np.float32)
  22.         img = np.expand_dims(img,axis=0)
  23.         img = img/255
  24.         prediction = model.predict(img)
  25.         predicted_class = labels[np.argmax(prediction)]
  26.         cv2.putText(image, predicted_class, (123,456), font, 2, (0,255,0), 3)
  27.         if predicted_class=='car':
  28.              cv2.putText(image,'car', (123,456), font, 2, (0,255,0), 3)
  29.         if predicted_class=="background":
  30.              cv2.putText(image,'background', (123,456), font, 2, (0,255,0), 3)
  31.   if cv2.waitKey(1) & 0xFF == ord('q'):
  32.     break
  33. cap.release()
复制代码
4.测试环形灯代码

安全眼——自行车智能安全辅助系统图27

  1. # MindPlus
  2. # Python
  3. from pinpong.extension.unihiker import *
  4. from pinpong.board import Board,Pin
  5. from pinpong.board import NeoPixel
  6. import time
  7. Board().begin()
  8. p_p24_out=Pin(Pin.P24, Pin.OUT)
  9. np1 = NeoPixel(p_p24_out,24)
  10. index = 0
  11. while True:
  12.     np1.range_color(0,11,0xFF0000)
  13.     np1.range_color(12,23,0x000000)
  14.    
  15.     time.sleep(1)
  16.     np1.range_color(0,11,0x000000)
  17.     np1.range_color(12,23,0xFF0000)
  18.   
  19.     time.sleep(1)
  20.     np1.rainbow(0,23,0,0x0022FF)
  21.     time.sleep(1)
  22.     for i in range(100):
  23.       np1.rotate(1)
  24.       time.sleep(0.1)
复制代码

5.按钮亮灯代码
左转向按钮、左转向灯
安全眼——自行车智能安全辅助系统图28

安全眼——自行车智能安全辅助系统图29

右转向按钮、右转向灯
安全眼——自行车智能安全辅助系统图30

安全眼——自行车智能安全辅助系统图31

  1. import cv2
  2. from pinpong.board import Board,Pin
  3. from pinpong.board import NeoPixel
  4. import time
  5. from unihiker import GUI
  6. bs=0
  7. Board().begin()
  8. p_p24_out=Pin(Pin.P24, Pin.OUT)
  9. np1 = NeoPixel(p_p24_out,24)
  10. np1.clear()
  11. p_p21_in=Pin(Pin.P21, Pin.IN)
  12. p_p22_in=Pin(Pin.P22, Pin.IN)
  13. currenttime1=time.time()
  14. currenttime2=time.time()
  15. color1=0xFF0000
  16. color2=0xFF0000
  17. bs1=0
  18. bs2=0
  19. bs3=0
  20. bs4=0
  21. u_gui=GUI()
  22. while True:
  23.    
  24.     if p_p21_in.read_digital()==True and p_p22_in.read_digital()==False:
  25.         if time.time()-currenttime1>0.2:
  26.            currenttime1=time.time()
  27.            if color1==0x000000:
  28.               color1=0xFF0000
  29.            else:
  30.               color1=0x000000
  31.            np1.range_color(0,11,color1)
  32.         bs3=1
  33.     elif bs3==1:
  34.         bs3=0
  35.         np1.range_color(0,11,0x000000 )
  36.     if p_p22_in.read_digital()==True and p_p21_in.read_digital()==False:
  37.        if time.time()-currenttime2>0.2:
  38.            currenttime2=time.time()
  39.            if color2==0x000000:
  40.               color2=0xFF0000
  41.            else:
  42.               color2=0x000000
  43.            np1.range_color(12,23,color2)
  44.        bs4=1
  45.     elif bs4==1:
  46.         bs4=0
  47.         np1.range_color(12,23,0x000000)
  48.     if p_p22_in.read_digital()==True and
复制代码
6.按钮显示后方图像安全眼——自行车智能安全辅助系统图32

安全眼——自行车智能安全辅助系统图33


  1. import cv2
  2. from pinpong.board import Board,Pin
  3. from pinpong.board import NeoPixel
  4. import time
  5. from unihiker import GUI
  6. bs=0
  7. #False:不旋转屏幕(竖屏显示,上下会有白边)
  8. #True:旋转屏幕(横屏显示)
  9. screen_rotation = True
  10. cap = cv2.VideoCapture(0)
  11. cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  #设置摄像头图像宽度
  12. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) #设置摄像头图像高度
  13. cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)     #设置OpenCV内部的图像缓存,可以极大提高图像的实时性。
  14. cv2.namedWindow('camera',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  15. cv2.setWindowProperty('camera', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  16. Board().begin()
  17. p_p24_out=Pin(Pin.P24, Pin.OUT)
  18. np1 = NeoPixel(p_p24_out,24)
  19. np1.clear()
  20. p_p21_in=Pin(Pin.P21, Pin.IN)
  21. p_p22_in=Pin(Pin.P22, Pin.IN)
  22. currenttime1=time.time()
  23. currenttime2=time.time()
  24. color1=0xFF0000
  25. color2=0xFF0000
  26. bs1=0
  27. bs2=0
  28. bs3=0
  29. bs4=0
  30. u_gui=GUI()
  31. while True:
  32.    
  33.     if p_p22_in.read_digital()==True and p_p21_in.read_digital()==True:
  34.      bs1=0
  35.      success, img = cap.read()
  36.      if not success:
  37.         print("Ignoring empty camera frame.")
  38.         continue
  39.      if bs2==0:
  40.          bs2=1
  41.          cv2.namedWindow('camera',cv2.WND_PROP_FULLSCREEN)    #窗口全屏
  42.          cv2.setWindowProperty('camera', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)   #窗口全屏
  43.      if screen_rotation: #是否要旋转屏幕
  44.         img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) #旋转屏幕
  45.      cv2.imshow('camera',img)
  46.      print("camera")
  47.     else:
  48.      if bs1==0:
  49.        print("1")
  50.        cv2.destroyAllWindows()
  51.        sz=u_gui.draw_clock(x=120,y=100,r=50,color="#0000FF")
  52.        bs2=0
  53.        bs1=1
  54.      else:
  55.        pass
  56. cap.release()
  57. cv2.destroyAllWindow()
复制代码
【演示视频】


【制作反思】

1、本项目使用了自已训练的模型,来识别后方车辆,但由于行空板的算力有限,识别速度慢,识别时屏幕显示的画面有些延迟。但识别准确率较高。

2、行空板只进行了简单保护,因可以遇到雨天骑车,可能会出现行空板短路现象。所以需日后制作保护装置,防雨水短路。

3、本项目使用热熔胶、束带固定装置,拆装方便,但存在易丢失问题。

ThuAugust-202208046997..png
ThuAugust-202208042456..png

Forgotten  版主

发表于 2022-8-5 14:21:40

高级
回复

使用道具 举报

癞皮龙  学徒

发表于 2022-9-6 09:00:08


一个小建议,全彩灯环24颗太大了,做转向效果不好,建议使用2个12颗的全彩灯环,左右分开点距离,因为可以串联,所以也只占用了板子上的一个接口而已,通过索引控制左转和右转闪烁的LED颗粒。
回复

使用道具 举报

云天  初级技神
 楼主|

发表于 2022-9-6 11:25:20

癞皮龙 发表于 2022-9-6 09:00
一个小建议,全彩灯环24颗太大了,做转向效果不好,建议使用2个12颗的全彩灯环,左右分开点距离 ...

好建议
回复

使用道具 举报

岑剑伟  初级技师

发表于 2022-9-14 11:30:08

太高级了
回复

使用道具 举报

CPY  见习技师

发表于 2022-9-24 11:45:19

优秀啊!想学!
回复

使用道具 举报

52970800  初级技师

发表于 2022-12-1 22:18:42

用图形化编程可以实现吗?
回复

使用道具 举报

云天  初级技神
 楼主|

发表于 2022-12-1 23:07:19

可以的,这两天,我会出一个项目,涉及
回复

使用道具 举报

52970800  初级技师

发表于 2022-12-2 16:10:00

云天 发表于 2022-12-1 23:07
可以的,这两天,我会出一个项目,涉及

期待学习
回复

使用道具 举报

 学徒

发表于 2024-5-16 18:38:55

您好,我参考了您的安全眼文章想做复现,请问为什么按下相应按键却不能进行目标检测呢?如果可以,方便请问一下您的源码吗?
回复

使用道具 举报

 学徒

发表于 2024-5-16 23:14:44

及 发表于 2024-5-16 18:38
您好,我参考了您的安全眼文章想做复现,请问为什么按下相应按键却不能进行目标检测呢?如果可以,方便请问 ...

打扰了,已经解决了
回复

使用道具 举报

李宏浩  学徒

发表于 2024-6-6 19:30:40

博主思维真不错,新手想做一下,可否分享一下原代码?给您点赞!~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail