0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

粒子フィルタを用いた人物追跡のためのデータ同化

Posted at

keras

tensorflowのラッパーであるkerasを用いてセマンティックセグメンテーションをおこなう。

学習環境

OS ubuntu 16.04 LTS
GPU ELSA GeForce GTX 1070 8GB S.A.C

使用データ

実装

# coding:utf-8
# Plan-Actionモデル
import numpy as np
import cv2
import cnf
import math
import h
import h_inv
from submain import Particle
from submain import Rect
import submain
import os.path
import argparse
import sys
from multiprocessing import Pool
import skvideo.io

# argvs = sys.argv  # コマンドライン引数を格納したリストの取得
# argc = len(argvs)
# parser = argparse.ArgumentParser()
# parser.add_argument('--model', type=str, required=True)
# parser.add_argument('--prob', type=str, required=True)
# parser.add_argument('--fluc', type=float, required=True)
# parser.add_argument('--Dnum', type=int, required=True)

# args = parser.parse_args()

Dataset = 1
img_h = 576
img_w = 720
rect_h = 50
rect_w = 50
v_mean = 0.7
v_std = 0.1

# ---------------------------------------------------------------テストデータ(停止している歩行者を除いたもの)
pedestrian_list = []
move_ped = np.loadtxt("Dataset_Hotel/move_ped.txt")
for i in range(len(move_ped)):
	if move_ped[i] > 320:
		pedestrian_list.append(move_ped[i])
		if move_ped[i] > 420:
			break
pedestrian_list = map(int,pedestrian_list)
# print pedestrian_list
# ----------------------------------------------------------------
obs = np.loadtxt("Dataset_Hotel/obsmat.txt")#歩行者データ
dest = np.loadtxt("Dataset_Hotel/destinations.txt")#目的地データ


# flag=1	
def Tracking(pedestrian):
# for pedestrian in pedestrian_list:
# for pedestrian in [100]:
	# print "a"

	proposed = []#描画用
	overlaprate_list = []#オーバーラップ計算用
		
	print ("=====ID"+str(pedestrian)+"=====")
	obs_true = np.loadtxt("Dataset_Hotel/ID_data/ID_%04d"%pedestrian+".txt")#ID別歩行者データの読み込み

	rect = Rect()
	p = []
	for i in range(Particle.PN):
		p.append(Particle())
	p_mean = Particle()

	i = 0#対象IDの行番号取得のため
	# fgbg = cv2.BackgroundSubtractorMOG2()# 背景差分計算用オブジェクトの生成
	fgbg = cv2.createBackgroundSubtractorMOG2()
	cap = cv2.VideoCapture("home/nakaishi/tracking/Dataset_Hotel/seq.avi")
	# cap = skvideo.io.VideoCapture("Dataset_Hotel/seq.avi")
	ret, frame = cap.read()
	# cap = cv2.VideoCapture(0)

	print(cap.isOpened())
	# print(cap)
	# if flag==0:
		# break
	cap.set(cv2.CAP_PROP_POS_MSEC,obs_true[0,0]/25.0*1000.0)#動画開始地点を指定


	while(cap.isOpened()):#qを押してカメラをreleaseしないと次回起動しなくなる
		frame_num = cap.get(cv2.CAP_PROP_POS_FRAMES)
		print("a")
		# print cap.get(0)

		# cap.set(0,obs_true[0,0]/25.0*1000.0)
		ret, img_src = cap.read()
		img_dst = img_src

		#---------------------------------------------------------------------------背景差分
		fgmask = fgbg.apply(img_src, learningRate=0.01)
		img_dst = img_src.copy()
		img_dst = cv2.bitwise_and(img_src, img_src, mask=fgmask)
		#----------------------------------------------------------------------------------
		
		rect.y,rect.x = int(np.round(h_inv.h_inv(obs_true[1,2],obs_true[1,4])[0])),int(np.round(h_inv.h_inv(obs_true[1,2],obs_true[1,4])[1]))
		rect.y = int(np.round(rect.y))
		rect.x = int(np.round(rect.x))
		rect.h = rect_h
		rect.w = rect_w
		y = np.round(rect.y-rect_h/2)
		x = np.round(rect.x-rect_w/2)

		if frame_num >= obs_true[0,0]:#動画のはじめから
			if i < obs_true.shape[0] and obs_true[i,0] == frame_num:
				if rect.selectObject and obs_true[1,0] == frame_num:
					hsv_img = cv2.cvtColor(img_dst, cv2.COLOR_BGR2HSV)
					tmp_hist,hist_x,hist_y = rect.CalcHSVHist_tmp(x, y, rect.w, rect.h, hsv_img)
					
					roi_img = img_dst[rect.y-rect.h/2:rect.y+rect.h/2,rect.x-rect.w/2:rect.x+rect.w/2]
					rect.bx,rect.by = obs_true[1-1,2],obs_true[1-1,4]
					rect.x,rect.y = obs_true[1,2],obs_true[1,4]
					rect.selectObject = False

				if rect.trackObject==True and rect.startTracking==False and frame_num == obs_true[1,0]:
						rect.InitParticleSet(p)
						rect.startTracking = True

				if rect.startTracking==True:
					rect.PredictionParticleSet(p, frame_num, img_dst, v_mean, v_std,obs_true)
					rect.CalcParticleWeight(p, img_dst, tmp_hist, hist_x, hist_y, frame_num)
					rect.ResampleParticleSet(p)
					rect.CalcMeanParticleSet(p, p_mean)
					
					# rect.DrawParticleSet(p, p_mean,obs_true[i], img_dst)
					rect.CalcOverlap(p_mean,obs_true[i],overlaprate_list)
					# rect.changeVelocity(p)
					# rect.DrawLocus(img_dst,p_mean,obs_true[i],i,pmlist,pmlist_random,obslist,Model)

				i+=1

				# cv2.imshow("Movie",img_dst)
				# if cv2.waitKey(10) & 0xFF == ord('q'):
					# flag = 0
					# break

		if frame_num == obs_true[obs_true.shape[0]-1,0]:#対象のデータ取得が終了
			break

	cap.release()
	cv2.destroyAllWindows()
	# print overlaprate_list

	return overlaprate_list

# def hoge():
p = Pool(18) 
o = p.map(Tracking, pedestrian_list) 

ol = []
for i in range(len(o)):
	for j in range(len(o[i])):
		ol.append(o[i][j])
# print o.dtype
# hoge()
# print len(o),o[0],len(o[1]),len(o[2])

# np.savetxt("overlap_test.txt",ol)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?