int THProcessYUYV(THNETWORK *network, unsigned char *image, int width, int height, float **results, int *outwidth, int *outheight) { THFloatTensor *out; THFloatStorage *st; #ifdef CUDNN if(network->net->cuda) THError("This function is not supported with CUDNN"); #endif #ifdef OPENCL if(network->net->cuda) THError("This function is not supported with OpenCL"); #endif st = THFloatStorage_new(width * height * 3); yuyv2fRGB(image, st->data, width*height, width, width, height, network->mean, network->std); THFloatTensor *t = THFloatTensor_new(); t->storage = st; t->nDimension = 3; t->size[0] = 3; t->size[1] = height; t->size[2] = width; t->stride[0] = width * height; t->stride[1] = width; t->stride[2] = 1; out = forward(network->net, t); THFloatTensor_free(t); *results = out->storage->data; if(out->nDimension >= 3) { *outwidth = out->size[out->nDimension - 1]; *outheight = out->size[out->nDimension - 2]; } else *outwidth = *outheight = 1; return THFloatTensor_nElement(out); }
void THFloatTensor_resizeAs(THFloatTensor *tdst, THFloatTensor *tsrc) { if(tsrc == tdst) return; long nelemsrc = THFloatTensor_nElement(tsrc); tdst->nDimension = tsrc->nDimension; memcpy(tdst->size, tsrc->size, sizeof(tsrc->size)); memcpy(tdst->stride, tsrc->stride, sizeof(tsrc->stride)); if(!tdst->storage) tdst->storage = THFloatStorage_new(nelemsrc); else if(nelemsrc != THFloatTensor_nElement(tdst)) { if(tdst->storage) tdst->storage->data = realloc(tdst->storage->data, sizeof(*tdst->storage->data) * nelemsrc); else tdst->storage = THFloatStorage_new(nelemsrc); } }
void THFloatTensor_resize1d(THFloatTensor *t, long size0) { t->nDimension = 1; t->size[0] = size0; t->stride[0] = 1; if(!t->storage) t->storage = THFloatStorage_new(size0); }
void THFloatTensor_resize3d(THFloatTensor *t, long size0, long size1, long size2) { t->nDimension = 3; t->size[0] = size0; t->size[1] = size1; t->size[2] = size2; t->stride[2] = 1; t->stride[1] = size2; t->stride[0] = size1 * size2; if(!t->storage) t->storage = THFloatStorage_new(size0 * size1 * size2); }
void THFloatTensor_resize(THFloatTensor *t, long *size, int nDimension) { int i; long stride = 1; t->nDimension = nDimension; memcpy(t->size, size, nDimension * sizeof(*t->size)); for(i = nDimension - 1; i >= 0; i--) { t->stride[i] = stride; stride *= t->size[i]; } if(!t->storage) t->storage = THFloatStorage_new(stride); }
int THProcessImages(THNETWORK *network, unsigned char **images, int batchsize, int width, int height, int stride, float **results, int *outwidth, int *outheight, int bgr) { int i; THFloatTensor *out, *t = 0; THFloatStorage *st; #ifdef CUDNN if(network->net->cuda) { #ifdef HAVEFP16 if(floattype == CUDNN_DATA_HALF) { st = THCudaStorage_new(batchsize * (width * height * 3)); for(i = 0; i < batchsize; i++) cuda_rgb2half((unsigned short *)st->data + i * (width * height * 3), images[i], width, height, stride, network->mean, network->std, bgr); } else #endif { st = THCudaStorage_new(batchsize * width * height * 3); for(i = 0; i < batchsize; i++) cuda_rgb2float(st->data + i * width * height * 3, images[i], width, height, stride, network->mean, network->std, bgr); } } else #endif #ifdef OPENCL if(network->net->opencl) t = OpenCL_LoadImage(images[0], width, height, stride, network->mean, network->std, bgr); else #endif { st = THFloatStorage_new(batchsize * width * height * 3); if(bgr) #pragma omp parallel for if(batchsize>1) private(i) for(i = 0; i < batchsize; i++) bgr2float(st->data + i * width * height * 3, images[i], width, height, stride, network->mean, network->std); else #pragma omp parallel for if(batchsize>1) private(i) for(i = 0; i < batchsize; i++) rgb2float(st->data + i * width * height * 3, images[i], width, height, stride, network->mean, network->std); } if(!t) { t = THFloatTensor_new(); t->storage = st; if(batchsize == 1) { t->nDimension = 3; t->size[0] = 3; t->size[1] = height; t->size[2] = width; t->stride[0] = width * height; t->stride[1] = width; t->stride[2] = 1; } else { t->nDimension = 4; t->size[0] = batchsize; t->size[1] = 3; t->size[2] = height; t->size[3] = width; t->stride[0] = 3 * width * height; t->stride[1] = width * height; t->stride[2] = width; t->stride[3] = 1; } } #ifdef CUDNN if(network->net->cuda) { out = forward(network->net, t); if(network->out) THFloatTensor_free(network->out); #ifdef HAVEFP16 if(floattype == CUDNN_DATA_HALF) network->out = THFloatTensor_newFromHalfCudaTensor(out); else #endif network->out = THFloatTensor_newFromCudaTensor(out); out = network->out; } else #endif #ifdef OPENCL if(network->net->opencl) { out = forward(network->net, t); if(network->out) THFloatTensor_free(network->out); #ifdef HAVEFP16 if(cl_datasize == 2) network->out = THFloatTensor_newFromHalfOpenCLImageTensor(out); else #endif network->out = THFloatTensor_newFromOpenCLImageTensor(out); out = network->out; } else #endif out = forward(network->net, t); THFloatTensor_free(t); *results = out->storage->data; if(out->nDimension >= 3) { *outwidth = out->size[out->nDimension - 1]; *outheight = out->size[out->nDimension - 2]; } else *outwidth = *outheight = 1; return THFloatTensor_nElement(out); }