Advertisement
Guest User

Untitled

a guest
Dec 17th, 2014
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <dirent.h>
  3. #include <opencv2/opencv.hpp>
  4. #include <opencv2/highgui/highgui.hpp>
  5. #include <opencv/cvaux.hpp>
  6. #include <math.h>
  7. #include <opencv2/nonfree/features2d.hpp>
  8. #include <unordered_map>
  9.  
  10. using namespace std;
  11. using namespace cv;
  12.  
  13. vector<string> bikesFiles;
  14. vector<string> carsFiles;
  15. vector<string> cowsFiles;
  16. vector<unordered_map<int,float>> histograms;
  17. CvNormalBayesClassifier classifier_motor;
  18. CvNormalBayesClassifier classifier_car;
  19. CvNormalBayesClassifier classifier_cow;
  20.  
  21. unordered_map<int,float> initHashTable(){
  22. unordered_map<int,float> hist;
  23. for(int i=0;i<100;i++){
  24. hist.emplace(i,0);
  25. }
  26. return hist;
  27. }
  28.  
  29. Mat subMat(Mat hist, int st_index, int length){
  30. Mat histogram_mat(length, 100, CV_32FC1);
  31. for(int i=0;i<length;i++){
  32. for(int j=0;j<100;j++){
  33. histogram_mat.at<float>(i,j)=hist.at<float>(st_index,j);
  34. }
  35. st_index++;
  36. }
  37. return histogram_mat;
  38. }
  39.  
  40. Mat histogramToMat(){
  41. Mat histogram_mat(326, 100, CV_32FC1);
  42. for(int i=0;i<histograms.size();i++){
  43. for(int j=0;j<histograms[i].size();j++){
  44. histogram_mat.at<float>(i,j)=histograms[i].at(j);
  45. }
  46. }
  47. return histogram_mat;
  48. }
  49.  
  50. Mat initResponse(int st_index,int length){
  51. Mat response = Mat::zeros(261, 1, CV_32S);
  52. for(int i=st_index;i<st_index+length;i++){
  53. response.at<int>(i,0)=1;
  54. }
  55. return response;
  56. }
  57.  
  58. vector<Mat> readImages(char path[], int type){
  59. vector<Mat> images;
  60. DIR* dir;
  61. dirent* pdir;
  62. char directory[100];
  63. strcpy(directory, path);
  64. dir = opendir(directory);
  65. readdir(dir);
  66. readdir(dir);
  67. while ((pdir = readdir(dir))) {
  68. char name[100];
  69. strcpy(name, directory);
  70. strcat(name,pdir->d_name);
  71. Mat src = imread(name,0);
  72. images.push_back(src);
  73. string fileName = pdir->d_name;
  74. if(type == 1)
  75. bikesFiles.push_back(fileName.substr(0,fileName.length()-4));
  76. if(type == 2)
  77. carsFiles.push_back(fileName.substr(0,fileName.length()-4));
  78. if(type == 3)
  79. cowsFiles.push_back(fileName.substr(0,fileName.length()-4));
  80. }
  81. closedir(dir);
  82. return images;
  83. }
  84.  
  85. void applyHistEqualization(vector<Mat>& original){
  86. for(int i=0;i<original.size();i++){
  87. Mat copy;
  88. equalizeHist( original[i], copy);
  89. original[i]=copy;
  90. }
  91. }
  92.  
  93. void applyResizing(vector<Mat>& original){
  94. for(int i=0;i<original.size();i++){
  95. Mat copy;
  96. resize(original[i], copy, Size(300, 250));
  97. original[i]=copy;
  98. }
  99. }
  100.  
  101. vector<vector<KeyPoint>> denseDetector(vector<Mat> original){
  102. vector<vector<KeyPoint>> keypoints;
  103. Ptr<FeatureDetector> detector(new DenseFeatureDetector(1.f,1,0.1f,5,0,true,false));
  104. for(int i=0;i<original.size();i++){
  105. vector<KeyPoint> image_keypoints;
  106. detector->detect(original[i],image_keypoints);
  107. keypoints.push_back(image_keypoints);
  108. }
  109. return keypoints;
  110. }
  111.  
  112. vector<Mat> extractor(vector<Mat> images, vector<vector<KeyPoint>> keypoints){
  113. vector<Mat> extracted_keypoints;
  114. SiftDescriptorExtractor sde;
  115. for(int i=0;i<images.size();i++){
  116. Mat descriptor;
  117. sde.compute(images[i], keypoints[i], descriptor);
  118. extracted_keypoints.push_back(descriptor);
  119. }
  120. return extracted_keypoints;
  121. }
  122.  
  123. vector<Mat> extractFromSiftFile(vector<Mat> images, const char *type, int type1, const char *extension){
  124. vector<Mat> extracted_keypoints;
  125. for(int i=0;i<images.size();i++){
  126. string path= "";
  127. if(type1 ==1){
  128. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ bikesFiles[i]+ (string)extension;
  129. }
  130. if(type1 ==2){
  131. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ carsFiles[i]+(string)extension;
  132. }
  133. if(type1 ==3){
  134. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ cowsFiles[i]+(string)extension;
  135. }
  136. Mat descriptor;
  137. FileStorage fs2(path, FileStorage::READ);
  138. fs2["SIFT"] >> descriptor;
  139. extracted_keypoints.push_back(descriptor);
  140.  
  141. }
  142. return extracted_keypoints;
  143. }
  144.  
  145. void saveDescriptors(vector<Mat>& images, const char *type, int type1, const char *extension){
  146. for(int i=0;i<images.size();i++){
  147. string path= "";
  148. if(type1 ==1){
  149. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ bikesFiles[i]+(string)extension;
  150. }
  151. if(type1 ==2){
  152. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ carsFiles[i]+(string)extension;
  153. }
  154. if(type1 ==3){
  155. path = "/Users/msalah93/Desktop/Sem9/ComputerVision/CVProject/" + (string)type + "/"+ cowsFiles[i]+(string)extension;
  156. }
  157. FileStorage fs(path, FileStorage::WRITE);
  158. fs << "SIFT" << images[i];
  159. }
  160. }
  161.  
  162. vector<Mat> getRandomImages(vector<Mat> motorbikes,vector<Mat> cars,vector<Mat> cows){
  163. vector<Mat> randomised;
  164. vector<int> indeces;
  165. for(int i = 0;i<75;i++){
  166. int index = 0;
  167. while(find(indeces.begin(), indeces.end(), index)!=indeces.end())
  168. index = rand()%326;
  169. indeces.push_back(index);
  170. if(index<115)
  171. randomised.push_back(motorbikes[index]);
  172. else{
  173. if(index<215)
  174. randomised.push_back(cars[index-115]);
  175. else{
  176. if(index<326)
  177. randomised.push_back(cows[index-215]);
  178. }
  179. }
  180. }
  181. return randomised;
  182. }
  183.  
  184. Mat applyKmeans(Mat images){
  185. Mat labels;
  186. Mat centroids;
  187. kmeans(images,100,labels,TermCriteria(TermCriteria::COUNT, 100, 2.0),1,KMEANS_RANDOM_CENTERS,centroids);
  188. return centroids;
  189. }
  190.  
  191. float getEuclideanDistance(vector<float> v1, vector<float> v2){
  192. float dist = 0;
  193. for(int i=0;i<v1.size();i++){
  194. dist+= pow((v1[i]-v2[i]),2);
  195. }
  196. return sqrt(dist);
  197. }
  198.  
  199. int adjustCentroid(vector<float> desc, Mat centroids){
  200. int index = 0;
  201. float min_dist = numeric_limits<float>::max();
  202. for(int i=0;i<centroids.rows;i++){
  203. // vector<float> v;
  204. // centroids.row(i).copyTo(v);
  205. float dist_tmp = getEuclideanDistance(desc, centroids.row(i));
  206. if(dist_tmp<min_dist){
  207. min_dist = dist_tmp;
  208. index = i;
  209. }
  210. }
  211. return index;
  212. }
  213.  
  214. void initialiseBoW(vector<Mat> images, Mat centroids){
  215. for(int i=0;i<images.size();i++){
  216. unordered_map<int,float> hist = initHashTable();
  217. cout << hist.size() << endl;
  218. for(int j=0;j<images[i].rows;j++){
  219. // vector<float> v;
  220. // images[i].row(j).copyTo(v);
  221. int cent_index = adjustCentroid(images[i].row(j), centroids);
  222. hist.at(cent_index)= hist.at(cent_index)+1;
  223. }
  224. cout << "histogram list: " << histograms.size() << endl;
  225. histograms.push_back(hist);
  226. }
  227. }
  228.  
  229. void trainDataSet(Mat trainData){
  230. // Mat trainData = histogramToMat();
  231. Mat motor_train = subMat(trainData, 0, 92);
  232. Mat car_train = subMat(trainData, 115, 80);
  233. Mat cow_train = subMat(trainData, 215, 89);
  234. vector<Mat> trainTmp= {motor_train,car_train,cow_train};
  235. Mat trainDataFinal;
  236. vconcat(trainTmp, trainDataFinal);
  237. Mat motor_bikes = initResponse(0, 92);
  238. Mat cars = initResponse(92, 80);
  239. Mat cows = initResponse(172, 89);
  240. classifier_motor.train(trainDataFinal, motor_bikes);
  241. cout << "trained motosekl" << endl;
  242. classifier_car.train(trainDataFinal, cars);
  243. cout << "trained cars" << endl;
  244. classifier_cow.train(trainDataFinal, cows);
  245. cout << "trained cows" << endl;
  246. }
  247.  
  248. void testDataSet(Mat testData){
  249. // Mat testData = histogramToMat();
  250. Mat motor_test = subMat(testData, 92, 23);
  251. Mat car_test = subMat(testData, 195, 20);
  252. Mat cow_test = subMat(testData, 304, 22);
  253. vector<Mat> testTmp= {motor_test,car_test,cow_test};
  254. Mat testDataFinal;
  255. vconcat(testTmp, testDataFinal);
  256. Mat motor_bikes,cars,cows;
  257. classifier_motor.predict(testDataFinal, &motor_bikes);
  258. cout << motor_bikes << endl;
  259. classifier_car.predict(testDataFinal, &cars);
  260. cout << cars << endl;
  261. classifier_cow.predict(testDataFinal, &cows);
  262. cout << cows << endl;
  263. }
  264.  
  265. void saveBoWFiles(int start, int end,const char *type, int type1){
  266. Mat imageHists= histogramToMat();
  267. vector<Mat> matrix;
  268. for(int i=start; i<end; i++){
  269. Mat currImage = Mat::zeros(1, 100, CV_32FC1);
  270. for(int j=0; j<100; j++){
  271. currImage.at<float>(0,j)=imageHists.at<float>(i,j);
  272. }
  273. matrix.push_back(currImage);
  274. }
  275. saveDescriptors(matrix, type,type1, ".bow");
  276. }
  277.  
  278. void descriptorExtractor(){
  279. char motorchar[] = "/Users/msalah93/Desktop/Sem9/PNGImages/motorbike-testset/";
  280. char carchar[] = "/Users/msalah93/Desktop/Sem9/PNGImages/sideviews-cars/";
  281. char cowchar[] = "/Users/msalah93/Desktop/Sem9/PNGImages/sideviews-cows2/";
  282. vector<Mat> motorbikes = readImages(motorchar,1);
  283. vector<Mat> cars = readImages(carchar,2);
  284. vector<Mat> cows = readImages(cowchar,3);
  285. applyHistEqualization(motorbikes);
  286. applyHistEqualization(cars);
  287. applyHistEqualization(cows);
  288. applyResizing(motorbikes);
  289. applyResizing(cars);
  290. applyResizing(cows);
  291.  
  292. // Only done 1st time running
  293. vector<vector<KeyPoint>> motorbikes_keypoints = denseDetector(motorbikes);
  294. vector<vector<KeyPoint>> cars_keypoints = denseDetector(cars);
  295. vector<vector<KeyPoint>> cows_keypoints = denseDetector(cows);
  296. vector<Mat> motorbikes_mat = extractor(motorbikes,motorbikes_keypoints);
  297. vector<Mat> cars_mat = extractor(cars,cars_keypoints);
  298. vector<Mat> cows_mat = extractor(cows,cows_keypoints);
  299. saveDescriptors(motorbikes_mat, "motorbikes",1);
  300. saveDescriptors(cars_mat, "cars",2);
  301. saveDescriptors(cows_mat, "cows",3);
  302.  
  303. vector<Mat> motorbikes_mat = extractFromSiftFile(motorbikes,"motorbikes",1,".sift");
  304. vector<Mat> cars_mat = extractFromSiftFile(cars, "cars",2, ".sift");
  305. vector<Mat> cows_mat = extractFromSiftFile(cows, "cows",3, ".sift");
  306. vector<Mat> randomised = getRandomImages(motorbikes_mat,cars_mat,cows_mat);
  307. cout << "finished randomised" << endl;
  308.  
  309. //Only Done 1st time running
  310. Mat randomDesc;
  311. vconcat(randomised, randomDesc);
  312. Mat randomCentroids= applyKmeans(randomDesc);
  313. cout << "finished kmeans" << endl;
  314. initialiseBoW(motorbikes_mat, randomCentroids);
  315. cout << "finished BOW motor" << endl;
  316. initialiseBoW(cars_mat, randomCentroids);
  317. cout << "finished BOW cars" << endl;
  318. initialiseBoW(cows_mat, randomCentroids);
  319. cout << "finished BOW cows" << endl;
  320. saveBoWFiles(0, 115, "motorbikes", 1);
  321. saveBoWFiles(115, 215, "cars", 2);
  322. saveBoWFiles(215, 326, "cows", 3);
  323.  
  324. vector<Mat> motorbikes_mat_bow = extractFromSiftFile(motorbikes,"motorbikes",1,".bow");
  325. vector<Mat> cars_mat_bow = extractFromSiftFile(cars, "cars",2, ".bow");
  326. vector<Mat> cows_mat_bow = extractFromSiftFile(cows, "cows",3, ".bow");
  327. Mat motor_bow, cars_bow, cows_bow;
  328. vconcat(motorbikes_mat_bow,motor_bow);
  329. vconcat(cars_mat_bow,cars_bow);
  330. vconcat(cows_mat_bow,cows_bow);
  331. vector<Mat> total_bow= {motor_bow, cars_bow, cows_bow};
  332. Mat trainTestData;
  333. vconcat(total_bow, trainTestData);
  334. trainDataSet(trainTestData);
  335. cout << "Trained." << endl;
  336. testDataSet(trainTestData);
  337. cout << "Tested";
  338. }
  339.  
  340. int main(int argc, char** argv)
  341. {
  342. descriptorExtractor();
  343. return 0;
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement