Giter Club home page Giter Club logo

promptir's Introduction

PromptIR: Prompting for All-in-One Blind Image Restoration (NeurIPS'23)

Vaishnav Potlapalli, Syed Waqas Zamir, Salman Khan and Fahad Shahbaz Khan

paper


Abstract: Image restoration involves recovering a high-quality clean image from its degraded version. Deep learning-based methods have significantly improved image restora- tion performance, however, they have limited generalization ability to different degradation types and levels. This restricts their real-world application since it requires training individual models for each specific degradation and knowing the input degradation type to apply the relevant model. We present a prompt-based learning approach, PromptIR, for All-In-One image restoration that can effectively restore images from various types and levels of degradation. In particular, our method uses prompts to encode degradation-specific information, which is then used to dynamically guide the restoration network. This allows our method to generalize to different degradation types and levels, while still achieving state-of- the-art results on image denoising, deraining, and dehazing. Overall, PromptIR offers a generic and efficient plugin module with few lightweight prompts that can be used to restore images of various types and levels of degradation with no prior information of corruptions.


Network Architecture

Installation and Data Preparation

See INSTALL.md for the installation of dependencies and dataset preperation required to run this codebase.

Training

After preparing the training data in data/ directory, use

python train.py

to start the training of the model. Use the de_type argument to choose the combination of degradation types to train on. By default it is set to all the 3 degradation types (noise, rain, and haze).

Example Usage: If we only want to train on deraining and dehazing:

python train.py --de_type derain dehaze

Testing

After preparing the testing data in test/ directory, place the mode checkpoint file in the ckpt directory. The pretrained model can be downloaded here, alternatively, it is also available under the releases tab. To perform the evalaution use

python test.py --mode {n}

n is a number that can be used to set the tasks to be evaluated on, 0 for denoising, 1 for deraining, 2 for dehaazing and 3 for all-in-one setting.

Example Usage: To test on all the degradation types at once, run:

python test.py --mode 3

Demo

To obtain visual results from the model demo.py can be used. After placing the saved model file in ckpt directory, run:

python demo.py --test_path {path_to_degraded_images} --output_path {save_images_here}

Example usage to run inference on a directory of images:

python demo.py --test_path './test/demo/' --output_path './output/demo/'

Example usage to run inference on an image directly:

python demo.py --test_path './test/demo/image.png' --output_path './output/demo/'

To use tiling option while running demo.py set --tile option to True. The Tile size and Tile overlap parameters can be adjusted using --tile_size and --tile_overlap options respectively.

Results

Performance results of the PromptIR framework trained under the all-in-one setting

Table

Visual Results

The visual results of the PromptIR model evaluated under the all-in-one setting can be downloaded here

Citation

If you use our work, please consider citing:

@inproceedings{potlapalli2023promptir,
  title={PromptIR: Prompting for All-in-One Image Restoration},
  author={Potlapalli, Vaishnav and Zamir, Syed Waqas and Khan, Salman and Khan, Fahad},
  booktitle={Thirty-seventh Conference on Neural Information Processing Systems},
  year={2023}
}

Contact

Should you have any questions, please contact [email protected]

Acknowledgment: This code is based on the AirNet and Restormer repositories.

promptir's People

Contributors

salman-h-khan avatar swz30 avatar va1shn9v 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  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

promptir's Issues

How to solve it?

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by (1) passing the keyword argument find_unused_parameters=True to torch.nn.parallel.DistributedDataParallel; (2) making sure all forward function outputs participate in calculating loss. If you already have done the above two steps, then the distributed data parallel module wasn't able to locate the output tensors in the return value of your module's forward function. Please include the loss function and the structure of the return value of forward of your module when reporting this issue (e.g. list,dict, iterable).

AttributeError: module 'torch' has no attribute 'autocast'

When I want to try to test the code, I encountered the following problem, how should I solve it?
Here's the error.
Traceback (most recent call last):
File "test.py", line 16, in
import lightning.pytorch as pl
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/init.py", line 25, in
from lightning.fabric.fabric import Fabric # noqa: E402
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/init.py", line 29, in
from lightning.fabric.fabric import Fabric # noqa: E402
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/fabric.py", line 32, in
from lightning.fabric.plugins import Precision # avoid circular imports: # isort: split
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/plugins/init.py", line 18, in
from lightning.fabric.plugins.precision.amp import MixedPrecision
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/plugins/precision/init.py", line 14, in
from lightning.fabric.plugins.precision.amp import MixedPrecision
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/plugins/precision/amp.py", line 29, in
class MixedPrecision(Precision):
File "/home/isalab102/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/fabric/plugins/precision/amp.py", line 96, in MixedPrecision
def _autocast_context_manager(self) -> torch.autocast:
AttributeError: module 'torch' has no attribute 'autocast'

Error with Demo

Hi

I am having issues when I try to execute the following:

python demo.py --test_path './test/demo/image.png' --output_path './output/demo/'

My error is:

Traceback (most recent call last):
  File "demo.py", line 108, in <module>
    net  = PromptIRModel().load_from_checkpoint(ckpt_path).to(device)
  File "/home/user/.pyenv/versions/promptir/lib/python3.8/site-packages/lightning/pytorch/utilities/model_helpers.py", line 121, in wrapper
    raise TypeError(
TypeError: The classmethod `PromptIRModel.load_from_checkpoint` cannot be called on an instance. Please call it on the class type and make sure the return value is used.

I did not make any modifications to the code. Help with this issue is much appreciated.

Can you release the all-in-one dataset for training?

Your work is so insightful that I am motivated to follow you and try all-in-one image restoration. However, some of the datasets used in your paper are seemingly inaccessible. So could you please release the all-in-one dataset for training?

Train/test pipeline

Hi and thanks for the contribution
I was wondering why the train and test aren't the same pipeline especially for the dehaze you don't do patch crop and it s forced to read rain test set instead of haze
also how are you reporting the results since the model don't do evaluation for each epoch, is it that later you iterate over all ckpts?

Thanks

Problems with connection timeouts

The problem I encountered when training, I used a device and a gpu to train.Can you help me with it?
I changed it in the code.
parser.add_argument('--cuda', type=int, default=0)
parser.add_argument("--num_gpus",type=int,default= 1,help = "Number of GPUs to use for training")

Here are the results.

File "E:\python\lib\site-packages lightninglpytorchltrainerltrainer.py", line 571, in _fit_implself._run(model, ckpt_path=ckpt_path)File "E:\python\liblsite-packages lightning pytorch trainer(trainer.py", line 938,in _runself.strategy.setup_environment()File "E:\pythonlliblsite-packagesllightninglpytorchlstrategieslddp.py", line 143, in setup_environmentself.setup_distributed()File "E:\oythonllib\site-packagesllightninglpytorch\strategiesiddp.py", line 191, in setup_distributecinit dist connection(self.cluster environment. self.process group backend, timeout=self. timeoutFile "E:lpythonlliblsite-packages lightninglfabriclutilities distributed.py", line 258, in _init_dist_connectiontorchdistributed.init_process_group(torchdistributed_backend, rank=global_rank, orld.size=world_size,**kwargsFile "E:\python\lib\site-packagesltorchidistributed\distributed_c10d.py",line 754, in init_process_groupstore. rank, world_size = next(rendezyous iterator)File "E:\python\lib\site-packages torchidistributed\rendezvous.py" line 246,in -env-rendezvous_handlerstore = _create_c10d_store(master-addr, master-port, rank, world_size, timeoutFile "E:\python\lib\site-packages\torchidistributed rendezvous.py", line 177,in _create_c10d_storereturn Tcpstore(
imeoutError: The client socket has timed out after 1800s while trying to connect to (127.0.0,1, 51823)

About the All-in-one performance

Hi, I am interested in your work. And I reproduce the experiment. And I got the results as followings:

image

The first line is the result I reproduced, the second line is the result in the paper.
I found the task of going to the rain to be much higher than in the thesis, and none of the other tasks lived up to the thesis. Did I set it up wrong somewhere?
I changed the batch size from 8 to 4 because of the cuda memory.
And I followed issue 4 to prepare the dataset.

Question about Possible Mismatch between Feature Size and Prompt Size

Hi,
Thanks for this incredible work! I have a question about the possible different feature size between pre-defined prompts and image features. It seems that the spatial size of prompts are pre-defined (such as 64x64 ) and fixed, so if the feature size of one testing image does not match this pre-defined size, hot to handle this?
Thx.

Training Cost (GPU and training time)

Thanks for your impressive work.

I like the prompt-based idea. May I know how many GPUs (also which type) you used and how long it tasks to train the model?

It would help me a lot.

Bests,

Demo Code Execution Error

Hi,

When I try to run the following command:

python demo.py --test_path './test/artifacts_dataset/rain/IMG_1665.JPG' --output_path './output/demo/'

I get the following error:

Total Images : ['../artifacts_dataset/rain/IMG_1665.JPG']
Start testing...
  0%|                                                                                                                                                                                                                                                                                | 0/1 [00:02<?, ?it/s]
Traceback (most recent call last):
  File "demo.py", line 120, in <module>
    restored = net(degrad_patch)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "demo.py", line 56, in forward
    return self.net(x)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/user/MSU/Research/PromptIR/net/model.py", line 326, in forward
    out_enc_level1 = self.encoder_level1(inp_enc_level1)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/container.py", line 217, in forward
    input = module(input)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/user/MSU/Research/PromptIR/net/model.py", line 194, in forward
    x = x + self.ffn(self.norm2(x))
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/user/MSU/Research/PromptIR/net/model.py", line 96, in forward
    x1, x2 = self.dwconv(x).chunk(2, dim=1)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 463, in forward
    return self._conv_forward(input, self.weight, self.bias)
  File "/home/user/.pyenv/versions/miniconda3-3.8-23.9.0-0/envs/promptir/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 459, in _conv_forward
    return F.conv2d(input, weight, bias, self.stride,
RuntimeError: Expected canUse32BitIndexMath(input) && canUse32BitIndexMath(output) to be true, but got false.  (Could this error message be improved?  If so, please report an enhancement request to PyTorch.)

Could this be because my tensor sizes are too big? Would resizing my input images help? Is there a specific size you used for images when training and testing? I did not make any modifications to the code.

Cannot install PromptIR because Pip dependencies error.

Ubuntu 18.04.6 LTS, Python 3.7.5, Anaconda 2023-07-01 (conda 23.5.2)

conda --version
conda 23.5.2

I try to install according to
https://github.com/va1shn9v/PromptIR/blob/main/INSTALL.md

When I use command
conda env create -f env.yml

It shows something like this.

Collecting tifffile==2023.1.23.1
  Using cached tifffile-2023.1.23.1-py3-none-any.whl (214 kB)
Collecting timm==0.6.12
  Using cached timm-0.6.12-py3-none-any.whl (549 kB)
Requirement already satisfied: torch==1.8.1 in /ssd-disk2/home/surapan/anaconda3/envs/promptir/lib/python3.8/site-packages (from -r /ssd-disk2/home/surapan/PromptIR/condaenv.r0b5wppv.requirements.txt (line 108)) (1.8.1)
Collecting torchmetrics==0.11.4
  Using cached torchmetrics-0.11.4-py3-none-any.whl (519 kB)
Collecting torchsummary==1.5.1
  Using cached torchsummary-1.5.1-py3-none-any.whl (2.8 kB)
Collecting triton==2.0.0
  Using cached triton-2.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (63.2 MB)
Collecting tsnecuda==3.0.1
  Using cached tsnecuda-3.0.1-py3-none-any.whl (53.2 MB)
Collecting typing-extensions==4.5.0
  Using cached typing_extensions-4.5.0-py3-none-any.whl (27 kB)
Collecting ujson==5.7.0
  Using cached ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (52 kB)
Collecting urllib3==1.26.14
  Using cached urllib3-1.26.14-py2.py3-none-any.whl (140 kB)
Collecting uvicorn==0.21.1
  Using cached uvicorn-0.21.1-py3-none-any.whl (57 kB)
Collecting uvloop==0.17.0
  Using cached uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB)
Collecting wandb==0.13.9
  Using cached wandb-0.13.9-py2.py3-none-any.whl (2.0 MB)

But finally, It shows error like this.

Pip subprocess error:
ERROR: Could not find a version that satisfies the requirement warmup-scheduler==0.3.2
ERROR: No matching distribution found for warmup-scheduler==0.3.2
                                                                                                                                                         failed

CondaEnvException: Pip failed

Please help or suggest how to solve this problem, Thank you.

Which split of SOTS do you used to test?

Hi, there are two splits of SOTS, i.e., indoor and outdoor, and each split have 500 paired images, which one do you used to test? Or is the number reported in Table 2 actually average performance in merged 1000 test images?

A question about the prompt in the paper.

A great work!
I'm confused about the prompt-component.It seems to be fixed across tasks.
But I'm starting to think that it should be different between tasks, is there a problem with my understanding, so how does the model differentiate between tasks?

self.prompt_param = nn.Parameter(torch.rand(1,prompt_len,prompt_dim,prompt_size,prompt_size))

About the airnet test dataset output

Hello, are you using AirNet's publicly available weights(released on github) for prediction, and why is my output different from the picture reported in your paper. Thank you!
C51B0A65-9218-4D34-8710-421746816647
5E2118D5-5B1F-4CEA-BEF8-A93DBB57D200
2D345B55-B96A-4CB5-B020-0BA9BB4C4B08

where I can download the dataset?

Good work! I'd like to train the model. Do you know where I can download the dataset? In the paper, the authors mentioned combining multiple datasets for their experiments.

How to pip install env?

(promptir) chenz@chenz-System-Product-Name:~/PromptIR$ python train.py
Traceback (most recent call last):
File "train.py", line 15, in
import lightning.pytorch as pl
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/init.py", line 27, in
from lightning.pytorch.callbacks import Callback # noqa: E402
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/pytorch/init.py", line 26, in
from lightning.pytorch.callbacks import Callback # noqa: E402
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/pytorch/callbacks/init.py", line 14, in
from lightning.pytorch.callbacks.batch_size_finder import BatchSizeFinder
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/pytorch/callbacks/batch_size_finder.py", line 24, in
from lightning.pytorch.callbacks.callback import Callback
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/pytorch/callbacks/callback.py", line 22, in
from lightning.pytorch.utilities.types import STEP_OUTPUT
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning/pytorch/utilities/types.py", line 25, in
from torchmetrics import Metric
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/init.py", line 14, in
from torchmetrics import functional # noqa: E402
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/functional/init.py", line 14, in
from torchmetrics.functional.audio._deprecated import _permutation_invariant_training as permutation_invariant_training
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/functional/audio/init.py", line 14, in
from torchmetrics.functional.audio.pit import permutation_invariant_training, pit_permutate
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/functional/audio/pit.py", line 23, in
from torchmetrics.utilities import rank_zero_warn
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/utilities/init.py", line 14, in
from torchmetrics.utilities.checks import check_forward_full_state_property
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/utilities/checks.py", line 25, in
from torchmetrics.metric import Metric
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/metric.py", line 30, in
from torchmetrics.utilities.data import (
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/utilities/data.py", line 22, in
from torchmetrics.utilities.imports import _TORCH_GREATER_EQUAL_1_12, _XLA_AVAILABLE
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchmetrics/utilities/imports.py", line 48, in
_TORCHAUDIO_GREATER_EQUAL_0_10: Optional[bool] = compare_version("torchaudio", operator.ge, "0.10.0")
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/lightning_utilities/core/imports.py", line 73, in compare_version
pkg = importlib.import_module(package)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchaudio/init.py", line 1, in
from . import extension # noqa: F401
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchaudio/extension/init.py", line 5, in
_init_extension()
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchaudio/extension/extension.py", line 11, in _init_extension
_init_script_module(ext)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchaudio/extension/extension.py", line 18, in _init_script_module
torch.classes.load_library(path)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torch/_classes.py", line 51, in load_library
torch.ops.load_library(path)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torch/_ops.py", line 643, in load_library
ctypes.CDLL(path)
File "/home/chenz/anaconda3/envs/promptir/lib/python3.8/ctypes/init.py", line 373, in init
self._handle = _dlopen(self._name, mode)
OSError: /home/chenz/anaconda3/envs/promptir/lib/python3.8/site-packages/torchaudio/_torchaudio.so: undefined symbol: _ZNK3c104Type14isSubtypeOfExtERKSt10shared_ptrIS0_EPSo

About the performance on Rain100L dataset in single-task setting.

Hi, authors. Thanks for your awesome work!
I have a question about the PSNR on Derain task under single-task setting.
In the original Restormer paper, the Table 1 in this paper show the PSNR on Rrain100L is 38.99dB.
However, in the PromptIR paper, the Table 3 show the PSNR of Restormer on Rain100L is 36.74dB.
I have no idea about this. Is there some setting different between the two? Can you give a further explanation?

Thank you!

The problem of dataset

Hi, I have a problem: the model reported that there is no such image, but I saw that there is such an image in the folder. What's the matter?

FileNotFoundError: [Errno 2] No such file or directory: 'home/chenz/Promptir/data/Train/Derain/rainy/rain-81.png'

error

Hi, I'm having the following problem with my training, can you tell me how to solve it?

TypeError: lr_scheduler_step() takes 2 positional arguments but 3 were given

Hello, senior! I have some questions about PromptIR that I don't understand. Could you please help me with them?

Hello, I apologize for taking up your valuable time. I have learned a lot from your article "PromptIR: Prompting for All-in-One Blind Image Restoration." However, I encountered some issues when trying to reproduce the results, and I hope to seek your assistance.

After running the command "conda env create -f env.yml," I encountered a "ModuleNotFoundError: No module named 'lightning'" when running train.py. Subsequently, I installed it using pip install lightning==2.0.1. However, a new issue arose with "AttributeError: module 'torch' has no attribute 'autocast'." I am unsure how to resolve this.

I would greatly appreciate your help!

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.