본문 바로가기

Robot/Robot Program - ROS

ROS Melodic에서 YOLO로 detection 된 사람 수 세기

최근 저는 광운대에서 ROS 기초 수업을 진행했습니다. 해당 수업은 제가 ROS 기초를 진행하고 마치면, 그 다음 다른 분이 이어서 실제 주행로봇을 가지고 프로젝트를 진행하는 방식이었습니다. 그래서 제 뒤에 이어지는 수업에서 ROS melodic 버전을 사용하기 때문에 저도 수업을 melodic으로 진행을 했죠. 근데 melodic 버전에서 제가 블로그에서 YOLO pkg를 소개했던 적이 있습니다.

https://pinkwink.kr/1256

 

ROS melodic에서 영상인식 YOLOv3 패키지 세팅하기

최근 여러글에서 이야기했지만, 제가 지금은 (임시.ㅠㅠ.로) 한양대 에리카에 있습니다. 여러 고마운 분들의 배려로 아주 다양한 재미있는 일들을 경험중이랍니다. 그 중에 또 하나 멋진 일은 아

pinkwink.kr

위 글인데요. 위 글의 내용을 수강생들에게 소개하고 재미삼아 YOLO ROS pkg 설치하고 잠시 즐거운 시간을 보냈죠. 근데 제가 수업중에 간단히 저 패키지의 노드가 발행하는 토픽을 구독해서 여러 class를 인식하지만 사람(person)이 인식되면 몇 명이 인식되었는지 카운트해서 화면에 프린트하는 코드를 작성해 보라는 숙제를 주었죠.

근데 수업이 진행되면서 제가 그 과제를 주었는지 잊어버린.ㅠㅠ. 종강하던 날 한 학생이 해당 숙제를 제가 풀어주지 않았다고 알려주더군요. 그래서 부랴부랴~~ 숙제 풀이를 해서 이렇게 공개합니다.ㅠㅠ. 아무튼 오늘 글은 YOLO가 중요한게 아니라 어떤 노드가 발행하는 토픽을 구독하는 방법을 유심히 보면 좋겠습니다.

앞에서 언급한 ROS Melodic용 YOLO를 설치하고 위 그림처럼 roscore를 실행합니다.

그리고 cv_camera를 실행하구요~

그리고 yolov3_pytorch_ros 패키지의 detector.launch를 실행합니다.

rqt_image_view를 실행해서 detection_image_topic을 지정하면 인식이 된다는 것을 압니다. 저는 맥을 사용하는데 패러럴즈로 우분투를 실행했기 때문에 yolov3-tiny 버전을 실행했습니다.

이제 토픽을 구독하고 뭔가 하기 위해 detected_objects_in_image 토픽의 정보(info)를 조회해보면 해당 토픽이 BoundingBoxes라는 메세지로 되어 있음을 알 수 있습니다.

그래서 BoundingBoxes를 rosmsg info 명령으로 조회하면 BoundingBox라는 이름으로 배열로 되어 있구요. 그 이름은 bounding_boxes입니다. 

일단 간단히 코드만 집중하려고 이미 설치한 yolo 패키지에 scripts라는 폴더를 만들고 그 안에 코드를 작성했습니다.

#! /usr/bin/env python

import rospy
from yolov3_pytorch_ros.msg import BoundingBoxes

def callback(data):
	cnt = 0
	for each in data.bounding_boxes:
		if each.Class == "person":
			cnt = cnt +1
	print "person count : " + str(cnt)

rospy.init_node("count_classes",  anonymous=False)
rospy.loginfo("--> Start Count Classes Node")

rospy.Subscriber("detected_objects_in_image", BoundingBoxes, callback)

rospy.spin()

위 코드는 detected_objects_in_image 토픽을 구독해서, 그 안에 bounding_boxes에서 Class에 person이 관찰되면 카운트(cnt)를 수행하도록 했습니다. 저렇게 보면 쉽죠^^. 아래에 공개한 영상을 보면서 어떻게 작성했는지 흐름을 봐주세요~

그리고 꼭 chmod 명령으로 실행권한을 추가해야 합니다. 아래 그림처럼 그리고 아까 말한 해당 코드를 실행합니다.

이제 그 결과는 영상에서 사람의 수를 카운트 해줍니다.

 

반응형