thinklab-sjtu / r3det_tensorflow Goto Github PK
View Code? Open in Web Editor NEWCode for AAAI 2021 paper: R3Det: Refined Single-Stage Detector with Feature Refinement for Rotating Object
License: Apache License 2.0
Code for AAAI 2021 paper: R3Det: Refined Single-Stage Detector with Feature Refinement for Rotating Object
License: Apache License 2.0
applied tools/inference.py on DOTA Test set 2 images, still no bounding boxes. Adjusted libs/configs/cfgs.py VIS_SCORE to 0.0, still no bounding boxes.
Here's the code I used
python inference.py --data_dir '/dir/of/2/test/images/' --save_dir '/my/chosen/folder/' --gpu 0 --draw_imgs
Here's the output running inference script on DOTA Test set P0034.png
Originally posted by @ncdejito in #7 (comment)
执行python multi_gpu_train_r3det.py,多GPU运行会出现截图中的错误,切换成一个GPU就不会出现,错误如下:
InternalError (see above for traceback): WhereOp: Could not launch cub::DeviceReduce::Sum to count number of true / nonzero indices. temp_storage_bytes: 5887, status: invalid resource handle
[[node tower_1/build_refine_loss/Where_2 (defined at ../libs/losses/losses.py:56) = WhereT=DT_BOOL, _device="/job:localhost/replica:0/task:0/device:GPU:0"]]
请问如何解决这个问题。
大佬好,我对Anchor的设置有些疑问。
对于H+R这一情况,在相关配置文件中只看到METHOD = 'H'这一项,在训练时好像也只用了矩形候选框,请问旋转候选框部分是在哪里实现的。
Hi,
I wanted to test the code by running inference on a couple of samples images i downloaded from the internet. But it's not working. Here are the steps that i followed:
data/pretrained_weights
and downloaded the resnet50
related ckpt files from GDrive into the directory. That is, the files resnet50_v1d.ckpt.data-00000-of-00001
, resnet50_v1d.ckpt.index
and resnet50_v1d.ckpt.meta
.Am I doing something wrong? Could you please guide. Thanks in advance.
I get an error when using test_dota_r3det.py, and the ckpt is saved from training. Can anyone help me? The original error:
Key build_pyramid/build_P3/reduce_dim_P3/biases not found in checkpoint
[[node save/RestoreV2 (defined at ../libs/networks/build_whole_network_r3det.py:386) = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]
[[{{node save/RestoreV2/_393}} = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_397_save/RestoreV2", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]]
@yangxue0827
What about icdar text detection?
@yangxue0827 大佬,你好。我用的是自己的数据集,如果我想训练400*400的模型,直接修改IMG_SHORT_SIDE_LEN这个参数为400的话,训练1600步后,就会报RuntimeWarning: divide by zero encountered in log
targets_dw = np.log(gt_rois[:, 2] / ex_rois[:, 2]),然后loss就直接会变成nan了,训练过800的,是可以的,但是400的不行
Have you tested your model on DOTA 1.5. If yes, what are the accuracy results?
在您的论文中,‘anchor combination strategy. the horizontal anchors are used in the first stage for faster speed and more proposals, and then the refined rotating anchors are used in the refinement stages to adapt to intensive scenarios。 ’
水平框 在第一阶段可以加速, 优化阶段用 优化过的旋转框
可是在代码中: rpn部分和后面refine stage都用R-anchor,没像论文中所说:用水平锚加速,用旋转锚提高准确率。
不知道 我看的对不对
RetinaNet | ResNet50_v1d 600->800 | DOTA1.0 trainval | DOTA1.0 test | 68.65 | 1X GeForce RTX 2080 Ti | 1 | R | iou-smooth L1 | 1x | No | cfgs_res50_dota_v5.py
in your model zoo,i only want to use 7th version, then its cfg may not match.
there is not in 'REFINE_IOU_POSITIVE_THRESHOLD', 'REFINE_IOU_NEGATIVE_THRESHOLD', 'USE_IOU_FACTOR'.
I don't know 'lr schd- 1x' meaning.
My application is simple that is two classes.
(汉语回答也行)
你好,我按readme的compile步骤,在第一部make完后,没有看到cython_utils文件夹下由cython_box生成,这导致在anchor_target_layer_without_boxweight脚本中会出现导入错误,请问这个是怎么回事?
谢谢
Hello author, how to use larger batch_size for training? I changed the batch_size in cfg from 1 to 4, but the actual training process is still training according to batch_size of 1.
when i test in the dota, i run the test-dota_r3det, in the rotate.py from libs.box_utils.rbbox_overlaps import rbbx_overlaps.I don't understand whcih rbbx_overlaps is need to import .cpp? .hpp? .pyx? or .cpython-36m-x86_64-linux?
我看到configs中有关于HRSC2016数据集的相关设置,但是我没有找到R3Det关于HRSC2016数据集的预训练模型,请问在哪里可以获得它?
Do I need to adjust the anchor parameters like ratio and scale ? or other methods are suggested to make it better ?
Thx.
你好,在你用retinanet做实验时,相关环境可以介绍下么,我用 tf-1.14, cuda-10.0.
出现了 两个错误:Internal: WhereOp: Could not launch
Non-OK-status: CudaLaunchKernel
在构建图的时候正常,执行图的时候run train_op,就会报上面两个错误~
Hello, the paper mentions that the F score of the ICDAR2015 dataset reaches 84.96. Can you provide the configuration file, some training details? Are you using other datasets for pre-training?
你好,请问下如何在模型测试时,进行coco类型的mAP计算呢?
还有个问题是如何进行模型预测,得到结果呢?
烦请各位大佬指点下,谢谢!
我在tf1.14 cuda10.0,未运行成功R版本。
错误:Internal: WhereOp
可以提供您的环境么,或者给点建议
大佬你好,我尝试复现出R3Det+数据扩充的结果(70.16)。在原cfgs.py中修改四个数据扩充项为True。结果只有66点几。请问一下大佬训练时有没有什么策略?谢谢!
I use R3Det to train my own images, But I found the loss is nan
2020-03-30 13:01:15: global_step:59360 current_step:59360
per_cost_time:0.968s
cls_loss:0.912
reg_loss:nan
refine_cls_loss:0.000
refine_reg_loss:0.000
refine_cls_loss_stage3:0.000
refine_reg_loss_stage3:0.000
total_losses:nan
mask_loss:0.000
the default learning rate is 5e-4, very low
用自己的数据集做训练,需要改的都改了,和之前跑网络retinanet一样,但跑r3det网络就有问题,刚开始训练到300次的时候就开始出这个问题,此时学习率已经调低到5e-5,
../libs/box_utils/bbox_transform.py:99: RuntimeWarning: divide by zero encountered in log
targets_dh = np.log(gt_rois[:, 3] / ex_rois[:, 3])
../libs/detection_oprations/refinebox_target_layer_without_boxweight.py:40: RuntimeWarning: invalid value encountered in greater_equal
positive_indices = max_overlaps >= pos_threshold
../libs/detection_oprations/refinebox_target_layer_without_boxweight.py:41: RuntimeWarning: invalid value encountered in greater
ignore_indices = (max_overlaps > neg_threshold) & ~positive_indices
2020-04-28 23:54:22: global_step:310 current_step:310
per_cost_time:1.205s
cls_loss:0.346
reg_loss:0.000
refine_cls_loss:0.017
refine_reg_loss:0.000
refine_cls_loss_stage3:0.016
refine_reg_loss_stage3:0.000
total_losses:0.379
2020-04-28 23:54:49: global_step:320 current_step:320
per_cost_time:1.330s
cls_loss:1.129
reg_loss:nan
refine_cls_loss:0.017
refine_reg_loss:0.000
refine_cls_loss_stage3:0.016
refine_reg_loss_stage3:0.000
total_losses:nan
smooth_l1_loss 里 大佬 没有求绝对值。tf.abs
I downloaded the pretrained weights, loaded the model, and tested on random images + some images i sampled from the DOTA dataset test images
But the model returns nothing
I think this might be the result of my confusion, does the pretrained weights contained in the drive the pretrained weights of a fully trained model, or just the backbone?
Can this framework be used to predict object orientations from 0-360 degrees?
I'd love to be able to detect objects and know which way they are facing.
Thanks!
-R
Hi. First of all, thank you for opensourcing your great work!
I am trying to train a model through multi_gpu_training_r3det.py using the configurations given in the repo but I am facing some problem.
My environment is consistent with the README
(1、python == 3.5
2、cuda == 10.0 , gcc = 4.9.4
3、opencv(cv2)
4、tfplot == 0.2.0
5、tensorflow == 1.13.1
However while running multi_gpu_training_r3det.py, my script is stuck at sess.run([train_op, global_step])
with tf.Session(config=tfconfig) as sess:
sess.run(init_op)
# sess.run(tf.initialize_all_variables())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord, sess=sess)
summary_path = os.path.join(cfgs.SUMMARY_PATH, cfgs.VERSION)
tools.mkdir(summary_path)
summary_writer = tf.summary.FileWriter(summary_path, graph=sess.graph)
if not restorer is None:
restorer.restore(sess, restore_ckpt)
print('restore model')
for step in range(cfgs.MAX_ITERATION // num_gpu):
training_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
if step % cfgs.SHOW_TRAIN_INFO_INTE != 0 and step % cfgs.SMRY_ITER != 0:
_, global_stepnp = sess.run([train_op, global_step])
else:
if step % cfgs.SHOW_TRAIN_INFO_INTE == 0 and step % cfgs.SMRY_ITER != 0:
start = time.time()
_, global_stepnp, total_loss_dict_ = \
sess.run([train_op, global_step, total_loss_dict])
My output right now is as such
(ive commented out the var in graph and ckpt while restoring resnet better display)
Use tf.cast instead.
WARNING:tensorflow:From /mnt/lustre/parkchanho/equivariance-project2/r3det/data/io/read_tfrecord_multi_gpu.py:21: TFRecordReader.__init__ (from tensorflow.python.ops.io_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Queue-based input pipelines have been replaced by `tf.data`. Use `tf.data.TFRecordDataset`.
WARNING:tensorflow:From /mnt/lustre/parkchanho/equivariance-project2/r3det/data/io/read_tfrecord_multi_gpu.py:118: batch (from tensorflow.python.training.input) is deprecated and will be removed in a future version.
Instructions for updating:
Queue-based input pipelines have been replaced by `tf.data`. Use `tf.data.Dataset.batch(batch_size)` (or `padded_batch(...)` if `dynamic_pad=True`).
tfrecord path is --> /mnt/lustre/parkchanho/equivariance-project2/r3det/data/tfrecord/DOTA_train*
WARNING:tensorflow:From ./tools/multi_gpu_train_r3det.py:161: py_func (from tensorflow.python.ops.script_ops) is deprecated and will be removed in a future version.
Instructions for updating:
tf.py_func is deprecated in TF V2. Instead, use
tf.py_function, which takes a python function which manipulates tf eager
tensors instead of numpy arrays. It's easy to convert a tf eager tensor to
an ndarray (just call tensor.numpy()) but having access to eager tensors
means `tf.py_function`s can use accelerators such as GPUs as well as
being differentiable using a gradient tape.
Tensor("tower_0/Shape:0", shape=(4,), dtype=int32, device=/device:GPU:0) #############################
we are in Pyramid::-======>>>>
['P3', 'P4', 'P5', 'P6', 'P7']
base_anchor_size are: [32, 64, 128, 256, 512]
WARNING:tensorflow:From /mnt/lustre/parkchanho/anaconda3/envs/r3det/lib/python3.5/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Tensor("tower_1/Shape:0", shape=(4,), dtype=int32, device=/device:GPU:1) #############################
we are in Pyramid::-======>>>>
['P3', 'P4', 'P5', 'P6', 'P7']
base_anchor_size are: [32, 64, 128, 256, 512]
Tensor("tower_2/Shape:0", shape=(4,), dtype=int32, device=/device:GPU:2) #############################
we are in Pyramid::-======>>>>
['P3', 'P4', 'P5', 'P6', 'P7']
base_anchor_size are: [32, 64, 128, 256, 512]
Tensor("tower_3/Shape:0", shape=(4,), dtype=int32, device=/device:GPU:3) #############################
we are in Pyramid::-======>>>>
['P3', 'P4', 'P5', 'P6', 'P7']
model restore from : /mnt/lustre/parkchanho/equivariance-project2/r3det/output/trained_weights/RetinaNet_DOTA_R3Det_2x_20191108/DOTA_1079996model.ckpt
2020-04-07 16:58:19.716699: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-04-07 16:58:19.723312: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2400075000 Hz
2020-04-07 16:58:19.725536: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x7fdc0a9c33c0 executing computations on platform Host. Devices:
2020-04-07 16:58:19.725561: I tensorflow/compiler/xla/service/service.cc:158] StreamExecutor device (0): <undefined>, <undefined>
/mnt/lustre/parkchanho/anaconda3/envs/r3det/lib/python3.5/site-packages/tensorflow/python/ops/gradients_impl.py:110: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.
"Converting sparse IndexedSlices to a dense Tensor of unknown shape. "
WARNING:tensorflow:From ./tools/multi_gpu_train_r3det.py:315: start_queue_runners (from tensorflow.python.training.queue_runner_impl) is deprecated and will be removed in a future version.
Instructions for updating:
To construct input pipelines, use the `tf.data` module.
WARNING:tensorflow:From /mnt/lustre/parkchanho/anaconda3/envs/r3det/lib/python3.5/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.
Instructions for updating:
Use standard file APIs to check for files with this prefix.
restored model
One of the problems I believe is that when I run the code below as stated in the README, it does not produce anything but an empty file (data/tfrecord/DOTA_train.tfrecord ).
cd $PATH_ROOT/data/io/
python convert_data_to_tfrecord.py --VOC_dir='/PATH/TO/DOTA/'
--xml_dir='labeltxt'
--image_dir='images'
--save_name='train'
--img_format='.png'
--dataset='DOTA'
Could this be the source of the problem? If not can you suggest any directions I should take? Thank you !
作者您好,请问你用HRSC数据集做实验的训练集有多少张图片,是论文里提到的436张吗,
from help_utils.gaussian_wasserstein_distance import get_element1, get_element4
ModuleNotFoundError: No module named 'help_utils.gaussian_wasserstein_distance'
No moudle named'help_utils.gaussian_wasserstein_distance' when run Eval on DOTA
Thanks for your share. I run you code on my dataset, and inferece it, i find that there maybe several predicted boxes on a target with different categories. The cfgs about NMS is :
NMS = True
NMS_IOU_THRESHOLD = 0.05
MAXIMUM_DETECTIONS = 40
FILTERED_SCORE = 0.5
VIS_SCORE = 0.5
I guess that you didn't do NMS between different categroies, but it's what I need. So where should I fix?
It would be really appreciated if more comments in the configure file would be added.
Can you show me cfgs_res152_dota_r3det_plusplus_v1.py?
If it is not possible, I would like to know which part should be changed in cfgs_res152_dota_r3det_v3.py which is currently uploaded.
I don't find 'multi_gpu_train_r3det.py' ,'test_dota_r3det.py'.Can u provide them ? Thanks !
bbox_transform.py:98: RuntimeWarning: divide by zero encountered in log
targets_dw = np.log(gt_rois[:, 2] / ex_rois[:, 2])
2020-04-07 20:04:45: global_step:140 current_step:140
per_cost_time:0.687s
cls_loss:1.132
reg_loss:nan
refine_cls_loss:0.161
refine_reg_loss:0.000
refine_cls_loss_stage3:0.161
refine_reg_loss_stage3:0.000
total_losses:nan
I use the DOAT1.5, is that means the dataset labels rbbox transform crossing the boundary? how can I solve it?
我的环境配置、预训练模型用的都是文档里要求的,但是eval或者inference的时候bbox是空的,rpnbox还都有值。请问是什么原因呢?
I don't find multi_gpu_train_r3det.py
, test_dota_r3det.py
file. Can you update them ? Thanks !
您好,很感谢能看到您的论文,在MODEL_ZOO.md.下载模型测试,报错,谢谢
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0)
2020-04-02 15:56:01.255092: W tensorflow/core/framework/op_kernel.cc:1490] Unknown: IndexError: Out of bounds on buffer access (axis 0)
Traceback (most recent call last):
File "/home/yongfeng/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 209, in call
ret = func(*args)
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0)
2020-04-02 15:56:01.255216: W tensorflow/core/framework/op_kernel.cc:1490] Unknown: IndexError: Out of bounds on buffer access (axis 0)
Traceback (most recent call last):
File "/home/yongfeng/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 209, in call
ret = func(*args)
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0)
2020-04-02 15:56:01.255469: W tensorflow/core/framework/op_kernel.cc:1490] Unknown: IndexError: Out of bounds on buffer access (axis 0)
Traceback (most recent call last):
File "/home/yongfeng/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 209, in call
ret = func(*args)
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0)
2020-04-02 15:56:01.256507: W tensorflow/core/framework/op_kernel.cc:1490] Unknown: IndexError: Out of bounds on buffer access (axis 0)
Traceback (most recent call last):
File "/home/yongfeng/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 209, in call
ret = func(*args)
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0)
2020-04-02 15:56:01.257749: W tensorflow/core/framework/op_kernel.cc:1490] Unknown: IndexError: Out of bounds on buffer access (axis 0)
Traceback (most recent call last):
File "/home/yongfeng/.local/lib/python3.6/site-packages/tensorflow/python/ops/script_ops.py", line 209, in call
ret = func(*args)
File "rotate_polygon_nms.pyx", line 22, in rotate_polygon_nms.rotate_gpu_nms (rotate_polygon_nms.cpp:1874)
IndexError: Out of bounds on buffer access (axis 0),
请问这是啥原因呢,谢谢!
你好,我在测试自己的数据的时候,用的2080ti,网络的backbone是Resnet152,发现推理速度很慢,需要几秒一张,我的图片里头有很多目标,大概有几十个,请问是因为目标多导致的速度慢么?
using DOTA dataset, default cfgs.py of DOTA
原本代码对于输入grountruth box的格式是4个角点坐标 (x0, y0, x1, y1, x2, y2, x3, y3)
我想改成bbox中心点和size的格式,即(xcenter, ycenter, width, height, angle),也就是论文里Fig 9.(b)描述的格式,使得angle的角度范围位于(-180, 0), box的长宽保持固定。
看了下代码感觉网络训练的时候用的是(xc, yc, w, h, angle)的格式,以为只需要改动 gtboxes 输入输出的坐标转换部分就行,于是改了代码里用到box_utils.coordinate_convert.forward convert()
和box_utils.coordinate_convert.backward convert()
的地方,以及angle_range=180
的地方
改完之后跑训练代码,一直都是跑到100+步左右就出现除零warning,之后的reg loss就都是Nan。
参照了issue里面有一个方法提到加epsilon=1e-5,也还是没有解决问题。而且在tensorboard里面看refine_stage都没有positive anchor。不知道是什么情况会导致ex_roi(也就是anchor)的长宽出现0?
数据没有问题,直接用没有改的代码跑是正常的。
报错信息:
refinebox_target_layer_without_boxweight.py:40: RuntimeWarning: invalid value encountered in greater_equal
positive_indices = max_overlaps >= pos_threshold
refinebox_target_layer_without_boxweight.py:40: RuntimeWarning: invalid value encountered in greater
ignore_indices = (max_overlaps > neg_threshold) & ~positive_indices
bbox_transform.py:98 RuntimeWarning: divide by zero encountered in true_divide
targets_dy = (gt_rois[:, 1] - ex_rois[:, 1]) / ex_rois[:, 3]
bbox_transform.py:98 RuntimeWarning: overflow encountered in true_divide
targets_dy = (gt_rois[:, 1] - ex_rois[:, 1]) / ex_rois[:, 3]
bbox_transform.py:98 RuntimeWarning: divide by zero encountered in true_divide
targets_dw = np.log(gt_rois[:, 2] / (ex_rois[:, 2] + epsilon) )
bbox_transform.py:98 RuntimeWarning: invalid value encountered in true_divide
targets_dx = (gt_rois[:, 0] - ex_rois[:, 0]) / ex_rois[:, 2]
bbox_transform.py:98 RuntimeWarning: divide by zero encountered in true_divide
targets_dh = np.log(gt_rois[:, 3] / (ex_rois[:, 3] + epsilon) )
Errors:
bbox.c: In function ‘__Pyx__ExceptionSave’:
bbox.c:9439:19: error: ‘PyThreadState {aka struct _ts}’ has no member named ‘exc_type’
*type = tstate->exc_type;
Actually i have solved this problem by deleting .c files in box_utils.
Just a reminder for those have same the problems can have an access to solve it.
Analysis:
The incompatibility of Cython and .c files will raise the above error.
After you updated the Cython, you would find it useless for that those old .c files will not be covered by the new generated .c files.
Delete the old .c files, and then recompile it, you will find anything goes well.
Problems with NAN emerged in training.
你好,下载好R3Det预训练模型,训练自己的数据,需要调整相应cfg文件中比如freeze之类的操作吗?
我似乎找不到相关的操作命令。(主要是因为下载了预训练模型然后训练,感觉效果并不好,所以在想是不是我只是在trained model上进行微调,而没有freeze backbne进行全部参数的训练呢?)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.