훈련 견본 에 대한 진가 표시

7388 단어
기계 학습 알고리즘 은 항상 훈련 견본 과 떨 어 질 수 없다. 일반적인 상황 에서 당신 이 찾 은 그림 은 견본 만 포함 하 는 것 이 아니 라 견본 과 마이너스 견본 을 동시에 포함 하 는 그림 이 어야 한다.예 를 들 어 기계 학습 알고리즘 을 이용 하여 사람의 얼굴 검 사 를 하려 면 사람의 얼굴 에 있 는 샘플 (사람의 얼굴 사진) 과 네 거 티 브 샘플 (비 사람의 얼굴 사진) 을 찾 아야 한다. 이때 샘플 과 네 거 티 브 샘플 은 쉽게 찾 을 수 없 는 경우 가 많다.(물론 얼굴 트 레이 닝 샘플 은 현재 인터넷 에서 공 개 된 트 레이 닝 샘플 라 이브 러 리 를 많이 찾 을 수 있 지만 차량 트 레이 닝 샘플 을 찾 으 려 면? 표정 트 레이 닝 샘플 은? 고양이 트 레이 닝 샘플? 비행기의 트 레이 닝 샘플?..) 이 럴 때 는 촬영 이나 다운로드 가 필요 하 다.의 그림; 물론 이 그림 에서 일부 구역 은 사람의 얼굴 (샘플) 이 고 다른 구역 은 사람의 얼굴 (샘플) 이 아 닙 니 다.분명 한 것 은 그림 도구 와 같은 소프트웨어 로 한 장의 그림 속 의 견본 구역 을 인공 적 으로 떼 어 내 고 견본, 나머지 구역 으로 마이너스 견본 으로 하 는 것 이 가능 한 방법 이다. 이렇게 할 수 있 지만 프로그래머 로 서 프로그램 을 쓰 는 것 처럼 폴 더 에 있 는 모든 그림 을 옮 겨 다 니 며 그림 을 차례대로 표시 하고 사용자 가 마 우 스 를 통 해 몇 번 클릭 하면 얻 을 수 있다.샘플 구역 과 네 거 티 브 샘플 구역 에 가면 더욱 효율 적 이 어야 합 니 다. 전 자 는 순수한 인공 적 인 방법 이 고 후 자 는 반 인공 적 인 방법 입 니 다. 충분 한 네 거 티 브 샘플 을 압수 하고 분류 기 를 훈련 한 후에 기계 (컴퓨터) 를 이용 하여 그림 속 의 샘플 구역 (얼굴) 을 자동 으로 만 들 수 있 습 니 다.떼 어 내 는 것 이 바로 전자 동 적 인 방법 이다. 기계 학습 의 목적 은 바로 기계 로 하여 금 인공 적 이 고 효율 적 인 반복 적 인 작업 을 완성 하 게 하 는 것 이다. 물론 훈련 샘플 을 얻 지 못 하기 전에 너 는 순수한 인공 또는 반 인공 적 인 방법 으로 훈련 샘플 문 제 를 해결 해 야 한다. 필 자 는 반 인공 적 인 절 차 를 제시 하여 친구 들 이 나중에 샘플 을 만 드 는 데 편 의 를 제공 해 야 한다.작업 과정 에서 사용 하기;
참조 코드:
#include "stdafx.h"
#include "windows.h"
#include <vector>
#include <string>
#include "opencv.hpp"
#include "iostream"
#include "fstream"
using namespace std;
typedef std::vector<std::string> file_lists;

static int str_compare(const void *arg1, const void *arg2)
{
	return strcmp((*(std::string*)arg1).c_str(), (*(std::string*)arg2).c_str());//     arg1 and arg2
}

file_lists ScanDirectory(const std::string &path, const std::string &extension)
{
    WIN32_FIND_DATA wfd;//WIN32_FIND_DATA:Contains information about the file that is found by the 
        //FindFirstFile, FindFirstFileEx, or FindNextFile function
     HANDLE hHandle;
     string searchPath, searchFile;
     file_lists vFilenames;
     int nbFiles = 0;
    
     searchPath = path + "/*" + extension;
     hHandle = FindFirstFile(searchPath.c_str(), &wfd);//Searches a directory for a file or subdirectory
              //with a name that matches a specific name
     if (INVALID_HANDLE_VALUE == hHandle)
    {
         fprintf(stderr, "ERROR(%s, %d): Cannot find (*.%s)files in directory %s/n",
              __FILE__, __LINE__, extension.c_str(), path.c_str());
         exit(0);
    }
    do
    {
         //. or ..
          if (wfd.cFileName[0] == '.')
         {
              continue;
          }
          // if exists sub-directory
          if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//dwFileAttributes:The file attributes of a file
        {             

          //FILE_ATTRIBUTE_DIRECTORY:The handle identifies a directory
             continue;
         }
        else//if file
        {
            searchFile = path + "/" + wfd.cFileName;
            vFilenames.push_back(searchFile);
            nbFiles++;
         }
    }while (FindNextFile(hHandle, &wfd));//Call this member function to continue a file search begun 
          //with a call to CGopherFileFind::FindFile

    FindClose(hHandle);//Closes a file search handle opened by the FindFirstFile, FindFirstFileEx,
       //or FindFirstStreamW function

 // sort the filenames
    qsort((void *)&(vFilenames[0]), (size_t)nbFiles, sizeof(string), str_compare);//Performs a quick sort

    return vFilenames;
}

bool rBtnDown = false;
const int ptsSize = 4;
CvPoint pts[ptsSize];
int ptsCount = 0;

void mouseOn(int e,int x,int y,int flags,void* param)
{
	if (e == CV_EVENT_LBUTTONDOWN)
	{
		pts[ptsCount++] = cvPoint(x,y);
	}
	else if (e == CV_EVENT_RBUTTONDOWN)
	{
		rBtnDown = true;
	}
}

void GetTrainSample()
{
	string folderIn, fileExt, folderOut;

	ifstream fileIn;
	fileIn.open("config.ini", ios::in);
	if (!fileIn)
	{
		cout<<"config.ini open error"<<endl;
		system("pause");
		exit(-1);
	}

	char str[512];
	memset(str, '\0', 512*sizeof(char));
	fileIn>>str;
	folderIn = str;
	memset(str, '\0', 512*sizeof(char));
	fileIn>>str;
	fileExt = str;
	memset(str, '\0', 512*sizeof(char));
	fileIn>>str;
	folderOut = str;

	file_lists files = ScanDirectory(folderIn, fileExt);
	int size = files.size();
	cout<<"         :"<<size<<endl;

	string fileName;
	string path;
	string ptsName;
	int len;

	cvNamedWindow("img", 0);
	cvSetMouseCallback("img", mouseOn);
	for (int i=0; i<size; i++)
	{
		cout<<i+1<<"/"<<size<<endl;

		int idx = files[i].find_last_of('\/');
		fileName.clear();
		fileName = files[i].substr(idx+1, files[i].length()-idx);
		path = folderOut + "/"+ fileName;

		ptsName = path;
		len = ptsName.length();
		if (ptsName[len-4] = '.')
		{
			ptsName[len-1] = 't';
			ptsName[len-2] = 'x';
			ptsName[len-3] = 't';
		}
		else
		{
			ptsName[len-1] = '\0';
			ptsName[len-2] = 't';
			ptsName[len-3] = 'x';
			ptsName[len-4] = 't';
		}
		

		ofstream fileOut;
		fileOut.open(ptsName.c_str(), ios::out);

		IplImage* pImg = cvLoadImage(files[i].c_str());
		if (!pImg)
		{
			cout<<"img load error, fileName: "<<files[i].c_str();
			continue;
		}
		cvSaveImage(path.c_str(), pImg);

		while(!rBtnDown)
		{
			cvShowImage("img", pImg);
			cvWaitKey(1);
			if (ptsCount == ptsSize)
			{
				int minX,minY,maxX,maxY;
				minX = maxX = pts[0].x;
				minY = maxY = pts[0].y;
				for (int j=1; j<ptsSize; j++)
				{
					minX = minX<pts[j].x ? minX:pts[j].x;
					minY = minY<pts[j].y ? minY:pts[j].y;
					maxX = maxX>pts[j].x ? maxX:pts[j].x;
					maxY = maxY>pts[j].y ? maxY:pts[j].y;
				}
				fileOut<<minX<<" "<<minY<<" "<<maxX<<" "<<maxY<<endl;

				ptsCount = 0;
				cvRectangle(pImg, cvPoint(minX,minY), cvPoint(maxX,maxY), CV_RGB(255,0,0));
				cvShowImage("img", pImg);
				cvWaitKey(1);
			}
		} 
		rBtnDown = false;
		ptsCount = 0;

		cvReleaseImage(&pImg);
		fileOut.close();
	}
}

void Usage()
{
	cout<<"config.ini  "<<endl;
	cout<<"   config.ini           :




config.ini :
c:\\inputDir
.bmp
D:\\result"<<endl; cout<<endl; cout<<" :"<<endl; cout<<" 4 , , "<<endl; cout<<"//////////////////////////////////////////////////////////////////////"<<endl; } int _tmain(int argc, _TCHAR* argv[]) { Usage(); GetTrainSample(); system("pause"); return 0; }

설명:
(1) 이상 코드 는 opencv 가 필요 합 니 다. 관련 lib 와 dll 을 자체 적 으로 설정 하 십시오.
(2) 상기 코드 는 컴 파일 과정 에서 "Unicode" 문자 집합 을 선택 하지 마 십시오. 예 를 들 어 VS 2008, VS 2010 에서 다음 과 같이 설정 하 십시오. 항목 -- > 속성 -- > 일반 -- > 문자 집합 -- > 설정 되 지 않 았 습 니 다.
(3) 실행 가능 한 파일 이 있 는 경 로 는 config. ini 파일 을 만 드 십시오. 이 파일 은 세 줄 을 포함 합 니 다.
그림 경로 입력
그림 접미사 이름
출력 경로;
config. ini 참조 설정:
E:\Images .bmp E:\result
(4) config. ini 의 입 출력 경 로 는 중국어 경 로 를 포함 하지 마 십시오. 오류 가 발생 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기