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

2023-10-30

CornerNet-Lite是刚开源不久的实时目标检测方法,据说比YOLO3 牛逼,于是打算尝鲜一波。

首先说运行的环境要求:

1)Python 3.7

2)PyTorch 1.0.0

3)CUDA 10 (意思是你得有一张NVIDIA的显卡,比如我的是GTX1060)

4)GCC 4.9.2 or above

1. 去github下载源码

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

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

2. 跟着官方readme,设置环境,这会下载一大堆东西,比如opencv, pytorch

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

这可能是一个漫长的过程(实验室这破网速,几kb的下载速度玩个XX),且在下载的pytorch的时候,可能会失败,失败,再失败,请不要气馁,奇迹总会出现,比如大清早,实验室的网速最佳,成功的几率更高哦。

3. active 你的环境

conda activate CornerNet_Lite

注意,这里是 conda ,不是source。执行完后,你会发现终端命令行前面多了(CornerNet_Lite)

这个时候你还会发现,当你在该终端下运行python时,默认是3.7版本了

4. 编译Corner Pooling Layers

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

5. 编译NMS

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

6. 下载模型文件

原下载地址:

CornerNet-Saccade

CornerNet-Squeeze

CornerNet

百度云走起:

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

把下载的文件放在正确的目录下:

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/

  7.  测试一下demo,看看效果如何

python demo.py

糟糕,有问题,由于本人安装了ROS,cv2.so冲突了吗?错误如下:

Traceback (most recent call last):
  File "demo.py", line 7, in <module>
    import cv2
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

    检查一下python路径

Python 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.
>>> import sys
>>> sys.path
['', '/home/communicationgroup/rgbdslam2_catkin_ws/devel/lib/python2.7/dist-packages', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python37.zip', '/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7', '/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7/lib-dynload', '/home/communicationgroup/.local/lib/python3.7/site-packages', '/home/communicationgroup/.local/lib/python3.7/site-packages/cpools-0.0.0-py3.7-linux-x86_64.egg', '/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7/site-packages', '/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7/site-packages/torchvision-0.2.1-py3.7.egg']

罪魁祸首正是'/opt/ros/kinetic/lib/python2.7/dist-packages'

那就删除它吧

对demo.py加入如下两行代码

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

2019/4/27更新:

这样的后果是不能在.py中 import rospy,若想嵌入到ROS中,则不能采用该方法。若不用嵌入ROS,使用该方法没得问题,若要嵌入ROS中,解决办法参考后面第8节的更新。

重新运行demo.py

python demo.py

终端输出大概是这样的:

total parameters: 116969339
loading from /home/communicationgroup/CornerNet-Lite/core/../cache/nnet/CornerNet_Saccade/CornerNet_Saccade_500000.pkl
/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7/site-packages/torch/nn/functional.py:2423: UserWarning: Default upsampling behavior when mode=bilinear is changed to align_corners=False since 0.4.0. Please specify align_corners=True if the old behavior is desired. See the documentation of nn.Upsample for details.
  "See the documentation of nn.Upsample for details.".format(mode))

结果还会在CornerNet-Lite目录下保存一张名为 demo_out.jpg 的图片

可以看出,已经把小狗仔们框出来了。

其实也并不快嘛,我的电脑(GTX1060)跑一张图像需要0.5s左右,难道是没用上GPU???2019/4/27注:平均测试速度单张图片244ms, Titan X (PASCAL) GPU

8. 尝试一下能不能用在ROS工程中

思路:相机节点通过相机获取视频,并通过ROS消息发布,图像处理节点订阅图像消息,并调用CornerNet进行目标检测。

1)C++和python参数传递

将.cpp获取的图像作为参数传给.py,实现目标识别,再将.py得到的bboxes传回给.cpp

(以后慢慢做,等更新)

2) 写一个.py节点,来订阅图像消息,并发布bboxes

由于这个CornerNet既要python3.7,又要pytorch1.0.0,还要opencv3,而ros还没有完全支持python3,所以暂时放弃该尝试。

-------------------------------------------------------------我是分割线--------------------------------------------------------------------

2019/4/27更新:

经过一番波折,实现了 .py节点的方法。测试方式:Kinect2 获取图像,test_ros.py 订阅图像消息,并调用CornerNet实现目标检测。

该方法主要是解决Python3 环境下运行ROS的问题,其中主要涉及cv_bridge,cv2的问题。网上方法形形色色,但是到我这里基本是都不得行,还害得我重装了一遍ROS。为了让大家少走弯路,这里总结一下我对Python3环境下运行ROS,并调用CornerNet的探索。

 

8.1.1 首先,解决import cv2的问题

前面第7节提到的方案在这里就不适用了,sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages') 会导致 import rospy失败。

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

意思就是重命名一下,真是简单粗暴还管用啊!

8.1.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

跟前面一样,成功的话,终端命令行前面或多出  (CornerNet_Lite)

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

 

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

pip install catkin_pkg pyyaml empy rospkg numpy

更改CornerNet_Lite环境下opencv版本为3.4.1(CornerNet_Lite环境下的opencv版本为3.4.2,该版本在调用cv2.imshow()函数时会报错,也不知道大家的存在这个问题不)

conda install opencv==3.4.1

终端输出如下

Collecting package metadata: done
Solving environment: done

## Package Plan ##

  environment location: /home/communicationgroup/anaconda3/envs/CornerNet_Lite

  added / updated specs:
    - opencv==3.4.1


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    ffmpeg-3.4                 |       h7985aa0_0         8.0 MB
    libopencv-3.4.1            |       h8fa1ad8_3        41.5 MB
    libprotobuf-3.5.2          |       h6f1eeef_0         4.2 MB
    opencv-3.4.1               |   py37h6fd60c2_3           8 KB
    py-opencv-3.4.1            |   py37h8fa1ad8_3         1.2 MB
    ------------------------------------------------------------
                                           Total:        54.9 MB

The following NEW packages will be INSTALLED:

  libprotobuf        pkgs/main/linux-64::libprotobuf-3.5.2-h6f1eeef_0

The following packages will be DOWNGRADED:

  ffmpeg                                     4.0-hcdf2ecd_0 --> 3.4-h7985aa0_0
  libopencv                                3.4.2-hb342d67_1 --> 3.4.1-h8fa1ad8_3
  opencv                               3.4.2-py37h6fd60c2_1 --> 3.4.1-py37h6fd60c2_3
  py-opencv                            3.4.2-py37hb342d67_1 --> 3.4.1-py37h8fa1ad8_3


Proceed ([y]/n)? y


Downloading and Extracting Packages
py-opencv-3.4.1      | 1.2 MB    | ##################################################################################################################################### | 100%
opencv-3.4.1         | 8 KB      | ##################################################################################################################################### | 100%
libopencv-3.4.1      | 41.5 MB   | ##################################################################################################################################### | 100%
libprotobuf-3.5.2    | 4.2 MB    | ##################################################################################################################################### | 100%
ffmpeg-3.4           | 8.0 MB    | ##################################################################################################################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

安装完成后,你可以使用conda list查看该环境下都有哪些包,主要关注以下opencv、 catkin_pkg、 pyyaml、  rospkg

conda list

输出大概是这样的 (我这里多了个opencv-python 3.4.5.20,是我自己手贱安装的)

# packages in environment at /home/communicationgroup/anaconda3/envs/CornerNet_Lite:
#
# Name                    Version                   Build  Channel
blas                      1.0                         mkl  
bzip2                     1.0.6                h14c3975_5  
ca-certificates           2019.1.23                     0  
cairo                     1.14.12              h8948797_3  
catkin-pkg                0.4.12                   pypi_0    pypi
certifi                   2019.3.9                 py37_0  
cffi                      1.11.5           py37he75722e_1  
cuda100                   1.0                           0    pytorch
cycler                    0.10.0                   py37_0  
cython                    0.28.5           py37hf484d3e_0  
dbus                      1.13.2               h714fa37_1  
defusedxml                0.6.0                    pypi_0    pypi
docutils                  0.14                     pypi_0    pypi
empy                      3.3.4                    pypi_0    pypi
expat                     2.2.6                he6710b0_0  
ffmpeg                    3.4                  h7985aa0_0  
fontconfig                2.13.0               h9420a91_0  
freeglut                  3.0.0                hf484d3e_5  
freetype                  2.9.1                h8a8886c_1  
glib                      2.56.2               hd408876_0  
graphite2                 1.3.12               h23475e2_2  
gst-plugins-base          1.14.0               hbbd80ab_1  
gstreamer                 1.14.0               hb453b48_1  
harfbuzz                  1.8.8                hffaf4a1_0  
hdf5                      1.10.2               hba1933b_1  
icu                       58.2                 h9c2bf20_1  
intel-openmp              2019.0                      118  
jasper                    2.0.14               h07fcdf6_1  
jpeg                      9b                   h024ee3a_2  
kiwisolver                1.0.1            py37hf484d3e_0  
libedit                   3.1.20170329         h6b74fdf_2  
libffi                    3.2.1                hd88cf55_4  
libgcc-ng                 8.2.0                hdf63c60_1  
libgfortran-ng            7.3.0                hdf63c60_0  
libglu                    9.0.0                hf484d3e_1  
libopencv                 3.4.1                h8fa1ad8_3  
libopus                   1.2.1                hb9ed12e_0  
libpng                    1.6.35               hbc83047_0  
libprotobuf               3.5.2                h6f1eeef_0  
libstdcxx-ng              8.2.0                hdf63c60_1  
libtiff                   4.0.9                he85c1e1_2  
libuuid                   1.0.3                h1bed415_2  
libvpx                    1.7.0                h439df22_0  
libxcb                    1.13                 h1bed415_1  
libxml2                   2.9.8                h26e45fe_1  
matplotlib                3.0.2            py37h5429711_0  
mkl                       2018.0.3                      1  
mkl_fft                   1.0.6            py37h7dd41cf_0  
mkl_random                1.0.1            py37h4414c95_1  
ncurses                   6.1                  hf484d3e_0  
netifaces                 0.10.9                   pypi_0    pypi
ninja                     1.8.2            py37h6bb024c_1  
numpy                     1.15.4           py37h1d66e8a_0  
numpy-base                1.15.4           py37h81de0dd_0  
olefile                   0.46                     py37_0  
opencv                    3.4.1            py37h6fd60c2_3  
opencv-python             3.4.5.20                 pypi_0    pypi
openssl                   1.1.1b               h7b6447c_1  
pcre                      8.42                 h439df22_0  
pillow                    5.2.0            py37heded4f4_0  
pip                       19.1                     pypi_0    pypi
pixman                    0.34.0               hceecf20_3  
py-opencv                 3.4.1            py37h8fa1ad8_3  
pycparser                 2.18                     py37_1  
pyparsing                 2.2.0                    py37_1  
pyqt                      5.9.2            py37h05f1152_2  
python                    3.7.1                h0371630_3  
python-dateutil           2.7.3                    py37_0  
pytorch                   1.0.0           py3.7_cuda10.0.130_cudnn7.4.1_1  [cuda100]  pytorch
pytz                      2018.5                   py37_0  
pyyaml                    5.1                      pypi_0    pypi
qt                        5.9.7                h5867ecd_1  
readline                  7.0                  h7b6447c_5  
rospkg                    1.1.9                    pypi_0    pypi
scikit-learn              0.19.1           py37hedc7406_0  
scipy                     1.1.0            py37hfa4b5c9_1  
setuptools                40.2.0                   py37_0  
sip                       4.19.8           py37hf484d3e_0  
six                       1.11.0                   py37_1  
sqlite                    3.25.3               h7b6447c_0  
tk                        8.6.8                hbc83047_0  
torchvision               0.2.1                    py37_1    pytorch
tornado                   5.1              py37h14c3975_0  
tqdm                      4.25.0           py37h28b3542_0  
wheel                     0.31.1                   py37_0  
xz                        5.2.4                h14c3975_4  
zlib                      1.2.11               ha838bed_2  

 5)从源码编译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,测试通过,管他呢,或许Python3都可以)

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

注意,这里直接下载到了src/目录下,所以不用先cd src/

 

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

gedit  src/vision_opencv/cv_bridge/CMakeLists.txt

将第11行的

find_package(Boost REQUIRED python3)

修改为

find_package(Boost REQUIRED python-py35)

修改src/vision_opencv/cv_bridge/setup.py第1行内容(话说这样才会在执行的时候使用Python3???)

gedit 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

此处使用catkin build编译cv_bridge包,并source了一下setup.bash,让系统知道cv_bridge要用咱们这里这个。

这时可以简单测试以下能不能用

python

Python 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
>>> 

不报错或许就是莫得问题啦,那就开始写代码吧

8.1.3 来个test_ros.py脚本测试测试

cd src/CornerNet-Lite/
gedit test_ros.py 

test_ros.py内容如下

#!/usr/bin/env python3
#!coding=utf-8

import sys
import rospy

from std_msgs.msg import String
from sensor_msgs.msg import Image 
from cv_bridge import CvBridge, CvBridgeError

import cv2
print("cv2.__version__: ", cv2.__version__) 

from core.detectors import CornerNet_Saccade
from core.vis_utils import draw_bboxes

def callback(data):
    global  count, bridge, detector
    count += 1
    if count ==1:
        count = 0
        cv_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():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('image_pro',anonymous=True)

    global count,bridge,detector
    detector = CornerNet_Saccade()
    count = 0
    bridge = CvBridge()
    rospy.Subscriber("/kinect2/qhd/image_color_rect", Image, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    image_pro()

注意:

第一行 #!/usr/bin/env python3  很重要

请修改订阅图像信息的话题名,我这儿使用的Kinect2

rospy.Subscriber("/kinect2/sd/image_color_rect", Image, callback)

8.1.4 run起来,go!go!go!

新开一个终端,运行roscore

roscore

再新开一个终端,运行相机节点(这里使用Kinect2)

rosrun kinect2_bridge kinect2_bridge

在之前那个激活了CornerNet_Lite环境的终端下运行test_ros.py

./test_ros.py 

或者

python test_ros.py 

终端输出大概是这样的

cv2.__version__:  3.4.5
total parameters: 116969339
loading from /home/communicationgroup/py3_ws/src/CornerNet-Lite/core/../cache/nnet/CornerNet_Saccade/CornerNet_Saccade_500000.pkl
/home/communicationgroup/anaconda3/envs/CornerNet_Lite/lib/python3.7/site-packages/torch/nn/functional.py:2423: UserWarning: Default upsampling behavior when mode=bilinear is changed to align_corners=False since 0.4.0. Please specify align_corners=True if the old behavior is desired. See the documentation of nn.Upsample for details.
  "See the documentation of nn.Upsample for details.".format(mode))

嘻嘻,稍等片刻,画面出现了,感谢刚哥友情出镜

效果不错啊,框出来这么多,美中不足就是有点卡。卡。卡。

 

8.1.5 出错总结:

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 

-------------------------------------------------------------我是分割线--------------------------------------------------------------------

2019/4/28更新:

8.2 既然得到了目标的框框,那就发布出来吧,以待后续工程中能够应用

8.2.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.txtpackage.xml

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

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

BoundingBox.msg 中写入如下内容

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

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

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

gedit BoundingBoxes.msg 

BoundingBoxes.msg 内容如下

Header header
BoundingBox[] bounding_boxes

意思就是里面有很多BoundingBox,存在数组(或者叫列表)中。

3)接下来就是修改修改CMakeLists.txtpackage.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 COMPONENTS
  roscpp 
  rospy 
  message_generation
  actionlib_msgs
  message_runtime
  sensor_msgs
  std_msgs
)

# find_package(Boost REQUIRED COMPONENTS system)

add_message_files(
   FILES
   BoundingBox.msg
   BoundingBoxes.msg
 )

generate_messages(
   DEPENDENCIES
   actionlib_msgs
   sensor_msgs
   std_msgs
 )

catkin_package(
  CATKIN_DEPENDS 
  actionlib_msgs 
  message_runtime
  sensor_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 workspace `/home/communicationgroup/py3_ws` is already initialized. No action taken.
--------------------------------------------------------------------------------
Profile:                     default
Extending:          [cached] /home/communicationgroup/catkin_ws/devel:/home/communicationgroup/rgbdslam2_catkin_ws/devel:/opt/ros/kinetic
Workspace:                   /home/communicationgroup/py3_ws
--------------------------------------------------------------------------------
Build Space:        [exists] /home/communicationgroup/py3_ws/build
Devel Space:        [exists] /home/communicationgroup/py3_ws/devel
Install Space:      [exists] /home/communicationgroup/py3_ws/install
Log Space:          [exists] /home/communicationgroup/py3_ws/logs
Source Space:       [exists] /home/communicationgroup/py3_ws/src
DESTDIR:            [unused] None
--------------------------------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        merged
--------------------------------------------------------------------------------
Additional CMake Args:       -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
--------------------------------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
--------------------------------------------------------------------------------
Workspace configuration appears valid.
--------------------------------------------------------------------------------

他说我已经initialized。。。(或许不必执行catkin init???)

既然这样,那就直接编译吧

catkin build cornernet_ros_msgs

 终端输出大概是这样的

--------------------------------------------------------------------------------
Profile:                     default
Extending:          [cached] /home/communicationgroup/catkin_ws/devel:/home/communicationgroup/rgbdslam2_catkin_ws/devel:/opt/ros/kinetic
Workspace:                   /home/communicationgroup/py3_ws
--------------------------------------------------------------------------------
Build Space:        [exists] /home/communicationgroup/py3_ws/build
Devel Space:        [exists] /home/communicationgroup/py3_ws/devel
Install Space:      [exists] /home/communicationgroup/py3_ws/install
Log Space:          [exists] /home/communicationgroup/py3_ws/logs
Source Space:       [exists] /home/communicationgroup/py3_ws/src
DESTDIR:            [unused] None
--------------------------------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        merged
--------------------------------------------------------------------------------
Additional CMake Args:       -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
--------------------------------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
--------------------------------------------------------------------------------
Workspace configuration appears valid.
--------------------------------------------------------------------------------
[build] Found '5' packages in 0.0 seconds.                                     
Starting  >>> cornernet_ros_msgs                                               
Finished  <<< cornernet_ros_msgs                [ 0.8 seconds ]                
[build] Summary: All 1 packages succeeded!                                     
[build]   Ignored:   4 packages were skipped or are blacklisted.               
[build]   Warnings:  None.                                                     
[build]   Abandoned: None.                                                     
[build]   Failed:    None.                                                     
[build] Runtime: 0.9 seconds total. 

我们最喜欢看到的就是succeed!

6) 敲代码,敲代码,把框框发布出去(只需要对前面的test_ros.py稍作修改)

暂且命名为test_ros1.py吧,内容如下,且放在py3_ws/src/CornerNet-Lite/目录下

#!/usr/bin/env python3
#!coding=utf-8

import sys
import numpy as np

import rospy

from 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 BoundingBox

import cv2
print("cv2.__version__: ", cv2.__version__) 

from core.detectors import CornerNet_Saccade
from core.vis_utils import draw_bboxes


def pub_bboxes(bboxes, thresh=0.5):
    """Public bounding boxes msgs.

    Args:
        bboxes: A dictionary representing bounding boxes of different object
            categories, where the keys are the names of the categories and the
            values are the bounding boxes. The bounding boxes of category should be
            stored 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 threshold
            will be drawn.

    Returns:
        None
    """  
    global pub
    bboxes_msg = BoundingBoxes()
    
    for cat_name in bboxes:
        keep_inds = bboxes[cat_name][:, -1] > thresh
             
        for bbox in bboxes[cat_name][keep_inds]:
            bbox_msg = BoundingBox( str(cat_name),             #class name
                                    bbox[-1].astype(np.float), #prab
                                    bbox[0].astype(np.int32),  #x1
                                    bbox[1].astype(np.int32),  #y1
                                    bbox[2].astype(np.int32),  #x2
                                    bbox[3].astype(np.int32))  #y2
                                                 
            bboxes_msg.bounding_boxes.append(bbox_msg) 
    # print(bboxes_msg)
    pub.publish(bboxes_msg) 



def callback(data):
    global  count, bridge, detector
    count += 1
    if count ==1:
        count = 0
        cv_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():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('image_pro',anonymous=True)
    
    global count,bridge,detector,pub
    detector = CornerNet_Saccade()
    count = 0
    bridge = CvBridge()
    rospy.Subscriber("/kinect2/qhd/image_color_rect", Image, callback)
    pub = rospy.Publisher('boundingboxes',BoundingBoxes,queue_size=10)
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    image_pro()

7)试一试,看看消息能发布出来不(看看程序能跑不)

先激活CornerNet_Lite环境,并source一下工作空间

cd py3_ws/src/CornerNet-Lite
conda activate CornerNet_Lite
source ../../devel/setup.bash 

运行test_ros1.py(假设你已经启动了roscore 和相机节点,参考8.1.4节)

./test_ros1.py 

 东西框出来了,那消息发布出去了么?那就rostopic list看一看

新开一个终端

rostopic list 

这是终端会输出ROS发布的所有消息,我的大概是这样的,很棒,第一个就是我们需要的

communicationgroup@Z370:~/py3_ws/src/CornerNet-Lite$ rostopic list 
/boundingboxes
/kinect2/cap/camera_info
/kinect2/cap/cap_bgr
/kinect2/cap/cap_bgr/compressed
/kinect2/cap/cap_mono
/kinect2/cap/cap_mono/compressed
/kinect2/hd/camera_info
/kinect2/hd/image_color
/kinect2/hd/image_color/compressed
/kinect2/hd/image_color_rect
/kinect2/hd/image_color_rect/compressed
/kinect2/hd/image_depth_rect
/kinect2/hd/image_depth_rect/compressed
/kinect2/hd/image_mono
/kinect2/hd/image_mono/compressed
/kinect2/hd/image_mono_rect
/kinect2/hd/image_mono_rect/compressed
/kinect2/qhd/camera_info
/kinect2/qhd/image_color
/kinect2/qhd/image_color/compressed
/kinect2/qhd/image_color_rect
/kinect2/qhd/image_color_rect/compressed
/kinect2/qhd/image_depth_rect
/kinect2/qhd/image_depth_rect/compressed
/kinect2/qhd/image_mono
/kinect2/qhd/image_mono/compressed
/kinect2/qhd/image_mono_rect
/kinect2/qhd/image_mono_rect/compressed
/kinect2/sd/camera_info
/kinect2/sd/image_color_rect
/kinect2/sd/image_color_rect/compressed
/kinect2/sd/image_depth
/kinect2/sd/image_depth/compressed
/kinect2/sd/image_depth_rect
/kinect2/sd/image_depth_rect/compressed
/kinect2/sd/image_ir
/kinect2/sd/image_ir/compressed
/kinect2/sd/image_ir_rect
/kinect2/sd/image_ir_rect/compressed
/rosout
/rosout_agg

再用rostopic echo /boundingboxes 看看里面具体是些啥

communicationgroup@Z370:~/py3_ws/src/CornerNet-Lite$ rostopic echo /boundingboxes 
ERROR: Cannot load message class for [cornernet_ros_msgs/BoundingBoxes]. Are your messages built?

哎呀,看到ERROR就尴尬了!其实这都是小问题啦,因为新开这个终端没有source工作空间,他怎么理解我们自己定义的消息呢,那就source一下

source ~/py3_ws/devel/setup.bash 

然后再echo

rostopic echo /boundingboxes 

终端输出大概是这样的

communicationgroup@Z370:~/py3_ws/src/CornerNet-Lite$ rostopic echo /boundingboxes 
header: 
  seq: 1
  stamp: 
    secs: 0
    nsecs:         0
  frame_id: ''
bounding_boxes: 
  - 
    class_: "bottle"
    prob: 0.650504469872
    x1: 1
    y1: 300
    x2: 43
    y2: 444
  - 
    class_: "bottle"
    prob: 0.597384572029
    x1: 123
    y1: 310
    x2: 154
    y2: 381
  - 
    class_: "cup"
    prob: 0.739920139313
    x1: 94
    y1: 379
    x2: 182
    y2: 472
  - 
    class_: "chair"
    prob: 0.736968696117
    x1: 719
    y1: 368
    x2: 917
    y2: 536
  - 
    class_: "tv"
    prob: 0.689738988876
    x1: 283
    y1: 246
    x2: 428
    y2: 350
  - 
    class_: "mouse"
    prob: 0.543673157692
    x1: 381
    y1: 388
    x2: 423
    y2: 408
  - 
    class_: "keyboard"
    prob: 0.587634801865
    x1: 228
    y1: 386
    x2: 369
    y2: 427
  - 
    class_: "book"
    prob: 0.500504910946
    x1: 501
    y1: 291
    x2: 590
    y2: 306
---

没错,这就是我们想要的。以后具体应用的时候,还是该把Header加上,这样就可以根据时间戳等信息知道这些框框对应哪一帧图像的。

最后备注:

代码中detector=CornerNet_Saccade(),是否可以改一改呀?不是有三个models嘛,这个就留给大家去探索吧(悄悄告诉大家,CornerNet_Squeeze很快哦

那就这样吧,本篇博客正式完结。

参考链接:

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

https://stackoverflow.com/questions/49221565/unable-to-use-cv-bridge-with-ros-kinetic-and-python3?rq=1

https://community.bwbot.org/topic/499/%E5%9C%A8ros%E4%B8%AD%E4%BD%BF%E7%94%A8python3

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试CornerNet-Lite进行目标识别并嵌入ROS 的相关文章

  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • 在 Visual Studio C++ 2008 中包含 dll

    有没有办法将 dll 包含在项目中 这样我就不必在编译后将这些 dll 与可执行文件放在同一文件夹中 这样我就可以用它们编译我的项目 这是否有可能 如果是 有人可以指导我 我的项目是一个 opencv 项目 有很多 dll 我必须包含在文件
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u
  • opencv_contrib编译错误:类没有成员

    我必须实现 SURF 算法来进行图像拼接 我在使用列出的库时遇到了问题here https stackoverflow com questions 33560251 opencv 3 0 0 ubuntu 14 04 nonfree non
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 未加载库:@rpath/libopenblasp-r0.2.19.dylib

    我应该如何解决这个问题 Monas MacBook Pro 02 02 mona python Python 3 6 1 Anaconda custom x86 64 default May 11 2017 13 04 09 GCC 4 2
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 将图像加载到现有 Mat 中

    有没有办法将图像加载到现有的 Mat 中 如果没有 有没有办法控制 OpenCV 在调用 cv imread 时分配内存的位置 我只是为您的类创建一个构造函数 该构造函数接受 imread 的输入参数并将图像直接加载 并分配 到您的类中 所
  • 相机校准:如何正确进行

    我正在尝试使用棋盘格通过众所周知的张氏方法进行校准 然后进行捆绑调整 该方法在 Matlab 和 OpenCV 中都可用 有很多经验指南 但从我个人的经验来看 准确性是相当随机的 它有时可能非常好 但有时也可能非常糟糕 实际上 只需将棋盘放
  • Alpha 混合可消除图像中的接缝

    我缝合了两张图像 但在最终图像中存在可见的接缝 我正在尝试使用阿尔法混合去除那条接缝 我知道 Alpha 混合是使用cvAddweight 函数 但在此函数参数是两个图像 alpha beta gamma和目的地 我正在服用gamma 0
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca
  • OpenCV 地板分割检测

    我正在研究一种检测图像中地板的方法 我试图通过将图像缩小为颜色区域然后假设最大区域是地板来实现此目的 我们对机器人的运行环境做出一些相当广泛的假设 我正在寻找一些关于适合这个问题的算法的建议 任何帮助将不胜感激 编辑 具体来说 我正在寻找一
  • OpenCV 中的 Canny 可以同时处理灰度图像和彩色图像吗?

    我有一些关于Canny 边缘检测器 in OpenCV 这是我尝试过的代码 def auto canny image sigma 0 33 v np median image lower int max 0 1 0 sigma v uppe
  • HTC One M8 - 使用第二个后置摄像头

    我有一台 HTC One M8 设备 它有 2 个后置摄像头和一个额外的前置摄像头 我的问题是尝试访问第二个后置摄像头 我已经成功制作了一个应用程序 它同时运行 2 个摄像头 1 个前置摄像头和 1 个后置摄像头 但问题是我无法访问第二个后
  • OpenCV findContours() 仅返回一个外部轮廓

    我试图隔离验证码中的字母 我设法过滤验证码 结果是这个黑白图像 但是当我尝试使用 OpenCV 的 findContours 方法分离字母时 它只是发现了一个包裹整个图像的外部轮廓 从而产生了该图像 图像外部的黑色轮廓 我将此代码与 Pyt
  • 如何计算 cv::Mat 的步幅

    我想知道如何计算步幅cv Mat 我已经更新了代码 我需要计算步幅 我不知道计算投影变换有什么问题 我得到一个cv Mat然后将其复制到unsigned int数组 然后对其进行转换 然后返回一个cv Mat待展示 cv Mat3b src
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中

随机推荐

  • 如何在Jenkins构建完代码后,能够查看HTML Report?

    有同学说想要在Jenkins构建完代码后就能查看构建后的结果报告 不知道怎么配置 这里我详细的说明一下步骤 对于想学习的同学有很大帮助 本次说明仅针对 python3 request unittest框架的案例作详细说明 想要完成这项配置过
  • paxos之Multi-Paxos

    paxos之Multi Paxos 朴素Paxos算法的Latency很高 Multi Paxos通过改变Promised的生效范围至全局的Instance 收到来自其他节点的Accept 则进行一段时间的拒绝提交请求 从而使得一些唯一节点
  • MySQL数据表的操作

    数据表操作 在MySQL数据库中 表是一种很重要的数据库对象 是组成数据库的基本元素 由若干个字段组成 主要用来实现存储数据记录 表的操作包含创建表 查询表 修改表和删除表 这些操作是数据库对象的表管理中最基本也是最重要的操作 表的创建 基
  • 架构设计方法学

    架构设计的方法学 约公元前25年 古罗马建筑师维特鲁威说 理想的建筑师应该既是文学家又是数字家 他还应通晓历史 热衷于哲学研究 精通音乐 懂得医药知识 具有法学造诣 深谙天文学及天文计算 好难哪 软件构架设计师的要求呢 大家好好想想吧 本文
  • 深入学习jquery源码之Deferred对象与holdReady()

    深入学习jquery源码之Deferred对象与holdReady jQuery的Deferred对象也有resolve reject then方法 还有done fail always 方法 jQuery就是用这个Deferred对象来注
  • 超级计算机使用机时,使用天河二号超级计算机资源申请表(10页).doc

    使用天河二号超级计算机资源申请表 10页 使用天河二号超级计算机资源申请表 Tianhe 2 Supercomputer Resource Application Form 填表日期 年 月 日 Date of Application 单位
  • 盛高会员系统服务器启动不了,盛高会员管理系统实用操作指南

    一 盛高小小系列软件介绍 二 盛高会员管理系统操作指引 1 安装盛高会员管理系统软件 单机应用须安装数据服务器和软件客户端 局域网应用主机安装数据服务器和客户端 分机只安装客户端 互联网应用总部安装数据服务器和客户端 分店分机只安装客户端
  • 数据分析实战(二) 基于美国人口adult数据集R语言分析实战

    目录 一 数据集介绍 二 数据预处理 三 描述型统计分析 四 机器学习及模型比较 一 数据集介绍 数据来源于UCI数据库 网址为adult数据集 下载下来是dat文件 可以用txt文本打开 该数据集共32560条数据 15个变量 具体变量名
  • #python 输入三条边的长度,判断这几条边是否能组成三角形

    python 输入三条边的长度 判断这几条边是否能组成三角形 问题描述 输入三角形的三条边 判断该三角形的形状 周长 面积和每条边的高 第一步 导入所需要的库math import math 第二步 判断此三条线段是否能组成三角形 判断条件
  • JSP数据交互(一)---内置对象》application:

    JSP数据交互 一 内置对象 application application实现用户之间的数据共享 application对象常用方法 applicatiion常用方法 方法名称 说明 void 色图Attribute String key
  • pandas读取Excel file

    Pandas read excel 参数 pandas read excel io sheet name 0 header 0 names None index col None usecols None squeeze False dty
  • Oracle + MyBatis 3 实现批量新增/修改

    批量新增Mapper 定义 public interface BaseHouseMapper 批量新增Mapper 定义 void batchInsert Param list List
  • git 查看该项目在git的具体地址

    在终端输入如下命令 git remote v 结果如下 上图显示的是该项目的git地址
  • 【Python】Pycharm连接云服务器的MySQL数据库详细步骤

    Pycharm连接数据库 MySQL 云服务器 准备阶段 pycharm的配置 服务器配置 问题汇总 准备阶段 准备阶段 pycharm正确运行环境 服务器一枚 pycharm直接官网下载 我是用的2020 3 2版本 服务器是腾讯云的免费
  • 关于android的WebView

    android webkit库聚合了webkit内核的浏览器功能 webview就是她的一个控件 可以使得网页轻松的内嵌到app里 并且比较强大的是 还可以直接跟js相互调用 webview有两个方法 setWebChromeClient和
  • flutter设置状态栏颜色

    Android flutter SystemUiOverlayStyle systemUiOverlayStyle SystemUiOverlayStyle statusBarColor Colors transparent SystemC
  • C语言程序设计之猜数字游戏(随机数的讲解)

    游戏玩法 电脑随机生成一个随机数 1 100之间 玩家根据提示进行猜测 直到猜对为止 相关知识点 分支与循环 随机数的生成 时间戳 标准输入输出 强制类型转换等 时间戳和随机数的生成将在本篇blog中重点讲解 其他知识点在其他blog中有重
  • 关于视频自动截取封面_ ffmpeg

    后台富文本框内 插入视频后 保存信息时 对视频封面处理 ffmpeg下载地址 创建bat文件 如以下关于bat文件的内容 start C Users 83469 Desktop ffmpeg 20180310 2536bd8 win64 s
  • Android 虚拟机简单介绍——ART、Dalvik、启动流程分析

    Android 虚拟机方面的知识 我是通过 深入理解 Android 内核设计思想 来学习的 内容特别多 只有一章 但有 160 页 感觉和 Android 开发有些偏 因此很多内容都没有认真去看 比如 EFL 格式等 这里只是选取了一些感
  • 尝试CornerNet-Lite进行目标识别并嵌入ROS

    CornerNet Lite是刚开源不久的实时目标检测方法 据说比YOLO3 牛逼 于是打算尝鲜一波 首先说运行的环境要求 1 Python 3 7 2 PyTorch 1 0 0 3 CUDA 10 意思是你得有一张NVIDIA的显卡 比