前言
第一節:
基於paddledetection在ROS中搭建紅綠燈檢測控制車模運動(1)—— 環境搭建準備以及軟件安裝
第二節:
基於paddledetection在ROS中搭建紅綠燈檢測控制車模運動(2)—— 數據集製作以及訓練
第三節:
基於paddledetection在ROS中搭建紅綠燈檢測控制車模運動(3)—— 使用訓練結果在ros中仿真紅綠燈控制小車運動
項目地址
訓練部分aistudio地址:傳動門
racecar仿真軟件下載地址:傳送門
本地項目下載地址:傳送門
數據準備
打開仿真環境:
roslaunch racecar_gazebo racecar_normal_light_runway.launch
在本地pycharm中新建一個工程文件:proj6_lightContrl/src在src下創建腳本讀取ros中攝像頭數據並按鍵截圖保存本地,prtSc.py文件如下:
import rospy,cv2
from sensor_msgs.msg import Image
import sys
sys.path.append("~/catkin_workspace/install/lib/python3/dist-packages/")
import cv_bridge
class Follower:
def __init__(self):
self.bridge = cv_bridge.CvBridge()
#cv2.namedWindow("window", 1)
self.image_sub = rospy.Subscriber('/camera/zed/rgb/image_rect_color',
Image, self.image_callback)
self.num1 = 0
self.num2 = 0
def image_callback(self, msg):
self.image = self.bridge.imgmsg_to_cv2(msg,desired_encoding='bgr8')
cv2.imshow("pic",self.image)
k = cv2.waitKey(3)
if k == 27: # 按ESC退出
cv2.destroyAllWindows()
elif k == ord('r'): # 按r保存並退出
self.num1 += 1
cv2.imwrite("./red/" + str(self.num1) + ".jpg", self.image)
print("保存成功:" + str(self.num1) + ".jpg")
elif k == ord('g'): # 按r保存並退出
self.num2 += 1
cv2.imwrite("./green/" + str(self.num2) + ".jpg", self.image)
print("保存成功:" + str(self.num2) + ".jpg")
if __name__ == '__main__':
rospy.init_node('follower')
follower = Follower()
rospy.spin()
按鍵r保存攝像頭圖片到red文件夾下,按鍵g保存到green文件夾下:
調整角度和遠近製作自己的數據集:
圖片標註
cd labelImg
python labelImg.py
打開圖片路徑:
選擇框選:
標註完成:
在aistudio上準備描述文件
在aistudio上創建項目(以下操作均在aistudio上進行)
首先下載paddledetection:
!git clone https://github.com/PaddlePaddle/PaddleDetection.git
將創建的red和green文件夾壓縮上傳到aistudio上的paddledetection中dataset下的my_light下執行解壓命令:
%cd PaddleDetection-release-0.3/dataset/my_light/
!unzip picture.zip
安裝paddledetection依賴:
%cd ~/PaddleDetection-release-0.3/
!pip install -r requirements.txt
測試aistudio環境:
#測試項目環境
!export PYTHONPATH=`pwd`:$PYTHONPATH
!python ppdet/modeling/tests/test_architectures.py
輸出如下即可:
在my_light文件夾下創建green_xmls和red_xmls存放xml文件,方便記錄txt:
%cd ~/PaddleDetection-release-0.3/dataset/my_light/
%mkdir green_xmls
%cd ./green
%mv *.xml ../green_xmls
%cd ~/PaddleDetection-release-0.3/dataset/my_light/
%mkdir red_xmls
%cd ./red
%mv *.xml ../red_xmls
記錄xml和picture的關係:
# 記錄train圖片
import os
import random
path = "/home/aistudio/PaddleDetection-release-0.3/dataset/my_light/"
total_red = os.listdir(path + "red/")
total_green = os.listdir(path + "green/")
num = len(total_red)
list=range(num)
ftrain = open('/home/aistudio/PaddleDetection-release-0.3/dataset/my_light/train.txt', 'w')
fval = open('/home/aistudio/PaddleDetection-release-0.3/dataset/my_light/val.txt', 'w')
for i in list:
if i % 9 != 0:
name=total_red[i][:-4]
writeName = "red/" + name + ".jpg " + "red_xmls/" + name + ".xml\n"
ftrain.write(writeName)
else:
name=total_red[i][:-4]
writeName = "red/" + name + ".jpg " + "red_xmls/" + name + ".xml\n"
fval.write(writeName)
for i in list:
if i % 9 != 0:
name=total_green[i][:-4]
writeName = "green/" + name + ".jpg " + "green_xmls/" + name + ".xml\n"
ftrain.write(writeName)
else:
name=total_green[i][:-4]
writeName = "green/" + name + ".jpg " + "green_xmls/" + name + ".xml\n"
fval.write(writeName)
ftrain.close()
fval.close()
輸出的train.txt如下:
輸出的val.txt如下:
數據好像有點少哎!
在train.txt同目錄創建label_list.txt:
訓練
修改configs/ssd/ssd_mobilenet_v1_voc.yml這個文件,主要修改位置:
-
num_classes: 3
-
trainReader下的anno_path和dataset_dir
anno_path: train.txt
dataset_dir: dataset/my_light -
EvalReader下的anno_path和dataset_dir
anno_path: val.txt
dataset_dir: dataset/my_light -
TestReader下的anno_path和dataset_dir:
dataset_dir: dataset/my_light
anno_path: label_list.txt
訓練:
#訓練模型
%cd ~/PaddleDetection-release-0.3/
# ssd訓練
!python -u tools/train.py -c configs/ssd/ssd_mobilenet_v1_voc.yml -o --eval
等待訓練完成即可: