Code Monkey home page Code Monkey logo

cuestarfm's Introduction

cuESTARFM

Version 1.0

Overview

MODIS and Landsat surface reflectance products have complementary characteristics in terms of spatial and temporal resolutions. To fully exploit these datasets, the Spatial and Temporal Adaptive Reflectance Fusion Model (STARFM) was developed by Gao et al. (2006). The STARFM approach blends the high-frequency temporal information from MODIS and the high-resolution spatial information from Landsat to generate synthetic surface reflectance products at 30m spatial resolution and daily temporal resolution. STARFM uses one or more pairs of Landsat-MODIS images collected on the same dates to predict surface reflectance at Landsat resolution on other MODIS observation dates. In order to better predict the reflectance of sub-pixel consisting of heterogeneous landscapes, an enhanced STARFM (ESTARFM) was developed by Zhu et al. (2010), which is based on the spectral unmixing theory and uses a “conversion coefficient” to help the prediction. However, the computational performance of ESTARFM has been a bottleneck for mass production.

To overcome the computational barrier and support mass production of large-size images, we designed and implemented a GPU-enabled ESTARFM program based on the Compute Unified Device Architecture (CUDA), called cuESTARFM. By taking advantages of the large amount of concurrent computing threads of a GPU, cuESTARFM can greatly reduce the computing time and improve the computational performance. Experiments showed that cuESTARFM achieved a speedup of 75 using a Nvidia Tesla K40 GPU, compared with a sequential ESTARFM program running on an Intel Xeon E3-1226 CPU.

Key features of cuESTARFM:

  • Supports a wide range of CUDA-enabled GPUs (https://developer.nvidia.com/cuda-gpus)
    • Automatic setting of the numbers of threads and thread blocks according to the GPU’s available computing resources (e.g., memory, streaming multiprocessors, and warp)
    • Adaptive cyclic task assignment to achieve better load balance
    • Optimized use of registers to improve the computational performance
    • Adaptive data decomposition when the size of images exceeds the GPU’s memory
    • All above are completely transparent to users
  • Intakes any number of pairs of Landsat-MODIS images as the input
  • Outputs any number of prediction images
  • Supports a wide range of image formats (see http://gdal.org/formats_list.html)
  • Supports both Windows and Linux/Unix operating systems

References

  • Gao, F.; Masek, J.; Schwaller, M. and Hall, F. On the Blending of the Landsat and MODIS Surface Reflectance: Predict Daily Landsat Surface Reflectance, IEEE Transactions on Geoscience and Remote Sensing. 2006, 44(8):2207-2218.
  • Zhu, X.; Chen, J.; Gao, F.; Chen, X. and Masek, J. An enhanced spatial and temporal adaptive reflectance fusion model for complex heterogeneous regions, Remote Sensing of Environment, 2010, 114(11): 2610–2623.

To Cite cuESTARFM in Publications

  • Please cite the following reference:
    Gao, H., Zhu, X., Guan, Q., Yang, X., Yao, Y., Zeng, W., Peng, X., 2021. cuFSDAF: An Enhanced Flexible Spatiotemporal Data Fusion Algorithm Parallelized Using Graphics Processing Units. IEEE Transactions on Geoscience and Remote Sensing. https://doi.org/10.1109/TGRS.2021.3080384

Compilation

  • Requirements:
  • For the Windows operating system (using MS Visual Studio as an example)
    1. Open all the source codes in Visual Studio
    2. Click menu Project -> Properties -> VC++ Directories -> Include Directories, and add the “include” directory of GDAL (e.g., C:\GDAL\include)
    3. Click menu Project -> Properties -> VC++ Directories -> Lib Directories, and add the “lib” directory of GDAL (e.g., C:\GDAL\lib)
    4. Click menu Build -> Build Solution
      Once successfully compiled, an executable file, cuESTARFM.exe, is created.
  • For the Linux/Unix operating system (using the CUDA compiler --- nvcc)
    In a Linux/Unix terminal, type in:
    • $ cd /the-directory-of-source-codes/
    • $ nvcc -o cuESTARFM kernel.cu cuLayer.cpp cuESTARFM_util.cpp trans.cpp -lgdal
      Once successfully compiled, an executable file, cuESTARFM, is created.

Usage

  • Before running the program, make sure that all Landsat and MODIS images have been pre-processed and co-registered. They must have:
    • the same spatial resolution (i.e., Landsat resolution --- 30m)
    • the same image size (i.e., numbers of rows and columns)
    • the same map projection
  • A text file must be manually created to specify the input and output images, and other parameters for the ESTARFM model.
    Example (# for comments):

ESTARFM_PARAMETER_START

#The number of input pairs of Landsat-MODIS images (>=2)
NUM_IN_PAIRS = 2

#The input MODIS images
#File names are separated by space
IN_PAIR_MODIS_FNAME = D:\cuda\shikong\testdata\M_2002_01_04.tif D:\cuda\shikong\testdata\M_2002_02_21.tif

#The input Landsat images
#File names are separated by space
IN_PAIR_LANDSAT_FNAME = D:\cuda\shikong\testdata\L_2002_01_04.tif D:\cuda\shikong\testdata\L_2002_02_21.tif

#The MODIS images for the prediction dates
#Multiple images can be given
#File names are separated by space
IN_PDAY_MODIS_FNAME = D:\cuda\shikong\testdata\M_2002_02_12.tif

#The output synthetic prediction images
#Multiple images can be given
#File names are separated by space
OUT_PDAY_LANDSAT_FNAME = D:\cuda\shikong\testdata\estr.tif

#The_width of searching_window
The_width_of_searching_window = 51

#Assumed_number of classifications
Assumed_number_of_classifications = 6

#Landsat sensor error
sensor_uncertain = 0.0028

#Output image format (optional)
#Will be used when the extension of the output files
#is not given
G_Type = GTIff

ESTARFM_PARAMETER_END

  • The program runs as a command line. You may use the Command (i.e., cmd) in Windows, or a terminal in Linux/Unix.

    • For the Windows version:
      $ cuESTARFM.exe parameters.txt
    • For the Linux/Unix version:
      $ ./cuESTARFM parameters.txt
  • Note: The computational performance of cuESTARFM largely depends on the GPU. The more powerful is the GPU, the better performance.

cuestarfm's People

Contributors

gaohuancug avatar gisers avatar sonicben avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cuestarfm's Issues

Uncaught exception of bad_alloc

I am getting the following exception while running the code. I have same size of all the Landsat (size 20.5 MB) and MODIS (size 5.1 MB) Images. I am running the code with python 3.6.7 on Mac (10.14.5 Intel Iris Graphics 6100 1536 MB)

libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
2.17085  2.34144  Abort trap: 6

Compiling Issues

Hi. I've been trying to compile the *.EXE on Microsoft Visual Studio 2017 but even though the compilation ends succesfully, no *.exe file is generated on the solution folder. Is this normal?

What kind of project needs to be built in order to compile the *.exe properly? What am I doing wrong?

Thanks.

项目编译时出错

项目平台设为x64,编译项目时出错。
错误列表如下:
Error LNK2019 unresolved external symbol "void __cdecl Re_fusion2(class CuLayer *,struct PARAMETER *)" (?Re_fusion2@@YAXPEAVCuLayer@@PEAUPARAMETER@@@z) referenced in function main ff C:\Users\joe\Downloads\Compressed\cuSTARFM-master\Windows\fusion.obj 1

Error LNK1120 1 unresolved externals ff C:\Users\joe\Downloads\Compressed\cuSTARFM-master\Windows\x64\Debug\ff.exe 1

之前c++用得少,通过错误提示猜测为Re_fusion2函数只进行了定义而没有实现。
配置环境已经配置好了,也可能是我哪里还没有准备到位。请问能否帮我解决下这个问题。期盼您的回复。

Failure to compile

On a system that features the following:

(Funtoo 8.3.1-r8) 8.3.1 20190503
  • nvcc
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Fri_Feb__8_19:08:17_PST_2019
Cuda compilation tools, release 10.1, V10.1.105
  • GDAL
GDAL 3.0.4, released 2020/01/28

an attempt to compile via:

nvcc -o cuESTARFM kernel.cu cuLayer.cpp cuESTARFM_util.cpp trans.cpp -lgdal

returns

cuLayer.h(23): warning: type qualifier on return type is meaningless

cuLayer.h(24): warning: type qualifier on return type is meaningless

cuLayer.h(25): warning: type qualifier on return type is meaningless

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(69): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(69): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(70): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(71): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(72): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(72): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(73): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(73): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(106): warning: variable "sum" was set but never used

kernel.cu(114): warning: variable "wi" was declared but never referenced

kernel.cu(344): warning: variable "r1" was declared but never referenced

kernel.cu(344): warning: variable "s1" was declared but never referenced

kernel.cu(345): warning: variable "k_h" was declared but never referenced

kernel.cu(409): warning: variable "sum" was set but never used

kernel.cu(416): warning: variable "wi" was declared but never referenced

kernel.cu(919): warning: variable "i" was declared but never referenced

kernel.cu(919): warning: variable "j" was declared but never referenced

kernel.cu(919): warning: variable "m" was declared but never referenced

kernel.cu(964): warning: result of call is not used

kernel.cu(977): warning: result of call is not used

kernel.cu(990): warning: result of call is not used

kernel.cu(1003): warning: result of call is not used

kernel.cu(1017): warning: result of call is not used

kernel.cu(1022): warning: conversion from a string literal to "char *" is deprecated

kernel.cu(1042): warning: result of call is not used

cuLayer.h(23): warning: type qualifier on return type is meaningless

cuLayer.h(24): warning: type qualifier on return type is meaningless

cuLayer.h(25): warning: type qualifier on return type is meaningless

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(65): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(69): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(69): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(70): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(71): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(72): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(72): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(73): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(73): warning: reference is to variable "ii"
(44): here -- under old for-init scoping rules it would have been variable "ii"
(57): here

kernel.cu(964): warning: result of call is not used

kernel.cu(977): warning: result of call is not used

kernel.cu(990): warning: result of call is not used

kernel.cu(1003): warning: result of call is not used

kernel.cu(1017): warning: result of call is not used

kernel.cu(1022): warning: conversion from a string literal to "char *" is deprecated

kernel.cu(1042): warning: result of call is not used

kernel.cu: In function ‘void Re_fusion2(const char*, const char*, const char*, const char*, const char*, const char*, int, int, float, float)’:
kernel.cu:964:19: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   hInBand1->RasterIO(GF_Read,0,0,width,height,BufferLandsat_0[k],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel.cu:977:19: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   hInBand1->RasterIO(GF_Read,0,0,width,height,BufferModis_0[k],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel.cu:990:19: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   hInBand1->RasterIO(GF_Read,0,0,width,height,BufferLandsat_1[k],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel.cu:1003:19: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   hInBand1->RasterIO(GF_Read,0,0,width,height,BufferModis_1[k],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel.cu:1017:19: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   hInBand1->RasterIO(GF_Read,0,0,width,height,BufferModis_2[k],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kernel.cu:1042:15: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   HOut->RasterIO(GF_Write,0,0,width,height,BufferOutColor[b],width,height,GDT_Float32,0,0);
   ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cuLayer.cpp: In function ‘char* findImageTypeGDAL(std::__cxx11::string)’:
cuLayer.cpp:253:38: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   if (dstExtension == "bmp") Gtype = "BMP";
                                      ^~~~~
cuLayer.cpp:254:43: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   else if (dstExtension == "jpg") Gtype = "JPEG";
                                           ^~~~~~
cuLayer.cpp:255:43: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   else if (dstExtension == "png") Gtype = "PNG";
                                           ^~~~~
cuLayer.cpp:256:43: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   else if (dstExtension == "tif") Gtype = "GTiff";
                                           ^~~~~~~
cuLayer.cpp:257:43: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   else if (dstExtension == "gif") Gtype = "GIF";
                                           ^~~~~
cuLayer.cpp: In member function ‘int CuLayer::Write(std::__cxx11::string, std::__cxx11::string)’:
cuLayer.cpp:306:17: warning: ignoring return value of ‘CPLErr GDALRasterBand::RasterIO(GDALRWFlag, int, int, int, int, void*, int, int, GDALDataType, GSpacing, GSpacing, GDALRasterIOExtraArg*)’, declared with attribute warn_unused_result [-Wunused-result]
   HOut->RasterIO(GF_Write,0,0,this->m_width,this->m_height,this->m_data[b],this->m_width,this->m_height,GDT_Float32,0,0);
   ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cuLayer.cpp:312:2: warning: control reaches end of non-void function [-Wreturn-type]
  }
  ^
cuESTARFM_util.cpp: In function ‘int parseParameters(char*, CuLayer*, PARAMETER*)’:
cuESTARFM_util.cpp:31:22: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
   char  *separator = "= ,";
                      ^~~~~
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.1/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libgeos-3.7.0.so: undefined reference to `std::runtime_error::runtime_error(std::runtime_error&&)@GLIBCXX_3.4.26'
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.1/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/local/lib/libgdal.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
collect2: error: ld returned 1 exit status

Error trying to execute

While trying to execute the script, i am getting the following error.

/home/wtelectronica/cuESTARFM-master/Codes/cuESTARFM paramet
ers_example.txt
�����ļ�Ӧ����ESTARFM_PARAMETER_END��β
����Ӱ��ͼ��Χ��ƥ��
Retrieve input parameters error!
Usage: /home/wtelectronica/cuESTARFM-master/Codes/cuESTARFM <IN_PARAMETER_FILE>
<IN_PARAMETER_FILE> is a text input file which contains:
STARFM_PARAMETER_START
NUM_IN_PAIRS =
The_pf_band_of_Landsat_for_calculating =
The_pc_band_of_MODIS_for_calculating =
IN_PAIR_MODIS_FNAME =
IN_PAIR_LANDSAT_FNAME =
IN_PDAY_MODIS_FNAME =
OUT_PDAY_LANDSAT_FNAME =
The_width_of_searching_window=
Assumed_number_of_classifications =
Landsat_sensor_error=
MODIS_sensor_error =
STARFM_PARAMETER_END

test_parameters_05_nqn.txt

I could run another dataset, but not this time, thank you for advice.

Handling no data in the fusion seems not to be working.

We were doing some debugging on getting some anomalous values in dataset having no data values. Seems like no data values are not address in the way we perceived it.

Function __global__ void limit_a_CalcuRela_pairs and __global__ void Blending2_pairs are using the following blocks.

int b=Idx/(Height*Width);  
int j=(Idx-(Height*Width)*b)/Width; 
int i=(Idx-(Height*Width)*b)%Width;

on solving these mathematically the i and j will turn out to be 0 for any value of Idx. So, what it was intended to do?
Also handling of no data is still not clear we are getting garbage values in no data region in the test images which spread out to the whole window.

Here is some permalink of addressed lines.

int b=Idx/(Height*Width);

int j=(Idx-(Height*Width)*b)/Width;

参数文件

程序编译成功后运行,仅弹出了一个cmd对话框,内容为:
Usage: E:\CUDA_TEST1\x64\Debug\CUDA_TEST1.exe <IN_PARAMETER_FILE>
<IN_PARAMETER_FILE> is a text input file which contains:
STARFM_PARAMETER_START
NUM_IN_PAIRS =
The_pf_band_of_Landsat_for_calculating =
The_pc_band_of_MODIS_for_calculating =
IN_PAIR_MODIS_FNAME =
IN_PAIR_LANDSAT_FNAME =
IN_PDAY_MODIS_FNAME =
OUT_PDAY_LANDSAT_FNAME =
The_width_of_searching_window=
Assumed_number_of_classifications =
Landsat_sensor_error=
MODIS_sensor_error =
STARFM_PARAMETER_END
请按任意键继续. . .
当我按任意键后对话框直接关闭,似乎程序仅运行了cuESTARFM_util.cpp的参数介绍部分。请问参数文件txt设置好后还需要在代码中哪里设置路径,以便让程序获取设定的参数以进行后续的运算?

build problem

when i run" build solution",it seems to have some problems.
these are error lists:
Error LNK2019 unresolved external symbol "void __cdecl Re_fusion2(class CuLayer *,struct PARAMETER *)" (?Re_fusion2@@YAXPEAVCuLayer@@PEAUPARAMETER@@@z) referenced in function main ff C:\Users\joe\Downloads\Compressed\cuSTARFM-master\Windows\fusion.obj 1

Error LNK1120 1 unresolved externals ff C:\Users\joe\Downloads\Compressed\cuSTARFM-master\Windows\x64\Debug\ff.exe 1

it seems to have some problems with the function of "Re_fusion2".how can i solve this problem?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.