将训练好的模型用于视频上的目标检测
前言:一直都是用来检测图片,未来肯定是要应用在视频上,刚好想做个在视频上检测的小demo,不是做跟踪,所以实现起来很简单,只要把视频的每一帧都处理,另存到另一个视频里就可以了。
流程:
- 把已经训练好的模型冻结下来,即得到.pb文件(既包括权重也包括网络结构)
- 利用模型对视频每一帧进行处理并保存
冻结模型
每次保存模型的时候会生成三个文件,其中×××.meta代表网络结构,×××.data 代表权重,要将其存为.pb文件,采用API提供的方法:冻结模型
# From tensorflow/models
python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path ${PIPELINE_CONFIG_PATH} \
--checkpoint_path model.ckpt-${CHECKPOINT_NUMBER} \
--inference_graph_path YOUR_NAME.pb
处理图片
官方的demo:quick start,正是使用.pb模型离线检测图片的例子,写的非常清楚不再赘述
处理视频
我是采用opencv读取视频帧并处理的方式,很简单,直接上代码,这里做的仅仅是把quick start里面检测部分改成了函数的形式:即下面的detect函数
videoCapture = cv2.VideoCapture('video_path')
#获得码率及尺寸
fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS)
size = (int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
int(videoCapture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
#指定写视频的格式, I420-avi, MJPG-mp4
videoWriter = cv2.VideoWriter('video.avi', cv2.cv.CV_FOURCC('I', '4', '2', '0'), fps, size)
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
success, frame = videoCapture.read()
while success:
frame = detect(frame, detection_graph, sess)
cv2.imshow('frame', frame) #显示
cv2.waitKey(1000/int(fps))
videoWriter.write(frame)
success, frame = videoCapture.read()
videoCapture.release()
cv2.destroyAllWindows()
运行程序可以看到训练好的模型处理每一帧的情况,所以如果网络结构能达到实时,那看起来就像放视频,啊,好想有那种效果又好,又能达到实时的结构跑一下,求推荐好的目标检测的tensorflow资源!
另外推荐一个采用另外一个库moviepy对视频做处理的小demo, 用起来比opencv方便一些:基于moviepy的视频检测小demo