Skip to content

Commit 3b01eaa

Browse files
arrybnmshabunin
authored andcommitted
Fixed bugs after dnn refactoring. Added new tests for layers (#1142)
* Fixed bugs after dnn refactoring. Added new tests for layers * Fixed torch tests
1 parent c42beb4 commit 3b01eaa

File tree

12 files changed

+242
-35
lines changed

12 files changed

+242
-35
lines changed

modules/dnn/src/dnn.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ void Net::setBlob(String outputName, const Mat &blob_)
607607
MatSize prevShape = ld.outputBlobs[pin.oid].size;
608608
ld.outputBlobs[pin.oid] = blob_.clone();
609609

610-
impl->netWasAllocated = prevShape == blob_.size;
610+
impl->netWasAllocated = impl->netWasAllocated && prevShape == blob_.size;
611611
}
612612

613613
Mat Net::getBlob(String outputName)

modules/dnn/src/layers/op_im2col.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,7 @@ class im2row_CpuPBody : public cv::ParallelLoopBody
153153
t.width_col = width_col;
154154
t.channels_col = channels * kernel_h * kernel_w;
155155

156-
int total = t.height_col*t.width_col;
157-
#if 1
158-
t(Range(0, total));
159-
#else
160-
cv::parallel_for_(Range(0, total), t, 16);
161-
#endif
156+
cv::parallel_for_(Range(0, t.height_col*t.width_col), t, 16);
162157
}
163158

164159
virtual void operator ()(const Range &r) const
@@ -203,7 +198,6 @@ class im2row_CpuPBody : public cv::ParallelLoopBody
203198
}
204199
else
205200
{
206-
memset(data_col_, 0, kw*kh*channels*sizeof(data_col_[0]));
207201
for(int i_c = 0; i_c < channels; i_c++)
208202
{
209203
int channels_offset = i_c * width * height;
@@ -242,7 +236,6 @@ void im2row(const float* data_im, int channels, int height, int width,
242236
}
243237

244238

245-
#if 0
246239
template <typename Dtype>
247240
class col2im_CpuPBody : public cv::ParallelLoopBody
248241
{
@@ -312,7 +305,6 @@ class col2im_CpuPBody : public cv::ParallelLoopBody
312305
}
313306
}
314307
};
315-
#endif
316308

317309
//single-threaded version
318310
template <typename Dtype>
@@ -360,9 +352,15 @@ void col2im(const float* data_col, int channels, int height, int width,
360352
int stride_h, int stride_w, int dilation_h, int dilation_w,
361353
float* data_im, const int* ofsbuf)
362354
{
363-
//col2im_CpuPBody<float>::run(data_col, channels, height, width, kernel_h, kernel_w, pad_h, pad_w, stride_h, stride_w, data_im);
355+
(void)dilation_h;
356+
(void)dilation_w;
357+
(void)ofsbuf;
358+
col2im_CpuPBody<float>::run(data_col, channels, height, width, kernel_h,
359+
kernel_w, pad_h, pad_w, stride_h, stride_w, data_im);
360+
#if 0
364361
col2im_cpu(data_col, channels, height, width, kernel_h, kernel_w, pad_h, pad_w,
365362
stride_h, stride_w, dilation_h, dilation_w, data_im, ofsbuf);
363+
#endif
366364
}
367365

368366
}

modules/dnn/src/torch/THDiskFile.cpp

Lines changed: 193 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ typedef struct THDiskFile__
1313
FILE *handle;
1414
char *name;
1515
int isNativeEncoding;
16+
int longSize;
1617

1718
} THDiskFile;
1819

@@ -172,9 +173,17 @@ static void THDiskFile_seek(THFile *self, long position)
172173
THDiskFile *dfself = (THDiskFile*)(self);
173174

174175
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
175-
THArgCheck(position >= 0, 2, "position must be positive");
176176

177-
if(fseek(dfself->handle, position, SEEK_SET) < 0)
177+
#if defined(_WIN64)
178+
THArgCheck(position <= (_int64)INT64_MAX, 2, "position must be smaller than INT64_MAX");
179+
if(_fseeki64(dfself->handle, (__int64)position, SEEK_SET) < 0)
180+
#elif defined(_WIN32)
181+
THArgCheck(position <= (long)LONG_MAX, 2, "position must be smaller than LONG_MAX");
182+
if(fseek(dfself->handle, (long)position, SEEK_SET) < 0)
183+
#else
184+
THArgCheck(position <= (long)LLONG_MAX, 2, "position must be smaller than LLONG_MAX");
185+
if(fseeko(dfself->handle, (off_t)position, SEEK_SET) < 0)
186+
#endif
178187
{
179188
dfself->file.hasError = 1;
180189
if(!dfself->file.isQuiet)
@@ -188,7 +197,13 @@ static void THDiskFile_seekEnd(THFile *self)
188197

189198
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
190199

200+
#if defined(_WIN64)
201+
if(_fseeki64(dfself->handle, 0L, SEEK_END) < 0)
202+
#elif defined(_WIN32)
191203
if(fseek(dfself->handle, 0L, SEEK_END) < 0)
204+
#else
205+
if(fseeko(dfself->handle, 0L, SEEK_END) < 0)
206+
#endif
192207
{
193208
dfself->file.hasError = 1;
194209
if(!dfself->file.isQuiet)
@@ -200,7 +215,20 @@ static long THDiskFile_position(THFile *self)
200215
{
201216
THDiskFile *dfself = (THDiskFile*)(self);
202217
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
203-
return ftell(dfself->handle);
218+
219+
#if defined(_WIN64)
220+
__int64 offset = _ftelli64(dfself->handle);
221+
#elif defined(_WIN32)
222+
long offset = ftell(dfself->handle);
223+
#else
224+
off_t offset = ftello(dfself->handle);
225+
#endif
226+
if (offset > -1)
227+
return (long)offset;
228+
else if(!dfself->file.isQuiet)
229+
THError("unable to obtain disk file offset (maybe a long overflow occurred)");
230+
231+
return 0;
204232
}
205233

206234
static void THDiskFile_close(THFile *self)
@@ -274,6 +302,23 @@ void THDiskFile_bigEndianEncoding(THFile *self)
274302

275303
/* End of Little and Big Endian Stuff */
276304

305+
void THDiskFile_longSize(THFile *self, int size)
306+
{
307+
THDiskFile *dfself = (THDiskFile*)(self);
308+
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
309+
THArgCheck(size == 0 || size == 4 || size == 8, 1, "Invalid long size specified");
310+
dfself->longSize = size;
311+
}
312+
313+
void THDiskFile_noBuffer(THFile *self)
314+
{
315+
THDiskFile *dfself = (THDiskFile*)(self);
316+
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
317+
if (setvbuf(dfself->handle, NULL, _IONBF, 0)) {
318+
THError("error: cannot disable buffer");
319+
}
320+
}
321+
277322
static void THDiskFile_free(THFile *self)
278323
{
279324
THDiskFile *dfself = (THDiskFile*)(self);
@@ -302,12 +347,12 @@ READ_WRITE_METHODS(short, Short,
302347
int ret = fprintf(dfself->handle, "%hd", data[i]); if(ret <= 0) break; else nwrite++)
303348

304349
READ_WRITE_METHODS(int, Int,
305-
int ret = fscanf(dfself->handle, "%d", &data[i]); if(ret <= 0) break; else nread++,
350+
int ret = fscanf(dfself->handle, "%d\n\r", &data[i]); if(ret <= 0) break; else nread++,
306351
int ret = fprintf(dfself->handle, "%d", data[i]); if(ret <= 0) break; else nwrite++)
307352

308-
READ_WRITE_METHODS(long, Long,
353+
/*READ_WRITE_METHODS(long, Long,
309354
int ret = fscanf(dfself->handle, "%ld", &data[i]); if(ret <= 0) break; else nread++,
310-
int ret = fprintf(dfself->handle, "%ld", data[i]); if(ret <= 0) break; else nwrite++)
355+
int ret = fprintf(dfself->handle, "%ld", data[i]); if(ret <= 0) break; else nwrite++)*/
311356

312357
READ_WRITE_METHODS(float, Float,
313358
int ret = fscanf(dfself->handle, "%g", &data[i]); if(ret <= 0) break; else nread++,
@@ -317,6 +362,146 @@ READ_WRITE_METHODS(double, Double,
317362
int ret = fscanf(dfself->handle, "%lg", &data[i]); if(ret <= 0) break; else nread++,
318363
int ret = fprintf(dfself->handle, "%.17g", data[i]); if(ret <= 0) break; else nwrite++)
319364

365+
366+
/* For Long we need to rewrite everything, because of the special management of longSize */
367+
static long THDiskFile_readLong(THFile *self, int64 *data, long n)
368+
{
369+
THDiskFile *dfself = (THDiskFile*)(self);
370+
long nread = 0L;
371+
372+
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
373+
THArgCheck(dfself->file.isReadable, 1, "attempt to read in a write-only file");
374+
375+
if(dfself->file.isBinary)
376+
{
377+
if(dfself->longSize == 0 || dfself->longSize == sizeof(int64))
378+
{
379+
nread = fread__(data, sizeof(int64), n, dfself->handle);
380+
if(!dfself->isNativeEncoding && (sizeof(int64) > 1) && (nread > 0))
381+
THDiskFile_reverseMemory(data, data, sizeof(int64), nread);
382+
} else if(dfself->longSize == 4)
383+
{
384+
nread = fread__(data, 4, n, dfself->handle);
385+
if(!dfself->isNativeEncoding && (nread > 0))
386+
THDiskFile_reverseMemory(data, data, 4, nread);
387+
long i;
388+
for(i = nread; i > 0; i--)
389+
data[i-1] = ((int *)data)[i-1];
390+
}
391+
else /* if(dfself->longSize == 8) */
392+
{
393+
int big_endian = !THDiskFile_isLittleEndianCPU();
394+
int32_t *buffer = (int32_t*)THAlloc(8*n);
395+
nread = fread__(buffer, 8, n, dfself->handle);
396+
long i;
397+
for(i = nread; i > 0; i--)
398+
data[i-1] = buffer[2*(i-1) + big_endian];
399+
THFree(buffer);
400+
if(!dfself->isNativeEncoding && (nread > 0))
401+
THDiskFile_reverseMemory(data, data, 4, nread);
402+
}
403+
}
404+
else
405+
{
406+
long i;
407+
for(i = 0; i < n; i++)
408+
{
409+
long d;
410+
int ret = fscanf(dfself->handle, "%ld", &d); if(ret <= 0) break; else nread++;
411+
data[i] = d;
412+
}
413+
if(dfself->file.isAutoSpacing && (n > 0))
414+
{
415+
int c = fgetc(dfself->handle);
416+
if( (c != '\n') && (c != EOF) )
417+
ungetc(c, dfself->handle);
418+
}
419+
}
420+
421+
if(nread != n)
422+
{
423+
dfself->file.hasError = 1; /* shouldn't we put hasError to 0 all the time ? */
424+
if(!dfself->file.isQuiet)
425+
THError("read error: read %d blocks instead of %d", nread, n);
426+
}
427+
428+
return nread;
429+
}
430+
431+
static long THDiskFile_writeLong(THFile *self, int64 *data, long n)
432+
{
433+
THDiskFile *dfself = (THDiskFile*)(self);
434+
long nwrite = 0L;
435+
436+
THArgCheck(dfself->handle != NULL, 1, "attempt to use a closed file");
437+
THArgCheck(dfself->file.isWritable, 1, "attempt to write in a read-only file");
438+
439+
if(dfself->file.isBinary)
440+
{
441+
if(dfself->longSize == 0 || dfself->longSize == sizeof(long))
442+
{
443+
if(dfself->isNativeEncoding)
444+
{
445+
nwrite = fwrite(data, sizeof(long), n, dfself->handle);
446+
}
447+
else
448+
{
449+
char *buffer = (char*)THAlloc(sizeof(long)*n);
450+
THDiskFile_reverseMemory(buffer, data, sizeof(long), n);
451+
nwrite = fwrite(buffer, sizeof(long), n, dfself->handle);
452+
THFree(buffer);
453+
}
454+
} else if(dfself->longSize == 4)
455+
{
456+
int32_t *buffer = (int32_t *)THAlloc(4*n);
457+
long i;
458+
for(i = 0; i < n; i++)
459+
buffer[i] = data[i];
460+
if(!dfself->isNativeEncoding)
461+
THDiskFile_reverseMemory(buffer, buffer, 4, n);
462+
nwrite = fwrite(buffer, 4, n, dfself->handle);
463+
THFree(buffer);
464+
}
465+
else /* if(dfself->longSize == 8) */
466+
{
467+
int big_endian = !THDiskFile_isLittleEndianCPU();
468+
int32_t *buffer = (int32_t*)THAlloc(8*n);
469+
long i;
470+
for(i = 0; i < n; i++)
471+
{
472+
buffer[2*i + !big_endian] = 0;
473+
buffer[2*i + big_endian] = data[i];
474+
}
475+
if(!dfself->isNativeEncoding)
476+
THDiskFile_reverseMemory(buffer, buffer, 8, n);
477+
nwrite = fwrite(buffer, 8, n, dfself->handle);
478+
THFree(buffer);
479+
}
480+
}
481+
else
482+
{
483+
long i;
484+
for(i = 0; i < n; i++)
485+
{
486+
long res = 0;
487+
int ret = fprintf(dfself->handle, "%ld", res); data[i] = res; if(ret <= 0) break; else nwrite++;
488+
if( dfself->file.isAutoSpacing && (i < n-1) )
489+
fprintf(dfself->handle, " ");
490+
}
491+
if(dfself->file.isAutoSpacing && (n > 0))
492+
fprintf(dfself->handle, "\n");
493+
}
494+
495+
if(nwrite != n)
496+
{
497+
dfself->file.hasError = 1;
498+
if(!dfself->file.isQuiet)
499+
THError("write error: wrote %d blocks instead of %d", nwrite, n);
500+
}
501+
502+
return nwrite;
503+
}
504+
320505
static long THDiskFile_readString(THFile *self, const char *format, char **str_)
321506
{
322507
THDiskFile *dfself = (THDiskFile*)(self);
@@ -494,6 +679,7 @@ THFile *THDiskFile_new(const char *name, const char *mode, int isQuiet)
494679
self->name = (char*)THAlloc(strlen(name)+1);
495680
strcpy(self->name, name);
496681
self->isNativeEncoding = 1;
682+
self->longSize = 0;
497683

498684
self->file.vtable = &vtable;
499685
self->file.isQuiet = isQuiet;
@@ -595,6 +781,7 @@ THFile *THPipeFile_new(const char *name, const char *mode, int isQuiet)
595781
self->name = (char*)THAlloc(strlen(name)+1);
596782
strcpy(self->name, name);
597783
self->isNativeEncoding = 1;
784+
self->longSize = 0;
598785

599786
self->file.vtable = &vtable;
600787
self->file.isQuiet = isQuiet;

modules/dnn/src/torch/THDiskFile.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ TH_API int THDiskFile_isBigEndianCPU(void);
1313
TH_API void THDiskFile_nativeEndianEncoding(THFile *self);
1414
TH_API void THDiskFile_littleEndianEncoding(THFile *self);
1515
TH_API void THDiskFile_bigEndianEncoding(THFile *self);
16+
TH_API void THDiskFile_longSize(THFile *self, int size);
17+
TH_API void THDiskFile_noBuffer(THFile *self);
1618

1719
#endif

modules/dnn/src/torch/THFile.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#if defined(ENABLE_TORCH_IMPORTER) && ENABLE_TORCH_IMPORTER
22
#include "THFile.h"
33
#include "THFilePrivate.h"
4-
4+
#include <opencv2/core.hpp>
55
extern "C"
66
{
77

@@ -20,7 +20,7 @@ IMPLEMENT_THFILE_RW(Byte, unsigned char)
2020
IMPLEMENT_THFILE_RW(Char, char)
2121
IMPLEMENT_THFILE_RW(Short, short)
2222
IMPLEMENT_THFILE_RW(Int, int)
23-
IMPLEMENT_THFILE_RW(Long, long)
23+
IMPLEMENT_THFILE_RW(Long, int64)
2424
IMPLEMENT_THFILE_RW(Float, float)
2525
IMPLEMENT_THFILE_RW(Double, double)
2626

@@ -134,7 +134,7 @@ IMPLEMENT_THFILE_SCALAR(Byte, unsigned char)
134134
IMPLEMENT_THFILE_SCALAR(Char, char)
135135
IMPLEMENT_THFILE_SCALAR(Short, short)
136136
IMPLEMENT_THFILE_SCALAR(Int, int)
137-
IMPLEMENT_THFILE_SCALAR(Long, long)
137+
IMPLEMENT_THFILE_SCALAR(Long, int64)
138138
IMPLEMENT_THFILE_SCALAR(Float, float)
139139
IMPLEMENT_THFILE_SCALAR(Double, double)
140140

0 commit comments

Comments
 (0)