YOLO V3检测模型的测试
1.测试命令:
./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3.weights data/person.jpg -thresh 0.4
2.darknet提供的Python接口
python python/darknet.py
(1)报错:
File "python/darknet.py", line 154
print r
^
找到源码报错的地方 print r,原来是语法问题,这是python2的写法,我用的Python3.6,所以简单改下即可
改正: print(r)
(2)报错
Traceback (most recent call last):
File "python/darknet.py", line 48, in <module>
lib = CDLL("libdarknet.so", RTLD_GLOBAL)
File "/home/liuze/anaconda3/lib/python3.6/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: libdarknet.so: cannot open shared object file: No such file or directory
这是链接库问题,改成自己编译出来的so文件的路径即可,源码中第48行
改正:lib = CDLL("/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/libdarknet.so", RTLD_GLOBAL)
(3)报错
Traceback (most recent call last):
File "python/darknet.py", line 151, in <module>
net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
模型没换,要换成自己的模型
改正:
net = load_net("cfg/yolov3.cfg", "/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/backup/yolov3.weights", 0)
换成自己的模型后还是报错,原因是load_net函数会将参数传给libdarknet.so库,而libdarknet.so库是用c/c++来写的,所以出现了这个错误。解决方法是在出错的字符串前面添加一个b就行了
net = load_net(b"cfg/yolov3.cfg", b"/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/backup/yolov3.weights", 0)
meta = load_meta(b"cfg/coco.data")
r = detect(net, meta, b"data/dog.jpg")
再次运行:
python python/darknet.py
我们看下这个结果,首先输出目标名称,接下来是置信度,后面括号中是矩形框的位置信息,前两个是中心点的坐标,后两个是边框的宽和高。
3.上面的结果可视化一下,打开darknet.py并在开头和结尾手动添加代码:
import cv2
import sys, os
import pdb
data = cv2.imread("data/dog.jpg")
for i in range(len(r)):
cv2.rectangle(data, (int(r[i][2][0]-r[i][2][2]/2),int(r[i][2][1]-r[i][2][3]/2)), (int(r[i][2][0]+r[i][2][2]/2),int(r[i][2][1]+r[i][2][3]/2)),(0,255,0),2)
cv2.imshow("image",data)
cv2.waitKey(0)
重新运行命令:
python python/darknet.py
就顺利显示结果以及可视化的图片了,后面还可以把标签自己添加上去,自由发挥吧