实时目标检测如RCNN,yolo,ssd等都是可行的解决方案,但对于工业目标检测方案落地,一些嵌入式系统架构的硬件性能不能达到这样的高性能计算要求,或者当需要对特定目标进行检测识别时,这时可以采取的方案是检测+跟踪。
不要惊奇我们常用的OpenCV中包含着8种独立的目标检测方法,可以在计算机视觉中进行应用。
OpenCV中的8种目标检测方法
1.BOOSTING Tracker
该算法是基于机器学习汇总我的Haar级联(Adaboost)算法,是一种较为落后的一种方法,比较的慢,性能也不是很好,主要用来做算法的比较和基准。(>opencv3.0.0)
2.MIL Tracker
比boosting具有更好的准确率,但是存在报错的几率。(>opencv3.0.0)
3.KCF Tracker
核相关滤波算法,比上述两种都要快,但是偶然因素下存在失效。(>opencv3.1.0)
4.CSRT Tracker
判别相关滤波算法,具有通道和空间可靠性,比KCF准确率更高,但是相对慢。(>opencv3.4.2)
5.MedianFlow Tracker
失效性能良好,然后如果目标变动过大,如移动过快,容易丢失目标。(>opencv3.0.0)
6.TLD Tracker
有一定的假正率,不推荐使用该种OpenCV目标跟踪方法。
7.MOSSE Tracker
非常非常快,但是准确率没有CSRT和KCF高,如果对帧率要求很高,这是可行的方法。
8.GOTURN Tracker
这种唯一一个使用深度学习的OpenCV的方法。需要额外的模型文件caffe网络结构文件caffemode+prototext,并且基于caffe框架。
先给建议,再给实操。
使用CSRT当需要非常高的跟踪准确率。并且可以容忍慢一些的帧率。
使用KCF,当需要较快的FPS,但同时能够容忍轻微弱的准确率。
使用MOSSE,当需要非常高的FPS。
opencv_object_tracker.py
from imutils.video import VideoSteram
from imutils.video import FPS
import argparse
import imutils
import time
import cv2
#pip install --upgrade imutils
ap = argparse.ArgumentParse()
ap.add_argument("-v", "--video", type=str, help="path to input video files"
ap.add_argument("-t", "--tracker", type=str, default="kcf", help="opencv object tracker type")
args = vars(ap.parse_args())
(major, minor) = cv2.__version__.split(".")[:2]
if int(majot) ==3 and int(minor) <3:
tracker=cv2.Tracker_create(args["tracker"]).upper()
else:
OPENCV_OBJECT_TRACKERS ={
"csrt":cv2.TrackerCSRT_create,
"kcf":cv2.TrckerCKF_create,
"mil":cv2.TrckerMIL_create,
"tld":cv2.TrckerTLD_create,
"medianflow":cv2.TrackerMedianFlow_create,
"mosse":cv2.TrackerMOSSE_create
}
tarcker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
initBB =None
if not args.get("video", False):
print("[INFO]starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(1.0)
else:
vs = cv2.VideoCapture(arg["vide"])
fps=None
while True:
frame = vs.read()
frame=frame[1] if args.get("video", False) else frame
if frame is None:
break
frame = imutils.resize(frame, width=500)
(H, W) = frame.shape[:2]
if intiBB is not None:
if success:
(x, y, w, h)=[int(v) for v in box]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255,0),2)
fps.update()
fps.stop()
info=[
("Tracker", args["tracker"]),
("Success", "Yes", if success else "No"),
("FPS", "{:.2f}".format(fps.fps())),
]
for (i, (k, v)) in enumerate(info):
text="{}:{}".format(k ,v)
cv2.puttext(frame, text, (10, H - ((i*10) +20)),
cv2.FONT_HERSHEY_SIMPLE, 0.6, (0,0,255),2)
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) && oxff
if key == ord("s"):
initBB =cv2.selectROI("Frame", frame, fromCenter=False, showCrosshair=True)
tracker.init(frame, initBB)
fps == FPS().start()
elif key == ord("q"):
break
if not args.get("video", False):
vs.stop()
else:
vs.release()
cv2.desrtoyAllWindows()
python opecv_object_tracking.py –video 1.mp4 –tracker csrt