首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在cython块中使用gsl集成?

如何在cython块中使用gsl集成?
EN

Stack Overflow用户
提问于 2016-07-19 18:12:54
回答 2查看 252关注 0票数 2

为了使事情变得更普遍,以gsl_integration_qag为例(因为它需要一个工作区来管理间隔)。

下面是一个精心设计的简单示例(problem.pyx):

代码语言:javascript
运行
AI代码解释
复制
from libc.math cimport cos
from cython.parallel import prange
from cython_gsl cimport *

cdef double mean(double[:] arr):
    cdef Py_ssize_t i
    cdef double sum_ = 0.0
    for i in range(arr.shape[0]):
        sum_ += arr[i]
    return sum_ / arr.shape[0]

cdef double integrand(double x, void *params) nogil:
    cdef double a = (<double*>params)[0]
    cdef double b = (<double*>params)[1]
    return a*x + b

def use_gsl_integration_sequential():
    cdef double result, error
    cdef Py_ssize_t i, j
    cdef double result_sum=0.0
    cdef double results[3]
    cdef double a=0.0, b=0.0
    cdef double da = 0.1
    cdef size_t space_size = 1000

    cdef gsl_function gsl_func
    cdef double params[2]
    gsl_func.function = &integrand

    cdef gsl_integration_workspace *ws
    ws= gsl_integration_workspace_alloc(space_size)

    for i in range(3):
        a += da
        result_sum = 0.0 # reset the sum(thank J.J.Hakala for pointing out this)
        for j in range(4): # here may be range(100000) in practice!
            b = a + j
            params[0] = a; params[1] = b
            gsl_func.params = params
            gsl_integration_qag(&gsl_func, 0.0, 1.0, 1e-8, 1e-8, space_size, GSL_INTEG_GAUSS15, ws, &result, &error)
            result_sum += result
        results[i] = result_sum

    gsl_integration_workspace_free(ws)
    # do some other stuff with the 'results', for example:
    return mean(results)


# Now, I want to parallel the inner loop
def use_gsl_integration_parallel():
    cdef double result, error
    cdef Py_ssize_t i, j
    cdef double result_sum=0.0
    cdef double results[3]
    cdef double a, b
    cdef double da = 0.1
    cdef size_t space_size = 1000

    cdef gsl_function gsl_func
    cdef double params[2]
    gsl_func.function = &integrand

    cdef gsl_integration_workspace *ws
    ws= gsl_integration_workspace_alloc(space_size)

    for i in range(3):
        # a should be read-only in the follow prange block.
        a += da 
        # here may be prange(100000,...) in practice!
        for j in prange(4, nogil=True): 
            # b should be local private.
            b = a + j

            # params also should be local private
            params[0] = a; params[1] = b

            # gsl_func is shared, only its params differ.
            # According to the gsl manual(see follow link), workspaces should be allocated on a per-thread basis, but how?
            gsl_func.params = params
            gsl_integration_qag(&gsl_func, 0.0, 1.0, 1e-8, 1e-8, space_size, GSL_INTEG_GAUSS15, ws, &result, &error)

            result_sum += result

        results[i] = result_sum
        gsl_integration_workspace_free(ws)
    return mean(results)

有点长的代码,只是为了完全(复制),但我认为相当简单(阅读)(๑·ᴗ·๑)

然后编译&链接:

代码语言:javascript
运行
AI代码解释
复制
cython -a -2 problem.pyx

gcc -O3 -fopenmp -c problem.c -o problem.o -IC:\gsl2.1x86\include -IC:\python-2.7.10\include

gcc -shared -fPIC -fopenmp -o problem.pyd -LC:\gsl2.1x86\libs -LC:\python-2.7.10\libs problem.o -l:libgsl.a -l:libgslcblas.dll.a -l:libpython27.dll.a

在IPython中:

代码语言:javascript
运行
AI代码解释
复制
In [1]: from problem import *
In [2]: use_gsl_integration_sequential()
Out[2]: 7.2

use_gsl_integration_parallel()的结果是没有定义的,我尝试了几次,大多数时候,它会崩溃,有一些幸运,得到一个未定义的值,所以一定有什么问题!我只是找不到这样一个类似的例子。有人能帮我吗?

环境:

Win10-64位,gcc (tdm-1) 5.1.0 32位,python-2.7.10 32位,python 0.24,gsl-2.1

一些有用的参考资料?:

https://github.com/twiecki/CythonGSL

002dsafety

(对不起,不能发布更多的信息,两个链接是我的限制.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 08:46:41

当我测试该代码时,我发现了分段错误(linux,gcc 4.9.2)。

我认为原始代码存在以下问题

  • 四个线程共享多个变量,每个线程都应该有自己的
  • 在这些线程中使用相同的工作空间

以下版本为7.2。序列版本实际上是否正确,因为它没有将result_sum = 0.0设置为

代码语言:javascript
运行
AI代码解释
复制
for i in range(3):
    a += da
    result_sum = 0.0
代码语言:javascript
运行
AI代码解释
复制
from openmp cimport omp_get_max_threads, omp_get_thread_num

def use_gsl_integration_parallel():
    cdef double result
    cdef Py_ssize_t i, j
    cdef double result_sum
    cdef double results[3]
    cdef double results2[4]
    cdef double a
    cdef double b[4]
    cdef double error[4]
    cdef double da = 0.1
    cdef size_t space_size = 1000

    cdef gsl_function gsl_func[4]
    cdef double params[4][2]
    cdef int tid

    cdef gsl_integration_workspace ** ws = <gsl_integration_workspace **>malloc(omp_get_max_threads() * sizeof(gsl_integration_workspace *))

    for j in range(omp_get_max_threads()):
        ws[j] = gsl_integration_workspace_alloc(space_size)

    for i in range(3):
        a += da

        for j in prange(4, nogil=True):
            tid = omp_get_thread_num()
            b[tid] = a + j

            params[tid][0] = a;
            params[tid][1] = b[tid]

            gsl_func[tid].function = &integrand
            gsl_func[tid].params = params[tid]
            gsl_integration_qag(&gsl_func[tid], 0.0, 1.0, 1e-8, 1e-8,
                                space_size, GSL_INTEG_GAUSS15, ws[tid],
                                &results2[j], &error[j])
            # printf("tid %d\n", tid)
        results[i] = sum(results2)

    for j in range(omp_get_max_threads()):
        gsl_integration_workspace_free(ws[j])
    free(ws)

    return mean(results)
票数 0
EN

Stack Overflow用户

发布于 2016-07-21 06:59:12

感谢@J.J.Hakala,我终于想出了如何让这些东西发挥作用。我修改了这个例子,做了一些简单的介绍。我只是在这里张贴它,希望有一天它将有助于一些新闻蜜蜂(和我一样)在科学计算。

如果有任何错误,请纠正我。谢谢!

代码语言:javascript
运行
AI代码解释
复制
# cython: cdivision=True
# cython: boundscheck=False
# cython: wraparound=False

from libc.stdlib cimport malloc, free
from libc.math cimport sin
from cython.parallel import prange
from cython_gsl cimport *
cimport openmp

cdef double arr_sum(double *arr, size_t arr_len):
    cdef size_t i
    cdef double sum_ = 0.0
    for i in range(arr_len):
        sum_ += arr[i]
    return sum_

cdef double arr_mean(double *arr, size_t arr_len):
    return arr_sum(arr, arr_len) / arr_len

# A random chosen integrand function for demo.
cdef double integrand(double x, void *params) nogil:
    cdef double a = (<double*>params)[0]
    cdef double b = (<double*>params)[1]
    return sin(a*x + b)

def sequential_solution(int outer_loops, int inner_loops):
    cdef double result, error
    cdef size_t i, j
    cdef double result_sum=0.0, mean_val
    cdef double *results = <double*>malloc(sizeof(double) * outer_loops)
    cdef double a=0.0, da = 0.1
    cdef size_t space_size = 1000
    cdef gsl_function gsl_func
    cdef double params[2]

    gsl_func.function = &integrand
    cdef gsl_integration_workspace *ws = gsl_integration_workspace_alloc(space_size)

    for i in range(outer_loops):
        a += da
        result_sum = 0.0
        for j in range(inner_loops):
            params[0] = a; params[1] = a + j
            gsl_func.params = params
            gsl_integration_qag(&gsl_func, 0.0, 1.0, 1e-8, 1e-8, space_size, GSL_INTEG_GAUSS15, ws, &result, &error)
            result_sum += result

        results[i] = result_sum

    mean_val = arr_mean(results, outer_loops)
    gsl_integration_workspace_free(ws)
    free(results)
    return mean_val


def parallel_solution(int outer_loops, int inner_loops, int num_threads):
    cdef size_t i, j
    cdef double a = 0.0
    cdef double da = 0.1
    cdef double mean_val = 0.0
    cdef size_t space_size = 1000

    # Heavy malloc!
    cdef double *outer_results = <double*>malloc(sizeof(double) * outer_loops)
    cdef double *inner_results = <double*>malloc(sizeof(double) * inner_loops)
    #cdef double *error = <double*>malloc(sizeof(double) * inner_loops)
    cdef double error # Ignore the integration abserror in parallel
    cdef gsl_function *gsl_func = <gsl_function*>malloc(sizeof(gsl_function) * inner_loops)
    cdef double *params = <double*>malloc(sizeof(double) * inner_loops * 2)
    cdef gsl_integration_workspace **ws = <gsl_integration_workspace**>malloc(sizeof(gsl_integration_workspace*) * num_threads)
    for i in range(num_threads):
        ws[i] = gsl_integration_workspace_alloc(space_size)

    for i in range(outer_loops):
        a += da
        for j in prange(inner_loops, nogil=True, num_threads=num_threads):
            error = 0 # local private.
            params[2*j] = a; params[2*j+1] = a+j
            gsl_func[j].function = &integrand
            gsl_func[j].params = params + 2*j

            # ws[openmp.omp_get_thread_num()] guarantees each thread shares it's own workspace,
            # since workspace is resuable in a thread. If two thread access the same workspace, data will corrupt.
            gsl_integration_qag(&gsl_func[j], 0.0, 1.0, 1e-8, 1e-8,
                                space_size, GSL_INTEG_GAUSS15, ws[openmp.omp_get_thread_num()],
                                &inner_results[j], &error)

        outer_results[i] = arr_sum(inner_results, inner_loops)

    mean_val = arr_mean(outer_results, outer_loops)

    # Now, free
    for i in range(num_threads):
        gsl_integration_workspace_free(ws[i])
    free(ws)
    free(params)
    free(gsl_func)
    #free(error)
    free(inner_results)
    free(outer_results)
    return mean_val

def parallel_solution_ver(int outer_loops, int inner_loops, int num_threads):
    cdef size_t i, j
    cdef double a = 0.0
    cdef double da = 0.1
    cdef double mean_val = 0.0
    cdef size_t space_size = 1000

    cdef double *outer_results = <double*>malloc(sizeof(double) * outer_loops)
    #cdef double *inner_results = <double*>malloc(sizeof(double) * inner_loops) 
    cdef double inner_result, inner_result_sum # no need to malloc a inner_results 
    #cdef double *error = <double*>malloc(sizeof(double) * inner_loops)
    cdef double error  # Ignore the integration abserror in parallel
    cdef gsl_function *gsl_func = <gsl_function*>malloc(sizeof(gsl_function) * inner_loops)
    cdef double *params = <double*>malloc(sizeof(double) * inner_loops * 2)
    cdef gsl_integration_workspace **ws = <gsl_integration_workspace**>malloc(sizeof(gsl_integration_workspace*) * num_threads)
    for i in range(num_threads):
        ws[i] = gsl_integration_workspace_alloc(space_size)

    for i in range(outer_loops):
        a += da
        inner_result_sum = 0.0  # reduction(+: inner_result_sum)
        for j in prange(inner_loops, nogil=True, num_threads=num_threads):
            inner_result = 0.0  # local private.
            error = 0  # local private.
            params[2*j] = a; params[2*j+1] = a+j
            gsl_func[j].function = &integrand
            gsl_func[j].params = params + 2*j

            # ws[openmp.omp_get_thread_num()] guarantees each thread shares it's own workspace,
            # since workspace is resuable in a thread. If two thread access the same workspace, data will corrupt.
            gsl_integration_qag(&gsl_func[j], 0.0, 1.0, 1e-8, 1e-8,
                                space_size, GSL_INTEG_GAUSS15, ws[openmp.omp_get_thread_num()],
                                &inner_result, &error)
            inner_result_sum += inner_result

        outer_results[i] = inner_result_sum

    mean_val = arr_mean(outer_results, outer_loops)

    # Now, free
    for i in range(num_threads):
        gsl_integration_workspace_free(ws[i])
    free(ws)
    free(params)
    free(gsl_func)
    #free(error)
    #free(inner_results)
    free(outer_results)
    return mean_val

更新:不需要malloc a results 数组,添加了一个更新的解决方案parallel_solution_ver ,我认为这更好,尽管它与 parallel_solution的效率几乎相同。

在IPython笔记本中:

代码语言:javascript
运行
AI代码解释
复制
%matplotlib inline
from problem import *
import matplotlib.pyplot as plt

max_exp = 20

times_seq = []
for loops in [2**n for n in range(max_exp)]:
    res = %timeit -n 1 -r 5 -o sequential_solution(10, loops)
    times_seq.append((loops, res))

times_p = []
for loops in [2**n for n in range(max_exp)]:
    res = %timeit -n 1 -r 5 -o parallel_solution(10, loops, 8)
    times_p.append((loops, res))

times_p_ver = []
for loops in [2**n for n in range(max_exp)]:
    res = %timeit -n 1 -r 5 -o parallel_solution_ver(10, loops, 8)
    times_p_ver.append((loops, res))

time_results = [times_seq, times_p, times_p_ver]
labels = ["sequential solution", "parallel solution", "parallel solution_ver"]
colors = ['r', 'y', 'g']
markers = ['s', '+', 'o']
line_params = [
    {"sequential solution": {"color": "r", "marker": "s", "ms": 6}},
    {"parallel solution": {"color": "g", "marker": "+", "ms": 20, "mew": 1}},
    {"parallel solution_ver": {"color": "b", "marker": "o", "ms": 6}}
]

for results, param in zip(time_results, line_params):
    loops = [res[0] for res in results]
    times = [res[1].best for res in results]
    plt.loglog(loops, times, label=param.keys()[0], **param.values()[0])
plt.xlabel("inner loops")
plt.ylabel("exec time (ms)")
plt.legend(loc=0)

print "loops        sequential  parallel    parallel_ver"
for s, p, p_v in zip(times_seq, times_p, times_p):
    print "n = {:6d}   {:f}s   {:f}s   {:f}s".format(s[0], s[1].best, p[1].best, p_v[1].best)

# Same result? Yes!
print sequential_solution(10, 2**19)  # 0.0616505777102
print parallel_solution(10, 2**19, 8)  # 0.0616505777102
print parallel_solution_ver(10, 2**19, 8)  # 0.0616505777102

代码语言:javascript
运行
AI代码解释
复制
loops        sequential  parallel    parallel_ver
n =      1   0.000009s   0.001450s   0.001450s  
n =      2   0.000016s   0.001435s   0.001435s  
n =      4   0.000032s   0.001447s   0.001447s  
n =      8   0.000063s   0.001454s   0.001454s  
n =     16   0.000125s   0.001396s   0.001396s  
n =     32   0.000251s   0.001389s   0.001389s  
n =     64   0.000505s   0.001387s   0.001387s  
n =    128   0.001016s   0.001360s   0.001360s  
n =    256   0.002039s   0.001683s   0.001683s  
n =    512   0.003846s   0.001844s   0.001844s  
n =   1024   0.007717s   0.002416s   0.002416s  
n =   2048   0.015395s   0.003575s   0.003575s  
n =   4096   0.030817s   0.006055s   0.006055s  
n =   8192   0.061689s   0.010820s   0.010820s  
n =  16384   0.123445s   0.020872s   0.020872s  
n =  32768   0.246928s   0.040165s   0.040165s  
n =  65536   0.493903s   0.079077s   0.079077s  
n = 131072   0.987832s   0.156176s   0.156176s  
n = 262144   1.975107s   0.311151s   0.311151s  
n = 524288   3.949421s   0.617181s   0.617181s     
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38471231

复制
相关文章
ubuntu上R语言安装gsl包
报错如下: * installing *source* package ‘gsl’ ... ** package ‘gsl’ successfully unpacked and MD5 sums ch
生信技能树
2019/07/30
2.6K0
GSL+DevC++使用
在DEV C++中配置GSL1.8库 前面写了如何在vs2005中添加gsl,本文所所述为在dev c++中使用gsl库,由实践总结而得。 准备软件: 1、Orwell Dev C++ 5.6.2 No Compiler Setup.exe(devc++的社区升级版,很不错的) 2、gsl-1.8.exe 3、TDM-GCC4.7.1-2.exe,安装后,目录同样名为mingw32(也可以安装mingw版) 步骤如下: 1、安装完以上3个软件。 2、将 gsl 安装目录下的 bin 下 libgsl.dll,libgslcblas.dll 复制到mingw32的bin目录中,lib 下 ibgsl.a,libgslcblas.a 复制到 mingw32目录下的 lib 目录下;include 下的整个 gsl 文件夹复制到mingw32目录下的 include 目录下。 3、 打开 dev-c++,工具-编译选项-编译器,选上“在连接器命令行加入如下命令”,加入-lgsl -lgslcblas(中间有空格,即在连接时连上 libgsl.a,libgslcblas.a,gcc 可以自动识别前缀 lib 和后缀.a) 此时在用Dev C++打开一个gsl的c文件,如下所示:
用户4645519
2020/09/07
1.1K0
VS2005下使用GSL-1.15小结
最近在复习高等数学,有时为了验证顺便复习下C语言,看了看自己下载收集的软件,发现C语言有一个数学工具包,是GNU开发的,叫做GSL——GNU Scientific Library,中文:C++科学计算库,主页为www.gnu.org/s/gsl/,主要是在linux环境下运行的,幸好牛人们已经做好了windows版的移植(有条件的就在linux下编译gsl喽),有:Gsl for Windows - GnuWin32 - SourceForge,https://code.google.com/p/oscats/(gsl-1.15-dev-win32.zip 5.9 MB),也可以在windows下安装MSYS或是cygwin下编译源代码获得适合在windows下运行的动态链接库等,具体的我也不太清楚,网上看了,具体的编译流程比较复杂,索性直接下载牛人们编译好的。
用户4645519
2020/09/07
7980
VMware安装CentOS时,无法以图形界面安装解决办法
有的同学问: 用虚拟机软件(vmware、VirtualBox)安装CentOS系统时, 安装过程中没有中文,也没有出现图形界面,都是以命令行方式去安装, 有时候又会出现图形界面,不知道哪里配置的问题
流柯
2018/08/30
2.2K0
VMware安装CentOS时,无法以图形界面安装解决办法
解决Instruments检测内存泄漏时真机无法定位的问题
真机在使用Instruments检测内存泄漏时老是定位不到代码,显示内存地址,上网搜查后完美解决,现做下记录 问题 只显示内存地址 原因 Xcode在每次编译项目后,都会生成一个新的 dSYM 文
LinXunFeng
2018/06/29
1.4K0
WebView 常见 Crash 分析及解决方案
App 出现意外闪退我们称之为 Crash,Crash 率是衡量 App 稳定性的一个重要指标,App 的稳定性不仅影响使用体验,甚至会造成用户流失。由于导致 App Crash 的原因和类型众多,一篇文章无法阐述清楚,也不是本文的重点,我们不做过多赘述。
深度学习与Python
2021/11/11
5.4K0
centos安装mysql时未设置root密码,导致无法登录
昨天给公司内网开发用服务器装系统,然后装mysql居然花了一天,昨天一天都是启动mysql时提示:The server quit without updating PID file,今天重装了mysql之后还是同样报错,然后恢复了一下/usr/my.cnf突然就可以启动了。(明明昨天/usr/my.cnf就是默认的,有个解决方法说改这个文件才改的)
黒之染
2018/10/19
6.7K1
安装MySQL时由于找不到vcruntime140_1.dll,无法继续安装
从知乎过来不少学习SQL的朋友,反馈在安装MySQL的时候会出现一些无法预料的错误,比如各种找不到dll,或者输入运行代码没反应的情况,今天就来解决一个先。
陈学谦
2020/05/25
3.1K0
安装MySQL时由于找不到vcruntime140_1.dll,无法继续安装
解决win10在安装Android-studio时提示HAXM无法安装问题[通俗易懂]
错误提示:This computer does not support Intel Virtualization Technology (VT-x) or it is being exclusively used by Hyper-V. HAXM cannot be installed. Please ensure Hyper-V is disabled in Windows Features, or refer to the Intel HAXM documentation for more information.
全栈程序员站长
2022/09/13
4.9K0
解决win10在安装Android-studio时提示HAXM无法安装问题[通俗易懂]
vbox安装时出现回滚无法安装的解决方案 —–基于Windows 10
win键+R键    cmd services.msc   打开服务管理 win键+R键    cmd regedit.exe     打开注册表 win键+R键    cmd devmgmt.msc     打开设备管理器
小狐狸说事
2022/11/17
2.3K0
vbox安装时出现回滚无法安装的解决方案 —–基于Windows 10
zblogasp安装时出错,左侧显示无法使用Access数据库
今天突然想起之前的一个网站博客,感觉还不错,但它是zblogasp的,所以想移植到zblogphp版本,但是把网站数据恢复之后登陆后台显示,数据库连接出错,因为asp+access类型,目录位置都对,所以可能是access数据库连接失败。
李洋博客
2021/06/15
4.7K0
离线编译OpenMolcas+QCMaquis
OpenMolcas是收费软件Molcas的开源免费版本,前两年在GitLab上开源;QCMaquis前几个月在GitHub上开源,二者结合可以做DMRG、DMRG-NEVPT2和DMRG-PDFT等方法的计算。软件的详细介绍请阅读公众号前期教程《OpenMolcas 与 QCMaquis 的安装》,文中也讲了如何联网安装。QCMaquis的详细使用请阅读官方手册
用户7592569
2021/02/26
1.6K0
文件无法保存(文件夹已损坏无法读取怎么办)
要使用EmguCV,首先需要去官网下载安装包(除了下载安装包,还有其他几种方式)。安装完成后,得配置环境变量。这里不再赘述。网上的教程很多。我这里分享一个官网的下载链接:https://sourceforge.net/projects/emgucv/files/emgucv/
全栈程序员站长
2022/07/25
1.6K0
文件无法保存(文件夹已损坏无法读取怎么办)
需要打开文件夹时,双击文件夹文件夹没有打开怎么办?
1、点击[此电脑] 2、点击[查看] 3、点击[选项] 4、点击[通过单击打开项目(指定时选定)] 5、点击[确定]
裴来凡
2022/05/28
3.2K0
需要打开文件夹时,双击文件夹文件夹没有打开怎么办?
链接时无法解析符号checklist
主要原因包括四类:函数声明与实现的原型不一致、函数声明与实现的作用域不同、函数声明但没有实现、使用DLL接口不当。
gaigai
2019/08/30
2.5K0
集成测试时 MockMvc 无法注入
如果阅读过 使用 Junit 编写单元测试[1] 的小伙伴都知道,在写对 Controller 进行单元测试时,会将 Service 层进行 Mock。
程序员小航
2022/11/24
1.1K0
集成测试时 MockMvc 无法注入
opencv之打开摄像头、边缘检测
许多工业相机或某些视频I / O设备不为操作系统提供标准的驱动程序接口。因此,您不能在这些设备上使用VideoCapture或VideoWriter。
全栈程序员站长
2022/07/23
3.4K0
opencv之打开摄像头、边缘检测
selenium 无头模式 以及防止被检测
它是怎么做的的呢?一般情况下,我们使用Selenium打开一个网页时,会有一个提示:Chrome正受到自动测试软件的控制。
py3study
2020/11/04
16.1K0
selenium 无头模式 以及防止被检测
IntelliJ IDEA 使用Subversion时忽略文件夹
IntelliJ IDEA 在使用Subversion进行版本管理时,忽略某个文件或者文件夹的操作方法如下:
程序新视界
2022/11/30
2.8K0
IntelliJ IDEA 使用Subversion时忽略文件夹
安全帽佩戴检测摄像头
安全帽佩戴检测摄像头借助现场已有的监控摄像头或者专门安装内置算法的监控摄像头,对现场人员安全帽佩戴进行实时识别检测。安全帽佩戴检测摄像头通过RTSP协议访问摄像机视频流,实时获取分析。立即识别视频监控区域未戴安全帽的工人,并实时分析抓拍警报。
燧机科技
2022/10/05
4590
安全帽佩戴检测摄像头

相似问题

安装mlpy时出现gsl错误

10

使用MacPorts安装GSL时出错

20

本地安装GSL时的FGSL配置

11

安装gsl gem时出现问题

92

安装gsl (使用netbeans)时出现错误

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文