Upload
ymygrexcomp
View
50
Download
5
Embed Size (px)
Citation preview
Menggunakan Kalman Filter untuk objek pelacakan
Contoh ini menunjukkan cara menggunakanvisi vision.KalmanFilterobjek dan configureKalmanFilterfungsiuntuk melacak benda.
Contoh ini adalah fungsi dengan tubuh yang utama di atas dan penolong rutinitas dalam bentuk fungsi bersarang dibawah ini.
function kalmanFilterForTracking
PengenalanKalman filter memiliki banyak kegunaan, termasuk aplikasi kontrol, navigasi, komputer visi dan waktu seriekonometri. Contoh ini menggambarkan cara menggunakan Kalman filter untuk melacak objek dan berfokus padatiga fitur penting:
Prediksi objek lokasi di masa mendatang
Pengurangan kebisingan yang diperkenalkan oleh pendeteksian tidak akurat
Memfasilitasi proses Asosiasi beberapa objek untuk jejak mereka
Tantangan objek pelacakanSebelum menampilkan penggunaan Kalman filter, mari kita pertama Periksa tantangan pelacakan objek dalamvideo. Video berikut ini menunjukkan sebuah bola hijau yang bergerak dari kiri ke kanan di lantai.
showDetections();
Wilayah putih atas bola menyoroti pixel terdeteksi menggunakan visivision.ForegroundDetector, yangmemisahkan objek bergerak dari latar belakang.Pengurangan latar belakang hanya menemukan sebagian bolakarena rendah kontras antara bola dan lantai. Dengan kata lain, proses deteksi tidak ideal dan memperkenalkankebisingan.
Untuk mudah memvisualisasikan seluruh objek lintasan, kita overlay semua frame video ke berkas tunggal. Tanda"+" menunjukkan centroids dihitung menggunakan analisis gumpalan.
showTrajectory();
Open Script
Dua masalah dapat diamati:
1. Pusat wilayah ini biasanya berbeda dari pusat bola. Dengan kata lain, ada kesalahan dalam pengukuran bolalokasi.
2. Lokasi bola tidak tersedia ketika itu adalah tersumbat oleh kotak, yaitu pengukuran hilang.
Kedua tantangan ini dapat diatasi dengan menggunakan Kalman filter.
Melacak objek tunggal menggunakan Kalman FilterMenggunakan video yang terlihat sebelumnya, fungsi trackSingleObjectmenunjukkan Anda bagaimana untuk:
Menciptakan visi vision.KalmanFilter dengan menggunakanconfigureKalmanFilter
Menggunakan metode predict dan correct dalam urutan yang untuk menghilangkan kebisingan hadir dalamsistem pelacakan
Menggunakan metode predict sendiri untuk memperkirakan lokasi bola ketika itu adalah tersumbat oleh kotak
Pemilihan Kalman filter parameter dapat menantang. Fungsi configureKalmanFiltermembantu menyederhanakanmasalah ini. Rincian lebih lanjut tentang ini dapat ditemukan lebih lanjut dalam contoh.
Fungsi trackSingleObject mencakup fungsi pembantu bersarang. Toplevel variabel berikut digunakan untukmentransfer data antara fungsi bersarang.
frame = []; % A video frame detectedLocation = []; % The detected location trackedLocation = []; % The tracked location label = ''; % Label for the ball utilities = []; % Utilities used to process the video
Prosedur untuk Pelacakan objek tunggal ditunjukkan di bawah.
function trackSingleObject(param) % Create utilities used for reading video, detecting moving objects, % and displaying the results. utilities = createUtilities(param);
isTrackInitialized = false; while ~isDone(utilities.videoReader) frame = readFrame();
% Detect the ball. [detectedLocation, isObjectDetected] = detectObject(frame);
if ~isTrackInitialized if isObjectDetected % Initialize a track by creating a Kalman filter when the ball is % detected for the first time. initialLocation = computeInitialLocation(param, detectedLocation); kalmanFilter = configureKalmanFilter(param.motionModel, ... initialLocation, param.initialEstimateError, ... param.motionNoise, param.measurementNoise);
isTrackInitialized = true; trackedLocation = correct(kalmanFilter, detectedLocation); label = 'Initial'; else trackedLocation = []; label = ''; end
else % Use the Kalman filter to track the ball. if isObjectDetected % The ball was detected. % Reduce the measurement noise by calling predict followed by % correct. predict(kalmanFilter); trackedLocation = correct(kalmanFilter, detectedLocation); label = 'Corrected'; else % The ball was missing. % Predict the ball's location. trackedLocation = predict(kalmanFilter); label = 'Predicted'; end end
annotateTrackedObject(); end % while
showTrajectory(); end
Ada dua skenario yang berbeda yang Kalman filter Alamat:
Ketika bola terdeteksi, Kalman filter pertama memprediksi negara pada saat ini video bingkai, dan kemudianmenggunakan lokasi objek baru terdeteksi untuk memperbaiki keadaan. Hal ini menghasilkan lokasi yangdisaring.
Ketika bola hilang, Kalman filter sematamata bergantung pada keadaan sebelumnya untuk memprediksi bolalokasi saat ini.
Anda dapat melihat lintasan bola dengan overlaying semua video frame.
param = getDefaultParameters(); % get Kalman configuration that works well % for this example
trackSingleObject(param); % visualize the results
Menjelajahi opsiopsi konfigurasi Kalman FilterKonfigurasi Kalman filter bisa sangat menantang. Selain pemahaman dasar filter Kalman, hal ini seringmembutuhkan eksperimen untuk datang dengan satu set parameter konfigurasicocok. Fungsi trackSingleObject , yang didefinisikan di atas, membantu Anda untuk menjelajahi berbagai pilihankonfigurasi yang ditawarkan oleh fungsi configureKalmanFilter .
Fungsi configureKalmanFilter mengembalikan sebuah objek filter Kalman. Anda harus memberikan limamasukan argumen.
kalmanFilter = configureKalmanFilter(MotionModel, InitialLocation, InitialEstimateError, MotionNoise, MeasurementNoise)
Pengaturan MotionModel harus sesuai dengan karakteristik fisik dari gerak benda.Anda dapat mengatur kecepatankonstan atau konstan percepatan model. Contoh berikut menggambarkan konsekuensi dari membuat pilihan suboptimal.
param = getDefaultParameters(); % get parameters that work wellparam.motionModel = 'ConstantVelocity'; % switch from ConstantAcceleration % to ConstantVelocity % After switching motion models, drop noise specification entries % corresponding to acceleration. param.initialEstimateError = param.initialEstimateError(1:2); param.motionNoise = param.motionNoise(1:2);
trackSingleObject(param); % visualize the results
Perhatikan bahwa bola muncul di tempat yang berbeda dari lokasi yang diperkirakan.Dari waktu ketika bola dirilis, itutergantung konstan perlambatan karena perlawanan dari karpet. Oleh karena itu, model percepatan konstan adalahpilihan yang lebih baik.Jika Anda terus model kecepatan konstan, hasil pelacakan akan suboptimal tidak peduli apayang Anda pilih untuk nilainilai lainnya.
Biasanya, Anda akan mengatur masukan InitialLocation ke lokasi mana objek pertama kali terdeteksi. Anda jugaakan mengatur vektor InitialEstimateError nilainilai besar karena keadaan awal mungkin sangat bising mengingatbahwa itu berasal dari deteksi tunggal. Gambar berikut menunjukkan efek dari misconfiguring parameter ini.
param = getDefaultParameters(); % get parameters that work well param.initialLocation = [0, 0]; % location that's not based on an actual detectionparam.initialEstimateError = 100*ones(1,3); % use relatively small values
trackSingleObject(param); % visualize the results
Dengan parameter misconfigured, butuh beberapa langkah sebelum lokasi yang dikembalikan oleh Kalman filtersejajar dengan lintasan yang sebenarnya objek.
Nilai MeasurementNoise harus dipilih berdasarkan detektor akurasi. Mengatur pengukuran kebisingan dengan lebihbesar nilai untuk detektor kurang akurat. Contoh berikut menggambarkan pendeteksian bising dari ambangsegmentasi misconfigured.Meningkatkan pengukuran kebisingan menyebabkan Kalman filter dengan lebihmengandalkan pada keadaan internal daripada pengukuran masuk, dan dengan demikian mengkompensasi deteksikebisingan.
param = getDefaultParameters(); param.segmentationThreshold = 0.0005; % smaller value resulting in noisy detectionsparam.measurementNoise = 12500; % increase the value to compensate % for the increase in measurement noise
trackSingleObject(param); % visualize the results
Biasanya objek tidak bergerak dengan konstan percepatan atau kecepatan konstan.Andamenggunakan MotionNoise untuk menentukan jumlah penyimpangan dari model ideal gerak. Ketika Andameningkatkan suara gerak, Kalman filter lebih sangat bergantung pada pengukuran masuk daripada pada keadaaninternal. Mencoba bereksperimen dengan parameter MotionNoise untuk mempelajari lebih lanjut tentang efek.
Sekarang bahwa Anda sudah familiar dengan cara menggunakan Kalman filter dan bagaimana caramengkonfigurasinya, Bagian berikutnya akan membantu Anda belajar bagaimana hal itu dapat digunakan untukbeberapa objek pelacakan.
Catatan: Untuk menyederhanakan proses konfigurasi dalam contoh di atas, kita menggunakanfungsi configureKalmanFilter . Fungsi ini membuat beberapa asumsi.Lihat dokumentasi fungsi untukrincian. Jika Anda membutuhkan tingkat yang lebih besar kontrol atas proses konfigurasi, Anda dapat menggunakanvisivision.KalmanFilter objek secara langsung.
Melacak beberapa objek yang menggunakan Kalman FilterPelacakan beberapa objek pose beberapa tantangan tambahan:
Beberapa pendeteksian harus dihubungkan dengan benar trek
Anda harus menangani objek baru yang muncul di adegan
Identitas objek harus dipertahankan ketika beberapa objek bergabung menjadi satu deteksi
Visi vision.KalmanFilter objek bersama dengan fungsiassignDetectionsToTracks dapat membantumemecahkan masalah
Menetapkan pendeteksian ke trek
Dengan kata lain, menentukan apakah deteksi sesuai dengan objek baru, melacak penciptaan
Seperti dalam kasus objek tunggal occluded, prediksi dapat digunakan untuk membantu beberapa bendabendayang dekat satu sama lain
Untuk mempelajari lebih lanjut tentang menggunakan Kalman filter untuk melacak beberapa objek, lihat contohberjudul berbasis gerakan beberapa objek pelacakan.
Fungsi utilitas yang digunakan dalam contohFungsi utilitas yang digunakan untuk mendeteksi objek dan menampilkan hasilnya.Bagian ini menggambarkanbagaimana contoh menerapkan fungsifungsi ini.
Mendapatkan parameter default untuk membuat penyaring Kalman dan segmentasi bola.
function param = getDefaultParameters param.motionModel = 'ConstantAcceleration'; param.initialLocation = 'Same as first detection'; param.initialEstimateError = 1E5 * ones(1, 3);
param.motionNoise = [25, 10, 1]; param.measurementNoise = 25; param.segmentationThreshold = 0.05; end
Membaca frame video berikutnya dari video file.
function frame = readFrame() frame = step(utilities.videoReader); end
Mendeteksi dan anotasi bola dalam video.
function showDetections() param = getDefaultParameters(); utilities = createUtilities(param); trackedLocation = [];
idx = 0; while ~isDone(utilities.videoReader) frame = readFrame(); detectedLocation = detectObject(frame); % Show the detection result for the current video frame. annotateTrackedObject();
% To highlight the effects of the measurement noise, show the detection % results for the 40th frame in a separate figure. idx = idx + 1; if idx == 40 combinedImage = max(repmat(utilities.foregroundMask, [1,1,3]), frame); figure, imshow(combinedImage); end end % while
% Close the window which was used to show individual video frame. uiscopes.close('All'); end
Mendeteksi bola dalam bingkai video saat ini.
function [detection, isObjectDetected] = detectObject(frame) grayImage = rgb2gray(frame); utilities.foregroundMask = step(utilities.foregroundDetector, grayImage); detection = step(utilities.blobAnalyzer, utilities.foregroundMask); if isempty(detection) isObjectDetected = false; else % To simplify the tracking process, only use the first detected object. detection = detection(1, :); isObjectDetected = true; end end
Menampilkan hasil Deteksi dan pelacakan saat ini.
function annotateTrackedObject() accumulateResults(); % Combine the foreground mask with the current video frame in order to % show the detection result. combinedImage = max(repmat(utilities.foregroundMask, [1,1,3]), frame);
if ~isempty(trackedLocation)
shape = 'circle'; region = trackedLocation; region(:, 3) = 5; combinedImage = insertObjectAnnotation(combinedImage, shape, ... region, {label}, 'Color', 'red'); end step(utilities.videoPlayer, combinedImage); end
Menunjukkan lintasan bola dengan overlaying semua video bingkai di atas satu sama lain.
function showTrajectory % Close the window which was used to show individual video frame. uiscopes.close('All');
% Create a figure to show the processing results for all video frames. figure; imshow(utilities.accumulatedImage/2+0.5); hold on; plot(utilities.accumulatedDetections(:,1), ... utilities.accumulatedDetections(:,2), 'k+');
if ~isempty(utilities.accumulatedTrackings) plot(utilities.accumulatedTrackings(:,1), ... utilities.accumulatedTrackings(:,2), 'r‐o'); legend('Detection', 'Tracking'); end end
Mengumpulkan video frame, terdeteksi lokasi, dan lokasi yang dilacak untuk menunjukkan lintasan bola.
function accumulateResults() utilities.accumulatedImage = max(utilities.accumulatedImage, frame); utilities.accumulatedDetections ... = [utilities.accumulatedDetections; detectedLocation]; utilities.accumulatedTrackings ... = [utilities.accumulatedTrackings; trackedLocation]; end
Untuk tujuan ilustrasi, pilih lokasi awal digunakan oleh penyaring Kalman.
function loc = computeInitialLocation(param, detectedLocation) if strcmp(param.initialLocation, 'Same as first detection') loc = detectedLocation; else loc = param.initialLocation; end end
Membuat utilitas untuk membaca video, mendeteksi objek bergerak, dan menampilkan hasilnya.
function utilities = createUtilities(param) % Create System objects for reading video, displaying video, extracting % foreground, and analyzing connected components. utilities.videoReader = vision.VideoFileReader('singleball.mp4'); utilities.videoPlayer = vision.VideoPlayer('Position', [100,100,500,400]); utilities.foregroundDetector = vision.ForegroundDetector(... 'NumTrainingFrames', 10, 'InitialVariance', param.segmentationThreshold); utilities.blobAnalyzer = vision.BlobAnalysis('AreaOutputPort', false, 'MinimumBlobArea', 70, 'CentroidOutputPort', true);
utilities.accumulatedImage = 0; utilities.accumulatedDetections = zeros(0, 2); utilities.accumulatedTrackings = zeros(0, 2);
end
end
Apakah topik ini berma