The Visionary Researcher

논문 : Click


"Classification of Gait Types Based on The Duty-Factor"

Author : Preben Fihl et al.

(Appearance based approach)


<Key point> 

1. Duty Factor라는 것을 이용해서 걸음걸이의 종류(Walk, Jog, Run)를 분류한다. [1]

(Duty Factor : the fraction of the duration of a stride for which each foot remains on the ground)

(발이 땅에 얼마나 오래동안 붙어있는지 비율을 이용)

(달리는 속도와 Camera setup에 independent, 달리는 속도로 걸음걸이 종류를 분류하는 것이 아님)

2. 실루엣은 Codebook Method에 의해서 추출되고, Shape Contexts에 의해서 표현된다.

3. 실루엣 매칭을 위해서 Hungarian method가 사용된다.


<Introduction 논리 전개>

1. Video Surveilance 분야의 성장과 중요성

2. 주어진 환경에서 Gait Recognition의 연구진행, 여러움 제기

3. 속도가 걸음걸이는 분류하는 기준이 아니다

(달리는 것은 단순히 걷는 것의 속도가 빠른 버전이 아니다)

4. 걸음걸이를 분류하기 위한 Descriptor가 필요하다(Duty factor의 필요성)

5. Duty factor의 정의

6. 실험 database 설명

7. Duty factor의 성능과 장점 명시

8. model based approach 설명(pose estimation 필요, model 추정)

9. 정확한 pose estimation 필요없다. (model free, appearance based)

10. database에서 비슷한 실루엣을 찾고 해당 정보를 이용한다.


<Silhouette Database>

1. 하나의 DB에서 각 걸음걸이 종류 1개씩 생성한다.

2. 애니메이션을 이용하여 생성

3. 총 90개의 실루엣

4. 3대의 카메라 앵글(30도씩 움직이며, 애니메이션으로)


<Silhouette Extraction>

1. Codebook background substraction 사용 [2] [3]


<Silhouette Description>

1. 다리부분만 사용

2. Scale과 translation에 invariant한 descriptor이용

3. Shape Contexts [4] 에 거리로 정규화 적용

4. 실루엣에서 n개의 점과, K개의 bin 존재, 따라서 실루엣당 n * (K+1) matrix 생성


<Silhouette Comparison>

1. 두 실루엣을 x^2 test statistics을 이용하여 매칭점수 계산

2. 두 실루엣에서 각 점간의 cost를 계산(n * n matrix)

3. cost는 n * (K+1) matrix 두개를 이용하여 계산

4. cost matrix에서 총 cost가 최소가 되도록 하는 hungarian matching method 이용


<Duty-Factor Calculation>

1. 발이 땅바닥에 얼마나 오래동안 붙어있는지 비율을 이용

2. 이를 통해서 걸음걸이 분류가 가능

3. Label이라고 생각하면 될듯


<Results>

1. 총 131 seqeunces, 카메라 방향, 움직이는 방향, 해상도 변함, 22명의 사람, 다양한 실루엣 높이 변화

2. n은 100, K는 60, 3종류 분류결과 81.7%


<Discussion>

1. Jog와 run의 모호성

2. 안좋은 성능의 background subtraction, 안좋은 성능의 DB로 인한 오류



Reference

[1] R. Alexander. Energetics and Optimization of Human Walking and Running: The 2000 Raymond Pearl Memorial Lecture. American Journal of Human Biology, 14, 2002.

[2] P. Fihl, R. Corlin, S. Park, T. Moeslund, and M. Trivedi. Tracking of Individuals in Very Long Video Sequences. In Int. Symposium on Visual Computing, Lake Tahoe, Nevada, USA, November 6-8 2006.

[3]  K. Kim, T. Chalidabhongse, D. Harwood, and L. Davis. Real-time Foreground-Background Segmentation using Codebook Model. Real-time Imaging, 11(3):167–256, 2005.

[4] S. Belongie, J. Malik, and J. Puzicha. Shape matching and object recognition using shape contexts. PAMI, 24(4), 2002.

댓글 0

IMAGE_DIM = 256;
mean_im = zeros(IMAGE_DIM, IMAGE_DIM, 3);
num = 0;
for nNumFolder = 0:42
    loadFolder = num2str(nNumFolder, '%05d');
    imgs = dir([loadFolder, '\*.ppm']);
    num_imgs = length(imgs);
    for i = 1 : num_imgs
        im = imread([loadFolder, '\', imgs(i).name]);
        im = im(:, :, [3, 2, 1]);  % permute channels from RGB to BGR
        im = permute(im, [2, 1, 3]);  % flip width and height
        im = single(im);  % convert from uint8 to single
        im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % resize im_data
        mean_im = mean_im + im;
    end
    num = num + num_imgs;
end
mean_im = mean_im / num;


'임시 저장' 카테고리의 다른 글

matcaffe 코드 임시  (0) 2016.05.11

댓글 0

기본 틀 구성 및 DB 다운로드

1. 새로운 폴더 생성

2. Traffic sign dataset 주소 : http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset

3. Training, Test dataset download 후 압축 풀어서 폴더로 이동


The training data set contains 39,209 training images in 43 classes.

The test dataset contains 12,630 test images or the corresponding pre-calculated features in random order.

  • Extended annotations including class ids: Download (98 kB)

4. imagenet example 파일

cp 새로운폴더주소 caffe-dir/example/imagenet/

(create_imagenet.sh, create_imagenet_mean.sh, readme.md, resume_training.sh, train_caffenet.sh)

5. bvlc reference 파일

cp 새로운폴더주소 caffe-dir/models/bvlc_reference_caffenet/train_val.prototxt

cp 새로운폴더주소 caffe-dir/models/bvlc_reference_caffenet/solver.prototxt



LMDB를 이용하여 DB 구성

이유 : caffe에서 data format 3가지

(LMDB, LevelDB, hdf5->matlab사용가능)

LMDB 구성방법 : http://stackoverflow.com/questions/31427094/guide-to-use-convert-imageset-cpp

[create_imagenet.sh 변경]

1. 폴더, 이미지, label txt파일 구성

>새로운 폴더

>>위에에서 다운받은 imagen일et, blvc 총 7개 파일

>>database

>>>images

>>>>train_images

>>>>>train 이미지들

(폴더 안에 보통 여러개의 세부폴더로 클래스가 나뉘면서 존재)

[train db를 옮겨줍니다.]

>>>>test_images

>>>>>test 이미지들

(폴더 안에 일정한 포맷으로 존재)

[test db를 옮겨줍니다.]

>>>labels

>>>>train_labels.txt

(00000.ppm 16 와 같은 포맷으로 구성)

[matlab을 이용하여 txt파일을 구성합니다]

>>>>test_labels.txt

(00000/00000_00000.ppm 0 와 같은 포맷으로 구성)

[matlab을 이용하여 txt파일을 구성합니다]

>>>lmdb

>>>>train_lmdb(절대 만들어 놓지 말 것-오류발생)

>>>>test_lmdb(절대 만들어 놓지 말 것-오류발생)


*.label txt파일 구하는 매틀랩 코드

clear, close all
%%make test DB

%%make train DB
train_dir = dir('./database/images/train_images/');
train_dir(1:2) = [];
train_txt = fopen('train.txt', 'w+');

for i = 1 : length(train_dir)
    temp = train_dir(i).name;
    train_dir1 = dir(['./database/images/train_images/',temp, '/*.ppm']);
    for j = 1 : length(train_dir1)
        fprintf(train_txt, '%s%c%s %d\n', temp,'/',train_dir1(j).name, i-1);
    end
end

fclose(train_txt);

test db는 label과 같이 존재하는 csv파일을 이용하여 바로 구성


2. create_imagenet.sh 수정

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs

EXAMPLE=./database/lmdb
DATA=./database/labels
TOOLS=../caffe-master/build/tools

TRAIN_DATA_ROOT=./database/images/train_images/
VAL_DATA_ROOT=./database/images/test_images/

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi

if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet training data is stored."
  exit 1
fi

if [ ! -d "$VAL_DATA_ROOT" ]; then
  echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet validation data is stored."
  exit 1
fi

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train_labels.txt \
    $EXAMPLE/train_lmdb/

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/test_labels.txt \
    $EXAMPLE/test_lmdb/

echo "Done."

주의 할 점은 RESIZE=true로 바꿀 것(나중에 make_imagenet_mean.sh할 때 오류)

example의 위치는 lmdb 위치(lmdb 내부에 폴더 생성하지 말것)

data의 위치는 label txt파일이 있는 위치

tools의 위치는 원래 caffe-dir로 설정(이 곳에 convert_imageset함수 존재)

모든 이미지를 LMDB형태로 구성합니다.


3. ./create_imagenet.sh 수행




Generate mean file

1. make_imagenet_mean.sh 수정

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12

EXAMPLE=./database/lmdb
DATA=./database/labels
TOOLS=../caffe-master/build/tools

$TOOLS/compute_image_mean $EXAMPLE/train_lmdb \
  $DATA/imagenet_mean.binaryproto

echo "Done."

주의 할 점은 lmdb폴더 내부를 지울 것

또한 이 과정이 지나면 imagenet_mean.binaryproto 파일이 생성된다.


2. ./make_imagenet_mean.sh 수행




Train and Test

1. train_caffenet.sh 수정

#!/usr/bin/env sh

../caffe-master/build/tools/caffe train \
    --solver=./solver.prototxt


2. train_val.prototxt 수정

crop size : 227로 수정

mean_file : 주소 수정

source_file : 주소 수정

num_output : 1000->43(fc8 layer)

(class 43개이므로)

batch_size : 20으로 조정

(nvidia-smi 이용하여 테스트 할 때 gpu memory check하면서

batch size 올릴 수 있으면 올린다)

[한번에 읽어오는 이미지 수]


3. solver.prototxt 수정

base_lr : 0.001 (수렴 안되면 더 낮출걸)

snapshot_prefix : 주소 수정(snapshot 저장)

solver_mode : GPU (CPU로 할거면 CPU)


4. ./train_caffenet.sh



로그 저장하는 방법

./train_caffenet.sh 2>&1 | tee -a path/to/text/log/file.txt



Matcaffe 이용한 Test class accuracy

1. compile matcaffe wrapper

cd caffe-dir

sudo gedit Makefile.config

-> MATLAB_DIR := /home/seokeon/MATLAB/R2015b

mat all matcaffe

make mattest

matlab

2. 데모 실행

caffe-master/matlab/demo/classification_demo.m 이용하여 수정

function [scores, maxlabel] = classification_demo(im, use_gpu)
% [scores, maxlabel] = classification_demo(im, use_gpu)
%
% Image classification demo using BVLC CaffeNet.
%
% IMPORTANT: before you run this demo, you should download BVLC CaffeNet
% from Model Zoo (http://caffe.berkeleyvision.org/model_zoo.html)
%
% ****************************************************************************
% For detailed documentation and usage on Caffe's Matlab interface, please
% refer to Caffe Interface Tutorial at
% http://caffe.berkeleyvision.org/tutorial/interfaces.html#matlab
% ****************************************************************************
%
% input
%   im       color image as uint8 HxWx3
%   use_gpu  1 to use the GPU, 0 to use the CPU
%
% output
%   scores   1000-dimensional ILSVRC score vector
%   maxlabel the label of the highest score
%
% You may need to do the following before you start matlab:
%  $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda-5.5/lib64
%  $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
% Or the equivalent based on where things are installed on your system
%
% Usage:
%  im = imread('../../examples/images/cat.jpg');
%  scores = classification_demo(im, 1);
%  [score, class] = max(scores);
% Five things to be aware of:
%   caffe uses row-major order
%   matlab uses column-major order
%   caffe uses BGR color channel order
%   matlab uses RGB color channel order
%   images need to have the data mean subtracted

% Data coming in from matlab needs to be in the order
%   [width, height, channels, images]
% where width is the fastest dimension.
% Here is the rough matlab for putting image data into the correct
% format in W x H x C with BGR channels:
%   % permute channels from RGB to BGR
%   im_data = im(:, :, [3, 2, 1]);
%   % flip width and height to make width the fastest dimension
%   im_data = permute(im_data, [2, 1, 3]);
%   % convert from uint8 to single
%   im_data = single(im_data);
%   % reshape to a fixed size (e.g., 227x227).
%   im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');
%   % subtract mean_data (already in W x H x C with BGR channels)
%   im_data = im_data - mean_data;

% If you have multiple images, cat them with cat(4, ...)

% Add caffe/matlab to you Matlab search PATH to use matcaffe
if exist('../+caffe', 'dir')
  addpath('..');
else
  error('Please run this demo from caffe/matlab/demo');
end

% Set caffe mode
if exist('use_gpu', 'var') && use_gpu
  caffe.set_mode_gpu();
  gpu_id = 0;  % we will use the first gpu in this demo
  caffe.set_device(gpu_id);
else
  caffe.set_mode_cpu();
end

% Initialize the network using BVLC CaffeNet for image classification
% Weights (parameter) file needs to be downloaded from Model Zoo.
model_dir = '../../models/bvlc_reference_caffenet/';
net_model = [model_dir 'deploy.prototxt'];
net_weights = [model_dir 'bvlc_reference_caffenet.caffemodel'];
phase = 'test'; % run with phase test (so that dropout isn't applied)
if ~exist(net_weights, 'file')
  error('Please download CaffeNet from Model Zoo before you run this demo');
end

% Initialize a network
net = caffe.Net(net_model, net_weights, phase);

if nargin < 1
  % For demo purposes we will use the cat image
  fprintf('using caffe/examples/images/cat.jpg as input image\n');
  im = imread('../../examples/images/cat.jpg');
end

% prepare oversampled input
% input_data is Height x Width x Channel x Num
tic;
input_data = {prepare_image(im)};
toc;

% do forward pass to get scores
% scores are now Channels x Num, where Channels == 1000
tic;
% The net forward function. It takes in a cell array of N-D arrays
% (where N == 4 here) containing data of input blob(s) and outputs a cell
% array containing data from output blob(s)
scores = net.forward(input_data);
toc;

scores = scores{1};
scores = mean(scores, 2);  % take average scores over 10 crops

[~, maxlabel] = max(scores);

% call caffe.reset_all() to reset caffe
caffe.reset_all();

% ------------------------------------------------------------------------
function crops_data = prepare_image(im)
% ------------------------------------------------------------------------
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that
% is already in W x H x C with BGR channels
d = load('../+caffe/imagenet/ilsvrc_2012_mean.mat');
mean_data = d.mean_data;
IMAGE_DIM = 256;
CROPPED_DIM = 227;

% Convert an image returned by Matlab's imread to im_data in caffe's data
% format: W x H x C with BGR channels
im_data = im(:, :, [3, 2, 1]);  % permute channels from RGB to BGR
im_data = permute(im_data, [2, 1, 3]);  % flip width and height
im_data = single(im_data);  % convert from uint8 to single
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % resize im_data
im_data = im_data - mean_data;  % subtract mean_data (already in W x H x C, BGR)

% oversample (4 corners, center, and their x-axis flips)
crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single');
indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
n = 1;
for i = indices
  for j = indices
    crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);
    crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);
    n = n + 1;
  end
end
center = floor(indices(2) / 2) + 1;
crops_data(:,:,:,5) = ...
  im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);


수정해야 할 것

+caffe가 있는 dir

addpath dir

model_dir

net_model

net_weights

d

mean_data

cropped_dim




mean_im.mat

compute_mean.m




댓글 0

티스토리 툴바