نوشته‌ها

کد برنامه تشخیص و شمارش خودروهای در حال حرکت در زبان Matlab

در این پروژه سعی داریم با استفاده از روش «رهگیری اهداف چندگانه» اقدام به شناسایی اشیاء در حال حرکت نموده و آنها را شمارش نمائیم. این برنامه می تواند جهت شمارش تعداد خودروهای عبوری، تعداد افراد در حال تردد و… مورد استفاده قرار بگیرد. این الگوریتم توسط شرکت mathwork پیاده سازی گردیده و جهت استفاده علاقه مندان ادامه ارائه می گردد.

باتوجه به توضیحات کامل این پروژه از ذکر توضیحات اضافه اجتناب میکنیم و فقط شرحی مختصر از عماکرد برنامه ارائه می نماییم. ابتدا با استفاده از چند فریم به عنوان نمونه، زمینه(background) را شناسایی می کنیم و سپس به اقدام به تشخیص آبجکت های(foreground) می نماییم. سپس با استفاده از روش کالمن (Kalman) اقدام به رهگیری آبجکت هایی که از مقداری مشخص (اصلاحا blob) بزرگتر هستند می نمائیم.  در ادامه آبجکت ها را رهگیری می کنیم تا هنگامی که از صفحه خارج شوند. نکته جالب توجه این هست که اگر آبجکتی موقتا ناپیدا شود(مثلا زیر پل یا درخت قرار بگیرد) به عنوان «Predicted» برچسب خورده و پس از پیدا شدن مجددا به عنوان همان آبجکت قبلی شناسایی می شود.

 

تشخیص و شمارش خودروهای در حال حرکت

سورس کد برنامه تشخیص و شمارش خودرو:

 

%% Multiple Object Tracking Tutorial
% This example shows how to perform automatic detection and motion-based
% tracking of moving objects in a video. It simplifies the example
% <matlab:helpview(fullfile(docroot,'toolbox','vision','vision.map'),'MotionBasedMultiObjectTrackingExample')
% Motion-Based Multiple Object Tracking> and uses the |multiObjectTracker|
% available in Automated Driving System Toolbox.
%
% Copyright 2016 The MathWorks, Inc.
 
%%
% Detection of moving objects and motion-based tracking are important 
% components of many computer vision applications, including activity
% recognition, traffic monitoring, and automotive safety. The problem of
% motion-based object tracking can be divided into two parts:
%
% # Detecting moving objects in each frame 
% # Tracking the moving objects from frame to frame 
%
% The detection of moving objects uses a background subtraction algorithm
% based on Gaussian mixture models. Morphological operations are applied to
% the resulting foreground mask to eliminate noise. Finally, blob analysis
% detects groups of connected pixels, which are likely to correspond to
% moving objects. 
%
% The tracking of moving objects from frame to frame is done by the
% |multiObjectTracker| object that is responsible for the following:
%
% # Assigning detections to tracks. 
% # Initializing new tracks based on unassigned detections. All tracks are
% initialized as |'Tentative'|, accounting for the possibility that they
% resulted from a false detection.
% # Confirming tracks if they have more than _M_ assigned detections in _N_
% frames.
% # Updating existing tracks based on assigned detections.
% # Coasting (predicting) existing unassigned tracks.
% # Deleting tracks if they have remained unassigned (coasted) for too long.
%
% The assignment of detections to the same object is based solely on
% motion. The motion of each track is estimated by a Kalman filter. The
% filter predicts the track's location in each frame, and determines the
% likelihood of each detection being assigned to each track. To initialize
% the filter that you design, use the |FilterInitializationFcn| property of
% the |multiObjectTracker|.
%
% For more information, see
% <matlab:helpview(fullfile(docroot,'toolbox','vision','vision.map'),'multipleObjectTracking') Multiple Object Tracking>.
%
% This example is a function, with the main body at the top and helper 
% routines in the form of 
% <matlab:helpview(fullfile(docroot,'toolbox','matlab','matlab_prog','matlab_prog.map'),'nested_functions') nested functions> 
% below.
 
function p12_on_video_using_tracking_matlab_sample()
% Create objects used for reading video and displaying the results.
videoObjects = setupVideoObjects('6.mp4');
 
% Create objects used for detecting objects in the foreground of the video.
minBlobArea = 10000; % Minimum blob size, in pixels, to be considered as a detection
detectorObjects = setupDetectorObjects(minBlobArea);
 
%% Create the Multi-Object Tracker
% When creating a |multiObjectTracker|, consider the following: 
%
% # |FilterInitializationFcn|: The likely motion and measurement models. 
% In this case, the objects are expected to have a constant speed motion.
% The |initDemoFilter| function configures a linear Kalman filter to 
% track the motion. See the 'Define a Kalman filter' section for details.
% # |AssignmentThreshold|: How far detections may fall from tracks. 
% The default value for this parameter is 30. If there are detections
% that are not assigned to tracks, but should be, increase this value. If
% there are detections that get assigned to tracks that are too far,
% decrease this value.
% # |NumCoastingUpdates|: How long a track is maintained before deletion.
% In this case, since the video has 30 frames per second, a reasonable
% value is about 0.75 seconds (22 frames).
% # |ConfirmationParameters|: The parameters controlling track confirmation.
% A track is initialized with every unassigned detection. Some of these
% detections might be false, so initially, all tracks are |'Tentative'|. 
% To confirm a track, it has to be detected at least _M_ out of _N_
% frames. The choice of _M_ and _N_ depends on the visibility of the
% objects. This example assumes a visibility of 6 out of 10 frames.
tracker = multiObjectTracker(...
 'FilterInitializationFcn', @initDemoFilter, ...
 'AssignmentThreshold', 30, ...
 'NumCoastingUpdates', 22, ...
 'ConfirmationParameters', [6 10] ...
 );
 
%% Define a Kalman Filter
% When defining a tracking filter for the motion, complete the following
% steps:
%
% *Step 1: Define the motion model and state*
%
% In this example, use a constant velocity model in a 2-D rectangular
% frame.
%
% # The state is |[x;vx;y;vy]|.
% # The state transition model matrix is |A = [1 dt 0 0; 0 1 0 0; 0 0 1 dt; 0 0 0 1]|.
% # Assume that |dt = 1|.
%
% *Step 2: Define the process noise*
%
% The process noise represents the parts of the process that are not taken
% into account in the model. For example, in a constant velocity model, the
% acceleration is neglected.
%
% *Step 3: Define the measurement model*
%
% In this example, only the position (|[x;y]|) is measured. So, the
% measurement model is |H = [1 0 0 0; 0 0 1 0]|.
%
% Note: To preconfigure these parameters, define the |'MotionModel'|
% property as |'2D Constant Velocity'|.
%
% *Step 4: Initialize the state vector based on the sensor measurement*
%
% In this example, because the measurement is |[x;y]| and the state is
% |[x;vx;y;vy]|, initializing the state vector is straightforward. Because
% there is no measurement of the velocity, initialize the |vx| and |vy|
% components to 0.
%
% *Step 5: Define an initial state covariance*
%
% In this example, the measurements are quite noisy, so define the initial 
% state covariance to be quite large: |stateCov = diag([50, 50, 50, 50])|
%
% *Step 6: Create the correct filter*
% 
% In this example, all the models are linear, so use |trackingKF| as the
% tracking filter.
 function filter = initDemoFilter(detection)
 % Initialize a Kalman filter for this example.
 
 % Define the initial state.
 state = [detection.Measurement(1); 0; detection.Measurement(2); 0];
 
 % Define the initial state covariance.
 stateCov = diag([50, 50, 50, 50]);
 
 % Create the tracking filter.
 filter = trackingKF('MotionModel', '2D Constant Velocity', ... 
 'State', state, ...
 'StateCovariance', stateCov, ... 
 'MeasurementNoise', detection.MeasurementNoise(1:2,1:2) ... 
 );
 end
 
%%% 
% The following loop runs the video clip, detects moving objects in the
% video, and tracks them across video frames. 
 
% Count frames to create a sense of time.
frameCount = 0;
while hasFrame(videoObjects.reader)
 % Read a video frame and detect objects in it.
 frameCount = frameCount + 1; % Promote frame count
 frame = readFrame(videoObjects.reader); % Read frame 
 [detections, mask] = detectObjects(detectorObjects, frame); % Detect objects in video frame 
 
 % Run the tracker on the preprocessed detections.
 confirmedTracks = updateTracks(tracker, detections, frameCount);
 
 % Display the tracking results on the video.
 displayTrackingResults(videoObjects, confirmedTracks, frame, mask);
end
%% Create Video Objects
% Create objects used for reading and displaying the video frames.
 
 function videoObjects = setupVideoObjects(filename)
 % Initialize video I/O
 % Create objects for reading a video from a file, drawing the tracked
 % objects in each frame, and playing the video.
 
 % Create a video file reader.
 videoObjects.reader = VideoReader(filename);
 
 % Create two video players: one to display the video,
 % and one to display the foreground mask. 
 videoObjects.maskPlayer = vision.VideoPlayer('Position', [20, 400, 700, 400]);
 videoObjects.videoPlayer = vision.VideoPlayer('Position', [740, 400, 700, 400]);
 end
 
%% Create Detector Objects
% Create objects used for detecting foreground objects.
% Use |minBlobArea| to define the size of the blob, in pixels, that is
% considered to be a detection. 
%
% * Increase |minBlobArea| to avoid detecting small blobs, which are more
% likely to be false detections, or if several detections are created for 
% the same object due to partial occlusion.
% * Decrease |minBlobArea| if objects are detected too late or not at all.
 
 function detectorObjects = setupDetectorObjects(minBlobArea)
 % Create System objects for foreground detection and blob analysis
 
 % The foreground detector segments moving objects from the
 % background. It outputs a binary mask, where the pixel value of 1
 % corresponds to the foreground and the value of 0 corresponds to
 % the background.
 
 detectorObjects.detector = vision.ForegroundDetector('NumGaussians', 3, ...
 'NumTrainingFrames', 40, 'MinimumBackgroundRatio', 0.7);
 
 % Connected groups of foreground pixels are likely to correspond to
 % moving objects. The blob analysis System object finds such
 % groups (called 'blobs' or 'connected components') and computes
 % their characteristics, such as their areas, centroids, and the
 % bounding boxes.
 
 detectorObjects.blobAnalyzer = vision.BlobAnalysis('BoundingBoxOutputPort', true, ...
 'AreaOutputPort', true, 'CentroidOutputPort', true, ...
 'MinimumBlobArea', minBlobArea);
 end
 
%% Detect Objects
% The |detectObjects| function returns the centroids and the bounding boxes
% of the detected objects as a list of |objectDetection| objects. You can
% supply this list as an input to the |multiObjectTracker|. The
% |detectObjects| function also returns the binary mask, which has the same
% size as the input frame. Pixels with a value of 1 correspond to the
% foreground. Pixels with a value of 0 correspond to the background.
%
% The function performs motion segmentation using the foreground detector. 
% It then performs morphological operations on the resulting binary mask to
% remove noisy pixels and to fill the holes in the remaining blobs.
%
% When creating the |objectDetection| list, the |frameCount| serves as the
% time input, and the centroids of the detected blobs serve as the
% measurement. The list also has two optional name-value pairs:
%
% * |MeasurementNoise| - Blob detection is noisy, and this example defines 
% a large measurement noise value.
% * |ObjectAttributes| - The detected bounding boxes that get passed to the
% track display are added to this argument.
 
 function [detections, mask] = detectObjects(detectorObjects, frame)
 % Expected uncertainty (noise) for the blob centroid.
 measurementNoise = 100*eye(2); 
 % Detect foreground.
 mask = detectorObjects.detector.step(frame);
 
 % Apply morphological operations to remove noise and fill in holes.
 mask = imopen(mask, strel('rectangle', [9, 9]));
 mask = imclose(mask, strel('rectangle', [10, 10])); 
 mask=bwareaopen(mask,1500);
 mask = imfill(mask, 'holes');
 
 % Perform blob analysis to find connected components.
 [~, centroids, bboxes] = detectorObjects.blobAnalyzer.step(mask);
 
 % Formulate the detections as a list of objectDetection objects.
 numDetections = size(centroids, 1);
 detections = cell(numDetections, 1);
 for i = 1:numDetections
 detections{i} = objectDetection(frameCount, centroids(i,:), ...
 'MeasurementNoise', measurementNoise, ...
 'ObjectAttributes', {bboxes(i,:)});
 end
 end
 
%% Display Tracking Results
% The |displayTrackingResults| function draws a bounding box and label ID
% for each track on the video frame and foreground mask. It then displays
% the frame and the mask in their respective video players.
 
 function displayTrackingResults(videoObjects, confirmedTracks, frame, mask)
 % Convert the frame and the mask to uint8 RGB.
 frame = im2uint8(frame);
 mask = uint8(repmat(mask, [1, 1, 3])) .* 255;
 
 if ~isempty(confirmedTracks) 
 % Display the objects. If an object has not been detected
 % in this frame, display its predicted bounding box.
 numRelTr = numel(confirmedTracks);
 boxes = zeros(numRelTr, 4);
 ids = zeros(numRelTr, 1, 'int32');
 predictedTrackInds = zeros(numRelTr, 1);
 for tr = 1:numRelTr
 % Get bounding boxes.
 boxes(tr, : ) = confirmedTracks(tr).ObjectAttributes{1}{1};
 
 % Get IDs.
 ids(tr) = confirmedTracks(tr).TrackID;
 
 if confirmedTracks(tr).IsCoasted
 predictedTrackInds(tr) = tr;
 end
 end
 
 predictedTrackInds = predictedTrackInds(predictedTrackInds > 0);
 
 % Create labels for objects that display the predicted rather 
 % than the actual location.
 labels = cellstr(int2str(ids));
 
 isPredicted = cell(size(labels));
 isPredicted(predictedTrackInds) = {' predicted'};
 labels = strcat(labels, isPredicted);
 
 % Draw the objects on the frame.
 frame = insertObjectAnnotation(frame, 'rectangle', boxes, labels);
 
 % Draw the objects on the mask.
 mask = insertObjectAnnotation(mask, 'rectangle', boxes, labels);
 end
 
 % Display the mask and the frame.
 videoObjects.maskPlayer.step(mask); 
 videoObjects.videoPlayer.step(frame);
 end
displayEndOfDemoMessage(mfilename)
end
%% Summary
% In this example, you created a motion-based system for detecting and
% tracking multiple moving objects. Try using a different video to see if
% you can detect and track objects. Try modifying the parameters of the
% |multiObjectTracker|.
%
% The tracking in this example was based solely on motion, with the
% assumption that all objects move in a straight line with constant speed.
% When the motion of an object significantly deviates from this model, the
% example can produce tracking errors. Notice the mistake in tracking the
% person occluded by the tree.
%
% You can reduce the likelihood of tracking errors by using a more complex
% motion model, such as constant acceleration or constant turn. To do that,
% try defining a different tracking filter, such as |trackingEKF| or
% |trackingUKF|. 

تشخیص و شمارش خودروهای در حال حرکت

 

منبع:

https://www.mathworks.com/

 

جهت دانلود بر روی لینک زیر کلیک نمایید.

تشخیص و شمارش خودروهای درحال حرکت

ویدئوی پیوست برنامه تشخیص و شمارش خودورهای در حال حرکت

رمز فایل : behsanandish.com

 

عامل‌ های هوشمند

عامل هوشمند یا کارگزار هوشمند (به انگلیسی: Intelligent agent)، در مبحث هوش مصنوعی به موجودی گفته می‌شود که در یک محیط، اطراف خود را شناخته و اعمالی را روی محیط انجام می‌دهد و کلیه اعمالی که انجام می‌دهد در جهت نیل به اهدافش می‌باشد. این سیستم‌ها امکان یادگیری دارند و سپس از دانش اکتسابی خود برای انجام اهداف خود استفاده می‌کنند. این عامل ها ممکن است بسیار ساده یا پیچیده باشند. بطور مثال ماشین‌های کوکی که با برخورد به دیوار، راه خود را عوض می‌کنند نمونه‌ای از عامل های هوشمند هستند.

تعریف عامل:

عامل هر چیزی است که می‌تواند محیطش را از طریق حسگرها درک کند و بر روی محیطش از طریق عمل‌کننده‌ها تأثیر گذارد. یک عامل انسانی دارای حس‌کننده‌هایی از قبیل چشم، گوش، لامسه و امثال آن می‌باشد. و میتوان از دست، پا، صحبت کردن و اعمال ارادی به عنوان عمل‌کننده‌ها نام برد. ورودی یک عامل نرم‌افزاری میتوانند چندین متغیر باشد که مقدار آن‌ها را عامل میخواند سپس بر اساس مکانیزم تصمیم‌گیری یک تصمیم اخذ می‌کند و عملگرهای آن میتوانند دستورهای مقداردهی چند متغیر دیگر باشد. به عنوان مثال فرض کنید یک عامل قرار است متغیر x را بخواند و توان دوم آن را حساب کند و در y قرار دهد. این عامل x را میخوانند و سپس توان دوم آن را حساب می‌کند و در y قرار می‌دهد.

نحوه کار عامل:

یک عامل چگونه باید بفهمد که بهترین عمل ممکن چیست؟ عمل درست عملی است که باعث شود عامل موفق‌ترین باشد. این امر ما را با مسئله تصمیم‌گیری در مورد چگونگی و زمان ارزیابی کردن موفقیت عامل روبرو میکند. اصطلاح میزان کارایی برای موفقیت عامل تعریف می‌کنیم. گفتنی است که میزان کارایی برای عاملهای مختلف متفاوت می‌باشد. نکته خیلی مهم این است که میزان کارایی یک عامل باید بر اساس محیط تعریف شود. به عنوان مثال فرض کنیم که یک عامل کارش جمع‌آوری آشغال‌ها از یک اتاق و دفع آن‌ها باشد، اگر عامل میزان کارایی اش بر حسب اشغال جمع شده تعریف شود آنگاه عامل می‌تواند آشغال‌ها را جمع کند و سپس دوباره در اباق بریزد تا بهترین کارایی را کسب کند. اما اگر میزان کارایی بر اساس محیط تعریف شود آنگاه عامل یک بار کار تمیز کردن را انجام می‌دهد. پس یک عامل محیطش را حس می‌کند و سپس بر اساس آن تصمیم میگیرد. این مستلزم آن است که با عامل خود مختار و انواع محیط‌ها آشنا شویم.

عامل خود مختار

به عاملی خود مختار میگوییم که تصمیم‌گیری اش بر اساس ادراکاتش باشد نه بر اساس دانش تزریق شده به آن. در واقع هر چه دانش قبلی یک عامل بیشتر باشد از خودمختاری آن کاهش مییابد و هر چه دانش قبلی کمتر باشد و مکانیزم یادگیری عامل قوی تر باشد، آن عامل خود مختار تر است.

انواع محیط ها

قابل مشاهده و غیر قابل مشاهده: اگر عامل به کل محیط دسترسی داشته باشد و بتواند آن را حس کند می‌گوییم محیط قابل مشاهده است، در غیر این صورت آن را غیر قابل مشاهده یا تا حدودی قابل مشاهده می نامیم. مثلاً در محیط عامل شطرنج باز کل محیط قابل مشاهده است. طبیعی است که یک مسئله با محیط قابل مشاهده برای طراحان عاملها مطلوب تر می‌باشد.

قطعی و غیر قطعی: اگر بتوان حالت بعدی را از حالت فعلی، عمل فعلی و کنشهایی که تاکنون انجام شده به دست بیاوریم، میگوییم که محیط قطعی است. بازهم میتوان از بازی شطرنج برای محیط قطعی مثال زد، چون با محیط فعلی و حرکت فعلی می‌شود حالت بعدی را به صورت دقیق یافت. قابل توجه است که بدانیم اگر محیط کاملاً قابل مشاهده نباشد آنگاه قطعی نخواهد بود. اما اگر با یک حرکت ممکن باشد به چندین حالت برویم محیط غیر قطعی است.

دوره‌ای یا غیر دوره ای: اگر هر دوره از دوره‌های دیگر مستقل باشد میگوییم محیط دوره‌ای است. مانند دوره‌های مختلف در مذاکرات چند عامله. محیط‌های غیر دوره‌ای به عنوان محیط‌های ترتیبی نیز یاد می‌شوند.

ایستا و پویا: اگر محیط در زمان تصمیم‌گیری عامل تغییر کند آنگاه محیط پویا است. و در غیر آن صورت محیط ایستا است. اما اگر محیط در زمان تصمیم‌گیری ثابت بماند اما زمان، کارایی عامل را کاهش دهد، محیط را نیمه پویا مینامیم.

گسسته و پیوسته: اگر مشاهدات و کنش‌های مختلف مجزا و تعریف شده باشند، محیط پیوسته است. مانند شطرنج. اما یک عامل بهینه ساز معادلات در محیط پیوسته کار میکند.

ساختار عامل های هوشمند

تا کنون در مورد محیط‌ها و کلیات مربوط به عاملها صحبت کردیم. حال نوبت بررسی ساختارهای مختلف عاملها است. مهم‌ترین وظیفه ما طراحی برنامه عامل است. برنامه عامل تابعی است که ادراکات را به یک عمل‌ها نگاشت میکند. معماری عامل ساختاری است که برنامه محاسباتی عامل تر روی آن پیاده‌سازی می‌شود. پس در کل معماری از طریق حسگرها ورودی را میگیرد، توسط برنامه تصمیم می‌گیرد و در نهایت با عملگرها عمل می‌کند و روی محیط تأثیر میگذارد.

عامل های واکنشی ساده

در این گونه عاملها سعی بر این است که به ازای هر حالت ممکن در دنیا یک عمل مناسب انجام دهیم. برای این کار می‌توانیم حالت محیط را در ستون اول یک جدول قرار دهیم و عمل مربوط به آن را در ستون دوم نکه داری کنیم. به چنین عاملی وابسته به جدول نیز می‌گویند. و به این جدول، جدول حالت-قانون نیز میگویند. در همان ابتدا مشخص می‌شود که برای طراحی چنین عاملی محیط باید کاملاً قابل مشاهده باشد. مهمترین مشکلی که در راه طراحی این عامل به وجود می‌آید این است در مسائل دنیای واقعی پر کردن چنین جدولی غیرممکن است. مثلاً برای شطرنج ۳۵۱۰۰ حالت مختلف برای محیط وجود دارد. حال اگر فرض کنیم توانایی پر کردن جدول را داشته باشیم، آنگاه اولا حافظه لازم را نخواهیم داشت و ثانیا جستجو جهت یافتن جواب زمان زیادی خواهد گرفت. ساختار این عامل در شکل زیر دیده می‌شود.

منبع


 به هر موجودیت که از طریق گیرنده ها و سنسورهایش محیط اطراف خود را مشاهده نموده و از طریق اندام های خود در آن محیط عمل مینماید (بر روی آن محیط تاثیر میگذارد) عامل (Agent) میگویند. برای مثال انسان به عنوان یک عامل از گوش ها، چشم ها و دیگر اندام های خود جهت دریافت اطلاعات از محیط استفاده کرده و از طریق دست و پا و زبان  برای عمل نمودن در همان محیط استفاده مینماید. به همین ترتیب یک عامل رباتیک نیز از سنسورهای خود به عنوان دریافت کننده و از بازو های خود به عنوان عمل کننده، در محیط اطراف استفاده مینماید.

ساختار یک عامل

هر موجودیت که نسبت به مشاهدات خود از محیط اطراف واکنش نشان میدهد را عامل مینامند.

عامل هوشمند (Rational Agent)

 عاملی است که در محیط خود کار صحیح را انجام میدهد. قطعا انجام کار صحیح بهتر از انجام کار اشتباه است! اما سوالی که پیش می آید این است که براستی تعریف کار صحیح چیست؟

در حال حاضر میتوان بطور تقریبی اینگونه به این سوال پاسخ داد که کار صحیح کاریست که باعث کسب موفقیت توسط عامل هوشمند میشود. با این حال توجه داشته باشید که همین تعریف تقریبی هم ما را با دو سوال چگونه و چه زمان در ابهام باقی میگذار. اگر اینگونه تفسیر نمایید که چگونه به موفقیت برسیم؟ و چه زمان به موفقیت رسیده ایم؟ این ابهام برای شما ملموس تر خواهد شد.

برای رفع ابهام در مورد موفقیت عامل هوشمند، مفهومی با عنوان اندازه گیری عملکرد یا performance measure تعریف میشود. اندازه گیری عملکرد در واقع مجموعه ای از قوانین هستند که ما به عنوان طراحان یا شاهدان عملکرد عامل هشومند، وضع مینماییم تا بتوانیم عامل هوشمند خود را مورد سنجش قرار دهیم.

فرض کنید که ما بعنوان سازنده، عامل هوشمندی ساخته ایم که در واقع یک ربات نظافت گر خودکار میباشد. برای مثال یک معیار اندازه گیری عملکرد برای این ربات میتواند میزان جمع آوری گرد غبار در طول مدت یک شیفت کاری باشد. یا مثلا برای توانمند تر ساختن ربات میتوان مقدار انرژی الکتریکی مصرف شده و سر و صدای تولید شده توسط آن را به مجموعه معیار های اندازه گیری اضافه نمود. برای مثال میتوانیم بگوئیم اگر ربات ما در طول یک ساعت حداقل  x لیتر غبار جمع آوری و کمتر از y  انرژی مصرف نمود، کار خود به درستی انجام داده است.

تفاوت ِعقلانیت و علم لایتناهی

نکته ای که از اهمیت بسیاری برخوردا است، تمیز دادن بین دو مفهوم عقلانیت و علم لایتناهی میباشد. یک عامل با علم لایتناهی نتیجه خروجی تمامی اعمال خود را میداند که بسیار هم عالی و خوب است! اما در دنیای واقعی عملا همچین عاملی وجود نخواهد داشت! به مثالی که در ادامه آماده توجه فرمایید.

شما در یک منطقه دورافتاده و بی آب و علف هستید که ناگهان یک دختر بسیار زیبا را در طرف دیگر خیابان مشاهده مینمایید. هیچ ماشینی در حال تردد در خیابان نیست و شما نیز مجرد و تنها هستید! بنظر میرسد که با توجه به شرایط اطراف عاقلانه ترین کار این است که از عرض خیابان رد شده، به سراغ دختر زیبا بروید و او را به صرف یک نوشیدنی دعوت نمایید. در همین لحظه در ارتفاع ۳۳۰۰۰ پایی یک هواپیمای بار بری در حال عبور از منطقه شماست که ناگهان درب هواپیما کنده شده و به سمت زمین پرتاب میشود و با شما برخورد میکند. نتیجتا قبل از اینکه شما  به طرف دیگر برسید مانند گوجه فرنگی در کف خیابان له خواهید شد!

سوالی که پیش می آید این است که تصمیم شما برای عبور از خیابان یک تصمیم اشتباه و غیر هوشمندانه بوده است؟ آیا از عمل شما به عنوان یک عمل غیر عقلانی یاد خواهد شد؟

اینجاست که باید بگوییم که در واقع، عقلانیت، با موفقیتی که ناشی از مجموعه مشاهدات عامل است تعریف میشود. (در مثال بالا، شخص عبور کننده توانایی دیدن درب هواپیما را نداشته برای همین تصمیم به عبور از خیابان گرفته است) به زبان دیگر ما نمیتوانیم یک عامل را که به خاطر عدم توانایی در مشاهده تمام محیط اطراف، شکست خورده است، سرزنش نماییم. نتیجه این بحث میتواند این باشد که در شرایط واقعی نمیتوان همیشه از عامل هوشمند خود انتظار داشت که کار صحیح را انجام دهد.

بطور خلاصه میتوان گفت که هوشمند بودن یک موجودیت به چهار عامل بستگی دارد.

اندازه گیری عملکرد که درجات موفقیت را مشخص مینماید.
هر آن چیز که عامل  اخیرا مشاهده و یا در یافت نموده است.توالی مشاهدات.
هر آنچه که عامل از مورد محیط خود میداند.
مجموعه عمل هایی که عامل میتواند در محیط انجام دهد.

عامل هوشمند ایده آل

مجموعه تعاریف و مطالب فوق، ما را به سمت تعرف مفوهم عامل هوشمند ایده آل هدایت مینماید. عامل هوشمند ایده آل، عاملی است که برای هر مجموعه از توالی مشاهدات، با توجه به شواهد موجود در محیط و دانش پیش ساخته خود، آن عملِ مورد انتظاری را انجام دهد که باعث افزایش اندازه عملکرد و یا همان performance measure بشود.

توجه داشته باشید در نگاه اول ممکن است بنظر برسد که این تعریف باعث ساخت عامل های هوشمندانه ای خواهد شد که خود را در شرایطی که به انجام عمل غیر عقلانی ختم میشود قرار خواهد داد. در واقع ممکن است عامل هوشمند به خیال خود در حال افزایش اندازه عملکرد باشد در حالی که برای این افزایش آن از بسیاری از مسائل چشم پوشی نماید.

برای مثال اگر عامل برای عبور از خیابان به طرفین نگاه نکند (در حالی که هدفش عبور از خیابان است) توالی مشاهداتش او را از خطر تصادف با یک کامیون که با سرعت به طرف او می آید آگاه نخواهد کرد. در نتیجه طبق تعریف، عبور از خیابان برای عامل، عملی هوشمندانه به حساب آمده و او به راه خود ادامه خواهد. در صورتی که چنین تفسیری به دو دلیل اشتباه میباشد. اول آنکه بطور کلی ریسک عبور از خیابان بدون نگاه بطرفین بسیار بالا میباشد. دوم آنکه در صورت نتیجه گیری صحیح از تعریف عامل هوشمند ایده آل، چنین عاملی برای افزایش اندازه عملکرد خود باید به طرفین نگاه کند.

نگاشت ایده آل، از توالی مشاهدات به عمل

با توجه به مطالب فوق میتوان نتیجه گیری کرد از آنجا که رفتار عامل ما بر اساس توالی مشاهداتش میباشد، میتوان برای عامل ها با رسم جدول، مشاهده و عمل را به یکدیگر نگاشت نمود. با این حال باید توجه داشت  که برای تمامی عامل ها چنین جدولی بسیار طولانی و یا دارای بی نهایت سطر میباشد مگر آنکه محدودیتی در طول مشاهدات، از طرف طراح برای آن جدول تعیین شده باشد.

به چنین جدولی، جدول “نگاشت مشاهدات به عمل” میگویند. در اصول میتوان با تست اینکه چه عملی برای مشاهدات مناسب است این جدول را تکمیل نمود. باید توجه نمود که اگر میتوانیم از روی نگاشت، عامل هوشمند داشته باشیم از روی نگاشت ایده آل نیز میتوان به عامل هوشمند ایده آل رسید.

البته معنی توضیحات بالا این نیست که ما باید همیشه و بطور ضمنی و دقیق جدولی تهیه نماییم. در واقع در بسیاری از موارد به جای یک جدول ضمنی میتوان از یک تعریف مشخص که خود تولید کننده سطرهای جدول میباشد استفاده نماییم. برای مثال فرض کنید که ما یک عامل هوشمند بسیار ساده داریم که قرار است توان اعداد را محاسبه نمایید. برای طراحی چنین عاملی احتیاجی به ایجاد یک جدول واقعی نخواهیم داشت و عملا میتوان سطرهای این جدول را با فرمول توان یک عدد به عدد دیگر محاسبه نمود.

عامل های هوشمند قسمت ۱
عامل های هوشمند قسمت ۲
عامل های هوشمند قسمت ۳
عامل های هوشمند قسمت ۴
عامل های هوشمند قسمت ۵

Interpolation يا درون یابی

Interpolation يا درون یابی (كه گاهي resampling نيز ناميده ‌مي‌شود) يك روش گرافيكي براي افزايش يا كاهش تعداد پيكسل‌هاي يك تصوير ديجيتالي است. دوربين‌هاي ديجيتالي از اين روش براي زوم ديجيتال و يا افزايش مصنوعي ابعاد تصوير، نسبت به تصوير اصلي ثبت شده توسط حسگر خود استفاده مي‌كنند. كيفيت تصوير نهايي حاصل از درون‌يابي به پيچيدگي الگوريتم ساخت تصوير بستگي دارد. حالت‌هاي متفاوت درون‌يابي عبارتند است از:

Nearest Neighbor Interpolation

اين روش ساده‌ترين عمليات درون‌يابي محسوب مي‌شود كه اساساً پيكسل‌هاي بزرگ‌تري را ايجاد مي‌كند و رنگ هر پيكسل در تصوير جديد، با رنگ نزديك‌ترين پيكسل در تصوير اصلي مطابقت دارد. به عنوان مثال اگر شما يك تصوير را ۲۰۰ درصد بزرگ كنيد، يك پيكسل تصوير به يك فضاي چهار پيكسلي (دو پيكسل در دو پيكسل) با رنگ پيكسل اوليه تبديل مي‌شود. بسياري از دوربين‌هاي ديجيتالي براي زوم‌كردن روي يك سوژه از اين روش استفاده مي‌كنند. زيرا اين روش هيچ تأثيري بر اطلاعات رنگي تصوير نمي‌گذارد. اصولاً بهتر است از اين روش براي افزايش ابعاد تصوير استفاده نشود. چرا كه موجب ايجاد حالت شطرنجي در تصوير مي‌گردد.

Bilinear Interpolation

اين روش ارزش يك پيكسل رنگي را براساس چهار پيكسل در جهت‌هاي عمودي و افقي پيكسل در تصوير اصلي معين‌مي‌كند. تصوير جديد داراي خاصيت Anti-aliasing است و تقريباً هيچ اثري از پيكسل‌هاي شطرنجي در آن ديده نمي‌شود.

Bicubic Interpolation

اين روش داراي پيچيده‌ترين الگوريتم درون‌يابي است و تصويري كه با اين روش به دست مي‌آيد، لبه‌هاي بسيارنرم‌تري پيدا مي‌كند. در اين حالت پيكسل جديد براساس ارزش تخميني ۱۶ پيكسل (چهار پيكسل در چهار پيكسل) برآورد‌مي‌شود.

شايان ذكر است كه اغلب دوربين‌ها، چاپگرها و نرم‌افزارهاي گرافيكي براي تغيير تعداد پيكسل‌هاي يك تصوير از اين روش استفاده مي‌كنند.
نرم‌افزار Photoshop CS دو نوع Sharper و Smoother اين درون‌يابي را نيز ارائه مي‌دهد.

Fractal Interpolation

اين روش براي بزرگ كردن تصوير در ابعاد خيلي بزرگ (به‌عنوان مثال چاپ روي بدنه يك اتوبوس) روش بسيار مناسبي به‌شمار مي‌رود. زيرا با دقت خوبي مي‌تواند شكل اجزاي تصوير را حفظ كند. لبه‌هاي بسيار تميزتر و صاف‌تري را نيز برجا مي‌گذارد. در اين حالت مناطق محوي كه در لبه‌هاي تصوير در روش‌هاي قبل وجود داشتند، به ندرت ديده مي‌شوند. البته روش‌هاي ديگري هم وجود دارند كه جز در برنامه‌هاي گرافيكي پيشرفته، به‌ندرت از آن‌ها استفاده مي‌شود.
منبع