1
1
using CNTK ;
2
+ using Emgu . CV . Structure ;
2
3
using SiaNet . Processing ;
3
4
using System ;
4
5
using System . Collections . Generic ;
11
12
12
13
namespace SiaNet . Model
13
14
{
15
+ internal class ImageMapInfo
16
+ {
17
+ internal string Filepath ;
18
+ internal int Label ;
19
+ internal int RotationAngle ;
20
+ internal Emgu . CV . CvEnum . FlipType Flip = Emgu . CV . CvEnum . FlipType . None ;
21
+ internal int Resize = 0 ;
22
+ }
23
+
14
24
public class ImageDataFrame
15
25
{
16
26
private int [ ] features ;
17
27
private int labels ;
18
28
private string folder ;
19
29
private bool fromFolder ;
20
- Dictionary < string , int > folderMapData ;
30
+ List < ImageMapInfo > folderMapData ;
21
31
22
32
public ImageDataFrame ( Variable feature , Variable label )
23
33
{
@@ -27,11 +37,11 @@ public ImageDataFrame(Variable feature, Variable label)
27
37
counter = 0 ;
28
38
}
29
39
30
- public ImageDataFrame ( string folder , int randomRotation = 0 , bool horizontalFlip = false , bool verticalFlip = false )
40
+ public ImageDataFrame ( string folder , int resize = 0 , int numberOfRandomRotation = 0 , bool horizontalFlip = false , bool verticalFlip = false )
31
41
{
32
42
this . folder = folder ;
33
43
fromFolder = true ;
34
- folderMapData = new Dictionary < string , int > ( ) ;
44
+ folderMapData = new List < ImageMapInfo > ( ) ;
35
45
DirectoryInfo dir = new DirectoryInfo ( folder ) ;
36
46
var subfolders = dir . GetDirectories ( ) ;
37
47
int counter = 1 ;
@@ -40,7 +50,24 @@ public ImageDataFrame(string folder, int randomRotation = 0, bool horizontalFlip
40
50
var files = item . GetFiles ( ) . Select ( x => ( x . FullName ) ) . ToList ( ) ;
41
51
foreach ( var file in files )
42
52
{
43
- folderMapData . Add ( file , counter ) ;
53
+ folderMapData . Add ( new ImageMapInfo ( ) { Filepath = file , Label = counter , RotationAngle = 0 , Resize = resize } ) ;
54
+ if ( numberOfRandomRotation > 0 )
55
+ {
56
+ for ( int i = 0 ; i < numberOfRandomRotation ; i ++ )
57
+ {
58
+ folderMapData . Add ( new ImageMapInfo ( ) { Filepath = file , Label = counter , RotationAngle = new Random ( 30 ) . Next ( 10 , 360 ) , Resize = resize } ) ;
59
+ }
60
+ }
61
+
62
+ if ( horizontalFlip )
63
+ {
64
+ folderMapData . Add ( new ImageMapInfo ( ) { Filepath = file , Label = counter , RotationAngle = 0 , Flip = Emgu . CV . CvEnum . FlipType . Horizontal , Resize = resize } ) ;
65
+ }
66
+
67
+ if ( verticalFlip )
68
+ {
69
+ folderMapData . Add ( new ImageMapInfo ( ) { Filepath = file , Label = counter , RotationAngle = 0 , Flip = Emgu . CV . CvEnum . FlipType . Vertical , Resize = resize } ) ;
70
+ }
44
71
}
45
72
46
73
counter ++ ;
@@ -121,12 +148,11 @@ public bool GetNextFromFolder(int batchSize)
121
148
122
149
foreach ( var item in batchData )
123
150
{
124
- Bitmap bmp = new Bitmap ( item . Key ) ;
125
- byteData . AddRange ( bmp . ParallelExtractCHW ( ) ) ;
151
+ byteData . AddRange ( processImageFile ( item ) ) ;
126
152
127
153
for ( int i = 1 ; i <= labels ; i ++ )
128
154
{
129
- if ( item . Value == i )
155
+ if ( item . Label == i )
130
156
{
131
157
labelData . Add ( 1 ) ;
132
158
}
@@ -143,6 +169,28 @@ public bool GetNextFromFolder(int batchSize)
143
169
return true ;
144
170
}
145
171
172
+ private List < float > processImageFile ( ImageMapInfo mapInfo )
173
+ {
174
+ Bitmap bmp = new Bitmap ( mapInfo . Filepath ) ;
175
+ Emgu . CV . Image < Bgr , byte > img = new Emgu . CV . Image < Bgr , byte > ( bmp ) ;
176
+ if ( mapInfo . Resize > 0 )
177
+ {
178
+ img = img . Resize ( mapInfo . Resize , mapInfo . Resize , Emgu . CV . CvEnum . Inter . Nearest ) ;
179
+ }
180
+
181
+ if ( mapInfo . Flip != Emgu . CV . CvEnum . FlipType . None )
182
+ {
183
+ img = img . Flip ( mapInfo . Flip ) ;
184
+ }
185
+
186
+ if ( mapInfo . RotationAngle > 0 )
187
+ {
188
+ img . Rotate ( mapInfo . RotationAngle , new Bgr ( Color . White ) ) ;
189
+ }
190
+
191
+ return img . Bitmap . ParallelExtractCHW ( ) ;
192
+ }
193
+
146
194
internal void Reset ( )
147
195
{
148
196
counter = 1 ;
@@ -152,7 +200,7 @@ internal void Reset()
152
200
153
201
private void Shuffle ( )
154
202
{
155
- Dictionary < string , int > clone = folderMapData ;
203
+ List < ImageMapInfo > clone = folderMapData ;
156
204
if ( folderMapData . Count > 0 )
157
205
{
158
206
clone . Clear ( ) ;
@@ -162,8 +210,8 @@ private void Shuffle()
162
210
{
163
211
int row = random . Next ( 0 , folderMapData . Count ) ;
164
212
var element = folderMapData . ElementAt ( row ) ;
165
- clone . Add ( element . Key , element . Value ) ;
166
- folderMapData . Remove ( element . Key ) ;
213
+ clone . Add ( element ) ;
214
+ folderMapData . Remove ( element ) ;
167
215
}
168
216
}
169
217
0 commit comments