运行环境说明:

1)Python 3.7

2)PyTorch 1.0.0

3)CUDA 10

4)GCC 4.9.2 or above

本机测试环境说明:

torch1.4+10.0+Python3.7(虚拟环境中)

系统环境UBUNTU16.04+Python3.5和python2.7(默认)

详细步骤如下:

1.github上下载源码

CornerNet_ite github网址

git clone https://github.com/princeton-vl/CornerNet-Lite.git

2环境配置

(1)创建虚拟环境

cd <CornerNet-Lite dir>
conda create --name CornerNet_Lite --file conda_packagelist.txt --channel pytorch

创建CornerNet_Lite环境的过程需要下载一个1.0版本的pytorch有600多M,一次不一定能成功,失败了重新再运行下。

(2)激活环境

conda activate CornerNet_Lite

此时终端最前面个会多一个(CornerNet_LIte)的标志,表示已经进入到该虚拟空间。

退出虚拟空间:conda deactivate

(3)编译Corner PoolingLayers

cd <CornerNet-Lite dir>/core/models/py_utils/_cpools/
python setup.py install --user

(4)编译NMS

cd <CornerNet-Lite dir>/core/external
make

(5)下载模型文件

CornerNet

CornerNet-Squeeze(检测速度快)

CornerNet-Saccade(检测准确率高)

链接:https://pan.baidu.com/s/1lyy-Pe_uH3p7oIqfasXOqw 。提取码:0kb7 。复制这段内容后打开百度网盘手机App,操作更方便哦

三个模型一共1G多,下载完成后,Put the CornerNet-Saccade model under <CornerNet-Lite dir>/cache/nnet/CornerNet_Saccade/, CornerNet-Squeeze model under <CornerNet-Lite dir>/cache/nnet/CornerNet_Squeeze/ and CornerNet model under <CornerNet-Lite dir>/cache/nnet/CornerNet/
(6)测试

python demo.py

这里容易有个Python版本冲突的问题,装了ROS后2.7的版本容易与3版本冲突,两种解决办法:
1.在demo.py开头加上:

#解决ros中cv2的冲突
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

如果单纯测试demo,这种方法没有问题,如果后续要嵌入到ros中,这种方法不行。

2.强制给CV2.so重命名

cd /opt/ros/kinetic/lib/python2.7/dist-packages/
sudo mv cv2.so cv2_ros.so
#!/usr/bin/env python  ->   #!/usr/bin/env python3

结果会在CornerNet_Lite目录下保存一张名为demo_out.jpg的图片

3.嵌入到ROS工程中

思路:相机节点发布图像话题,test_ros.py订阅图像话题,然后调用CornerNet——Lite检测。

(1)重命名cv2.so

cd /opt/ros/kinetic/lib/python2.7/dist-packages/
sudo mv cv2.so cv2_ros.so

之前解决cv2.so冲突的问题只能采用这种方法来解决。

(2)解决Python3和cv_bridge的问题

ROS默认使用python2.7,这时我们需要从源码编译cv_bridge,并在编译前设置好Python版本为Python3

1.新建ros工作空间,用于测试

mkdir py3_ws
cd py3_ws
mkdir src

2.将前面测试通过的CornerNet-Lite目录全部拷贝到 src/目录下

现在,目录结构大概是这样的 py3_ws/src/CornerNet-Lite

3.使用conda激活CornerNet-Lite环境

cd src/CornerNet-Lite/
conda activate CornerNet_Lite

因为后续需要在该环境下调用ROS,所以得先切换到该环境下,安装rospkg等包。

4.使用pip在CornerNet_Lite环境下安装rospkg、catkin_pkg等,这样才能在该环境下调用ROS

pip install catkin_pkg pyyaml empy rospkg numpy

5.这里更改以下opencv-python的版本,我的之前是4.5的,导致Python中用的cv2的一些东西就会报错不兼容。

这里降级一下:

pip uninstall opencv-python
pip install opencv-python==4.1.2.30

6.源码编译cv_bridge

依赖安装:

sudo apt-get update
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge

初始化工作空间,并设置Python版本为Python3(注意,这里使用的是系统默认安装的Python3.5m)

cd ../../  #回到py3_ws/目录
catkin init
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
catkin config --install

下载cv_bridge源码并编译

git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv

注意:

1.修改src/vision_opencv/cv_bridge/CMakeLists.txt 第11行内容(解决找不到boost_python3的问题)

将11行:

find_package(Boost REQUIRED python3)

修改为:

find_package(Boost REQUIRED python35)

修改src/vision_opencv/cv_bridge/setup.py第1行内容

将第一行:

#!/usr/bin/env python

修改为:

#!/usr/bin/env python3

开始编译:

catkin build cv_bridge
source install/setup.bash --extend

如果报错:

在cmakelist.txt文件中添加:

add_compile_options(-std=c++11)

完成之后,测试:

pythonPython 3.7.1 (default, Oct 23 2018, 19:19:42)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from cv_bridge.boost.cv_bridge_boost import getCvType
>>> 

7.节点测试

创建一个测试脚本:

cd src/CornerNet-Lite/
gedit test_ros.py 

test_ros.py内容:

#!/usr/bin/env python3
#!coding=utf-8import sys
import rospyfrom std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeErrorimport cv2
print("cv2.__version__: ", cv2.__version__) from core.detectors import CornerNet_Saccade
from core.vis_utils import draw_bboxesdef callback(data):global  count, bridge, detectorcount += 1if count ==1:count = 0cv_img = bridge.imgmsg_to_cv2(data, "bgr8")bboxes = detector(cv_img)cv_img  = draw_bboxes(cv_img, bboxes)cv2.imshow("frame", cv_img)cv2.waitKey(3)else:pass    def image_pro():rospy.init_node('image_pro',anonymous=True)global count,bridge,detectordetector = CornerNet_Saccade()count = 0bridge = CvBridge()rospy.Subscriber("/camera/image", Image, callback)# spin() simply keeps python from exiting until this node is stoppedrospy.spin()if __name__ == '__main__':image_pro()

我这里使用的sub相机,相机节点名称为:/camera/image,此处根据自己的实际情况修改。

首先运行相机节点(根据自己的实际情况而定):

roslaunch ros_cv opencamera.launch

然后在激活了空间的终端下运行:

./test_ros.py 或者python test_ros.py 

效果:

此处使用的CornerNet_Squeeze,速度快,准确率低。

出错总结:

1)如果出现如下类似错误,就是找不到'torch',应该是你没有激活环境

Traceback (most recent call last):
      File "./test_ros1.py", line 14, in <module>
        from core.detectors import CornerNet_Saccade
      File "/home/communicationgroup/py3_ws/src/CornerNet-Lite/core/detectors.py", line 1, in <module>
        from .base import Base, load_cfg, load_nnet
      File "/home/communicationgroup/py3_ws/src/CornerNet-Lite/core/base.py", line 3, in <module>
        from .nnet.py_factory import NetworkFactory
      File "/home/communicationgroup/py3_ws/src/CornerNet-Lite/core/nnet/py_factory.py", line 2, in <module>
        import torch
    ImportError: No module named 'torch'

解决办法:在终端执行

conda activate CornerNet_Lite

2)如果出现如下错误,就是cv_bridge的错误,应该是你没有source 一下

[ERROR] [1556354686.771577]: bad callback: <function callback at 0x7f598b536268>
    Traceback (most recent call last):
      File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
        cb(msg)
      File "./test_ros1.py", line 22, in callback
        cv_img = bridge.imgmsg_to_cv2(data, "bgr8")
      File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 163, in imgmsg_to_cv2
        dtype, n_channels = self.encoding_to_dtype_with_channels(img_msg.encoding)
      File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 99, in encoding_to_dtype_with_channels
        return self.cvtype2_to_dtype_with_channels(self.encoding_to_cvtype2(encoding))
      File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 91, in encoding_to_cvtype2
        from cv_bridge.boost.cv_bridge_boost import getCvType
    ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

解决办法:如果在py3_ws/src/CornerNet-Lite目录下的话,在终端执行

source ../../devel/setup.bash

4.发布检测框信息

(1)自定义BoundingBox信息

1)首先,在py3_ws/src目录下创建cornernet_ros_msgs包,里面主要是定义了我们自己的BoundingBox消息

cd py3_ws/src/
catkin_create_pkg cornernet_ros_msgs message_generation actionlib_msgs sensor_msgs std_msgs message_runtime

创建后会发现 py3_ws/src目录下生成了一个名为cornernet_ros_msgs的文件夹,打开该文件夹,我们可以看到里面生成了CMakeLists.txt 和 package.xml 。

2)进入cornernet_ros_msgs/目录,并创建msg文件夹,并在msg/目录下新建两个文件,分别为BoundingBox.msg 和BoundingBoxes.msg

cd cornernet_ros_msgs/
mkdir msg
cd msg/
gedit BoundingBox.msg 

BoundingBix.msg中写入:

string class
float64 prob
int64 x1
int64 y1
int64 x2
int64 y2

意思就是自定义了名为 BoundingBox 的消息类型,其中class为类名,prob也就是得分嘛,可以根据这个得分滤掉低于设定阈值的框框,后面的x1,y1,x2,y2就是boundingbox的坐标了。

保存一下,再创建 BoundingBoxes.msg (很多时候框框不止一个)
BoundingBoxes.msg 内容如下:

Header header
BoundingBox[] bounding_boxes

数组,元素为BoundingBox

3)接下来就是修改修改CMakeLists.txt 和 package.xml 中的内容了。

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(cornernet_ros_msgs)## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)find_package(catkin REQUIRED COMPONENTSroscpp rospy message_generationactionlib_msgsmessage_runtimesensor_msgsstd_msgs
)# find_package(Boost REQUIRED COMPONENTS system)add_message_files(FILESBoundingBox.msgBoundingBoxes.msg)generate_messages(DEPENDENCIESactionlib_msgssensor_msgsstd_msgs)catkin_package(CATKIN_DEPENDS actionlib_msgs message_runtimesensor_msgs std_msgs
)

package.xml

<?xml version="1.0"?>
<package format="2"><name>cornernet_ros_msgs</name><version>0.0.0</version><description>The cornernet_ros_msgs package</description><maintainer email="communicationgroup@todo.todo">communicationgroup</maintainer><license>TODO</license><buildtool_depend>catkin</buildtool_depend><build_depend>message_generation</build_depend><build_depend>actionlib_msgs</build_depend><build_depend>sensor_msgs</build_depend><build_depend>std_msgs</build_depend><build_depend>message_runtime</build_depend><build_export_depend>actionlib_msgs</build_export_depend><build_export_depend>sensor_msgs</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>actionlib_msgs</exec_depend><exec_depend>message_runtime</exec_depend><exec_depend>sensor_msgs</exec_depend><exec_depend>std_msgs</exec_depend><export></export>
</package>

4)那就开始编译吧(就像前面编译cv_bridge一样)

cd ../../../ #回到py3_ws/目录下
catkin init

因为之前初始化过一次,所以运行之后报警告已经初始化。

编译:

catkin build cornernet_ros_msgs

这里我遇到了个问题:
定位到ros下Python2.7的路径给我报没有em模块的错误。

网上的方法都是安装empy,各种安装方法,但我这里均没有用。

最终解决方法:
先在CornerNet_Lite虚拟环境外,将系统默认的Python2.7改为Python3.5,版本切换方法:python多版本切换

然后安装pip install empy

然后在CornerNet_Lite虚拟环境中重新便于cornernet_ros_msgs即可。

成功之后就修改下之前那个测试脚本:

test_ros1.py:

#!/usr/bin/env python3
#!coding=utf-8import sys
import numpy as npimport rospyfrom std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError#自己定义的BoundingBoxes消息
from cornernet_ros_msgs.msg import BoundingBoxes
from cornernet_ros_msgs.msg import BoundingBoximport cv2
print("cv2.__version__: ", cv2.__version__) from core.detectors import CornerNet_Saccade
from core.vis_utils import draw_bboxesdef pub_bboxes(bboxes, thresh=0.5):"""Public bounding boxes msgs.Args:bboxes: A dictionary representing bounding boxes of different objectcategories, where the keys are the names of the categories and thevalues are the bounding boxes. The bounding boxes of category should bestored in a 2D NumPy array, where each row is a bounding box (x1, y1,x2, y2, score).thresh: (Optional) Only bounding boxes with scores above the thresholdwill be drawn.Returns:None"""  global pubbboxes_msg = BoundingBoxes()for cat_name in bboxes:keep_inds = bboxes[cat_name][:, -1] > threshfor bbox in bboxes[cat_name][keep_inds]:bbox_msg = BoundingBox( str(cat_name),             #class namebbox[-1].astype(np.float), #prabbbox[0].astype(np.int32),  #x1bbox[1].astype(np.int32),  #y1bbox[2].astype(np.int32),  #x2bbox[3].astype(np.int32))  #y2bboxes_msg.bounding_boxes.append(bbox_msg) # print(bboxes_msg)pub.publish(bboxes_msg) def callback(data):global  count, bridge, detectorcount += 1if count ==1:count = 0cv_img = bridge.imgmsg_to_cv2(data, "bgr8")bboxes = detector(cv_img)cv_img  = draw_bboxes(cv_img, bboxes)cv2.imshow("frame", cv_img)pub_bboxes(bboxes) #发布消息cv2.waitKey(3)else:pass    def image_pro():rospy.init_node('image_pro',anonymous=True)global count,bridge,detector,pubdetector = CornerNet_Saccade()count = 0bridge = CvBridge()rospy.Subscriber("/camrea/image", Image, callback)pub = rospy.Publisher('boundingboxes',BoundingBoxes,queue_size=10)# spin() simply keeps python from exiting until this node is stoppedrospy.spin()if __name__ == '__main__':image_pro()

测试:
同上启动相机节点,然后激动脚本:

./test_ros1.py 

然后可以打印bboxes_msg信息输出到终端。

也可以定之后,通过

tsotopic echo /boundingboxes

查看输入。注意,新开终端一定要source install/setup.bash环境和devel/setup.bash的环境

后续就可以根据实际需求进行应用。

如果需要训练自己的数据集可以参考:CornerNet_Lite训练自己的数据集

参考文献:

https://github.com/princeton-vl/CornerNet-Lite

https://blog.csdn.net/qq_25349629/article/details/89493192?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162065314216780261985350%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162065314216780261985350&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-1-89493192.first_rank_v2_pc_rank_v29&utm_term=%E5%B0%9D%E8%AF%95CornerNet-Lite%E8%BF%9B%E8%A1%8C%E7%9B%AE%E6%A0%87%E8%AF%86%E5%88%AB%E5%B9%B6%E5%B5%8C%E5%85%A5&spm=1018.2226.3001.4187

https://blog.csdn.net/qq_33547191/article/details/86552214

UBUNTU16.04使用CornerNet_Lite进行目标识别并嵌入到ROS中相关推荐

  1. Ubuntu16.04.06 LTS -bash 进程占用cpu很高,中了挖矿病毒

    环景: Ubuntu16.04.06 LTS 问题描述: -bash 进程占用cpu很高,别的进程开启运行过后就被它killed,-bash一直占用50%的CPU,服务器被拉的嗷嗷叫 解决方案: 1. ...

  2. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(3)

    在上一节已经进行了UR3机械臂的运动规划仿真,这一节就进行真实的UR3机械臂运动控制. 1. 电脑和UR3机械臂连接配置 在启动UR3机械臂后,笔记本电脑通过网线连接UR3的控制箱,此时需要配置网络连 ...

  3. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(2)

    在上一节已经搭建了UR3机械臂的仿真环境,并且在rviz界面中通过拖拽机械臂实现了Moveit的运动规划.这一节就通过程序实现简单的UR3机械臂的运动规划. 首先,在 ur3工作空间中的 ~/ur_w ...

  4. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(1)

    1. 下载并编译UR3/UR5/UR10驱动包 我们在Home目录下创建一个文件夹(命名为ur_ws),这就是UR驱动的工作空间了,并且创建一个src文件夹,如下. 然后去下载驱动包,如下图. 下载后 ...

  5. Ubuntu16.04下使用kalibr标定intel RealSense D435i imu+双目

    使用kalibr标定RealSense D435i imu+双目 一.实验背景 RealSense D435i包含了rgb图像.左视图.右视图.深度图.imu等主要的数据.为了更好的使用这些数据进行算 ...

  6. 尝试CornerNet-Lite进行目标识别并嵌入ROS

    CornerNet-Lite是刚开源不久的实时目标检测方法,据说比YOLO3 牛逼,于是打算尝鲜一波. 首先说运行的环境要求: 1)Python 3.7 2)PyTorch 1.0.0 3)CUDA ...

  7. Ubuntu16.04系统运行VINS-Mono(安装、环境配置)

    Ubuntu16.04系统运行VINS-Mono 目录 一.Ubuntu16.04系统安装(基于VMware) 二.ROS Kinetic的安装 三.opencv3.3.1的安装 四.eigen3.3 ...

  8. 【Ubuntu】Ubuntu16.04+VMware+Win10安装及配置教程

    Ubuntu16.04+VMware+Win10安装及配置教程   前言:   我之所以使用Ubuntu16.4,既为学Linux操作,也为学习Python.Ubuntu16.4一直以来在虚拟机上都跑 ...

  9. Ubuntu16.04安装gazebo8并加载模型库

    Ubuntu16.04安装gazebo8并加载模型库 说明 ros桌面版集成了gazebo7,但gazebo7不支持suv模型,导致官方提供的模型库中部分模型无法使用,具体表现为一旦从模型列表中拖出s ...

最新文章

  1. MySQL57安装与设置
  2. 详解亚马逊:物流为何是电商命脉
  3. 哈佛大学惊人发现:新冠对人类未来影响巨大!
  4. linux gvim 列编辑,Linux——vim编辑器
  5. java中的锁池和等待池
  6. 5. Linux 设备文件名
  7. LoRa无线网络技术概述
  8. 长江流域图——只希望“霉”雨快走开
  9. 缠论108课_缠论108课完整版pdf_炒股108式
  10. maven配置阿里源
  11. 『贪心』阿狸和桃子的游戏
  12. java tapestry_Java Web开发的轻便架构Tapestry5---简介
  13. Error:间接寻址级别不同——C++真的魔鬼
  14. portSentry入侵检测工具
  15. SQL语法 自然连接 外连接 内连接
  16. vue-pdf打印乱码、方块字、无法打印
  17. python 学生成绩表,生成数据表并且绘图
  18. webpack转化es6语法
  19. php邮箱类,php邮件类(PHPMailer)使用心得
  20. ESP8266_19MQTT协议接入ONENET平台_订阅主题

热门文章

  1. SpringBoot项目实现短信发送接口开发
  2. 咸鱼CAD笔记—CAD快捷键
  3. 听说你想学Python爬虫?我从零教你啊
  4. android ios 屏幕直播软件推荐,看个球:超全超给力的看球直播利器(iOS +安卓) | 闲一鱼博客...
  5. If today were the last day of my life
  6. Codeforces 1155F Delivery Oligopoly dp(看题解)
  7. Debian搭建Samba服务
  8. 电商平台商品订单拆分模式分析
  9. 阿里云SLB配置HTPPS方式访问
  10. Tomcat配置HTPPS访问