نوشته‌ها

چرا از فضای رنگی مختلف استفاده می کنیم؟

از فضای رنگی مختلف استفاده می کنیم چون این امکان در آن فضای رنگی به ما داده میشه تا بتوینم رنگ دلخواه مان را به راحتی از محدوده دیگر رنگ ها جدا کنیم .فرض کنید که شما قصد دارید رنگ سبز را در تصویر فیلتر نمایید این بازه شامل طیفی می باشد که یک سمت آن سبز تیره و در سمت دیگر آن سبز روشن می باشد برای جدا کردن آن در فضای رنگی RGB این امکان وجود ندارد که شما بتوان به صورت خطی یعنی هر کانال با یک شرط بازه رنگ دلخواه را انتخاب نمائید پس به خاطر چنین مشکلاتی تصویر را به فضای رنگی HSV انتقال می دهیم که این فضا از اجزای Hue (رنگدانه) ،Saturation(اشباع) و Value(روشنایی) تشکیل شده.برای تفکیک رنگ سبز در این فضای رنگی کافیست محدوده Hue خود که مربوط به رنگ مورد نظر را انتخاب کرده و سپس کل محدوه اشباع و در نهایت انتخاب محدوده دلخواه برای روشنایی پس در این فضای رنگی به راحتی تونستید رنگ دلخواه خودتون را انتخاب کنید.

تبدیل فضای رنگی در opencv

در کتابخانه Opencv می تونیم از تابع cvtColor استفاده کنیم.

مثال:


/*------------------------------------------------------------------------------------------*\
This file contains material supporting chapter 3 of the cookbook:
Computer Vision Programming using the OpenCV Library
Second Edition
by Robert Laganiere, Packt Publishing, 2013.

This program is free software; permission is hereby granted to use, copy, modify,
and distribute this source code, or portions thereof, for any purpose, without fee,
subject to the restriction that the copyright notice may not be removed
or altered from any source or altered source distribution.
The software is released on an as-is basis and without any warranties of any kind.
In particular, the software is not guaranteed to be fault-tolerant or free from failure.
The author disclaims all warranties with regard to this software, any use,
and any consequent failure, is purely the responsibility of the user.

Copyright (C) 2013 Robert Laganiere, www.laganiere.name
\*------------------------------------------------------------------------------------------*/

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>
#include <vector>

void detectHScolor(const cv::Mat& image, // input image
double minHue, double maxHue, // Hue interval
double minSat, double maxSat, // saturation interval
cv::Mat& mask) { // output mask

// convert into HSV space
cv::Mat hsv;
cv::cvtColor(image, hsv, CV_BGR2HSV);

// split the 3 channels into 3 images
std::vector<cv::Mat> channels;
cv::split(hsv, channels);
// channels[0] is the Hue
// channels[1] is the Saturation
// channels[2] is the Value

// Hue masking
cv::Mat mask1; // under maxHue
cv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);
cv::Mat mask2; // over minHue
cv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);

cv::Mat hueMask; // hue mask
if (minHue < maxHue)
hueMask = mask1 & mask2;
else // if interval crosses the zero-degree axis
hueMask = mask1 | mask2;

// Saturation masking
// under maxSat
cv::threshold(channels[1], mask1, maxSat, 255, cv::THRESH_BINARY_INV);
// over minSat
cv::threshold(channels[1], mask2, minSat, 255, cv::THRESH_BINARY);

cv::Mat satMask; // saturation mask
satMask = mask1 & mask2;

// combined mask
mask = hueMask&satMask;
}

int main()
{
// read the image
cv::Mat image= cv::imread("boldt.jpg");
if (!image.data)
return 0;

// show original image
cv::namedWindow("Original image");
cv::imshow("Original image",image);

// convert into HSV space
cv::Mat hsv;
cv::cvtColor(image, hsv, CV_BGR2HSV);

// split the 3 channels into 3 images
std::vector<cv::Mat> channels;
cv::split(hsv,channels);
// channels[0] is the Hue
// channels[1] is the Saturation
// channels[2] is the Value

// display value
cv::namedWindow("Value");
cv::imshow("Value",channels[2]);

// display saturation
cv::namedWindow("Saturation");
cv::imshow("Saturation",channels[1]);

// display hue
cv::namedWindow("Hue");
cv::imshow("Hue",channels[0]);

// image with fixed value
cv::Mat newImage;
cv::Mat tmp(channels[2].clone());
// Value channel will be 255 for all pixels
channels[2]= 255;
// merge back the channels
cv::merge(channels,hsv);
// re-convert to BGR
cv::cvtColor(hsv,newImage,CV_HSV2BGR);

cv::namedWindow("Fixed Value Image");
cv::imshow("Fixed Value Image",newImage);

// image with fixed saturation
channels[1]= 255;
channels[2]= tmp;
cv::merge(channels,hsv);
cv::cvtColor(hsv,newImage,CV_HSV2BGR);

cv::namedWindow("Fixed saturation");
cv::imshow("Fixed saturation",newImage);

// image with fixed value and fixed saturation
channels[1]= 255;
channels[2]= 255;
cv::merge(channels,hsv);
cv::cvtColor(hsv,newImage,CV_HSV2BGR);

cv::namedWindow("Fixed saturation/value");
cv::imshow("Fixed saturation/value",newImage);

// Testing skin detection

// read the image
image= cv::imread("girl.jpg");
if (!image.data)
return 0;

// show original image
cv::namedWindow("Original image");
cv::imshow("Original image",image);

// detect skin tone
cv::Mat mask;
detectHScolor(image,
۱۶۰, ۱۰, // hue from 320 degrees to 20 degrees
۲۵, ۱۶۶, // saturation from ~0.1 to 0.65
mask);

// show masked image
cv::Mat detected(image.size(), CV_8UC3, cv::Scalar(0, 0, 0));
image.copyTo(detected, mask);
cv::imshow("Detection result",detected);

// A test comparing luminance and brightness

// create linear intensity image
cv::Mat linear(100,256,CV_8U);
for (int i=0; i<256; i++) {

linear.col(i)= i;
}

// create a Lab image
linear.copyTo(channels[0]);
cv::Mat constante(100,256,CV_8U,cv::Scalar(128));
constante.copyTo(channels[1]);
constante.copyTo(channels[2]);
cv::merge(channels,image);

// convert back to BGR
cv::Mat brightness;
cv::cvtColor(image,brightness, CV_Lab2BGR);
cv::split(brightness, channels);

// create combined image
cv::Mat combined(200,256, CV_8U);
cv::Mat half1(combined,cv::Rect(0,0,256,100));
linear.copyTo(half1);
cv::Mat half2(combined,cv::Rect(0,100,256,100));
channels[0].copyTo(half2);

cv::namedWindow("Luminance vs Brightness");
cv::imshow("Luminance vs Brightness",combined);

cv::waitKey();
}

منبع

 

مرحله ۴: سرکوب لبه های غیر حداکثر

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

 

</pre>
<pre>#include "stdafx.h"
#include "tripod.h"
#include "tripodDlg.h"

#include "LVServerDefs.h"
#include "math.h"
#include <fstream>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace std;

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripodDlg dialog

CTripodDlg::CTripodDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTripodDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTripodDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//////////////// Set destination BMP to NULL first 
	m_destinationBitmapInfoHeader = NULL;

}

////////////////////// Additional generic functions

static unsigned PixelBytes(int w, int bpp)
{
    return (w * bpp + 7) / 8;
}

static unsigned DibRowSize(int w, int bpp)
{
    return (w * bpp + 31) / 32 * 4;
}

static unsigned DibRowSize(LPBITMAPINFOHEADER pbi)
{
    return DibRowSize(pbi->biWidth, pbi->biBitCount);
}

static unsigned DibRowPadding(int w, int bpp)
{
    return DibRowSize(w, bpp) - PixelBytes(w, bpp);
}

static unsigned DibRowPadding(LPBITMAPINFOHEADER pbi)
{
    return DibRowPadding(pbi->biWidth, pbi->biBitCount);
}

static unsigned DibImageSize(int w, int h, int bpp)
{
    return h * DibRowSize(w, bpp);
}

static size_t DibSize(int w, int h, int bpp)
{
    return sizeof (BITMAPINFOHEADER) + DibImageSize(w, h, bpp);
}

/////////////////////// end of generic functions


void CTripodDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTripodDlg)
	DDX_Control(pDX, IDC_PROCESSEDVIEW, m_cVideoProcessedView);
	DDX_Control(pDX, IDC_UNPROCESSEDVIEW, m_cVideoUnprocessedView);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTripodDlg, CDialog)
	//{{AFX_MSG_MAP(CTripodDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDEXIT, OnExit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripodDlg message handlers

BOOL CTripodDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	// For Unprocessed view videoportal (top one)
	char sRegUnprocessedView[] = "HKEY_LOCAL_MACHINE\\Software\\UnprocessedView";
	m_cVideoUnprocessedView.PrepareControl("UnprocessedView", sRegUnprocessedView, 0 );	
	m_cVideoUnprocessedView.EnableUIElements(UIELEMENT_STATUSBAR,0,TRUE);
	m_cVideoUnprocessedView.ConnectCamera2();
	m_cVideoUnprocessedView.SetEnablePreview(TRUE);

	// For binary view videoportal (bottom one)
	char sRegProcessedView[] = "HKEY_LOCAL_MACHINE\\Software\\ProcessedView";
	m_cVideoProcessedView.PrepareControl("ProcessedView", sRegProcessedView, 0 );	
	m_cVideoProcessedView.EnableUIElements(UIELEMENT_STATUSBAR,0,TRUE);
	m_cVideoProcessedView.ConnectCamera2();
	m_cVideoProcessedView.SetEnablePreview(TRUE);

	// Initialize the size of binary videoportal
	m_cVideoProcessedView.SetPreviewMaxHeight(240);
	m_cVideoProcessedView.SetPreviewMaxWidth(320);

	// Uncomment if you wish to fix the live videoportal's size
	// m_cVideoUnprocessedView.SetPreviewMaxHeight(240);
	// m_cVideoUnprocessedView.SetPreviewMaxWidth(320);

	// Find the screen coodinates of the binary videoportal
	m_cVideoProcessedView.GetWindowRect(m_rectForProcessedView);
	ScreenToClient(m_rectForProcessedView);
	allocateDib(CSize(320, 240));

	// Start grabbing frame data for Procssed videoportal (bottom one)
	m_cVideoProcessedView.StartVideoHook(0);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTripodDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTripodDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTripodDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTripodDlg::OnExit() 
{
	// TODO: Add your control notification handler code here

	// Kill live view videoportal (top one)
	m_cVideoUnprocessedView.StopVideoHook(0);
    m_cVideoUnprocessedView.DisconnectCamera();	
	
	// Kill binary view videoportal (bottom one)
	m_cVideoProcessedView.StopVideoHook(0);
    m_cVideoProcessedView.DisconnectCamera();	

	// Kill program
	DestroyWindow();	

	

}

BEGIN_EVENTSINK_MAP(CTripodDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTripodDlg)
	ON_EVENT(CTripodDlg, IDC_PROCESSEDVIEW, 1 /* PortalNotification */, OnPortalNotificationProcessedview, VTS_I4 VTS_I4 VTS_I4 VTS_I4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTripodDlg::OnPortalNotificationProcessedview(long lMsg, long lParam1, long lParam2, long lParam3) 
{
	// TODO: Add your control notification handler code here
	
	// This function is called at the camera's frame rate
    
#define NOTIFICATIONMSG_VIDEOHOOK	۱۰

	// Declare some useful variables
	// QCSDKMFC.pdf (Quickcam MFC documentation) p. 103 explains the variables lParam1, lParam2, lParam3 too 
	
	LPBITMAPINFOHEADER lpBitmapInfoHeader; // Frame's info header contains info like width and height
	LPBYTE lpBitmapPixelData; // This pointer-to-long will point to the start of the frame's pixel data
    unsigned long lTimeStamp; // Time when frame was grabbed

	switch(lMsg) {
		case NOTIFICATIONMSG_VIDEOHOOK:
			{
				lpBitmapInfoHeader = (LPBITMAPINFOHEADER) lParam1; 
				lpBitmapPixelData = (LPBYTE) lParam2;
				lTimeStamp = (unsigned long) lParam3;

				grayScaleTheFrameData(lpBitmapInfoHeader, lpBitmapPixelData);
				doMyImageProcessing(lpBitmapInfoHeader); // Place where you'd add your image processing code
				displayMyResults(lpBitmapInfoHeader);

			}
			break;

		default:
			break;
	}	
}

void CTripodDlg::allocateDib(CSize sz)
{
	// Purpose: allocate information for a device independent bitmap (DIB)
	// Called from OnInitVideo

	if(m_destinationBitmapInfoHeader) {
		free(m_destinationBitmapInfoHeader);
		m_destinationBitmapInfoHeader = NULL;
	}

	if(sz.cx | sz.cy) {
		m_destinationBitmapInfoHeader = (LPBITMAPINFOHEADER)malloc(DibSize(sz.cx, sz.cy, 24));
		ASSERT(m_destinationBitmapInfoHeader);
		m_destinationBitmapInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
		m_destinationBitmapInfoHeader->biWidth = sz.cx;
		m_destinationBitmapInfoHeader->biHeight = sz.cy;
		m_destinationBitmapInfoHeader->biPlanes = 1;
		m_destinationBitmapInfoHeader->biBitCount = 24;
		m_destinationBitmapInfoHeader->biCompression = 0;
		m_destinationBitmapInfoHeader->biSizeImage = DibImageSize(sz.cx, sz.cy, 24);
		m_destinationBitmapInfoHeader->biXPelsPerMeter = 0;
		m_destinationBitmapInfoHeader->biYPelsPerMeter = 0;
		m_destinationBitmapInfoHeader->biClrImportant = 0;
		m_destinationBitmapInfoHeader->biClrUsed = 0;
	}
}

void CTripodDlg::displayMyResults(LPBITMAPINFOHEADER lpThisBitmapInfoHeader)
{
	// displayMyResults: Displays results of doMyImageProcessing() in the videoport
	// Notes: StretchDIBits stretches a device-independent bitmap to the appropriate size

	CDC				*pDC;	// Device context to display bitmap data
	
	pDC = GetDC();	
	int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

	StretchDIBits( 
		pDC->GetSafeHdc(),
		m_rectForProcessedView.left,				// videoportal left-most coordinate
		m_rectForProcessedView.top,					// videoportal top-most coordinate
		m_rectForProcessedView.Width(),				// videoportal width
		m_rectForProcessedView.Height(),			// videoportal height
		۰,											// Row position to display bitmap in videoportal
		۰,											// Col position to display bitmap in videoportal
		lpThisBitmapInfoHeader->biWidth,			// m_destinationBmp's number of columns
		lpThisBitmapInfoHeader->biHeight,			// m_destinationBmp's number of rows
		m_destinationBmp,							// The bitmap to display; use the one resulting from doMyImageProcessing
		(BITMAPINFO*)m_destinationBitmapInfoHeader, // The bitmap's header info e.g. width, height, number of bits etc
		DIB_RGB_COLORS,								// Use default 24-bit color table
		SRCCOPY										// Just display
	);
 
	SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

	ReleaseDC(pDC);

	// Note: 04/24/02 - Added the following:
	// Christopher Wagner cwagner@fas.harvard.edu noticed that memory wasn't being freed

	// Recall OnPortalNotificationProcessedview, which gets called everytime
	// a frame of data arrives, performs 3 steps:
	// (۱) grayScaleTheFrameData - which mallocs m_destinationBmp
	// (۲) doMyImageProcesing
	// (۳) displayMyResults - which we're in now
	// Since we're finished with the memory we malloc'ed for m_destinationBmp
	// we should free it: 
	
	free(m_destinationBmp);

	// End of adds
}

void CTripodDlg::grayScaleTheFrameData(LPBITMAPINFOHEADER lpThisBitmapInfoHeader, LPBYTE lpThisBitmapPixelData)
{

	// grayScaleTheFrameData: Called by CTripodDlg::OnPortalNotificationBinaryview
	// Task: Read current frame pixel data and computes a grayscale version

	unsigned int	W, H;			  // Width and Height of current frame [pixels]
	BYTE            *sourceBmp;		  // Pointer to current frame of data
	unsigned int    row, col;
	unsigned long   i;
	BYTE			grayValue;

	BYTE			redValue;
	BYTE			greenValue;
	BYTE			blueValue;

    W = lpThisBitmapInfoHeader->biWidth;  // biWidth: number of columns
    H = lpThisBitmapInfoHeader->biHeight; // biHeight: number of rows

	// Store pixel data in row-column vector format
	// Recall that each pixel requires 3 bytes (red, blue and green bytes)
	// m_destinationBmp is a protected member and declared in binarizeDlg.h

	m_destinationBmp = (BYTE*)malloc(H*3*W*sizeof(BYTE));

	// Point to the current frame's pixel data
	sourceBmp = lpThisBitmapPixelData;

	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {

			// Recall each pixel is composed of 3 bytes
			i = (unsigned long)(row*3*W + 3*col);
        
			// The source pixel has a blue, green andred value:
			blueValue  = *(sourceBmp + i);
			greenValue = *(sourceBmp + i + 1);
			redValue   = *(sourceBmp + i + 2);

			// A standard equation for computing a grayscale value based on RGB values
			grayValue = (BYTE)(0.299*redValue + 0.587*greenValue + 0.114*blueValue);

			// The destination BMP will be a grayscale version of the source BMP
			*(m_destinationBmp + i)     = grayValue;
			*(m_destinationBmp + i + 1) = grayValue;
			*(m_destinationBmp + i + 2) = grayValue;
			
		}
	}
}


void CTripodDlg::doMyImageProcessing(LPBITMAPINFOHEADER lpThisBitmapInfoHeader)
{
	// doMyImageProcessing:  This is where you'd write your own image processing code
	// Task: Read a pixel's grayscale value and process accordingly

	unsigned int	W, H;			// Width and Height of current frame [pixels]
	unsigned int    row, col;		// Pixel's row and col positions
	unsigned long   i;				// Dummy variable for row-column vector
	int	    upperThreshold = 60;	// Gradient strength nessicary to start edge
	int		lowerThreshold = 30;	// Minimum gradient strength to continue edge
	unsigned long iOffset;			// Variable to offset row-column vector during sobel mask
	int rowOffset;					// Row offset from the current pixel
	int colOffset;					// Col offset from the current pixel
	int rowTotal = 0;				// Row position of offset pixel
	int colTotal = 0;				// Col position of offset pixel
	int Gx;							// Sum of Sobel mask products values in the x direction
	int Gy;							// Sum of Sobel mask products values in the y direction
	float thisAngle;				// Gradient direction based on Gx and Gy
	int newAngle;					// Approximation of the gradient direction
	bool edgeEnd;					// Stores whether or not the edge is at the edge of the possible image
	int GxMask[3][3];				// Sobel mask in the x direction
	int GyMask[3][3];				// Sobel mask in the y direction
	int newPixel;					// Sum pixel values for gaussian
	int gaussianMask[5][5];			// Gaussian mask

	W = lpThisBitmapInfoHeader->biWidth;  // biWidth: number of columns
    H = lpThisBitmapInfoHeader->biHeight; // biHeight: number of rows
	
	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {
			edgeDir[row][col] = 0;
		}
	}

	/* Declare Sobel masks */
	GxMask[0][0] = -1; GxMask[0][1] = 0; GxMask[0][2] = 1;
	GxMask[1][0] = -2; GxMask[1][1] = 0; GxMask[1][2] = 2;
	GxMask[2][0] = -1; GxMask[2][1] = 0; GxMask[2][2] = 1;
	
	GyMask[0][0] =  1; GyMask[0][1] =  2; GyMask[0][2] =  1;
	GyMask[1][0] =  0; GyMask[1][1] =  0; GyMask[1][2] =  0;
	GyMask[2][0] = -1; GyMask[2][1] = -2; GyMask[2][2] = -1;

	/* Declare Gaussian mask */
	gaussianMask[0][0] = 2;		gaussianMask[0][1] = 4;		gaussianMask[0][2] = 5;		gaussianMask[0][3] = 4;		gaussianMask[0][4] = 2;	
	gaussianMask[1][0] = 4;		gaussianMask[1][1] = 9;		gaussianMask[1][2] = 12;	gaussianMask[1][3] = 9;		gaussianMask[1][4] = 4;	
	gaussianMask[2][0] = 5;		gaussianMask[2][1] = 12;	gaussianMask[2][2] = 15;	gaussianMask[2][3] = 12;	gaussianMask[2][4] = 2;	
	gaussianMask[3][0] = 4;		gaussianMask[3][1] = 9;		gaussianMask[3][2] = 12;	gaussianMask[3][3] = 9;		gaussianMask[3][4] = 4;	
	gaussianMask[4][0] = 2;		gaussianMask[4][1] = 4;		gaussianMask[4][2] = 5;		gaussianMask[4][3] = 4;		gaussianMask[4][4] = 2;	
	

	/* Gaussian Blur */
	for (row = 2; row < H-2; row++) {
		for (col = 2; col < W-2; col++) {
			newPixel = 0;
			for (rowOffset=-2; rowOffset<=2; rowOffset++) {
				for (colOffset=-2; colOffset<=2; colOffset++) {
					rowTotal = row + rowOffset;
					colTotal = col + colOffset;
					iOffset = (unsigned long)(rowTotal*3*W + colTotal*3);
					newPixel += (*(m_destinationBmp + iOffset)) * gaussianMask[2 + rowOffset][2 + colOffset];
				}
			}
			i = (unsigned long)(row*3*W + col*3);
			*(m_destinationBmp + i) = newPixel / 159;
		}
	}

	/* Determine edge directions and gradient strengths */
	for (row = 1; row < H-1; row++) {
		for (col = 1; col < W-1; col++) {
			i = (unsigned long)(row*3*W + 3*col);
			Gx = 0;
			Gy = 0;
			/* Calculate the sum of the Sobel mask times the nine surrounding pixels in the x and y direction */
			for (rowOffset=-1; rowOffset<=1; rowOffset++) {
				for (colOffset=-1; colOffset<=1; colOffset++) {
					rowTotal = row + rowOffset;
					colTotal = col + colOffset;
					iOffset = (unsigned long)(rowTotal*3*W + colTotal*3);
					Gx = Gx + (*(m_destinationBmp + iOffset) * GxMask[rowOffset + 1][colOffset + 1]);
					Gy = Gy + (*(m_destinationBmp + iOffset) * GyMask[rowOffset + 1][colOffset + 1]);
				}
			}

			gradient[row][col] = sqrt(pow(Gx,2.0) + pow(Gy,2.0));	// Calculate gradient strength			
			thisAngle = (atan2(Gx,Gy)/3.14159) * 180.0;		// Calculate actual direction of edge
			
			/* Convert actual edge direction to approximate value */
			if ( ( (thisAngle < 22.5) && (thisAngle > -22.5) ) || (thisAngle > 157.5) || (thisAngle < -157.5) )
				newAngle = 0;
			if ( ( (thisAngle > 22.5) && (thisAngle < 67.5) ) || ( (thisAngle < -112.5) && (thisAngle > -157.5) ) )
				newAngle = 45;
			if ( ( (thisAngle > 67.5) && (thisAngle < 112.5) ) || ( (thisAngle < -67.5) && (thisAngle > -112.5) ) )
				newAngle = 90;
			if ( ( (thisAngle > 112.5) && (thisAngle < 157.5) ) || ( (thisAngle < -22.5) && (thisAngle > -67.5) ) )
				newAngle = 135;
				
			edgeDir[row][col] = newAngle;		// Store the approximate edge direction of each pixel in one array
		}
	}

	/* Trace along all the edges in the image */
	for (row = 1; row < H - 1; row++) {
		for (col = 1; col < W - 1; col++) {
			edgeEnd = false;
			if (gradient[row][col] > upperThreshold) {		// Check to see if current pixel has a high enough gradient strength to be part of an edge
				/* Switch based on current pixel's edge direction */
				switch (edgeDir[row][col]){		
					case 0:
						findEdge(0, 1, row, col, 0, lowerThreshold);
						break;
					case 45:
						findEdge(1, 1, row, col, 45, lowerThreshold);
						break;
					case 90:
						findEdge(1, 0, row, col, 90, lowerThreshold);
						break;
					case 135:
						findEdge(1, -1, row, col, 135, lowerThreshold);
						break;
					default :
						i = (unsigned long)(row*3*W + 3*col);
						*(m_destinationBmp + i) = 
						*(m_destinationBmp + i + 1) = 
						*(m_destinationBmp + i + 2) = 0;
						break;
					}
				}
			else {
				i = (unsigned long)(row*3*W + 3*col);
					*(m_destinationBmp + i) = 
					*(m_destinationBmp + i + 1) = 
					*(m_destinationBmp + i + 2) = 0;
			}	
		}
	}
	
	/* Suppress any pixels not changed by the edge tracing */
	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {	
			// Recall each pixel is composed of 3 bytes
			i = (unsigned long)(row*3*W + 3*col);
			// If a pixel's grayValue is not black or white make it black
			if( ((*(m_destinationBmp + i) != 255) && (*(m_destinationBmp + i) != 0)) || ((*(m_destinationBmp + i + 1) != 255) && (*(m_destinationBmp + i + 1) != 0)) || ((*(m_destinationBmp + i + 2) != 255) && (*(m_destinationBmp + i + 2) != 0)) ) 
				*(m_destinationBmp + i) = 
				*(m_destinationBmp + i + 1) = 
				*(m_destinationBmp + i + 2) = 0; // Make pixel black
		}
	}

	/* Non-maximum Suppression */
	for (row = 1; row < H - 1; row++) {
		for (col = 1; col < W - 1; col++) {
			i = (unsigned long)(row*3*W + 3*col);
			if (*(m_destinationBmp + i) == 255) {		// Check to see if current pixel is an edge
				/* Switch based on current pixel's edge direction */
				switch (edgeDir[row][col]) {		
					case 0:
						suppressNonMax( 1, 0, row, col, 0, lowerThreshold);
						break;
					case 45:
						suppressNonMax( 1, -1, row, col, 45, lowerThreshold);
						break;
					case 90:
						suppressNonMax( 0, 1, row, col, 90, lowerThreshold);
						break;
					case 135:
						suppressNonMax( 1, 1, row, col, 135, lowerThreshold);
						break;
					default :
						break;
				}
			}	
		}
	}
	
}

void CTripodDlg::findEdge(int rowShift, int colShift, int row, int col, int dir, int lowerThreshold)
{
	int W = 320;
	int H = 240;
	int newRow;
	int newCol;
	unsigned long i;
	bool edgeEnd = false;

	/* Find the row and column values for the next possible pixel on the edge */
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;		// If the next pixel would be off image, don't do the while loop
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
		
	/* Determine edge directions and gradient strengths */
	while ( (edgeDir[newRow][newCol]==dir) && !edgeEnd && (gradient[newRow][newCol] > lowerThreshold) ) {
		/* Set the new pixel as white to show it is an edge */
		i = (unsigned long)(newRow*3*W + 3*newCol);
		*(m_destinationBmp + i) =
		*(m_destinationBmp + i + 1) =
		*(m_destinationBmp + i + 2) = 255;
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
	}	
}

void CTripodDlg::suppressNonMax(int rowShift, int colShift, int row, int col, int dir, int lowerThreshold)
{
	int W = 320;
	int H = 240;
	int newRow = 0;
	int newCol = 0;
	unsigned long i;
	bool edgeEnd = false;
	float nonMax[320][3];			// Temporarily stores gradients and positions of pixels in parallel edges
	int pixelCount = 0;					// Stores the number of pixels in parallel edges
	int count;						// A for loop counter
	int max[3];						// Maximum point in a wide edge
	
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;		// If the next pixel would be off image, don't do the while loop
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
	i = (unsigned long)(newRow*3*W + 3*newCol);
	/* Find non-maximum parallel edges tracing up */
	while ((edgeDir[newRow][newCol] == dir) && !edgeEnd && (*(m_destinationBmp + i) == 255)) {
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
		nonMax[pixelCount][0] = newRow;
		nonMax[pixelCount][1] = newCol;
		nonMax[pixelCount][2] = gradient[newRow][newCol];
		pixelCount++;
		i = (unsigned long)(newRow*3*W + 3*newCol);
	}

	/* Find non-maximum parallel edges tracing down */
	edgeEnd = false;
	colShift *= -1;
	rowShift *= -1;
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;	
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
	i = (unsigned long)(newRow*3*W + 3*newCol);
	while ((edgeDir[newRow][newCol] == dir) && !edgeEnd && (*(m_destinationBmp + i) == 255)) {
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
		nonMax[pixelCount][0] = newRow;
		nonMax[pixelCount][1] = newCol;
		nonMax[pixelCount][2] = gradient[newRow][newCol];
		pixelCount++;
		i = (unsigned long)(newRow*3*W + 3*newCol);
	}

	/* Suppress non-maximum edges */
	max[0] = 0;
	max[1] = 0;
	max[2] = 0;
	for (count = 0; count < pixelCount; count++) {
		if (nonMax[count][2] > max[2]) {
			max[0] = nonMax[count][0];
			max[1] = nonMax[count][1];
			max[2] = nonMax[count][2];
		}
	}
	for (count = 0; count < pixelCount; count++) {
		i = (unsigned long)(nonMax[count][0]*3*W + 3*nonMax[count][1]);
		*(m_destinationBmp + i) = 
		*(m_destinationBmp + i + 1) = 
		*(m_destinationBmp + i + 2) = 0;
	}
}

 

دانلود کد فوق از طریق لینک زیر:

Canny in C++ -No2

رمز فایل : behsanandish.com

الگوریتم Canny در سی پلاس پلاس قسمت ۱
الگوریتم Canny در سی پلاس پلاس قسمت ۲
الگوریتم Canny در سی پلاس پلاس قسمت ۳
الگوریتم Canny در سی پلاس پلاس قسمت ۴

♦ عامل های مبتنی بر هدف (goal-based agents)

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

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

توجه کنید که این نوع تصمیم گیری با “قوانین شرط فعالیت” که شرح آنها گذشت متفاوت است، به طوری که باید آینده را در نظر گرفت: “اگر چنین و چنان کنم، چه اتفاقی می افتد؟” ، “این مراحل مرا خوشحال می کند”. در طراحی های عامل واکنشی، این اطلاعات صریحا نمایش داده نمی شوند، زیرا قوانین داخلی، مستقیما از ادراکات به فعالیت ها نگاشت می شوند. عامل واکنشی، وقتی ترمز می کند که لامپ های ترمز را ببیند. در اصل عامل مبتنی بر هدف نتیجه می گیرد که اگر چراغ ترمز اتومبیل جلویی روشن شود، سرعت آن کاهش می یابد. با توجه به چگونگی تکامل جهان، تنها عملی که منجر به برخورد با اتومبیل دیگر نمیشود، ترمز کردن است.

گرچه عامل مبتنی ببر هدف کارایی چندانی ندارد، قابلیت انعطاف آن بیشتر است. زیرا دانشی که از تصمیمات آن پشتیبانی می کند، صریحا نمایش داده می شود و قابل اصلاح است. برای عامل واکنشی، باید بسیاری از “قوانین شرط فعالیت” را بازنویسی کنیم. رفتار عامل مبتنی بر هدف می تواند تغییر کند تا به هدف مورد نظر برسد.

♦ عامل های مبتنی بر سودمندی (utility-based agents)

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

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

این روش، تنها روش خردمند بودن نیست، اما همانند عامل های مبتنی بر هدف، عامل های مبتنی بر سودمندی از نظر قابلیت انعطاف و یادگیری، امتیازات زیادی دارند. علاوه بر این، در دو مورد اهداف چندان روشن نیستند، ولی عامل مبتنی بر سودمندی هنوز میتواند تصمیمات خردمندانه بگیرد.

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

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

ماهیت محیط های عامل های هوشمند

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

تعیین کردن محیط کار

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

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

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

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

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

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

خواص محیط های کار (task environment)

بدیهی است که حدود محیط های کار AI بسیار گسترده است. می توانیم محیط های کار را به چند بعد تقسیم کنیم. این ابعاد، طراحی مناسب عامل و قابلیت اجرای هر خانواده از تکنیک ها را برای محیط عامل تعیین میکنند. این ابعاد عبارتنداز:

• “کاملا قابل مشاهده” در مقابل “پاره ای قابل مشاهده” (Fully observable vs. partially observable) :

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

• تک عاملی در برابر چند عاملی (Single agent vs. multiagent) :

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

• قطعی در مقابل اتفاقی (Deterministic vs. stochastic) :

اگر حالت بعدی محیط کاملا توسط حالت فعلی و عملی که عامل در حال انجام آن است، کاملا قابل تعیین باشد، می گوییم این محیط، قطعی است، وگرنه این محیط اتفاقی است. در اصل، عامل نباید در یک محیط قطعی و کاملا قابل مشاهده، نگران عدم اطمینان باشد. (در تعریف ما، عدم اطمینان ناشی از سایر عامل ها را در محیط چند عامل، نادیده می گیریم؛ بنابراین، در یک بازی حتی اگر هیچ عاملی نتواند فعالیت های عامل های دیگر را پیش بینی کند، این بازی میتواند قطعی باشد). اگر محیط پاره ای قابل مشاهده باشد، ممکن است اتفاقی به نظر برسد. بعضی از وضعیت های واقعی، آنقدر پیچیده هستند که نگهداری تمام جنبه های مشاهده نشده ی آن، غیر ممکن است؛ برای اهداف عملی، باید با آنها بصورت غیر قطعی یا اتفاقی رفتار کرد. اگر محیطی کاملا قابل مشاهده نباشد یا غیر قطعی باشد، می گوییم این محیط غیر قابل اعتماد یا نامطمئن است. منظور از واژه ی “غیر قطعی” این است که عدم اعتماد نسبت به نتایج، بر حسب احتمالات تعیین میشود؛ محیط غیر قطعی، محیطی است که در آن، فعالیت ها بر اساس نتایج ممکن مشخص می گردد، ولی هیچ احتمالی به آنها نسبت داده نمیشود. توصیف های محیط غیر قطعی، معمولا همراه با معیارهای کارایی است که برای موفقیت عامل در تمام نتایج ممکن از فعالیت های خود، ضروری است.

• مرحله ای در مقابل ترتیبی (Episodic vs. sequential) :

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

• ایستا در مقابل پویا (Static vs. dynamic) :

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

• گسسته در مقابل پیوسته (Discrete vs. continuous) :

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

• شناخته شده در مقابل ناشناخته (Known vs. unknown) :

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

 

چرا دوربین‌ها ۲۹٫۹۷ فریم بر ثانیه فیلم‌برداری می‌کنند و نه ۳۰ فریم؟

چرا در جزییات فنی فیلم‌برداری در بخش فریم ریت به جای عدد ۳۰ فریم، عدد۲۹٫۹۷ فریم بر ثانیه فیلم‌برداری ذکر می‌شود؟ احتمالاً اگر در بررسی مشخصات ویدیویی خیلی از دوربین‌ها از دوربین‌های موبایل گرفته تا دوربین‌های فیلم‌برداری، نکته‌سنج بوده باشید این سؤال در ذهن شما هم شکل گرفته باشد. هر چند که می‌توان این مطلب را به صورت فنی تشریح کرد ولی در ادامه سعی شده است تا با بیانی ساده آن را موردبررسی قرار دهیم.در ابتدا بهتر است ، کمی راجع به فریم ریت توضیح بدهیم. فریم ریت یا در اصل همان فریم در ثانیه به نرخ تصویری اشاره دارد که به صورت متوالی و پشت سر هم توسط یک دستگاه تولید می‌شود.

واحد اندازه‌گیری فریم،FPS یا همان فریم در ثانیه است. برای همین وقتی در مشخصات فیلم‌برداری دوربین عدد ۲۹٫۹۷ درج می‌شود این عدد معادل تعداد فریم هایی است که آن دوربین در عرض یک ثانیه ثبت می‌کند. حتی در دوربین‌های پیشرفته‌تر که به ادعای شرکت سازنده می‌توانند تصاویر را با فریم ریت ۶۰ fps رکورد کنند در ۹۹ درصد مواقع در هر دو حالت DF و NDF به صورت دقیق با فریم ریت ۵۹.۹۴ فریم بر ثانیه تصاویر را ضبط می‌کند. با این تفاسیر چرا این عدد دقیقاً ۳۰ یا ۶۰ فریم در ثانیه نیست؟

مروری بر گذشته

در زمان معرفی اولین تلویزیون‌های سیاه و سفید NTSC فریم ریت دقیقاً معادل ۳۰ فریم در ثانیه بود؛ اما رد پای عدد عجیب ۲۹٫۹۷ و (بعدها ۵۹.۹۴) فریم در ثانیه برای اولین بار با معرفی تلویزیون‌های رنگی پیدا شد. در زمان تولید این تلویزیون‌ها، مهندسان سازنده باید اطلاعات رنگ را نیز به سیگنال‌های تلویزیونی اضافه می‌کردند؛ اما به خاطر محدودیت پهنای باند تصمیم گرفتند که تا حد ناچیزی از فریم ریت تلویزیون بکاهند تا اطلاعات رنگ نیز بدون اینکه سیگنال‌های تلویزیونی دچار معایبی شوند در آن گنجانده شود.

 

 

این تصمیم از این جهت گرفته شد که عملاً چاره دیگری نبود، از نظر فنی امکان افزایش پهنای باند وجود نداشت؛ و افزایش تفکیک‌پذیری (بالا بردن تعداد خط‌های افقی) بدون افزایش پهنای باند درنهایت باعث افت تفکیک‌پذیری و کاهش کیفیت تصویر می‌شد. برای همین ۲۹٫۹۷ فریم در ثانیه به فریم ریت استاندارد تلویزیون‌های رنگی NTSC تبدیل شد. دوربین‌های فیلم‌برداری امروزی هم به همان ترتیب به جای ۳۰ فریم در واقع قابلیت ثبت ۲۹٫۹۷ فریم در ثانیه را دارند. البته این تفاوت آن‌قدر ناچیز هست که در اصطلاح رایج به ذکر عدد ۳۰ و ۶۰ فریم در ثانیه اکتفا می‌شود.

 

 

از طرفی دیگر استاندارد تلویزیونی PAL کاملاً برای سازگاری با تلویزیون‌های رنگی در نظر گرفته شده است. در نتیجه بدون لطمه خوردن به تفکیک‌پذیری، از فریم ریتی مناسبی برخوردار است؛ بنابراین بستگی دارد که دوربین با چه استانداردی (PAL و NTSC) تصاویر را رکورد می‌کند.

 

 

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

در این نوشته سعی شده به بررسی کلی سیستم های تشخیص خودکار پلاک خودرو و بررسی یکی از روش های تشخیص و خواندن پلاک پرداخته شود. شرکت بهسان اندیش تولید کننده سامانه های هوشمند مفتخر به تولید یکی از دقیقترین و سریعترین سامانه های جامع کنترل تردد خودرو می باشد که می توانید جهت آشنایی با این محصول به لینک :سامانه جامع کنترل تردد خودرو بهسان(پلاک خوان) مراجعه بفرمایید.

 

نویسنده: آقایان علی اوحدی و محسن امیدوار

تعداد صفحات : ۴۲

کلیمه عبور فایل : behsanandish.com

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

 تشخیص هویت زیست‌سنجی و بیومتریک

زیست سنجی ، یا بیومتریک (به انگلیسی: Biometrics)، به نوع خاصی از روش‌های امنیتی گفته می‌شود که در آن برای کنترل دسترسی و برقراری امنیت از خواص قابل اندازه‌گیری بدن انسان یا هر موجود زندهٔ دیگر استفاده می‌شود. همانگونه که از کلمهٔ بیومتریک بر می‌آید در این روش با استفاده از الگوریتم‌های ریاضی از اندام‌ها برداشت‌های ثابت و یکتایی می‌شود که می‌توان از آن به عنوان یک کلمهٔ عبور یکسان و غیرقابل تقلید و گاه غیرقابل تغییر استفاده کرد. به هر خصوصیت زیستی یا فیزیکی که با رایانه قابل اندازه‌گیری و بازشناسی خودکار باشد زیست‌سنجه گفته می‌شود.

اگرچه ممکن است این اسم به نظر غریب و جدید بیاید اما واقعیت این است که بشر مدت زیادی‌است که از آن بهره می‌برد و مثال زندهٔ آن استفاده از عکس‌هایی‌است که در کارت‌های مختلف از آن بهره می‌بریم. در واقع در تمامی آن کارت‌ها شخص کنترل‌کننده با دیدن عکس و مقایسه آن با چهره واقعی شما از اصول اولیه زیست سنجی (بیومتری) پیروی می‌کند یکی دیگر از اینگونه مثال‌ها استفاده از اثر انگشت است که قدمتی بس طولانی در بین اذهان عمومی بشر دارد.

 

Biometricsec.jpg

 

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

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

۲- خصوصیات رفتاری انسان‌ها، این ویژگی‌ها در حقیقت خصوصیات ناشی از رفتارهای انسان هاست نظیر راه رفتن انسان، نحوه فشردن دکمه‌ها (مثلاً موبایل) و غیره که می‌تواند بیانگر مشخصات یک انسان خاص باشد نظیر راه رفتن یک انسان که گاهی با نگاه کردن آن از پشت سر می‌توان تشخیص داد که وی کدام یک از دوستانتان است.

 

انواع روش‌های تعیین هویت زیست سنجی موجود

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

ارزیابی ویژگی‌های بیومتریک انسان

معمولاً ویژگی‌های انسان‌ها با ۹ پارامتر مورد ارزیابی قرار می‌گیرد که عبارتند از:

۱- عمومیت، هر شخص دارای آن ویژگی باشد.

۲- یکتایی، چه تعداد نمونه متفاوت را می‌توان تفکیک کرد.

۳- دوام، معیاری برای آنکه سنجش شود یک ویژگی چه مدت عمر می‌کند.

۴- قابلیت ارزیابی، سهولت استفاده برای ارزیابی نمونه‌های متفاوت.

۵- کارایی، دقت، سرعت و پایداری روش مورد استفاده.

۶- مقبولیت، میزان پذیرش تکنولوژی.

۷- جایگزین، سهولت در استفاده از جایگزین

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

۹- تشخیص هویت، در سیستم‌های تشخیص هویت مشخصه بیومتریک فرد به سیستم ارائه می‌شود و سیستم با جستجوی پایگاه اطلاعات مشخصات فرد را در صورت موجود بودن استخراج می‌کند.

مزایای استفاده از روش‌های امنیتی زیست سنجی

با این روش شما می‌توانید تقریباً مطمئن باشید که همان کسی که باید به منابع دسترسی دارد برای مثال اثر انگشت همواره یکتا و یکسان است، مشکلاتی مانند فراموش کردن رمز عبور یا گم کردن آن در این روش وجود ندارد. سرعت بسیار بالایی دارد و برای کاربران عادی نیاز به آموزش ندارد، امکان سرقت آلات بیومتری (زیست سنجشی) نیز بسیار کم است! یا در پاره ایی از مواقع صفر است.

منبع


بیومتریک

معرفی علم بیومتریک

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

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

علم بیومتریک اشاره دارد به تکنولوژیی برای اندازه‌گیری و آنالیز مشخصات بدن افراد جهت تشخیص هویت شخص.

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

مقدمه

از دیر باز انسان برای بقا، نیاز به تشخیص دوست از دشمن داشته است و تشخیص هویت برای وی امری حیاتی بوده و هست، لذا امروزه سعی در مکانیزه سازی سیستمهای شناسایی یا تشخیص هویت شده است. «این پیشرفتها دلیل بر نیاز جامعه و جهان است». نیازی که پیشرفت در آن باعث کاهش تخلفات، افزایش امنیت، تسریع در امور روزمره و … شده است.

در گذشته جهت شناسایی جرم و جنایتکار، از روال شناسایی اثر انگشت و چهره‌نگاری استفاده می‌شده، اما اکنون سیستمهای مکانیزه‌ای ایجاد شده است.

سیستمهای تشخیص هویت

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

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

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

بیومتریک چیست؟

  • اندازه‌گیری و تحلیل آماری داده‌های بیولوژیکی
  • بیومتریک اشاره دارد به تکنولوژیی برای اندازه‌گیری و آنالیز مشخصات بدن افراد جهت تشخیص هویت شخص
  • شناسایی اتوماتیک یک شخص با استفاده از ویژگیهای اختصاصی (مشخصات فیزیولوژیکی یا رفتاری)(تعریف در کنسرسیوم بیومتریک)

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

طبقه‌بندی متدهای بیومتریک

عموماً در سیستمهای بیومتریک از دو نوع ویژگی مختلف افراد جهت شناسایی استفاده می‌شود که در ذیل به آنها اشاره می‌کنیم.

  • (پارامترهای فیزیولوژیکی)

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

  • (پارامترهای رفتاری)

شناسایی الگوهای رفتاری مشخص یک فرد

پارامترهای فیزیولوژیکی:

  • (اثر انگشت)
  • (شناسایی از روی شبکیه چشم)
  • (شناسایی از طرق عنبیه چشم)
  • (شناسایی از روی هندسه دست)

پارامترهای رفتاری:

  • (شناسایی از طریق امضاء)
  • (شناسایی از طریق صدا)
  • (شناسایی از روی شدت ضربه شخص بر روی کیبورد)

در این مقاله ما سعی بر معرفی این سیتمها داریم.

معماری سیستمهای بیومتریک

تمامی سیستمهای بیومتریک دارای یک معماری کلی یکسان در ساخت هستند که به آنها اشاره می‌کنیم.

  • درخواست داده‌ها
  • پردازش سیگنال
  • تطبیق
  • تصمیم‌گیری
  • فضای ذخیره‌سازی
  • محیط انتقال داده‌ها

زیر سیستم درخواست داده در این زیر سیستم داده‌های خام، که از یک فرد، توسط یک سنسور ویژه اسکن شده است، وارد سیستم می‌شود. فرایندی که در این زیر سیستم انجام می‌شود:

  • دریافت داده‌ها توسط سنسور
  • تبدیل داده‌های (سیگنالها) دریافتی از سنسورها به فرم مناسبی (A/D) جهت ارسال به زیر سیستم پردازش سیگنال

زیرسیستم پردازش سیگنال عملیات این زیر سیستم به شرح ذیل می‌باشد:

  1. دریافت داده‌های خام از زیر سیستم جمع‌آوری داده
  2. استخراج خصیصه
  3. عملیات فیلترینگ جهت حذف نویز
  4. اصلاح داده‌ها
  5. تبدیل داده‌های دریافتی به فرم لازم (تولید الگو) برای زیر

سیستم تطبیق.

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

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

زیرسیستم تطبیق

خروجی این زیر سیستم از مقایسه دو الگو بدست می‌آید. فرایند این زیر سیستم شامل:

دریافت داده‌های پردازش شده (الگو) از زیر سیستم قبل و دریافت الگوهای ذخیره شده مقایسه الگوی تولید شده در زیر سیستم قبل، با الگوهای موجود

زیر سیستم تصمیم‌گیری

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

زیر سیستم فضای ذخیره‌سازی

شامل الگوهایی است که در هنگام ثبت نام از کاربران بدست آمده است. ممکن است برای هر کاربر یک یا چند الگو ذخیره شده باشد.

زیر سیستم محیط انتقال

وظیفه این بخش انتقال داده‌ها، بین اجزاء یک سیستم بیومتریک است.

پارامترهای مهم در سیستم‌های بیومتریک

در همه سیستمهای بیومتریک پارامترهایی موجودند که ویژگیها و قابلیتهای سیستم شما را معرفی می‌کنند.

  1. نرخ پذیرش اشتباه

این پارامتر تعیین کننده امکان پذیرش کاربر جعلی از کاربر اصلی می‌باشد. این پارامتر باید تا جای ممکن کوچک باشد.

  1. نرخ عدم پذیرش اشتباه

این مقیاس نمایانگر اینست که تا چه اندازه شخص اصلی اشتباهاً پذیرش نمی‌شود (حساسیت بسیار بالا). این پارامتر نیز باید تا حد مورد نیاز کم باشد.

  1. نرخ خطای مساوی:

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

  1. نرخ ثبت نام نادرست

احتمال خطایی که در هنگام نمونه بردای جهت ثبت در پایگاه داده، در خصوص تشخیص صحیح ممکن است رخ هد.

تکنولوژیهای بیومتریک

  • اثر انگشت
  • هندسه دست
  • اندازه‌گیری شبکیه چشم
  • اندازه‌گیری عنبیه
  • تشخیص چهره
  • تشخیص امضاء
  • تشخیص صدا
  • آزمایش دی‌ان‌ای
  • تشخیص از روی سیاهرگ دست
  • نمودار حرارتی چهره
  • شدت ضربه بر روی صفخه کلید
  • شکل گوش
  • بوی بدن

شناسایی از طریق اثر انگشت

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

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

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

در حالت دیگر مابقی ریزه کاریهای ذکر شده نیز الگو برداری می‌شوند.”با مقایسه نوع، راستا (جهت) و ارتباط (موقعیت) ریزه کاریها عمل شناسایی انجام می‌شود. ”

در روش دوم از مقایسه نواحی در برگیرنده همه ریزه کاریهای ذکر شده و نیز علامت‌های مجزای دیگر و داده‌های حاصل از مقایسه مجموعه لبه‌ها در این نواحی، استفاده می‌شود.

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

مراحل پردازش تصویر در شناسایی بر اساس اثر انگشت

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

در حالت سوم نویزهای موجود در تصویر اول را حذف کرده سپس مرز بین لبه‌ها و شیارها مشخص می‌شود.

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

سنسورهای مورد استفاده در روش شناسایی با استفاده از اثر انگشت:

۱-سنسور نوری

در این تکنولوژی کاربر انگشت خود را بر روی یک سطح پلاستیکی یا شیشه‌ای تمییز قرار می‌دهد، سپس یک اسکنر) CCD (شروع به اسکن کردن و تصویر برداری از انگشت می‌کند. این اسکنرها دارای تعدادی گیرنده نوری هستند که بصورت سطری در کنار یکدیگر قرار گرفته‌اند، که نوسانات و تغییرات شدت نور دریافتی را اندازه‌گیری می‌کنند. با تابش یک دسته شعاع نوری با شدت ثابت به انگشت، بازتاب این شعاع نوری توسط این دوربینهای CCD اندازه‌گیری می‌شود. این آرایه‌های CCD تصویری با رزولوشن ۷۲–۶۰۰dpi را نمایش می‌دهند؛ که البته قابلیت تصویر برداری تا ۱۰۰۰dpi را دارا می‌باشند. تصویر اثر انگشت تولیدی بصورت یکسری لبه‌های تاریک و شیارهای روشن نشان داده می‌شود که در ابتدا نامفهومند و با عملیات پردازش تصویر، تصویر واضحی از اثر انگشت تولید می‌شود

۲-سنسور خازنی

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

با توجه به اینکه فاصله بین پیک لبه و شیار از یک نقطه به یک نقطه دیگر تغییر می‌کند، داده خام برگردانده شده توسط سنسور به یک تصویر درهم که دارای یکسری سایه‌های خاکستری است، تبدیل می‌شود؛ که از یک الگوریتم دیگر جهت تکمیل و تصحیح این تصویر استفاده می‌شود رزولوشن این تصویر توسط اندازه و تقسیم‌بندی سلولهای سنسور تعیین می‌گردد. بعنوان مثال برای یک رزولوشن ۵۰۰dpi به یک سنسور با اندازه سلول ۵۰۰ میکرون نیاز است. عموماً این سری سنسورها رزولوشن ۲۵۰–۵۰۰dpi را تولید می‌کنند. دقت این سنسورها تا اندازه‌ای پایین است و نیاز به بازسازی تصویر بیشتری دارند.

۳-سنسور آلتراسوند

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

  1. هر شخص دارای اثر انگشت منحصربه‌فردی است
  2. اثر انگشت در برابر گذشت زمان مقاوم است
  3. این تکنولوژی به بلوغ خود رسیده است
  4. استفاده از آن بسیار راحت است
  5. دارای نرخ خطای مساوی پایینی می‌باشد
  6. ارزان است
  7. عامه پسند است

شناسایی از طریق چهره

فرم هندسی یک چهره نیز از پارامترهای مورد اندازه‌گیری در سیستمهای بیومتریک است ولی نمی‌توان گفت که جزء خصیصه‌های منحصربه‌فرد افراد است لذا این سیستمها در جاهایی که تعداد کاربران کم است و نیز زمانهای الگوبرداری درازمدت نیست، این سیستمها مناسبند. از دیگر کاربردهای این سیستمها، استفاده در سیستمهای مالتی بیومتریک جهت افزایش دقت است. تصویر چهره یک کاربر می‌تواند توسط یک دوربین سیاه و سفید با استاندارد که یک رزولوشن ۲۴۰*۳۲۰ و اقلاً ۳ تا ۴ فریم را تولید کند، گرفته می‌شود. دو روند اصلی برای تشخیص چهره انجام می‌شود

  • روند کلی یا کل چهره
  • خصوصیات پایه‌ای چهره

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

یا روند کلی یا کل چهره

در این روش یک تصویر کامل و یکجا از چهره، بدون لوکالیزه کردن نقاط ویژه مورد پردازش قرار می‌گیرد. این متد از تکنولوژیهای زیرجهت پردازش چهره بهره می‌گیرد:

  • تحلیل آماری
  • شبکه‌های عصبی

در کل سیستمهای این چنینی دارای دقت بالایی نیستند به دلیل اینکه چهرها کاملاً منحصربه‌فرد نیستند و گاه اتفاق می‌افتد که دو نفر (مخصوصا دوقلوها) از نظر چهره با هم مشابهند؛ لذا از اینگونه سیستمها فقط در مکانهایی استفاده می‌شوند که امنیت تا حد بسیار زیاد مورد نظر نباشد.

تشخیص هویت زیست سنجی و بیومتریک قسمت ۱
تشخیص هویت زیست سنجی و بیومتریک قسمت ۲
تشخیص هویت زیست سنجی و بیومتریک قسمت ۳
تشخیص هویت زیست سنجی و بیومتریک قسمت ۴
تشخیص هویت زیست سنجی و بیومتریک قسمت ۵

ویژگیهای یک روبات

یک روبات دارای سه مشخصه زیر است
۱-داری حرکت وپویایی است
۲-قابلیت برنامه ریزی جهت انجام کارهای مختلف را دارد
۳-بعد از اینکه برنامه ریزی شد.قابلیت انجام وظایفش را به صورت خودکار دارد.
ممکن است روزی فرا برسد که روباتها جای انسانها را در انجام کارها بگیرند.
حتی بعضی از آنها ممکن است به صورت
محافظ شخصی از جان انسانهادر مقابل خطرات احتمالی حفاظت کنند.

آناتومی اندام روبات های شبیه انسان

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

حرکت در روبات

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

لگو روبات(lego robot)

برای شروع به ساخت روبات بهتر است .،که با لگو ها ونحوه اسمبل کردن آنها آشنا شوید.لگوها ایده های خوبی در ساخت روبات به شما می دهند.بسیاری از روباتهایی که ساخته شده اند.حشره،حیوان،انسان نیستند.بلکه آنها لگو هستند.شما می توانید بدنه روبات خود را بوسیله لگوها بسازید.و مدارات الکترونیک را در آن جا سازی کنید.
بیشتر ماشینهایی که وجود دارند از چهار چرخ تشکیل شده اند.دو چرخ جلویی دارای چرخش زاویه ای هستند.،و دو چرخ عقبی در جای خود ثابت هستند.،وتنها میچرخند،حرکت به سمت راست،جلو و عقب را چرخهای جلویی تعیین می کنند.در برخی از ماشینها هر چهار چرخ دارای این وضعیت هستند.از این موارد در ساخت لگو روباتها شبیه ماشین استفاده می شود.برخی از ماشینهای پیشرفته از راه دور کنترل می شوند(remote control) که این مسئله را براحتی می توان در روباتها بست وتوسعه داد.
برای ساخت یک لگو ماشین احتیاج به چهار چرخ پلاستیکی و دو میله تحت عنوان محور احتیاج دارید.شاید بتوانید این قطعات را براحتی در یک ماشین اسباب بازی پیدا کنید.برخی از طراحان روبات به جای چهار چرخ از سه چرخ استفاده می کنند.در این حالت عموما دو چرخ ثابت وتنها در جای خود می چرخند و تنها یک چرخ دارای حرکت آزاد است.نوع دو چرخ آن نیز وجود دارد.در این حالت هر دوچرخ دارای حرکت آزاد زاویه ای هستند.
برای حل مشکل تعادل روباتها در هنگام چرخش از چهار چرخ استفاده می شود. در هر طرف دوچرخ وجود دارد.که چرخهای در هر سمت بوسیله تسمه یا نواری پلاستیکی بهم متصل می شوند.
کلمه ربات توسط Karel Capek نویسنده نمایشنامه R.U.R (روبات‌های جهانی روسیه) در سال ۱۹۲۱ ابداع شد. ریشه این کلمه، کلمه چک اسلواکی(robotnic) به معنی کارگر می‌باشد.
در نمایشنامه وی نمونه ماشین، بعد از انسان بدون دارا بودن نقاط ضعف معمولی او، بیشترین قدرت را داشت و در پایان نمایش این ماشین برای مبارزه علیه سازندگان خود استفاده شد.
البته پیش از آن یونانیان مجسمه متحرکی ساخته بودند که نمونه اولیه چیزی بوده که ما امروزه ربات می‌نامیم.
امروزه معمولاً کلمه ربات به معنی هر ماشین ساخت بشر که بتواند کار یا عملی که به‌طور طبیعی توسط انسان انجام می‌شود را انجام دهد، استفاده می‌شود.

ربات‌ها چه کارهایی انجام می‌دهند؟

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

ربات‌ها از چه ساخته می‌شوند؟

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

تأثیر رباتیک در جامعه:

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

مشکلات رباتیک:

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

مزایای رباتیک:

مزایا کاملاً آشکار است. معمولاً یک ربات می‌تواند کارهایی که ما انسان‌ها می‌خواهیم انجام دهیم را ارزان‌تر انجام‌ دهد. علاوه بر این ربات‌ها می‌توانند کارهای خطرناک مانند نظارت بر تأسیسات انرژی هسته‌ای یا کاوش یک آتش‌فشان را انجام دهند. ربات‌ها می‌توانند کارها را دقیقتر از انسان‌ها انجام دهند و روند پیشرفت در علم پزشکی و سایر علوم کاربردی را سرعت ‌بخشند. ربات‌ها به ویژه در امور تکراری و خسته کننده مانند ساختن صفحه مدار، ریختن چسب روی قطعات یدکی و… سودمند هستند.

تاثیرات شغلی:

بسیاری از مردم از اینکه ربات‌ها تعداد شغل‌ها را کاهش دهد و افراد زیادی شغل خود را از دست دهند، نگرانند. این تقریباً هرگز قضیه‌ای بر خلاف تکنولوژی جدید نیست. در حقیقت اثر پیشرفت‌ تکنولوژی مانند ربات‌ها (اتومبیل و دستگاه کپی و…) بر جوامع ، آن است که انسان بهره‌ورتر می‌شود.

قوانین سه‌گانه رباتیک:

ایزاک آسیموف نویسنده داستان‌های علمی تخیلی قوانین سه‌گانه رباتیک را به صورت زیر تعریف‌کرده است:
۱ـ یک ربات نباید به هستی انسان آسیب برساند یا به واسطه بی‌تحرکی، زندگی یک انسان را به مخاطره بیاندازد.
۲ـ یک ربات باید از دستوراتی که توسط انسان به او داده می‌شود، اطاعت کند؛ جز در مواردی که با قانون یکم در تضاد هستند.
۳ـ یک ربات باید تا جایی‌که با قوانین یکم و سوم در تضاد نباشد از خود محافظت کند.

آینده رباتیک:

جمعیت ربات‌ها به سرعت در حال افزایش است. این رشد توسط ژاپنی‌ها که ربات‌های آن‌ها تقریباً دو برابر تعداد ربات‌های آمریکا است، هدایت شده است.
همه ارزیابی‌ها بر این نکته تأکید دارد که ربات‌ها نقش فزاینده‌ای در جوامع مدرن ایفا خواهند کرد. آن ها به انجام کارهای خطرناک، تکراری، پر هزینه و دقیق ادامه می‌دهند تا انسان‌ها را از انجام آن‌ها باز دارند.

ربات امدادگر

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

مباني رباتيك

ربات ها ماشين هايي هستند كه به تقليد رفتار انسان ها يا حيوانات مي پردازند . انسان ها داراي جسم مي باشند و از ماهيچه براي حركت بدن ، حسگر براي دريافت اطلاعات محيط ، قدرت براي فعال كردن ماهيچه ها ، مغز براي پردازش اطلاعات حسگرها و دستور به ماهيچه ها و ويژگي هاي نامشهود ديگر مانند هوش و روحيه برخوردارند . به طور مشابه ربات ها نيز از ساختار قابل حركت ، موتورها ، حسگرهايي براي مشاهده محيط ، فعال ساز براي كنترل حركت ، منبع تغذيه و پردازنده / كامپيوتر براي كنترل رفتار و اجزاي خود برخوردار مي باشند . ربات هاي صنعتي بازوها يا ماشين هاي خودكار مكانيكي هستند كه توسط كامپيوتر كنترل شده و از آنها در خطوط مونتاژ كارخانه ها استفاده مي شود . وظايف آنها بازه وسيعي را از اتصال اجزاي بدنه اتومبيل تا قرار دادن يك قطعه بسيار كوچك در يك دستگاه الكترونيكي در بر مي گيرد .
يك ربات صنعتي كه از شش مفصل برخوردار است ، شباهت بسيار زيادي به بازوي انسان دارد . اين شش اتصال در واقع معادل شانه ، آرنج و مچ هستند . هر كدام از اين اتصالات توسط يك موتور DC/AC كنترل مي شوند . خود اين موتورها توسط سيگنال هايي كه توسط كابل منتقل مي شود ، كنترل مي گردند .
كامپيوتر كنترلي ربات شامل برنامه هايي است كه رفتار هر موتور را كنترل مي كند و بدين ترتيب ربات عمل مورد نياز را انجام مي دهد . براي حركت ربات ، اين رايانه ، موتورها و دريچه هاي مرتبط را فعال مي كند . ربات ها قابل برنامه ريزي جديد بوده و مي توان با برنامه ريزي جديد رفتار متفاوتي را از آنها انتظار داشت .
برنامه يك ربات جوشكاري حاوي دستورات لازم در زمينه ميزان جريان برق و اعمال جريان براي المان جوشكاري ربات است تا بدين ترتيب بعنوان قطعات فلزي با قطرهاي مختلف را به هم جوش داد . حسگرهاي موجود ، اطلاعات محيطي را به صورت پسخورد در اختيار كامپيوتر كنترلي قرار مي دهند و آنها را قادر مي سازند تا عمليات ربات را مطابق با شرايط محيطي تنظيم كنند . كامپيوترها سيگنال هاي فرمان را به ابزار رباتيك ارسال مي نمايند و بدين ترتيب عمليات كارخانه كنترل مي گردد .
مي توان ماشين هاي رباتيك را به گونه اي برنامه ريزي كرد كه وظايف مختلفي را انجام دهند و در نتيجه ربات ها مي توانند به منظور توليد محصولات مختلف ، مورد استفاده قرار گيرند . ربات هاي فوق در كارخانه هايي مورد استفاده قرار مي گيرند كه محصولات متنوعي را در دسته هاي كوچك توليد مي كنند و محصولات هر دسته با دسته ديگر فرق مي كند . ربات ها با سخت افزار فرآيند توليد ادغام مي شوند . پس از اينكه كار جاري خط توليد به پايان رسيد ، مي توان از اين ربات ها براي كار ديگر دوباره استفاده كرد .
خط توليدي كه در آن از ربات استفاده مي شود ، ممكن است فقط شش ماه دوام داشته باشد . پس از آن ، كارخانه به دليل تغيير محصول توليدي خود بايد خط توليد فوق را جمع آوري كند . از آنجايي كه مي توان ربات ها را براي انجام كارهاي مختلف برنامه ريزي كرد ، مي توان آنها را به راحتي از يك خط توليد جدا كرده و در جاي ديگر مورد استفاده قرار داد.
كارخانه موتورولا از دو ربات به طور همزمان براي مونتاژ قطعات الكترونيكي در دستگاه هاي راديويي خود استفاده مي كند . اين دو ربات دوازده كار پايه اي مانند قرار دادن قطعات الكترونيكي بر روي بوردهاي چاپي را بطور مشترك با هم انجام مي دهند . اين دو ربات به صورت جفت و دقيقا مانند دو بازوي يك انسان در خط مونتاژ كار مي كنند و كامپيوتر كنترل كننده با ارسال سيگنال هاي مناسب مانع از برخورد آنها باهم مي شود .

حواس انسان براي ربات ها :

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

ربات هاي بيولوژيكي :

محققان به دنبال هوش هستند ، گرچه اين هوش لزوما به پيچيدگي مغز انسان كه از ميليارها نورون و تريليون ها اتصال برخوردار است نخواهد بود . گرچه بسياري از مناطق مغز انسان از ساختار يكنواختي برخوردارند ، ولي صدها منطقه در مغز وجود دارد كه از نظر معماري متمايز هستند . اين مساله سبب پيچيدگي شبيه سازي مغز انسان در ربات ها مي شود .
در مقايسه ، حشرات و موجودات دريايي از نورون هاي كمتري برخوردارند . مهندسان با استفاده از داده هاي رفتاري مي دانند كه چگونه بخش هاي مغز اين موجودات با هم در ارتباط هستند و همچنين از نحوه تعامل نورون هاي آنها به منظور انجام يك كار خاص مطلع هستند .
هوش مغز سوسك براي توسعه ربات هاي بيولوژيكي بكار گرفته شده است . حشرات در زمان حركت بالا ، زير با پيرامون موانع شش بازوي خود را كنترل مي كنند . ربات هاي شش بازويي مانند Lemur (مخففLimbed Excursion Mobile Utility Robot ) ” ربات با قدرت حركت عضوي ” از خصوصيات سيستم عصبي حشرات براي حركت در سطوح سخت و ناهموار به منظور گردآوري ، نمونه برداري و تحليل داده ها استفاده مي كنند .
ماهيچه ها مسبب حركت و دستكاري در مخلوقات هستند . فعال سازي هاي ربات ها در واقع شبيه ساز ماهيچه ها به شمار مي روند . فعال سازي هايي كه از پليمرهاي فعال شونده با جريان برق (EAP) استفاده مي كنند ، بيشترين شباهت را به ماهيچه هاي بيولوژيكي دارند . EAP ها در پاسخ به تحريك هاي الكتريكي تغيير شكل مي دهند .در صورتي كه به سيال هاي الكترورئولوژيك (ERF) مبتني بر EAP تحريك الكتريكي وارد شود ، چسبناك مي شوند . از ERF ها براي توسعه فعال سازي هاي مينياتوري كنترل شونده توسط جريان برق استفاده مي شود . نيروهايي كه در محيط هاي دور اعمال مي شوند ، سبب تغيير در ويسكوزيته ERF شده و بدين شكل خود را در اجزاي مكانيكي ربات نشان مي دهند .
از ربات هاي مبتني بر EAP در كاربردهاي پزشكي و فضايي استفاده مي شود . ربات ماهي اولين محصول تجاري است كه در آن از EAP استفاده شده است . اين ربات مي تواند بدون استفاده از موتور يا باتري و با استفاده القاء گرهاي موجود شنا كند .
EAP ها را ميتوان به شكل هاي مختلفي ساخت . از تركيب آنها با حسگرهاي MEMS ( سيستم ميكروالكترومكانيكي ) مي توان به فعال سازهاي هوشمند دست يافت . EAP واسطي است بين انسان و ماشين در واقع جايگزيني است براي حواس انسان . بعنوان مثال ، مي توان از EAP بعنوان واسط بين ربات و مغز انسان استفاده كرد . كلاوس پيترزانر از دانشگاه ساوت همپتون در انگلستان رباتي ساخته است كه توسط يك نمونه پرورش يافته و خاص از موجودات زنده ” كپك مانند” كنترل ميشود . اين سلول ها از نور دوري مي كنند .
يك نمونه ستاره اي شكل از اين سلول ها به يك ربات شش بازويي ربات متصل گرديده اند . تابش نور سفيد بر بخشي از ارگانيسم سلول سبب مرتعش شدن آن مي گردد . اين ارتعاشات به رايانه منتقل شده و بر اساس آن سيگنال هاي كنترلي براي حركت بازوها ارسال مي گردد . با تابش نور برروي بخش هاي مختلف ستاره ، بازوهاي متفاوتي را ميتوان حركت داد . با انجام اين كار به صورتي منظم و با قاعده ، ميتوان ربات را به راه انداخت .

منبع

ربات چیست؟ قسمت ۱
ربات چیست؟ قسمت ۲
ربات چیست؟ قسمت ۳
ربات چیست؟ قسمت ۴
ربات چیست؟ قسمت ۵
ربات چیست؟ قسمت ۶
ربات چیست؟ قسمت ۷
ربات چیست؟ قسمت ۸

ارتباط یادگیری ماشین با آمار

یادگیری ماشین و آمار رشته های نزدیکی هستند. طبق نظر مایکل. ال. جردن (Micheal l. Jordan) ایده های یادگیری ماشین، از اصول متدلوژی گرفته تا ابزار نظری، پیشینه ای طولانی در آمار دارند. او همچنین عبارت علم داده ها را برای نام گذاری کل این رشته پیشنهاد کرد.

لئو بریمن (Leo Breiman) دو پارادایم آماری را مطرح ساخت: مدل داده و مدل الگوریتمیک، که مدل “الگوریتمیک” کما بیش به معنای الگوریتم های یادگیری ماشین مثل جنگل تصادفی است.

برخی آماردانان با استفاده از روش های یادگیری ماشین، گرایشی ساخته اند که آن را یادگیری آماری می نامند.

تئوری یادگیری ماشین

یک هدف اساسی ماشین یادگیرنده، تعمیم دهی از تجربه است. منظور از تعمیم دهی در این چهارچوب، توانایی یک ماشین یادگیرنده در داشتن عملکردی دقیق در فعالیت ها و مثال های جدید و دیده نشده، بر مبنای تجربه آن ماشین با مجموعه داده های آموزش است.  مثال های آموزشی از یک توزیعِ عموماً ناشناخته می آیند (که به عنوان نماینده فضای رخدادها در نظر گرفته می شود) و یادگیرنده باید برای این فضا مدلی عمومی تولید کندکه به آن، توانایی پیش بینیِ بقدر کافی دقیق در موارد جدید را بدهد.

تحلیل محاسباتی الگوریتم های یادگیری ماشین و عملکرد آن ها شاخه ای از علوم کامپیوتر نظری تحت عنوان نظریه یادگیری محاسباتی را تشکیل می دهد. چون مجموعه های داده های آموزشی، متناهی هستند و آینده قطعیت ندارد، نظریه یادگیری معمولا تضمینی در مورد عملکرد الگوریتم ها به ما نمی دهد. در عوض، کران های احتمالاتی روی عملکرد، بسیار معمول هستند. تجزیه اُریب-واریانس (bias-variance decomposition) راهی برای کمّی سازی خطای تعمیم دهی است.

برای داشتن بهترین عملکرد در چهارچوب تعمیم دهی، پیچیدگی فرض باید به اندازه پیچیدگی تابع زمینه داده ها باشد. اگر فرض پیچیدگی کمتری از تابع داشته باشد، آنگاه مدل، داده ها را زیربرازش (underfit) کرده است. اگر در پاسخ، پیچیدگی مدل افزایش یابد، آنگاه خطای آموزش کاهش می یابد. اما اگر فرض بسیار پیچیده باشد، مدل در معرض بیش برازش  (overfit)قرار می گیرد و تعمیم دهی ضعیف می شود.

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

روش های یادگیری ماشین

یادگیری درخت تصمیم یا Decision tree learning

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

یادگیری قانون وابستگی

یادگیری قانون وابستگی روشی برای کشف روابط جالب توجه میان متغیرها در پایگاه های بزرگ داده است.

شبکه های عصبی مصنوعی

یک الگوریتم شبکه عصبی مصنوعی (ANN)، که معمولا “شبکه عصبی” (NN) نامیده می شود، الگوریتمی است که از ساختار و جنبه های عملکردی شبکه های عصبی بیولوژیکی الهام گرفته شده است. در این شبکه، محاسبات در قالب گروه های متصلی از نورون های مصنوعی، ساختار می یابند و اطلاعات را با یک روش پیوندگرایی به محاسبات، پردازش می کند. شبکه های عصبی مدرن، ابزارهای مدل سازی غیر خطی داده های آماری هستند. این شبکه ها معمولا برای مدل سازی روابط پیچیده بین ورودی ها و خروجی ها، الگو شناسی در داده ها، یا دریافت ساختار آماری در یک توزیع توئم احتمال میان متغیر های مشاهده شده استفاده می شوند.

یادگیری عمیق

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

برنامه نویسی منطقی استقرایی

برنامه نویسی منطقی استقرایی (ILP) روشی برای هدایت یادگیری با استفاده از برنامه نویسی منطقی به عنوان نمایشی یکنواخت برای مثال ها (داده ها)ی ورودی، دانش پس زمینه و فرضیات است. با داشتن یک کدگذاری (encoding) از دانشِ معلومِ پس زمینه و مجموعه ای از مثال ها که به عنوان پایگاه داده ای از حقایق نمایش داده می شود، یک سیستم ILP برنامه ای منطقی استخراج می کند که تمام مثال های مثبت را نتیجه دهد و هیچ یک از مثال های منفی را نتیجه ندهد. برنامه نویسی استقرایی (inductive programming) شاخه ای مرتبط است که هر نوع زبان برنامه نویسی برای نمایش فرضیات را در بر می گیرد (و نه فقط برنامه نویسی منطقی)، از قبیل برنامه های تابعی.

ماشین های بُردار پشتیبانی

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

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

 خوشه بندی یا Clustering

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

شبکه های بِیزی یا Bayesian networks

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

یادگیری تقویتی

تمرکز روش یادگیری تقویتی بر این است که یک عامل چگونه باید در یک محیط عمل کند تا نوعی پاداش بلند مدت را بیشینه کند. الگوریتم های یادگیری تقویتی سعی دارند قاعده ای پیدا کنند که وضعیت های جهان را به عمل هایی که عامل باید در این وضعیت ها انجام دهد، تصویر کند. تفاوت یادگیری تقویتی با یادگیری نظارت شده در این است که جفت های صحیح وردودی/خروجی هرگز ارائه نمی شوند و نیز فعالیت های زیر-بهین (sub-optimal) نیز صریحاً اصلاح نمی شوند.

یادگیری نمایش یا Representation learning

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

الگوریتم های یادگیری منیفلد (Manifold learning) سعی دارند همین کار را با این محدودیت که نمایش یادگیری شده بُعد پایینی دارد، انجام دهند. الگوریتم های کدگذاری تُنُک سعی دارند همین کار را با این محدودیت که نمایش یادگیری شده تنک است (یعنی صفرهای زیادی دارد)، انجام دهند. الگوریتم های یادگیری زیرفضای چندخطی سعی دارند نمایش های با بُعد پایین را مستقیماً از نمایش های تانسوری داده های چند بعدی، بدون دادن شکل بُرداری (بعد بالا) به آن ها، یادگیری کنند.

الگوریتم های یادگیری عمیق، چندین سطح نمایش، یا سلسله ای از ویژگی ها را کشف می کنند، که ویژگی های سطح بالاتر و انتزاعی تر، بر حسب ویژگی های سطح پایین تر تعریف شده اند (یا آن ها را تولید می کنند). استدلال شده است که یک ماشین هوشمند ماشینی است که نمایشی را یاد می گیرد که فاکتورهای اساسی تغییرات را که داده های مشاهده شده را توضیح می دهند، تمییز دهد.

یادگیری تشابه و متریک

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

یادگیری دیکشنری تُنُک یا Sparse dictionary learning

در این روش، یک داده به شکل ترکیبی خطی از توابع پایه ای نمایش داده می شود، و فرض می شود که ضرایب این ترکیب تنک هستند. فرض کنید که x یک داده d بُعدی و D یک ماتریس d در n باشد که هر ستون آن نمایشگر یک تابع پایه ای است. r ضریب نمایش x با استفاده از D است. از نظر ریاضی، یادگیری دیکشنری تنک به معنی حل دستگاه x ≈ Dr است که در آن r تنک است. بطور کلی n از d بزرگ تر فرض می شود تا آزادی برای نمایش تنک فراهم شود.

یادگیری دیکشنری با نمایش های تُنُک “ان-پی کاملِ قوی”  (strongly NP-hard) است و حل تقریبی آن هم دشوار است. یک روش ابتکاری محبوب برای یادگیری دیکشنری تنک K-SVD است.

یادگیری دیکشنری تنک در چندین چهارچوب مورد استفاده قرار گرفته است. در طبقه بندی، مسئله، تعیین کلاسی است که داده ای که قبلا ناشناخته بوده، به آن  تعلق دارد. فرض کنید که قبلاً یک دیشکنری برای هر کلاس ساخته شده است. آنگاه یک داده جدید به کلاسی مرتبط می شود که دیکشنری آن کلاس بهترین نمایش تنک برای آن داده را بدست دهد. یادگیری دیکشنری تنک در کاهش نویز تصویر نیز استفاده شده است. ایده کلیدی این است که یک تصویر “تمیز” را می توان به شکل تنک توسط یک دیکشنریِ تصویر نمایش داد، اما نویز را نمی توان.

الگوریتم های ژنتیک

یک الگوریتم ژنتیک (GA)، الگورریتم جستجوی ابتکاری است که از فرایند انتخاب طبیعی  تقلید می کند، و به امید یافتن پاسخ های مناسب به یک مسئله، ازروش های مثل جهش (mutation) و دوتیرگی (crossover) برای تولید کروموزوم جدید، استفاده می کند. در یادگیری ماشین، الگوریتم های ژنتیک در دهه های ۱۹۸۰ و ۱۹۹۰ کاربرد یافتند. برعکس، تکنیک های یادگیری ماشین نیز برای بهبود عملکرد الگوریتم های تکاملی و ژنتیک مورد استفاده قرار گرفته اند.

یادگیری ماشین قانون-محور

یادگیری ماشین قانون-محور عبارتی کلی برای هر نوع روش یادگیری ماشینی است که  برای ذخیره، کنترل یا استفاده از دانش، “قوانینی” را شناسایی، یادگیری یا استنتاج می کند. ویژگی مشخصه یک ماشین یادگیرنده قانون-محور، شناسایی و استفاده از مجموعه ای از قوانین است که بطور جمعی، نمایشگر دانش فراگرفته شده توسط سیستم هستند. این روش، با سایر یادگیرنده های ماشینی که عموماً یک مدل واحد را در تمام موارد برای پیشگویی می شناسند، در تمایز است. روش های یادگیری ماشین قانون-محور شامل سیستم های طبقه ساز یادگیرنده، یادگیری قانون وابستگی و سیستم های ایمنی مصنوعی هستند.

سیستم های طبقه ساز یادگیرنده Learning classifier systems

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

کاربردهای یادگیری ماشین

کاربردهای یادگیری ماشین شامل موارد زیر است:

  • اثبات قضیه بطور خودکار
  • وبسایت های تطبیقی
  • هوش مصنوعی احساسی
  • بیوانفوماتیک
  • واسط مغز و رایانه
  • شیمی‌ انفورماتیک
  • طبقه بندی رشته های DNA
  • آناتومی محاسباتی
  • بینایی ماشین، از جمله شناسایی اشیاء
  • شناسایی کارت اعتباری جعلی
  • بازی عمومی (general game playing)
  • بازیابی اطلاعات
  • شناسایی کلاه برداری های اینترنتی
  • زبان شناسی
  • بازاریابی
  • کنترل یادگیری ماشین
  • ادراک ماشین
  • تشخیص پژشکی
  • اقتصاد
  • بیمه
  • پردازش زبان طبیعی
  • استنباط زبان طبیعی
  • بهینه سازی و الگوریتم های فرا ابتکاری
  • تبلیغات آنلاین
  • سیستم های توصیه گر
  • حرکت ربات
  • موتورهای جستجو
  • تحلیل احساسات (یا نظر کاوی)
  • مهندسی نرم افزار
  • شناسایی گفتار و دست نوشته
  • تحلیل بازارهای مالی
  • نظارت بر درستی ساحتار
  • الگوشناسی ترکیبی
  • پیش بینی سری های زمانی
  • تحلیل رفتار کاربر
  • ترجمه

در سال ۲۰۰۶ کمپانی فیلم سازی آنلاین نتفلیکس اولین رقابت “جایزه نتفلیکس” را برگزار کرد تا برنامه ای پیدا کند که پیش بینی بهتری از تمایلات کاربر داشته و دقت الگوریتم فعلی توصیه فیلم (Cinematch) خود را لااقل ۱۰% بهبود بخشد. گروهی متشکل از محققان بخش تحقیق و آزمایشگاه AT&T به همراه تیم های Big Chaos و Pragmatic Theory یک مدل چندگانه (ensemble model) ساختند که برنده جایزه ۱ میلیون دلاری سال ۲۰۰۹ شد.

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

در سال ۲۰۱۰ وال استریت ژورنال مقاله ای راجع به شرکت Rebellion Research و استفاده آن ها از یادگیری ماشین برای پیش بینی بحران مالی نوشت.

در سال ۲۰۱۲، وینود کسلا (Vinod Khosla) یکی از موسسین سان مایکروسیستمز (Sun Microsystems)، پیش بینی کرد که در دو دهه آینده بیش از ۸۰% از فرصت های شغلی پزشکی توسط نرم افزارهای تشخیص پزشکی یادگیری ماشین از بین خواهد رفت.

در سال ۲۰۱۴، گزارش شد که یک الگوریتم یادگیری ماشین در مطالعه تاریخ هنر استفاده شد تا نقاشی های هنرهای زیبا را بررسی کند، و نیز گزارش شد که این الگوریتم ممکن است تاثیرگذاری هایی را میان هنرمندان نشان داده باشد که قبلا شناخته شده نبوده است.

ارزیابی مدل

مدل های یادگیری ماشین طبقه بندی را می توان با تکنیک های تخمین دقت مثل روش هولد اوت (holdout) که داده ها را به یک مجموعه آموزش و یک مجموعه آزمایش تقسیم می کند (معمولا دو-سوم داده ها  در مجموعه آموزش و یک-سوم را در مجموعه آزمایش قرار می گیرند) و عملکرد مدل تحت آموزش را روی مجموعه آزمایش ارزیابی می کند، راستی آزمایی نمود. در مقایسه، روش تصدیق متقاطع N تایی  (N-fold cross validation) بطور تصادفی داده ها را به k زیرمجموعه تقسیم می کند که k-1 مورد از داده ها برای آموزش مدل استفاده می شود و   k-اُمین مورد برای آزمایش توانایی پیشگویی مدل استفاده می شود. علاوه بر روش های holdout و تصدیق متقاطع، راه اندازی خودکار (booststrap) که n مورد را، با جایگذاری، از مجموعه داده ها نمونه گیری می کند، می تواند برای ارزیابی دقیق مدل استفاه شود.

محققان علاوه بر دقت کلی، اغلب حساسیت و ویژگی را، که به ترتیب به معنای نسبت مثبت واقعی (TPR) و نسبت منفی واقعی (TNP) هستند، گزارش می کنند. بطور مشابه، محققین برخی اوقات نسبت مثبت کاذب  (FPR) و نسبت منفی کاذب (FNR) را نیز گزارش می کنند. با این حال، این ها نسبت هایی هستند که صورت و مخرج خود را نشان نمی دهند. مشخصه عملگری کل (TOC) روشی موثر جهت بیان توانایی تشخیص یک مدل است. TOC صورت و مخرج نسبت های فوق را نمایش می دهد، لذا اطلاعات بیشتری از منحنی های معمول مشخصه عملیاتی سیستم (ROC) و مساحت زیر این منحنی (AUC) بدست می دهد.

مسائل اخلاقی

یادگیری ماشین پرسش های اخلاقی متعددی را بوجود می آورد. سیستم های آموزش دیده روی مجموعه های داده های اُریب یا بایاس (bias) ، ممکن است این اریبی ها را هنگام استفاده نمایش دهند، لذا تبعیضات فرهنگی را دیجیتالی کنند. بنابراین جمع آوری مسئولانه داده ها بخش مهمی از یادگیری ماشین است.

چون زبان دارای اریبی است، ماشین هایی که روی پیکره های زبان  (language coropa) آموزش داده شده اند لزوماً اریبی را نیز یاد می گیرند.

نرم افزارها

برخی بسته های نرم افزاری که الگوریتم های یادگیری ماشین متنوعی دارند به شرح زیر هستند:

نرم فزار های رایگان و متن باز:

CNTK
Deeplearning4j
dlib
ELKI
GNU Octave
H2O
Mahout
Mallet
MEPX
mlpy
MLPACK
MOA (Massive Online Analysis)
MXNet

ND4J: ND arrays for Java

NuPIC
OpenAI Gym
OpenAI Universe
OpenNN
Orange
R
scikit-learn
Shogun
TensorFlow
Torch
Yooreeka
Weka

نرم افزارهای مالکیتی با ویرایش های رایگان و متن باز:

KNIME
RapidMiner

نرم افزار های مالکیتی:

Amazon Machine Learning
Angoss KnowledgeSTUDIO
Ayasdi
IBM Data Science Experience
Google Prediction API
IBM SPSS Modeler
KXEN Modeler
LIONsolver
Mathematica
MATLAB

Microsoft Azure Machine Learning

Neural Designer
NeuroSolutions
Oracle Data Mining
RCASE
SAP Leonardo
SAS Enterprise Miner
SequenceL
Skymind
Splunk
STATISTICA Data Miner

ژورنال ها

Journal of Machine Learning Research
Machine Learning
Neural Computation
منبع

یادگیری ماشین قسمت ۱
یادگیری ماشین قسمت ۲
یادگیری ماشین قسمت ۳