Giter Site home page Giter Site logo

rvh_mesh_registration's Introduction

RVH Mesh registration repository

This repository collects methods to register SMPL model to point clouds or 3D scans. If you use this code please cite:
Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction, ECCV'20.
LoopReg: Self-supervised Learning of Implicit Surface Correspondences, Pose and Shape for 3D Human Mesh Registration, NeurIPS'20.

Contents

  1. Dependencies
  2. Prepare model files
  3. Different registration methods

Dependencies

Most dependencies are included in requirement.txt file, the following modules need to be installed manually:

  1. MPI-IS Mesh library. See installation here.
  2. Openpose library. See lifting 2D poses.

Prepare model files

We provide SMPL or SMPL+H registration in this repo. Depending on your model choice, you should prepare the corresponding model files, for details please check here.

Different registration methods

We provide various methods for registering SMPL or SMPL+H to scans or point clouds:

  1. Fit SMPL(H) to scans
  2. Fit SMPL(H)+D to scans
  3. Fit SMPL(H) to point clouds
  4. Fit SMPL(H)+D to point clouds using IP-Net

The default model we use is SMPL. In all the following scripts, you can switch to SMPL-H model by adding a command option -hands.

Fit SMPL(H) to scans

For more accurate registration, we recommend to first obtain 3D body keypoints from scans using openpose and optimization. See details here.

With the model files and 3D keypoints ready, you can run fitting with:

python smpl_registration/fit_SMPLH.py [scan_path] [pose_file] [save_path] 
[-gender male/female]
[-hands optional: use SMPL-H]

Example command using our sample data:

python smpl_registration/fit_SMPLH.py data/mesh_1/scan.obj data/mesh_1/3D_pose.json data/mesh_1/

You can also add option --display to visualize the registration process if you have access to local monitor.

Fit SMPL(H)+D model to scans

Fitting SMPLH+D is based on fitting SMPLH, hence the command is very similar, except you can provide existing SMPLH parameters as input.

python smpl_registration/fit_SMPLH+D.py [scan_path] [pose_file] [save_path] 
[-smpl_pkl existing SMPLH parameters] 
[-gender male/female] 
[-hands optional: use SMPL-H]

Example command using our sample data:

python smpl_registration/fit_SMPLHD.py data/mesh_1/scan.obj data/mesh_1/3D_pose.json data/mesh_1/ 

Fit SMPL(H) model to Kinect point clouds

The fitting procedure is very similar to scan fitting. But Kinect point clouds are noisy and incomplete and the person pose captured by Kinects can be much more diverse than scans, we recommend to provide 3d pose estimation to initialize the SMPL model. These initial pose estimations can be obtained from monocular pose estimation methods, for example, FrankMocap.

Also you can obtain 3D joints following instructions here.

Run fitting:

python smpl_registration/fit_SMPLH_pcloud.py [pc_path] [j3d_file] [save_path] [pose_init]
[-gender male/female]
[-hands optional: use SMPL-H]

Example command using our sample data:

python smpl_registration/fit_SMPLH_pcloud.py data/pc/person.ply data/pc/3D_pose.json data/pc/ data/pc/mocap.json

Fit SMPL(H)+D model to scans using IP-Net

This fitting is based on the IP-Net project. You can download the pretrained IP-Net model here.

This method does not require providing lifted 3D pose. Run fitting:

python smpl_registration/fit_SMPLH_IPNet.py [pc_path] [save path]
[-w checkpoint path]  
[-gender male/female] 
[-hands optional: use SMPL-H]

Example command using our sample data:

python smpl_registration/fit_SMPLH_IPNet.py data/mesh_1/scan.obj data/mesh_1 -w CHECKPOINT_PATH

Cite us:

If you use this code please cite:

@inproceedings{bhatnagar2020ipnet,
    title = {Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction},
    author = {Bhatnagar, Bharat Lal and Sminchisescu, Cristian and Theobalt, Christian and Pons-Moll, Gerard},
    booktitle = {European Conference on Computer Vision ({ECCV})},
    month = {aug},
    organization = {{Springer}},
    year = {2020},
}
@inproceedings{bhatnagar2020loopreg,
    title = {LoopReg: Self-supervised Learning of Implicit Surface Correspondences, Pose and Shape for 3D Human Mesh Registration},
    author = {Bhatnagar, Bharat Lal and Sminchisescu, Cristian and Theobalt, Christian and Pons-Moll, Gerard},
    booktitle = {Advances in Neural Information Processing Systems ({NeurIPS})},
    month = {December},
    year = {2020},
}

License

Copyright (c) 2022 Bharat Lal Bhatnagar, Max-Planck-Gesellschaft

Please read carefully the following terms and conditions and any accompanying documentation before you download and/or use this software and associated documentation files (the "Software").

The authors hereby grant you a non-exclusive, non-transferable, free of charge right to copy, modify, merge, publish, distribute, and sublicense the Software for the sole purpose of performing non-commercial scientific research, non-commercial education, or non-commercial artistic projects.

Any other use, in particular any use for commercial purposes, is prohibited. This includes, without limitation, incorporation in a commercial product, use in a commercial service, or production of other artefacts for commercial purposes.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

You understand and agree that the authors are under no obligation to provide either maintenance services, update services, notices of latent defects, or corrections of defects with regard to the Software. The authors nevertheless reserve the right to update, modify, or discontinue the Software at any time.

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. You agree to cite the Combining Implicit Function Learning and Parametric Models for 3D Human Reconstruction paper in documents and papers that report on research using this Software.

rvh_mesh_registration's People

Contributors

bharat-b7 avatar ptrvilya avatar xiexh20 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  avatar

rvh_mesh_registration's Issues

Texture Mapping

I want to to register model along with texture of 3d human model such that I get UV map for SMPL registered human. How can I achieve this?

About dependency

Hello, I found this repository to registration my scan data to SMPL body model.
To using this code, I create conda environment with attached requirement.txt file, but I got this message.

(base) root@b84ceda4246b:~/Dataset/RVH_Mesh_Registration# conda create --name rvh_env --file requirements.txt
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  • tqdm==4.61.2=pyhd8ed1ab_1
  • ffmpeg==4.3=hf484d3e_0
  • pytorch==1.7.1=cpu_py37hf1c21f6_2
  • libgfortran-ng==9.3.0=hff62375_19
  • llvm-openmp==12.0.1=h4bd325d_0
  • pyyaml==5.4.1=py37h5e8e339_0
  • libgcc-ng==9.3.0=h2828fa1_19
  • torchvision==0.8.2=py37h6dc5373_1_cpu
  • tabulate==0.8.9=pyhd8ed1ab_0
  • jpeg==9d=h36c2ea0_0
  • termcolor==1.1.0=py_2
  • iopath==0.1.9=py37
  • libcblas==3.9.0=8_mkl
  • mkl==2020.4=h726a3e6_304
  • portalocker==1.7.0=py37h89c1867_1
  • yacs==0.1.6=py_0
  • pytorch3d==0.4.0=py37_cu102_pyt171
  • libgomp==9.3.0=h2828fa1_19
  • fvcore==0.1.5.post20210719=py37
  • _libgcc_mutex==0.1=conda_forge
  • scikit-learn==0.24.2=py37h18a542f_0
  • libblas==3.9.0=8_mkl
  • scipy==1.7.0=py37h29e03ee_1
  • libgfortran5==9.3.0=hff62375_19
  • threadpoolctl==2.2.0=pyh8a188c0_0
  • python_abi==3.7=2_cp37m
  • libstdcxx-ng==9.3.0=h6de172a_19
  • nvidiacub==1.10.0=0
  • _openmp_mutex==4.5=1_llvm
  • yaml==0.2.5=h516909a_0
  • joblib==1.0.1=pyhd8ed1ab_0
  • mkl-service==2.3.0=py37h8f50634_2
  • liblapack==3.9.0=8_mkl
  • trimesh==3.9.23=pyh6c4a22f_0

Current channels:

To search for alternate channels that may provide the conda package you're
looking for, navigate to

https://anaconda.org

and use the search bar at the top of the page.

I think linux-64's channel is enough to install these packages, but I wanna check if they need additional channels.
Also, I wonder, is there any specific environment setting needed to use this code? (Guessing with pytorch3d==0.4.0=py37_cu102_pyt171 .....)
If specific cuda version or python version is required, I should make environment with docker.

Thank you!

Requirements.txt file

Creation of the conda environment using the requirements.txt results in the following error:

`Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  • ffmpeg==4.3=hf484d3e_0
  • pytorch3d==0.4.0=py37_cu102_pyt171
  • fvcore==0.1.5.post20210719=py37
  • iopath==0.1.9=py37
  • nvidiacub==1.10.0=0

Current channels:

To search for alternate channels that may provide the conda package you're
looking for, navigate to

https://anaconda.org

and use the search bar at the top of the page.`

Does the requirement file need to be edited to reflect the newer package versions that are available? Since the packages are not being installed with the versions mentioned.

Strange pose

I ran the fit_SMPLH_pcloud.py script according to the official tutorial, but the posture is strange. What is the reason?
微信截图_20231128183655

cloth term missed in fit_SMPLHD.py

It seems that fit_SMPLHD.py does not contain cloth term, as methioned in ECCV 2020 sup. Where can I find the cloth term code implemetion? thx

About fit_SMPLH.py error

After everything is done, I tried running fit_SMPLH.py but got error as following.

Optimizing SMPL global orientation
Iter: 29, pose_pr: 0.0000, pose_obj: 137.3827: 100% 30/30 [00:02<00:00, 12.19it/s]
0% 0/30 [00:00<?, ?it/s]Optimizing SMPL global orientation
Iter: 29, pose_pr: 0.0000, pose_obj: 64.2258: 100% 30/30 [00:02<00:00, 12.46it/s]
0% 0/30 [00:00<?, ?it/s]Optimizing SMPL global orientation
Iter: 29, pose_pr: 0.0000, pose_obj: 42.8275: 100% 30/30 [00:02<00:00, 12.39it/s]
0% 0/30 [00:00<?, ?it/s]Optimizing SMPL global orientation
Iter: 29, pose_pr: 0.0000, pose_obj: 32.1087: 100% 30/30 [00:02<00:00, 12.32it/s]
0% 0/30 [00:00<?, ?it/s]Optimizing SMPL global orientation
Iter: 29, pose_pr: 0.0000, pose_obj: 25.6859: 100% 30/30 [00:02<00:00, 12.53it/s]
0% 0/30 [00:00<?, ?it/s]Optimizing SMPL pose only
Iter: 29, pose_pr: 0.0000, pose_obj: 21.4127: 100% 30/30 [00:02<00:00, 12.39it/s]
Iter: 29, pose_pr: 0.0000, pose_obj: 18.3474: 100% 30/30 [00:02<00:00, 12.33it/s]
Iter: 29, pose_pr: 0.0000, pose_obj: 16.0537: 100% 30/30 [00:02<00:00, 12.38it/s]
Iter: 29, pose_pr: 0.0000, pose_obj: 14.2699: 100% 30/30 [00:02<00:00, 12.22it/s]
Iter: 29, pose_pr: 0.0000, pose_obj: 12.8429: 100% 30/30 [00:02<00:00, 12.25it/s]
** Optimised smpl pose **
Optimizing SMPL: 0% 0/30 [00:00<?, ?it/s]
Traceback (most recent call last):
File "smpl_registration/fit_SMPLH.py", line 232, in
main(args)
File "smpl_registration/fit_SMPLH.py", line 207, in main
fitter.fit([args.scan_path], [args.pose_file], args.gender, args.save_path)
File "smpl_registration/fit_SMPLH.py", line 49, in fit
self.optimize_pose_shape(th_scan_meshes, smpl, iterations, steps_per_iter, th_pose_3d)
File "smpl_registration/fit_SMPLH.py", line 69, in optimize_pose_shape
loss_dict = self.forward_pose_shape(th_scan_meshes, smpl, th_pose_3d)
File "smpl_registration/fit_SMPLH.py", line 90, in forward_pose_shape
verts, _, _, _ = smpl()
File "/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py", line 1110, in _call_impl
return forward_call(*input, **kwargs)
File "/content/MPI_MeshRegistration/lib/smpl/wrapper_pytorch.py", line 68, in forward
th_offsets=self.offsets)
File "/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py", line 1110, in _call_impl
return forward_call(*input, **kwargs)
File "/content/MPI_MeshRegistration/lib/smpl/smplpytorch/smplpytorch/pytorch/smpl_layer.py", line 106, in forward
self.th_shapedirs, self.th_betas.transpose(1, 0)).permute(2, 0, 1)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (20670x10 and 300x1)

Any comments?

RuntimeError: mat1 dim 1 must match mat2 dim 0

Hi, I am getting the following error when trying to run fit_SMPLH_IPNet.py on the test scan:

Optimizing SMPL global orientation: 0%| | 0/30 [00:00<?, ?it/s]
Traceback (most recent call last):
File "smpl_registration/fit_SMPLH_IPNet.py", line 325, in
main(args)
File "smpl_registration/fit_SMPLH_IPNet.py", line 289, in main
fitter.fit([args.scan_path], None, None, args.gender, args.save_path)
File "smpl_registration/fit_SMPLH_IPNet.py", line 109, in fit
self.optimize_pose_only(th_scan_meshes, smpl, iterations, steps_per_iter, parts_th, smpl_part_labels)
File "smpl_registration/fit_SMPLH_IPNet.py", line 152, in optimize_pose_only
loss_dict = self.forward_step(th_scan_meshes, split_smpl, scan_parts, smpl_parts)
File "smpl_registration/fit_SMPLH_IPNet.py", line 221, in forward_step
verts, _, _, _ = smpl()
File "/home/user1/.conda/envs/testenv/lib/python3.7/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/user1/Documents/MeshReg2/RVH_Mesh_Registration/lib/smpl/wrapper_pytorch.py", line 180, in forward
th_offsets=self.offsets)
File "/home/user1/.conda/envs/testenv/lib/python3.7/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/user1/Documents/MeshReg2/RVH_Mesh_Registration/lib/smpl/smplpytorch/smplpytorch/pytorch/smpl_layer.py", line 111, in forward
th_v_shaped = self.th_v_template + torch.matmul(self.th_shapedirs, th_betas.transpose(1, 0)).permute(2, 0, 1)
RuntimeError: mat1 dim 1 must match mat2 dim 0

I figured that it must be related to the dimension of th_betas in smpl_layer.py (which is [1,10], although I think that it should be [1,300]).

Could you please point out if I am doing something wrong or if there is anything I should adjust within the code?

Inquiries Regarding RVH Mesh Registration

Hello, and thank you for your contributions to RVH. I have encountered some issues and would appreciate your insights.

When attempting to align SMPL(H) and SMPL(H)+D with scans without providing a pose file, the outcomes were unsatisfactory. Additionally, while fitting SMPL(H)+D to scans using IP-Net, the model's dimensions were inaccurate, as depicted in the attached examples.
0
Fitting SMPL to scans
1
Fitting SMPL to scan using IP-Net

My confusion arises from the differing results obtained using the SMPL fitting and IPNet code from another source. Despite not supplying a pose file here, the results were surprisingly decent. It seems that moving from kalin0.1 to pytorch3d is not reason for this issue. I want to use the one with pytorch3d, since it has better compatibility, but the RVH leads to weird registration..
2

I compare the code of fit_SMPL in both, and it seems that there is not much different..... However, I noted a variation in the 'prior.pkl' file—RVH's version contains a 'mean' of 69, whereas IP-Net's version has 63.
Could you provide any guidance on these issues?
@xiexh20

RuntimeError: mat1 and mat2 shapes cannot be multiplied (20670x300 and 10x1)

python smpl_registration/fit_SMPLHD.py data/mesh_1/scan.obj data/mesh_1/3D_pose.json data/mesh_1/
Using SMPL model for registration
SMPL not specified, fitting SMPL now
scan path ... data/mesh_1/scan.obj
/root/miniconda3/envs/pytorch3d/lib/python3.8/site-packages/pytorch3d/io/utils.py:65: UserWarning: Faces have invalid indices
warnings.warn("Faces have invalid indices")
/root/miniconda3/envs/pytorch3d/lib/python3.8/site-packages/pytorch3d/io/obj_io.py:542: UserWarning: No mtl file provided
warnings.warn("No mtl file provided")
/disk3/user/AIGC/motion/RVH_Mesh_Registration/lib/smpl/smplpytorch/smplpytorch/pytorch/smpl_layer.py:58: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /opt/conda/conda-bld/pytorch_1646755903507/work/torch/csrc/utils/tensor_numpy.cpp:178.)
torch.Tensor(smpl_data['betas'].r).unsqueeze(0))
/disk3/user/AIGC/motion/RVH_Mesh_Registration/lib/body_objectives.py:21: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /opt/conda/conda-bld/pytorch_1646755903507/work/torch/csrc/utils/tensor_new.cpp:210.)
body25_reg_torch = torch.sparse_coo_tensor(body25_reg.nonzero(), body25_reg.data, body25_reg.shape)
0%| | 0/30 [00:00<?, ?it/s]Optimizing SMPL global orientation
Optimizing SMPL global orientation: 0%| | 0/30 [00:00<?, ?it/s]
Traceback (most recent call last):
File "smpl_registration/fit_SMPLHD.py", line 150, in
main(args)
File "smpl_registration/fit_SMPLHD.py", line 122, in main
fitter.fit([args.scan_path], [args.pose_file], [args.smpl_pkl], args.gender, args.save_path)
File "smpl_registration/fit_SMPLHD.py", line 25, in fit
pose, betas, trans = super(SMPLDFitter, self).fit(scans, pose_files, gender, save_path)
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/smpl_registration/fit_SMPLH.py", line 46, in fit
self.optimize_pose_only(th_scan_meshes, smpl, pose_iterations, pose_steps_per_iter, th_pose_3d)
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/smpl_registration/fit_SMPLH.py", line 146, in optimize_pose_only
loss_dict = self.forward_step_pose_only(split_smpl, th_pose_3d, prior_weight)
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/smpl_registration/fit_SMPLH.py", line 183, in forward_step_pose_only
J, face, hands = smpl.get_landmarks()
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/lib/smpl/wrapper_pytorch.py", line 185, in get_landmarks
verts, _, _, _ = self.forward()
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/lib/smpl/wrapper_pytorch.py", line 177, in forward
verts, jtr, tposed, naked = self.smpl(self.pose,
File "/root/miniconda3/envs/pytorch3d/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1110, in _call_impl
return forward_call(*input, **kwargs)
File "/disk3/user/AIGC/motion/RVH_Mesh_Registration/lib/smpl/smplpytorch/smplpytorch/pytorch/smpl_layer.py", line 111, in forward
th_v_shaped = self.th_v_template + torch.matmul(self.th_shapedirs, th_betas.transpose(1, 0)).permute(2, 0, 1)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (20670x300 and 10x1)

Betas values in results always be zero

Hi, Thank you for the amazing work! I am trying to fit smpl-h to the scanned model, the 'pose' and 'trans' values in the smpl result seems correct, but the 'betas'(i.e. the shapes) values are always zero. Can any one please help with this?
I run the python script using the sample 3d models with smplh and smplhd,neither of them got the proper shape results.

python3 smpl_registration/fit_SMPLHD.py data/mesh_1/scan.obj data/mesh_1/3D_pose.json data/mesh_1/ -gender male -hands

ImportError: libc10_cuda.so: cannot open shared object file: No such file or directory

How can this problem be solved?

Traceback (most recent call last):
File "smpl_registration/fit_SMPLH.py", line 17, in
from pytorch3d.loss import point_mesh_face_distance
File "/home/yin/miniconda3/envs/rvh-mesh-env/lib/python3.7/site-packages/pytorch3d/loss/init.py", line 4, in
from .chamfer import chamfer_distance
File "/home/yin/miniconda3/envs/rvh-mesh-env/lib/python3.7/site-packages/pytorch3d/loss/chamfer.py", line 7, in
from pytorch3d.ops.knn import knn_gather, knn_points
File "/home/yin/miniconda3/envs/rvh-mesh-env/lib/python3.7/site-packages/pytorch3d/ops/init.py", line 5, in
from .graph_conv import GraphConv
File "/home/yin/miniconda3/envs/rvh-mesh-env/lib/python3.7/site-packages/pytorch3d/ops/graph_conv.py", line 8, in
from pytorch3d import _C
ImportError: libc10_cuda.so: cannot open shared object file: No such file or directory

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.