/
TTrafficSignDataset.h
114 lines (101 loc) · 3.31 KB
/
TTrafficSignDataset.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#ifndef TTRAFFIC_SIGN_DATASET_H
#define TTRAFFIC_SIGN_DATASET_H
#include <TDataset.h>
#include <multiscale_sampler.h>
#include <TRandomDouble.h>
///Ïàðàìåòðû äàòàñåòà äëÿ ðàáîòû ñ îáó÷àþùåé âûáîðêîé
/*typedef*/ struct TTrafficSignDatasetProperties {
TDatasetProperties ObjDatasetProperties,
BackDatasetProperties;
double Ratio;
unsigned long BackLabel;
};
///Ïàðàìåòðû äàòàñåòà äëÿ ðàáîòû ñ îáó÷àþùåé âûáîðêîé ïî óìîë÷àíèþ
static const TTrafficSignDatasetProperties TRAFFIC_SIGN_DATASET_PROPERTIES_DEFAULTS =
{
DATASET_PROPERTIES_DEFAULTS,
DATASET_PROPERTIES_DEFAULTS,
0.1,
777
};
///Ãåíåðèðóåò ïàêåòû îáó÷àþùåé âûáîðêè, êîìáèíèðóÿ äîïîëíåííûå èçîáðàæåíèÿ îáúåêòîâ è ôðàãìåíòû ôîíîâûõ èçîáðàæåíèé
class TTrafficSignDataset /*: public TDataset*/ {
protected:
TTrafficSignDatasetProperties TSDatasetProperties;
TDataset * ObjDataset,
* BackDataset;
MultiscaleSampler * MultiSampler;
unsigned long BackIdx,
BackLocationIdx;
cv::Mat CurrentBackImage;
std::vector <cv::Rect> CurrentBackLocations;
public:
TTrafficSignDataset(const TTrafficSignDatasetProperties &properties)
//: TDataset(properties.DatasetProperties)
{
TSDatasetProperties = properties;
ObjDataset = new TDataset(TSDatasetProperties.ObjDatasetProperties);
BackDataset = new TDataset(TSDatasetProperties.BackDatasetProperties);
MultiSampler = new MultiscaleSampler(TSDatasetProperties.BackDatasetProperties.ImgSize);
BackIdx = 0;
};
virtual ~TTrafficSignDataset()
{
delete MultiSampler;
delete BackDataset;
delete ObjDataset;
};
///Ïîëó÷èòü î÷åðåäíîé îáúåêò èç âûáîðêè è ñîîòâåòñòâóþùóþ åìó ìåòêó
void GetSample(cv::Mat &sample, unsigned long &label)
{
if (RandomDouble() <= TSDatasetProperties.Ratio)
{
ObjDataset->GetRandomSample(sample, label);
}else{
if (CurrentBackLocations.size() == 0 || BackLocationIdx >= CurrentBackLocations.size())
{
std::cout<<CurrentBackLocations.size()<<std::endl;
CurrentBackImage = BackDataset->GetSampleCVMat(BackIdx);
MultiSampler->getSamples(CurrentBackImage, std::vector <cv::Rect>(), CurrentBackLocations);
BackLocationIdx = 0;
BackIdx++;
if (BackIdx == BackDataset->Size())
BackIdx = 0;
}
sample = CurrentBackImage(CurrentBackLocations[BackLocationIdx]);
label = TSDatasetProperties.BackLabel;
BackLocationIdx++;
}
}
///
void GetSample(dlib::matrix<unsigned char> &sample, unsigned long &label)
{
cv::Mat mat_sample;
GetSample(mat_sample, label);
//Ïðåîáðàçóåì â dlib::matrix
CVMatToDlibMatrix8U(mat_sample, sample);
}
//Ïîëó÷èòü ïàêåò èçîáðàæåíèé è ñîîòâåòñòâóþùèå èì ìåòêè cv::Mat - dlib::matrix ïåðåïèñàòü ÷åðåç øàáëîí?
void GetSampleBatch(
std::vector<dlib::matrix<unsigned char>> &batch_samples,
std::vector<unsigned long> &batch_labels,
const size_t batch_size
) {
cv::Mat gray_img_buf;
dlib::matrix<unsigned char> temp,
sample(TSDatasetProperties.ObjDatasetProperties.ImgSize.height, TSDatasetProperties.ObjDatasetProperties.ImgSize.width);
unsigned long label;
batch_samples.clear();
batch_labels.clear();
for (unsigned long i = 0; i < batch_size; i++)
{
GetSample(gray_img_buf, label);
//Ïðåîáðàçóåì åå â dlib::matrix
CVMatToDlibMatrix8U(gray_img_buf, temp);
resize_image(temp, sample);
batch_samples.push_back(sample);
batch_labels.push_back(label);
};
}
};
#endif