关于图像识别:NVIDIA-CloudXR和RTX-6000赋能瑞云科技云渲染服务

瑞云科技云平台胜利集成NVIDIA CloudXR SDK,并部署了RTX 6000 GPU,极大加强AR/VR/XR等方面的云服务能力,让用户能够随时随地拜访云端XR资源,为各种利用资源的分享奠定了松软的根底。 汽车、教育、医疗、修建地产、工业仿真、智慧园区等行业对渲染品质与速度的需要逐步进步,沉重的图像计算亟需业余牢靠、平安稳固、可继续的解决方案来解决,云计算、云渲染便是其中的优选。 深圳市瑞云科技有限公司是一家专一为视觉行业提供垂直云计算服务的公司,致力于通过技术创新给行业带来低成本、高效、牢靠的云服务。旗下品牌3DCAT实时渲染云,为客户提供可随时随地跨终端、可交互、超高清、沉迷式拜访三维利用的服务。 云端海量GPU算力减速沉重的图像计算瑞云科技3DCAT将云计算、云渲染引入到VR/AR/XR产业中,利用云端海量GPU算力解决沉重的图像计算,实现VR/AR/XR内容上云,并串流同步输入到终端设备(PC、手机、平板、VR/AR等),从而实现终端设备的轻量化。 随着CloudXR产业日趋成熟,平台的用户规模越来越大,对平台算力的需要也逐步减少。与此同时,行业VR/AR/XR技术也在减速更新迭代,3DCAT一直优化更新底层计算资源,满足日益增长的用户需要,将NVIDIA CloudXR SDK和RTX 6000 GPU作为3DCAT的底层架构,实现残缺的SaaS服务,为用户提供了可自在调度、跨平台拜访的实时渲染云服务。 NVIDIA CloudXR SDK和RTX 6000 GPU赋能实时渲染云服务3DCAT利用了NVIDIA的GPU渲染和云服务器架构提供的计算能力,在确保VR/AR/XR内容高清显示的前提下,升高了对终端硬件性能的要求,简化了VR/AR/XR的零碎架构,升高了用户应用门槛,用户应用繁难的一体机即可体验高清、互动、沉迷感强的VR/AR/XR内容。 3DCAT实时渲染云将显卡降级为RTX 6000,基于RTX 6000弱小的显存,能够反对更大的渲染场景。在反对实时光线追踪成果的同时,显示帧数由30 fps晋升至60 fps,为用户带来了更加炫酷的视觉体验。 NVIDIA QUADRO RTX 6000 另外,3DCAT的CloudXR云服务集成了NVIDIA CloudXR™技术,岂但反对无线WIFI网络,还实现了5G网络VR/AR服务,为用户提供高清串流体验。 NVIDIA CloudXR拓展3DCAT利用场景NVIDIA CloudXR SDK为瑞云提供了用于服务器组件的安装程序和易于应用的库,将OpenVR应用程序流式传输到Android或Windows等客户端,为用户提供丰盛的XR内容。 基于NVIDIA CloudXR的技术,3DCAT不仅实现了对传统利用场景的延长,还拓展了更多场景,打造一系列标准化的性能组件,逐渐扩充产品的边界。当初,3DCAT的利用场景涵盖三维仿真、VR、AR等多种渲染场景服务。 利用场景的延长和老本的升高让瑞云进一步扩充了服务畛域,现阶段,3DCAT已在汽车、教育、医疗、修建地产、工业仿真、智慧园区等多个细分行业畛域落地,并已为上百家企业、院校和运营商客户提供了一站式解决方案。例如,3DCAT为滴滴青桔部署云展厅,为青桔粉丝提供就近的边缘运算服务,带来全新的云上漫游、观赏青桔新品的体验。 瑞云科技产品经理Nils Zhao说:“NVIDIA CloudXR SDK非常适合咱们的云渲染模式,能够大幅晋升可视化空间综合性虚构利用的扩展性和便携性。通过实时渲染云服务,用户不再须要依赖各种简单的工作站来体验虚拟现实环境,只须要便携式的一体机就可能在产品展现、游戏、场景互动、旅行等场景中实现协同和共享。” 瑞云科技在IT技术和研发上一直投入,帮忙用户解脱了惨重的IT和计算设施投入,将更多的精力和资源放在内容创作和经营上,大大提高行业生产合作效率,并极大降低成本。 将来,3DCAT将继续减少云端算力规模,携手像NVIDIA英伟达这样的合作伙伴,更深刻和宽泛地联合单方在实时渲染畛域的劣势,为各行业用户提供超高性价比的实时云渲染服务! 文章起源:NVIDIA英伟达企业解决方案公众号ID:NVIDIA-Enterprise

September 7, 2021 · 1 min · jiezi

关于图像识别:个推青少年网络游戏防沉迷解决方案助力开发者构建完善的青少年保护系统

8月30日,国家新闻出版署下发《对于进一步严格管理 切实避免未成年人沉迷网络游戏的告诉》。告诉要求,严格限度向未成年人提供网络游戏服务的工夫,所有网络游戏企业仅可在周五、周六、周日和法定节假日每日20时至21时向未成年人提供1小时服务;严格落实网络游戏用户账号实名注册和登录要求,所有网络游戏必须接入国家新闻出版署网络游戏防沉迷实名验证零碎;网络游戏企业不得以任何模式向未实名注册和登录的用户提供游戏服务。 网络游戏企业是防沉迷工作的次要参与方。在国家新闻出版署网络游戏防沉迷实名验证零碎建成运行前,为了帮忙游戏类APP尽快无效落实告诉要求,个推推出了青少年网络游戏防沉迷解决方案,通过实人认证服务+视觉智能技术,从游戏前、游戏中两个层面,助力APP开发者构建起更为欠缺的青少年爱护零碎,独特推动网络环境衰弱倒退。 个推实人认证服务,无效落实实名注册和登录要求实人(名)认证,是游戏注册登录环节中的一道要害防线。 个推实人认证服务对立调用官网权威数据接口,为游戏类APP提供可信、平安的网络身份验证服务,可能对注册用户进行实名、实人等不同类型的身份核验,实现物证合一,帮忙游戏类APP无效落实网络游戏用户账号实名注册和登录要求。 个推实人认证服务具备数据源权威可信、核验过程平安、用户体验便捷等外围劣势,可能在不泄露身份信息的前提下实现在线身份认证,无效满足游戏类APP对用户身份信息核验的需要。 个推视觉智能技术,智能高效判断用户特色除了在注册登录环节对用户进行实人认证外,个推青少年网络游戏防沉迷解决方案还提供了图像智能判断的双重保障。当一些未成年人应用家长身份信息绕过实名验证,冲破身份限度,使得时段时长无奈发挥作用时,游戏类APP可通过个推视觉智能技术,疾速对用户特色进行分类判断,进步防沉迷成果。 个推此前就深度布局了视觉智能畛域,投资了第三方图像智能服务商-涂图,并依靠自研的深度学习算法以及海量数据训练,打造了视觉智能解决方案。 个推视觉智能技术能够无效判断图像信息,并通过一直强化算法、优化模型,帮忙APP疾速智能地判断用户特色,不仅可使用于青少年网络游戏防沉迷爱护,同时可笼罩实名验证、风控核验等不同场景。 随着青少年网民规模持续增长,“触网”低龄化趋势更加显著,如何爱护青少年的集体信息安全备受关注。个推视觉智能技术在利用过程中非常重视青少年个人信息爱护,相干数据均在终端通过加密形式间接进行解决,全程均为机器判断,无人工染指,同时确保相干数据不会被记录和存储,并不会用于任何其余用处,切实保障数据安全和用户隐衷。同时,个推青少年网络游戏防沉迷解决方案还将减少监护人受权环节,在用户充沛知情和受权的前提下,建设判断、疏导和爱护机制,保障账号应用过程中的信息安全。 防沉迷工作是一项系统工程,须要社会各界的共同努力。技术更加精密紧密,落实更加无力无效,青少年能力更好地在衰弱清朗的网络空间里畅游。个推深耕开发者服务十余年,积淀了丰盛的行业解决方案,继续为APP开发者提供翻新技术服务。咱们也始终亲密关注着行业的变动,紧跟政策脚步,以大数据、人工智能等互联网前沿技术踊跃践行社会责任。在国家新闻出版署网络游戏防沉迷实名验证零碎建成运行后,个推还将持续跟进零碎的实际与利用,为推动防沉迷工作落地奏效贡献力量。咱们十分心愿能与宽广开发者及社会各界携手,用更加迷信的形式守护每一位青少年的健康成长。

September 1, 2021 · 1 min · jiezi

关于图像识别:七夕表白成功

我的北方姑娘! 简略的话语,认真的态度,表白我对你的喜爱... 谨以此条动静,记录咱们恋情的开始... ... 当前咱们还会过很多个七夕! 2021.08.14(七月初七)

August 15, 2021 · 1 min · jiezi

关于图像识别:读取图片

PILimport numpy as npfrom PIL import Imageimage_pil = Image.open("./test.jpg").convert('RGB')image_pil = np.asarray(image_pil)OpenCVimport cv2image_cv = cv2.imread("./test.jpg")image_cv = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)查看是否等价print(type(image_cv))print(type(image_pil))print(image_cv.any() == image_pil.any())<class 'numpy.ndarray'><class 'numpy.ndarray'>True转换成TorchTensorfrom torchvision import transformstransform = transforms.Compose([ transforms.Resize([224, 224]), transforms.ToTensor()])image_cv = Image.fromarray(image_cv)img_tensor_cv = transform(image_cv)img_tensor_cv = img_tensor_cv.reshape((1, 3, 224, 224))image_pil = Image.fromarray(image_pil)img_tensor_pil = transform(image_pil)img_tensor_pil = img_tensor_pil.reshape((1, 3, 224, 224))print(torch.equal(img_tensor_cv, img_tensor_pil))False

August 12, 2021 · 1 min · jiezi

关于图像识别:计算机视觉相关知识点整理

均值偏移滤波均值偏移滤波(Mean Shift Filtering),有时也称为均值偏移聚类(Mean Shift Clustering),是计算机视觉和图像处理中罕用的一种数据聚类算法。 对于图像的每个像素(具备物理空间地位信息和色彩信息),计算一组相邻像素(在定义的空间半径和色彩间隔内)的均值。 物理空间上2个坐标—x、y,加上色调空间上3个坐标—R、G、B(或任何3维色彩空间),形成一个5维的空间球体。对于这组相邻像素,将计算新的空间中心点(空间平均值)和新的色彩平均值。这些计算出的平均值将用作下一次迭代的新中心点。所形容的过程将反复进行,直到空间和色彩(或灰度)平均值进行变动为止。在迭代完结时,最终的均匀色彩将调配给该迭代的开始地位。 以下动画解释均值偏移的步骤,这里以2维的圆代表5维的空间球体。 参考自:https://waltpeter.github.io/o... 大津二值化法大津二值化法(Otsu's method),是大津展之(Nobuyuki Otsu)提出的全局最优阈值解决算法,将一个灰度图像进化为二值图像。应用聚类思维,将图像分为“前景”和“背景”两类,并使得两类的类内方差最小,即类间方差最大。 $$\sigma^2_w(t)=\omega_0(t)\sigma^2_0(t)+\omega_1(t)\sigma^2_1(t)$$ $x=1$$ 参考自:https://www.cnblogs.com/zdfff...

July 30, 2021 · 1 min · jiezi

关于图像识别:全球首个开源图像识别系统上线了人脸商品车辆识别一网打尽

父老们,乡亲们!你晓得人脸、商品、车辆辨认,以图搜图乃至主动驾驶,背地的技术是什么嘛? 起初小编感觉不就是图像分类、指标检测这些货色嘛,有什么难的?但能纯熟这些利用的BAT高级工程师们都轻松年薪百万,笑傲人生了!!! 当小编正在酸成柠檬精的时候,BAT大神幽幽的说:这背地是综合应用指标检测、图像分类、度量学习、图像检索的【通用图像识别零碎】… 度量学习是啥?图像检索是啥?通用图像识别零碎又是啥?!看来还是我Too Simple,Too Naive了… 难道我真的就无缘年薪百万了嘛?!正在小编捶胸顿足的时候,小编忽然发现了一个通用图像识别零碎疾速搭建神器!OMG!这不幻想一下就要实现了嘛! 连忙Star珍藏住:https://github.com/PaddlePaddle/PaddleClas 那这个我的项目到底有什么过人之处,图像识别又比图像分类、指标检测强在哪里呢? 拿[商品辨认]举个栗子,如果你用单纯的图像分类和指标检测,你会发现: 商品类别数以万计:基本没法当时把所有类别都放入训练集!训练集都不齐备怎么训练算法?样本类别极不平衡:每类商品的数量散布参差不齐,有的类别只有1、2张图片!这样的类别即便投入算法训练,辨认准确率也是十分非常低的。品类更新极快:各个商家不停的推出新的品类,每减少新的产品都要辛辛苦苦从新训练模型!而应用图像识别,不仅能将以上问题完满解决!而且上手极快,简略易懂。筹备好须要辨认的物体图片后,只需三步,多类别、小样本、数据不平衡统统不再是问题!并且它除了商品辨认,还能够进行车辆、人脸、Logo、行人辨认!!!让咱们一起想辨认什么就辨认什么!(是自在的感觉没错了!) 并且这个图像识别零碎的4个外围形成模块,都是通过精心打磨。无论是独自应用亦或是串联开发,都有不凡的成果: 主体检测:采纳高精准超轻量的PP-YOLOv2检测算法,疾速对图像进行主体检测,晋升辨认效率。 骨干网络:精选6个系列Backbone,笼罩最精美的挪动端模型和高精准的服务端模型,反对对构造进行疾速批改,满足不同应用场景的需要。 度量学习:集成ArcMargin, CenterLoss, TriHard等业界最当先的度量学习办法,并能任意组合,轻松训练出鲁棒的图像特色。 检索系统:集成百度自研的Möbius算法,高效实现向量检索,并能随时更新检索库,一次训练长期应用。 开发者不仅能够独自或自主组装应用这四个模块,还能够间接采纳构建好的车辆辨认、LOGO辨认、商品辨认、动漫辨认四个零碎。只须要补充好检索库,就能够间接投产应用了! 有了它们的助力,看齐大厂程序员,年薪百万不是梦!(逐步露出暴富的笑容~ ) 这么弱小、用心的我的项目 ,你还在等什么?!还不连忙Star珍藏上车吧! 传送门:https://github.com/PaddlePaddle/PaddleClas 疾速体验: https://github.com/PaddlePaddle/PaddleClas/blob/release%2F2.2/docs/zh_CN/tutorials/quick_start_recognition.md

June 24, 2021 · 1 min · jiezi

关于图像识别:项目

# date  : 2020.3.30import osimport cv2import randomimport numpy as npfrom matplotlib import pyplot as pltimport torchimport torch.nn.functional as Ffrom train_mnist import Net ##重要,尽管显示灰色(即在次代码中没用到),但若没有引入这个模型代码,加载模型时会找不到模型from torch.autograd import Variableimport pandas as pdres = {}# 读取图像def FourierAddGauss_Blur(img, mu, sigma, k): # 归一化解决 img = np.array(img / 255, dtype=float) # 傅里叶变换 f = np.fft.fft2(img) # print('Fourier Done') fshift = np.fft.fftshift(f) print(fshift) [rows, cols] = fshift.shape for i in range(0, k): for j in range(0, k): # print('before') # print(fshift[i][j]) f_real = fshift[i][j].real f_imag = fshift[i][j].imag f_real += random.gauss(mu, sigma) fshift[i][j] = f_real + (1j * f_imag) # print(fshift[i][j]) # print('Add GaussNoise to (0,10) real Done') res = np.log(np.abs(fshift)) # 傅里叶逆变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) # 自适应高斯滤波 out = cv2.GaussianBlur(iimg, (3, 3), 1) # print('Gaussian Filter Done') # # 滤波后频率图 # f_out = np.fft.fft2(out) # fshift_out = np.fft.fftshift(f_out) # res_out = np.log(np.abs(fshift_out)) # 展现后果 plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original Image') plt.subplot(222), plt.imshow(res, 'gray'), plt.title('Fourier Image') plt.subplot(223), plt.imshow(iimg, 'gray'), plt.title('Inverse Fourier Image') plt.subplot(224), plt.imshow(out, 'gray'), plt.title('out Image') # plt.subplot(325), plt.imshow(res_out, 'gray'), plt.title('Out Fourier Image') plt.show() return outdef FourierAddGauss_NoBlur(img, mu, var, k): # 归一化解决 img = np.array(img / 255, dtype=float) # 傅里叶变换 f = np.fft.fft2(img) # print('Fourier Done') fshift = np.fft.fftshift(f) [rows, cols] = img.shape f_real = np.zeros(img.shape) f_imag = np.zeros(img.shape) for i in range(0, rows): for j in range(0, cols): f_real[i][j] = fshift[i][j].real f_imag[i][j] = fshift[i][j].imag # 生成高频高斯噪声 noise = np.random.normal(mu, var ** 0.5, img.shape) for i in range(0, rows): for j in range(0, cols): if i > k or j > k: noise[i][j] = 0 print("noise") print(noise) print("f_real") print(f_real) # 退出噪声 f_real = f_real + noise for i in range(0, rows): for j in range(0, cols): fshift[i][j] = f_real[i][j] + (1j * f_imag[i][j]) res = np.log(np.abs(fshift)) # 傅里叶逆变换 print("fshift") print(fshift) ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) iimg = iimg * 255 # 自适应高斯滤波 out = cv2.GaussianBlur(iimg, (3, 3), 1) # print('Gaussian Filter Done') # # 滤波后频率图 # f_out = np.fft.fft2(out) # fshift_out = np.fft.fftshift(f_out) # res_out = np.log(np.abs(fshift_out)) # 展现后果 plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original Image') plt.subplot(222), plt.imshow(res, 'gray'), plt.title('Fourier Image') plt.subplot(223), plt.imshow(iimg, 'gray'), plt.title('Inverse Fourier Image') plt.subplot(224), plt.imshow(out, 'gray'), plt.title('out Image') # plt.subplot(325), plt.imshow(res_out, 'gray'), plt.title('Out Fourier Image') plt.show() return outdef train_pngAddGauss(root): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Net() model.load_state_dict(torch.load('mnist_cnn.pt')) # 加载模型 model = model.to(device) model.eval() # 把模型转为test模式 # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test' # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion2000_NoFiltering' # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion_NoFiltering' files_path = os.listdir(root) print("start testing:...") for png_name in files_path: # print(png_name) img = cv2.imread(root + "/" + png_name, 0) # print(img.shape) # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图片转为灰度图,因为mnist数据集都是灰度图 img = np.array(img).astype(np.float32) img = np.expand_dims(img, 0) img = np.expand_dims(img, 0) # 扩大后,为[1,1,28,28] img = torch.from_numpy(img) img = img.to(device) output = model(Variable(img)) prob = F.softmax(output, dim=1) prob = Variable(prob) prob = prob.cpu().numpy() # 用GPU的数据训练的模型保留的参数都是gpu模式的,要显示则先要转回cpu,再转回numpy模式 # print(prob) # prob是10个分类的概率 pred = np.argmax(prob) # 选出概率最大的一个 res[png_name] = pred.item() print("train over") data = pd.read_csv(r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test.csv') right = 0 for key, val in res.items(): # print(key,val) if int(data[data['pic_name'] == key]['label']) == val: right = right + 1 # else: # print("Actually:" + key, val) # Wrong_pred = int(data[data['pic_name'] == key]['label']) # print("Wrong predicted:" + str(Wrong_pred)) acc = right / len(res) print(acc) return accdef gasuss_noise(image, mean=0, var=0.001): # ''' # 增加高斯噪声 # image:原始图像 # mean : 均值 # var : 方差,越大,噪声越大 # ''' image = cv2.imread(image) image = np.array(image / 255, dtype=float) # 将原始图像的像素值进行归一化,除以255使得像素值在0-1之间 noise = np.random.normal(mean, var ** 0.5, image.shape) # 创立一个均值为mean,方差为var呈高斯分布的图像矩阵 out = image + noise # 将噪声和原始图像进行相加失去加噪后的图像 if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) # clip函数将元素的大小限度在了low_clip和1之间了,小于的用low_clip代替,大于1的用1代替 out = np.uint8(out * 255) # 解除归一化,乘以255将加噪后的图像的像素值复原 # cv.imshow("gasuss", out) noise = noise * 255 return [noise, out]def dctAddLowFre(img,mu,var,k): # 归一化解决 img = np.array(img / 255, dtype=float) img_dct = cv2.dct(np.float32(img)) # img_dct_log = np.log(abs(img_dct)) # print('img_dct:') # print(img_dct[0:k, 0:k]) # 生成低频噪声 # 学生成高斯噪声 noise = np.random.normal(mu, var ** 0.5, img.shape) # 创立一个均值为mu,方差为var呈高斯分布的图像矩阵 # 对 GaussionNoise 进行剪裁 for i in range(noise.shape[0]): for j in range(noise.shape[1]): if i > k or j > k: noise[i][j] = 0 # print('noise:') # print(noise) # 对 GaussionNoise 进行 IDCT 失去低频噪声 lowFre_noise = np.zeros(img.shape) lowFre_noise[0:k, 0:k] = cv2.idct(noise[0:k, 0:k]) # print('lowFre_noise:') # print(lowFre_noise[0:k, 0:k]) # 将 低频噪声 退出 img_dct img_dct_AddLowFreNoise = img_dct + lowFre_noise # print('img_dct_AddLowFreNoise') # print(img_dct_AddLowFreNoise[0:k, 0:k]) # 解除归一化 img_dct_AddLowFreNoise = img_dct_AddLowFreNoise * 255 # 逆离散余弦变换,变换图像回实数域 img_idct = cv2.idct(img_dct_AddLowFreNoise) img_idct_Blur = cv2.GaussianBlur(img_idct, (3, 3), 1) # show result plt.subplot(241), plt.imshow(img, 'gray'), plt.title('Img') plt.subplot(242), plt.imshow(noise, 'gray'), plt.title('Gaussion Noise') plt.subplot(243), plt.imshow(lowFre_noise, 'gray'), plt.title('Low Frequency Noise') plt.subplot(244), plt.imshow(img_dct, 'gray'), plt.title('Img_dct') plt.subplot(245), plt.imshow(img_dct_AddLowFreNoise, 'gray'), plt.title('Img_dct_AddLowFreNoise') plt.subplot(246), plt.imshow(img_idct, 'gray'), plt.title('IDCT Image') plt.subplot(247), plt.imshow(img_idct_Blur, 'gray'), plt.title('IDCT-Blur Image') plt.show() return img_idctdef train_pngAddLowFre(root,root_out,mu,var,k): files_path = os.listdir(root) for png_name in files_path: img = cv2.imread(root + "/" + png_name, 0) out = dctAddLowFre(img, mu, var, k) cv2.imwrite(root_out + "/" + png_name, out) train_pngAddGauss(root_out)def main(): # # test # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test' # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion_NoFiltering' # # # # train # # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\training\train' # # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\training\train_AddGuassion4000_Filtering' # # files_path = os.listdir(root) # # array = [100,200,500,1000,1200,1500,2000,2500,3000,3500,4000,4500,5000] # array2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # k = 28 # for sigma in array2: # for png_name in files_path: # img = cv2.imread(root + "/" + png_name, 0) # # out = FourierAddGauss_Blur(img, 0, sigma, k) # out = FourierAddGauss_NoBlur(img, 0, sigma, k) # cv2.imwrite(root_out + "/" + png_name, out) # # print(sigma) # train_pngAddGauss(root_out) #单张图片测试 img = cv2.imread(r'D:\PythonProjects\Fourier\0.png',0) #第一个参数是文件门路,可本人批改 out = FourierAddGauss_NoBlur(img, 0, 50, 10) # # 单张图片测试 # # 离散余弦变换 并获取其幅频谱 # img = cv2.imread(r'D:\PythonProjects\Fourier\0.png', 0) # img_addLowFre = dctAddLowFre(img, 0, 0.1, 10) # # 数据集测试 # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test' # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddLowFre' # mu = 0 # array_var = [0, 0.01, 0.02, 0.05, 0.1] # array_var2 = [0.6, 0.7, 0.8, 0.9, 1] # k = 10 # # for var in array_var2: # print(var) # train_pngAddLowFre(root, root_out, mu, var, k)if __name__ == '__main__': main()

June 4, 2021 · 5 min · jiezi

关于图像识别:YOLOv1学习笔记

算法思维间接对bounding box的地位和置信度进行回归。 算法流程将图片划分成S*S的格子,如果box核心落到某个格子内,则该格子负责预测这个box;每个格子负责预测b个bounding box(预测绝对于以后格子的坐标以及绝对于全图的长宽),最初选定置信度最大的格子输入;计算回归损失。推理流程图片通过网络前向计算失去S*S*(5*b+num_classes)个输入,在pascal VOC数据集中,YOLOv1采纳S=7, b=2, 一共20类,所以num_classes=20, 最初的输入为7*7*30,即每个格子预测两个bounding box;筛选出bounding box置信度(confidence)大于阈值的框(此时在YOLOv1中曾经过滤掉大部分);对筛选出的bounding box进行nms(非极大克制)。依据业务不同要求,nms的模式也可能不同,YOLOv1中间接对所有bbox的score进行排序,在所有bbox中做nms;而在要求召回较高的场景须要对每一类别离做nms。优缺点长处速度很快,pipline简略YOLO会基于整张图片信息进行预测,而其余滑窗式的检测框架,只能基于部分图片信息进行推理。YOLO学到的图片特色更为通用背景误检率低毛病因为输入层为全连贯层,因而在检测时,YOLO训练模型只反对与训练图像雷同的输出分辨率;每个格子只能预测一个bbox。当一个格子蕴含多个物体时,只能检出一个;地位检测不精确。YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss奉献值靠近(尽管采纳求平方根形式,但没有基本解决问题)。因而,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而升高了物体检测的定位准确性。代码https://github.com/Howe-Young...

April 28, 2021 · 1 min · jiezi

关于图像识别:TorchVision-预训练模型进行推断

torchvision.models 里蕴含了许多模型,用于解决不同的视觉工作:图像分类、语义宰割、物体检测、实例宰割、人体关键点检测和视频分类。 本文将介绍 torchvision 中模型的入门应用,一起来创立 Faster R-CNN 预训练模型,预测图像中有什么物体吧。 import torchimport torchvisionfrom PIL import Image创立预训练模型model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)print(model) 可查看其构造: FasterRCNN( (transform): GeneralizedRCNNTransform( Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) Resize(min_size=(800,), max_size=1333, mode='bilinear') ) (backbone): BackboneWithFPN( ... ) (rpn): RegionProposalNetwork( (anchor_generator): AnchorGenerator() (head): RPNHead( (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (cls_logits): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1)) (bbox_pred): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1)) ) ) (roi_heads): RoIHeads( (box_roi_pool): MultiScaleRoIAlign(featmap_names=['0', '1', '2', '3'], output_size=(7, 7), sampling_ratio=2) (box_head): TwoMLPHead( (fc6): Linear(in_features=12544, out_features=1024, bias=True) (fc7): Linear(in_features=1024, out_features=1024, bias=True) ) (box_predictor): FastRCNNPredictor( (cls_score): Linear(in_features=1024, out_features=91, bias=True) (bbox_pred): Linear(in_features=1024, out_features=364, bias=True) ) ))此预训练模型是于 COCO train2017 上训练的,可预测的分类有: ...

February 26, 2021 · 4 min · jiezi

关于图像识别:人民日报创作大脑背后的AI支撑百度大脑智能创作平台技术解密

人工智能、云计算、5G等新兴技术正在放慢媒体行业智能化降级步调。12月24日,人民日报举办“2020智慧媒体高峰论坛”,公布人民日报“创作大脑”,百度公司提供技术支持,助力智能编辑部建设,开启智能媒体新时代。 人民日报“创作大脑”具备直播智能拆条、在线视频快编、图片智能解决、智能字幕制作、可视化大数据、智能写作、新闻转视频、实时新闻监测等18项重点性能,是集轻利用平台、智慧媒体云、常识社区、凋谢生态于一身的一站式智能创作平台,可能为媒体机构提供全媒体生态智能解决方案。 人民日报“创作大脑”背地,是百度智能云提供当先的云+AI技术支持,尤其是来自百度大脑智能创作平台的反对。百度大脑智能创作平台基于自然语言解决、常识图谱、视觉、语音的整合技术能力,为创作者提供多项能力,助力新闻生产的策、采、编、审、发全流程,全面晋升内容生产效率。 (智能创作平台全景图) 智能策动,将数据转化为业务智慧 在智能策动方面,基于百度常识图谱的核心技术与数据,汇聚全网文本、视频、图片、语音等海量信息,借助全网资源构建具备语义关系的主题图谱,高效汇聚海量创作资源,通过关联剖析实时发现热点,智能化地构建事件脉络、通稿常识的关联与扩大等反对专题深度开掘的性能,堪称每日"选题会"利器。 (基于常识图谱的素材举荐性能示意图) 新闻编辑可通过智能策动性能,疾速获取以后热点,寻找创作灵感,开掘深度主题。借助热度趋势还可理解主题舆论现状,通过主题关联剖析取得指标主题的泛滥切入角度,晋升文章视角档次与深度。 智能采编,智能内容生产晋升内容创作效率和品质 智能生产则更加关注内容创作的效率和品质,为媒体内容生产提供主动创作和辅助创作的反对。百度大脑智能创作平台集成自然语言解决、常识图谱、视觉技术泛滥算法能力,反对智能文章创作及智能视频生产,包含新闻快讯生成、专题报道聚合、视频新闻主动生成等性能。从通稿式"规范"内容,一键转化为快讯、短视频等多样化状态。想要触达不同平台、不同受众?AI帮你疾速做到! (多模AI技术加持的智能采编) 智能文章创作:可通过接入数据、配置专属写作模板,疾速实现批量和主动文章生成能力,能间接承当具备高时效、简略、反复个性创作流程。通过可视化编辑等形式,基于数据和素材起源,实现创作模板、必要数据和素材解决;聚合写作,辅助实现一手时效性报道,从实时和海量的社交数据中,挖掘出有价值的资讯或新闻内容,利用常识加工、计算、聚合等形式产生高时效、高质量的独家内容,让创作者从反复繁琐的查找、收集材料工作中解放。 视频新闻自动生产:多模态视频智能创作,高效实现视频主动生成,解决视频素材获取老本高、行业视频制作门槛高、制作效率低工夫久的痛点,利用图片、视频、文字等多模态信息交融技术实现视频新闻的生产。它可利用算法和AI模型主动生成故事线,升高素材收集、整顿、匹配、剪辑的工夫老本,实现全自动智能化新闻视频内容生产。用户可零门槛疾速上手,通过图文链接一键导入,主动实现配音不同格调的男女声AI语音播报、字幕、画面、片头片尾的视频内容生产。同时通过视频编辑器疾速反对视频的宰割、视频剪辑、多视频合并、缩放与裁剪性能,通过AI技术赋能视频剪辑,带来晦涩应用体验。 多模态媒资智能治理,内容价值开掘利用:在媒资治理方面,通过剖析媒体资源造成结构化素材知识库,为使用者提供创作的素材起源。该过程由百度大脑通过常识图谱、语言了解、多模了解对内容资源深入分析,理解内容背地常识外延,建设内容语义关联,实现视频拆条、编目自动化,涵盖多畛域的视频主题、摘要、标签、人物、地点辨认。同时反对常识摸索举荐、语义检索,并基于新闻内容实现内容的生成与散发。 (视频了解、主动拆条和主动编目性能示意图) 智能审校:多维度审校,全方位保障内容品质 依靠自然语言解决技术,可反对采编素材、视频文字、图书稿件等场景的多维度审校,汇合纠错、一致性查看、格局校对等实用能力,可秒级实现十万字审核。而传统形式下一个人须要3.3天审核工夫,这使得媒体人有更多精力投入到创造性工作中。 (智能审校示意图) 散发营销晋升效率,助力内容推广千人千面 如何实现创作内容的精准散发?通过对创作者的生产内容进行剖析,帮忙创作者高效实现千人千面的内容散发和营销优化。在散发过程中,题目、摘要、主题短语等信息须要在较短的篇幅内抓住用户注意力,而在传统内容生产中,这些内容须要专门投入人力去手工提炼撰写。百度大脑智能创作可能主动且精确地为内容计算标签、题目、摘要、主题短语等信息,不仅节约创作者的编辑工夫,也能无效晋升散发效率,晋升内容的影响力。 (智能创作在散发场景的性能示意图) 百度大脑智能创作平台反对人民日报“创作大脑”的产品落地,标记着传统消耗大量精力及工夫的内容生产过程将被更新优化,是人工智能技术赋能媒体生产的进一步落地。百度助力人民日报推出的创作大脑,将首先在人民日报内容生产中投入利用,进而转化为可能为其余媒体机构和内容创作者服务的全媒体生态智能解决方案,为全国媒体深度交融倒退助力。

January 6, 2021 · 1 min · jiezi

关于图像识别:用PyInstaller打包py文件

用PyInstaller打包.py文件2021/1/4 背景课程设计要用PyQt制作GUI并打包成.exe文件,在学习PyQt,就做了一个读取图片的小小程序,顺便试一下用PyInstaller打包。 注释PyInstaller的装置我用的时候发现曾经装好了,应该是我大三试着玩的时候装的,这里就不表了。 PyInstaller的应用win + R关上运行窗口,输出cmd后回车进入控制台进入要打包的py文件的目录 输出d:进入D盘输出cd D:\_study\Grade4-1\CourseDesign\learn_PyQt\mine进入py文件所在文件夹输出指令pyinstaller -F -w -i favicon.ico mine.py -F 生成的dist文件夹只含有单个的exe程序-w exe文件关上时只有指标窗口,没有俊俏的控制台-i favicon.ico 为程序加上指定门路的图标,这里只能是ico文件,jpg会报错我试了mine.py 筹备打包的py文件各种参数的含意和用法在附录链接的文章中有具体介绍期待打包实现即可关上exe文件打包实现后文件夹里会新呈现以下货色 _pycache_ build dist 三个文件夹mine.specexe文件即在dist文件夹中,点击运行即可 过程中遇到的问题及解决图标格局必须是ico,用jpg在打包时会报错程序中要用到的图片素材等在代码援用素材时中应用相对路径'res/faye.jpg'打包完结后将res文件夹复制一份放在与exe文件并列的地位其余仿佛须要在零碎的主python环境中装置须要的库,我的PyQt一开始只装在anaconda创立的虚拟环境中,造成打包后点击exe不呈现图形界面,在主环境中装置PyQt5后问题解决总结这是我第一次写博文来记录学习,也是第一次应用markdown编辑文本,有些青涩见谅:)感激plb消耗100+mb流量帮我测试生疏环境下的程序运行。 附录PyInstaller各参数含意繁难图形程序的代码import sysimport cv2import numpyfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEditfrom PyQt5.QtGui import QIconfrom random import randintclass Example(QWidget): def __init__(self): super().__init__() self.initUI() # self.filename = 'a.jpg' def initUI(self): self.setGeometry(300, 300, 300, 150) self.setWindowTitle('读取图片') self.setWindowIcon(QIcon('res/faye.jpg')) self.bt1 = QPushButton('读取', self) self.bt1.setGeometry(115, 90, 70 ,30) self.bt1.setToolTip('<b>点击这里读取图片</b>') self.bt1.clicked.connect(self.showMessage) self.text = QLineEdit('在这里输出文件门路(不要含有中文)', self) self.text.selectAll() self.text.setFocus() self.text.setGeometry(25, 50, 250 ,30) self.show() def showMessage(self): filename = self.text.text() # print(filename) img = cv2.imread(filename) img1 = cv2.imread('a.jpg') if type(img) == type(img1): QMessageBox.about(self, '小问题...','门路如同错了') self.text.selectAll() self.text.setFocus() else: cv2.imshow(filename, img) cv2.waitKey(0) self.text.clear() self.text.setText('在这里输出文件门路(不要含有中文)') self.text.selectAll() self.text.setFocus() def closeEvent(self, event): reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

January 4, 2021 · 1 min · jiezi

关于图像识别:C中的深度学习二预处理识别硬币的数据集

在文章中,咱们将对输出到机器学习模型中的数据集进行预处理。 这里咱们将对一个硬币数据集进行预处理,以便当前在监督学习模型中进行训练。在机器学习中预处理数据集通常波及以下工作: 清理数据——通过对四周数据的平均值或应用其余策略来填补数据缺失或损坏造成的破绽。标准数据——将数据缩放值标准化到一个规范范畴,通常是0到1。具备宽泛值范畴的数据可能会导致不标准,因而咱们将所有数据都放在一个公共范畴内。一种热编码标签——将数据集中对象的标签或类编码为N维二进制向量,其中N是类的总数。数组元素都被设置为0,除了与对象的类绝对应的元素,它被设置为1。这意味着在每个数组中都有一个值为1的元素。将输出数据集分为训练集和验证集——训练集被用于训练模型,验证集是用于查看咱们的训练后果。这个例子咱们将应用Numpy.NET,它基本上是Python中风行的Numpy库的.NET版本。 Numpy是一个专一于解决矩阵的库。 为了实现咱们的数据集处理器,咱们在PreProcessing文件夹中创立Utils类和DataSet类。Utils类合并了一个动态Normalize 办法,如下所示: public class Utils { public static NDarray Normalize(string path) { var colorMode = Settings.Channels == 3 ? "rgb" : "grayscale"; var img = ImageUtil.LoadImg(path, color_mode: colorMode, target_size: (Settings.ImgWidth, Settings.ImgHeight)); return ImageUtil.ImageToArray(img) / 255; } }在这种办法中,咱们用给定的色彩模式(RGB或灰度)加载图像,并将其调整为给定的宽度和高度。而后咱们返回蕴含图像的矩阵,每个元素除以255。每个元素除以255是使它们标准化,因为图像中任何像素的值都在0到255之间,所以通过将它们除以255,咱们确保了新的范畴是0到1,包含255。 咱们还在代码中应用了一个Settings类。该类蕴含用于跨应用程序应用的许多常量。另一个类DataSet,示意咱们将要用来训练机器学习模型的数据集。这里咱们有以下字段: _pathToFolder—蕴含图像的文件夹的门路。_extList—要思考的文件扩展名列表。_labels—_pathToFolder中图像的标签或类。_objs -图像自身,示意为Numpy.NDarray。_validationSplit—用于将总图像数划分为验证集和训练集的百分比,在本例中,百分比将定义验证集与总图像数之间的大小。NumberClasses-数据集中惟一类的总数。TrainX -训练数据,示意为Numpy.NDarray。TrainY -训练标签,示意为Numpy.NDarray。ValidationX—验证数据,示意为Numpy.NDarray。ValidationY-验证标签,示意为Numpy.NDarray。这是DataSet类: public class DataSet { private string _pathToFolder; private string[] _extList; private List<int> _labels; private List<NDarray> _objs; private double _validationSplit; public int NumberClasses { get; set; } public NDarray TrainX { get; set; } public NDarray ValidationX { get; set; } public NDarray TrainY { get; set; } public NDarray ValidationY { get; set; } public DataSet(string pathToFolder, string[] extList, int numberClasses, double validationSplit) { _pathToFolder = pathToFolder; _extList = extList; NumberClasses = numberClasses; _labels = new List<int>(); _objs = new List<NDarray>(); _validationSplit = validationSplit; } public void LoadDataSet() { // Process the list of files found in the directory. string[] fileEntries = Directory.GetFiles(_pathToFolder); foreach (string fileName in fileEntries) if (IsRequiredExtFile(fileName)) ProcessFile(fileName); MapToClassRange(); GetTrainValidationData(); } private bool IsRequiredExtFile(string fileName) { foreach (var ext in _extList) { if (fileName.Contains("." + ext)) { return true; } } return false; } private void MapToClassRange() { HashSet<int> uniqueLabels = _labels.ToHashSet(); var uniqueLabelList = uniqueLabels.ToList(); uniqueLabelList.Sort(); _labels = _labels.Select(x => uniqueLabelList.IndexOf(x)).ToList(); } private NDarray OneHotEncoding(List<int> labels) { var npLabels = np.array(labels.ToArray()).reshape(-1); return Util.ToCategorical(npLabels, num_classes: NumberClasses); } private void ProcessFile(string path) { _objs.Add(Utils.Normalize(path)); ProcessLabel(Path.GetFileName(path)); } private void ProcessLabel(string filename) { _labels.Add(int.Parse(ExtractClassFromFileName(filename))); } private string ExtractClassFromFileName(string filename) { return filename.Split('_')[0].Replace("class", ""); } private void GetTrainValidationData() { var listIndices = Enumerable.Range(0, _labels.Count).ToList(); var toValidate = _objs.Count * _validationSplit; var random = new Random(); var xValResult = new List<NDarray>(); var yValResult = new List<int>(); var xTrainResult = new List<NDarray>(); var yTrainResult = new List<int>(); // Split validation data for (var i = 0; i < toValidate; i++) { var randomIndex = random.Next(0, listIndices.Count); var indexVal = listIndices[randomIndex]; xValResult.Add(_objs[indexVal]); yValResult.Add(_labels[indexVal]); listIndices.RemoveAt(randomIndex); } // Split rest (training data) listIndices.ForEach(indexVal => { xTrainResult.Add(_objs[indexVal]); yTrainResult.Add(_labels[indexVal]); }); TrainY = OneHotEncoding(yTrainResult); ValidationY = OneHotEncoding(yValResult); TrainX = np.array(xTrainResult); ValidationX = np.array(xValResult); }}上面是每个办法的阐明: ...

December 22, 2020 · 2 min · jiezi

关于图像识别:didi云-gpu服务器使用记录

这两天应用了一下didi云的gpu服务器总的来说不能间接用,开始有很多的货色要装didi云的gpu服务器大略是3块钱一小时,p4 8g的显存我抉择的是ubuntu16.04 cuda10.1的操作系统下来后一看没有tensorflow, 没有深度学习环境那只能本人装了tensorflow1.14.0可用,装上能辨认而后还要装置cv2和mtcnn,这两个也挺费时间这些都装上后发现cv2不能解决视频还须要装置opencv-contrib-python总之光装置环境就须要几个小时了 做完后筹备弄个快照,以不便下次应用

December 18, 2020 · 1 min · jiezi

关于图像识别:opencv-笔记

因为笔记上不能用照片,所以在这边记录下 HSV对应BGR色彩的表格参考链接

November 5, 2020 · 1 min · jiezi

关于图像识别:小白学YOLO一文带你学YOLOv1-Testing

摘要:本文将为初学者带详细分析如何进行YOLOv1 Testing的内容。YOLOv1 Testing进入testing阶段,咱们曾经失去98个bounding box和confidence还有Class probability map,接下来咱们须要一些筛选bounding box的算法,咱们开始引入NMS(Non-max suppression)非极大值克制。 NMS非极大值克制概述非极大值克制(Non-Maximum Suppression,NMS),顾名思义就是克制不是极大值的元素,能够了解为部分最大搜寻。这个部分代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不探讨通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据的NMS实现),而是用于指标检测中提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特色,经分类器分类辨认后,每个窗口都会失去一个分数。然而滑动窗口会导致很多窗口与其余窗口存在蕴含或者大部分穿插的状况。这时就须要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且克制那些分数低的窗口。 NMS在计算机视觉畛域有着十分重要的利用,如视频指标跟踪、数据挖掘、3D重建、指标辨认以及纹理剖析等。 YOLOv1中Testing过程上篇博客中,咱们曾经介绍了LOSS函数,并且给出了置信度计算公式以及Class概率公式(图中粉框圈出),并且为已知数值。如下方途中公式二者相乘并化简,即可失去图中等式右方后果。 1. 二者相乘得出20×1个score,对于98个bounding box都进行此运算,失去98×20个score。 2. 获取第一组class of scores,假如为dog的scores,如图中框1标出的。 3. 通过一个thresh的筛选,将score<0.2(概率太低)的值置为0。如框2标出的。 4. 将批改后的scores进行降序排列。如框3标注的。 5. 应用NMS将重叠的框去除。如框4标注的。 NMS在YOLOv1中实现过程如下图,咱们假如按降序排列好的scores中,bounding box 47的score最大为0.8,第二高的为bounding box 20的score,为0.5。 1.取score最大的一个bounding box,将他保留。 2.找到他上面一个非零框,即score为0.5的bounding box。 3.计算他们两个的IOU交并比,如果大于0.5,阐明他们两个重合度十分高,将score较小的bounding box的值置为0. 4.再按程序取下一个score,与score为0.8的bounding box计算交并比。如果交并比小于0.5就保留这个值。 5.当score=0.8的bounding box与其余bounding box都计算结束后,取这些scores中比0.8小的最大的score,在进行上述操作,直到满足完结条件。 6.将第二到第二十个class也进行上述操作。 7.依据每个bounding box的score进行比拟大小。取出这个bounding box中最大的数值。 8.如果有大于0的最大score,那么就画出这个score对应的框,并且把他当作这个class。直到遍历完所有的bounding box。 点击关注,第一工夫理解华为云陈腐技术~

July 20, 2020 · 1 min · jiezi

一种基于图像识别的移动端车牌识别技术支持AndroidiOS系统

随着移动行业的爆发式发展,手机配置不断提高,基于手机平台的信息采集、图像处理、数据传输等方面的研究也成为了热点,这使得基于手机平台上的车牌识别成为可能。传统的车牌识别系统一般都基于固定的桌面平台、图像采集不灵活,特别是对于交通管理部门来说,对违章车辆车牌的自动登记非常不便,因此基于移动端车牌识别出现了。       那么如何实现车牌识别的呢,下面简单说说:       首先对现存的车牌识别算法进行了研究,在诸多算法中寻找到一种适合在Android、iOS平台上运行的算法。先通过智能手机的摄像头获得车牌的彩色图像,然后将采集到的图像进处理,包括通过YUV模型进行灰度化,分段线性变换进行灰度拉升,二值化,Roberts算子进行边缘检测,数学形态学处理等,然后通过Hough变换进行车牌矫正,其次用双投影和灰度跳变的方法实现车牌的定位、分割,最后通过模板匹配实现车牌识别。       移动端车牌识别实现的过程简单为以下几个部分:       图像采集:通过智能手机摄像头拍摄车牌图像。       预处理:灰度化、二值化、边缘增强、噪声过滤、自动白平衡、自动曝光以及伽马校正、对比度调整等。       车牌定位:在经过图像预处理之后的灰度图像上进行行列扫描,确定车牌区域,车牌切斜校正。       字符分割:在图像中定位出车牌区域后,通过灰度化、二值化等处理,精确定位字符区域,然后根据字符尺寸特征进行字符分割。       字符识别:对分割后的字符进行缩放、特征提取,与字符数据库模板中的标准字符表达形式进行匹配判别。       结果输出:将车牌识别的结果以文本格式输出。       下面简单介绍移动端车牌识别技术应用领域:       停车管理系统会用到移动端车牌识别,停车管理系统需要做到的是对车辆的管理,特别像占道停车,总没可能安装一个一体机在路边上,然后一个车位安装一个,这会非常耗费成本。移动端车牌识别在占道停车能被非常好地用上,移动端车牌识别会让他们的工作更加的方便,用前端扫一扫车牌就能计费了。尤其是在停车管理系统宕机后系统无法工作,这时候移动端车牌识别手持收费设备就起到了应急作用。       移动警务、移动执法中也会用到移动端车牌识别技术,比如巡逻执勤,交警执法等,因为警务执法人员会每天接触到大量的信息,他们的信息录入需要非常快速的准确的录入下来,所以,在警务通中集成移动端车牌识别sdk,在信息录入效率方面,直接使用警务通设备摄像头扫描车牌即可识别上传车牌信息,让移动警务方面的应用更加的快捷。       车辆保险、现场勘察方面也会用到移动端车牌识别,比如车险移动查勘,他们会将移动端车牌识别与移动端证件识别技术结合起来,如果车辆没有车牌,也可以将车架号识别集成进来,他们在前期也是减少保险服务人员的工作量,并且会提高信息采集的正确率。       汽车服务行业汽修等也会用到移动端车牌识别,比如汽车4S点,汽车维修保养。       汽修服务行业的app上,最近也是一个非常火的应用,将移动端车牌识别sdk集成在app上,就能实现手机车牌识别的功能。       当前,车牌识别已经成为每个城市的车辆管理重点工作之一,有效、准确、及时的车牌识别为警务人员的交通执法、停车场车辆管理等工作带来极大的便利。 ...

June 21, 2020 · 1 min · jiezi

以图搜图实现之均值哈希

前言最近在逛淘宝时发现了淘宝的图片搜索功能,可能是我太Low了这个技术点已经实现很长时间了。想想自己能不能实现这个功能,起初我是这么想的,对两张图片从左上角的第一个像素点一直比较到右下角的最后一个像素点,并在比较时记录它们的相似度,可能是我太天真了(主要还是知识限制了想象),这样做有很多问题,比如说两张图片大小不一致、核心要素点的位置不同等...最终只得借助网络了,找到了一种叫做均值哈希的算法(Average hash algorithm),接下来具体阐述它的基本思路以及适用场景。 均值哈希的基本思路1、缩小尺寸: 去除图片的高频和细节的最快方法是缩小图片,将图片缩小到8x8的尺寸,总共64个像素。不要保持纵横比,只需将其变成8乘8的正方形。这样就可以比较任意大小的图片,摒弃不同尺寸、比例带来的图片差异。 2、简化色彩: 将8乘8的小图片转换成灰度图像。 3、计算平均值: 计算所有64个像素的灰度平均值。 4、比较像素的灰度: 将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。 5、计算hash值: 将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。 如果图片放大或缩小,或改变纵横比,结果值也不会改变。增加或减少亮度或对比度,或改变颜色,对hash值都不会太大的影响。最大的优点:计算速度快! 那么完成了以上步骤,一张图片就相当于有了自己的"指纹"了,然后就是计算不同位的个数,也就是汉明距离(例如1010001与1011101的汉明举例就是2,也就是不同的个数)。 如果汉明距离小于5,则表示有些不同,但比较相近,如果汉明距离大于10则表明完全不同的图片。 以上就是均值哈希的基本实现思路,总体来说是比较简单的。 C#实现public class ImageHashHelper{ /// <summary> /// 获取缩略图 /// </summary> /// <returns></returns> private static Bitmap GetThumbImage(Image image, int w, int h) { Bitmap bitmap = new Bitmap(w, h); Graphics g = Graphics.FromImage(bitmap); g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(0, 0, image.Width, image.Height), GraphicsUnit.Pixel); return bitmap; } /// <summary> /// 将图片转换为灰度图像 /// </summary> /// <returns></returns> private static Bitmap ToGray(Bitmap bmp) { for (int i = 0; i < bmp.Width; i++) { for (int j = 0; j < bmp.Height; j++) { //获取该点的像素的RGB的颜色 Color color = bmp.GetPixel(i, j); //利用公式计算灰度值 int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);//计算方式1 //int gray1 = (int)((color.R + color.G + color.B) / 3.0M);//计算方式2 Color newColor = Color.FromArgb(gray, gray, gray); bmp.SetPixel(i, j, newColor); } } return bmp; } /// <summary> /// 获取图片的均值哈希 /// </summary> /// <returns></returns> public static int[] GetAvgHash(Bitmap bitmap) { Bitmap newBitmap = ToGray(GetThumbImage(bitmap, 8, 8)); int[] code = new int[64]; //计算所有64个像素的灰度平均值。 List<int> allGray = new List<int>(); for (int row = 0; row < bitmap.Width; row++) { for (int col = 0; col < bitmap.Height; col++) { allGray.Add(newBitmap.GetPixel(row, col).R); } } double avg = allGray.Average(a => a);//拿到平均值 //比较像素的灰度 for (int i = 0; i < allGray.Count; i++) { code[i] = allGray[i] >= avg ? 1 : 0;//将比较结果进行组合 } //返回结果 return code; } /// <summary> /// 对两个AvgHash进行比较 /// </summary> /// <returns></returns> public static int Compare(int[] code1, int[] code2) { int v = 0; for (int i = 0; i < 64; i++) { if (code1[i] == code2[i]) { v++; } } return v; }}这里我们在GetAvgHash函数中获取64个像素的灰度值时直接通过了R来获取,因为RGB都是一样的,所以哪一个都可以。 ...

September 8, 2019 · 2 min · jiezi

人工智能98都认错图像识别AI遇上对抗性图像竟变瞎子

作者 | James Vincent来源 | 数据与算法之美在视觉方面,AI和人类的差距有多大?来自UC Berkeley等高校的研究人员创建了一个包含7500个“自然对抗实例”的数据集,在测试了许多机器视觉系统后,发现AI的准确率下降了90%!在某些情况下,软件只能识别2%-3%的图像。这样的AI若用在自动驾驶汽车上,后果不敢想象! 近几年来,计算机视觉有了很大的改善,但仍然有可能犯严重的错误。犯错如此之多,以至于有一个研究领域致力于研究AI经常误认的图片,称为“对抗性图像”。可以把它们看作计算机的光学错觉,当你看到树上有一只猫时,人工智能看到了一只松鼠。 ▲AI把爬上树的猫误认为松鼠 研究这些图像是很有必要的。当我们把机器视觉系统放在AI安全摄像头和自动驾驶汽车等新技术的核心位置时,我们相信计算机和我们看到的世界是一样的。而对抗性图像证明并非如此。 对抗性图像利用机器学习系统中的弱点 但是,尽管这个领域的很多关注点都集中在那些专门设计用来愚弄AI的图片上(比如谷歌的算法把3D打印的乌龟误认为是一把枪),但这些迷惑性图像也会自然的出现。这类图像更令人担忧,因为它表明,即便不是我们特意制作的,视觉系统也会犯错。 ▲谷歌AI误认为这只乌龟是枪 为了证明这一点,来自加州大学伯克利分校、华盛顿大学和芝加哥大学的一组研究人员创建了一个包含7500个“自然对抗实例”(natural adversarial examples)的数据集,他们在这些数据上测试了许多机器视觉系统,发现它们的准确率下降了90%,在某些情况下,软件只能识别2%-3%的图像。 下面就是一些“自然对抗实例”数据集的例子: ▲AI眼中是“沉船”,其实是虫子爬在枯叶上 ▲AI眼中是“火炬” ▲AI眼中是“瓢虫” ▲AI眼中是“日晷” ▲AI眼中是“棒球运动员” ▲AI眼中是“人开卡丁车” 数据有望帮助培养更强大的视觉系统 在论文中,研究人员称这些数据有望帮助培养更强大的视觉系统。他们解释说,这些图像利用了“深层缺陷”,这些缺陷源于该软件“过度依赖颜色,纹理和背景线索”来识别它所看到的东西。 例如,在下面的图像中,AI错误地将左侧的图片当作钉子,这可能是因为图片的木纹背景。在右边的图像中,它们只注意到蜂鸟饲养器,但却错过了没有真正的蜂鸟存在的事实。 下面的四张蜻蜓照片,AI在颜色和纹理上进行分析后,从左到右依次会识别为臭鼬、香蕉、海狮和手套。我们从每张图片中都可以看出AI为什么会犯错误。 AI系统会犯这些错误并不是新闻了。多年来,研究人员一直警告说,利用深度学习创建的视觉系统是“浅薄”和“脆弱”的,它们不会像人一样灵活地理解世界上的一些几乎相同的细微差别。 这些AI系统在成千上万的示例图像上进行了训练,但我们通常不知道图片中的哪些确切元素是AI用于做出判断的。 一些研究表明,考虑到整体形状和内容,算法不是从整体上看图像,而是专注于特定的纹理和细节。本次数据集中给出的结果似乎支持这种解释,例如,在明亮的表面上显示清晰阴影的图片,会被错误地标识为日晷。 AI视觉系统真的没救了? 但这是否意味着这些机器视觉系统没得救了?完全不是。一般这些系统所犯的错误都是小错,比如将排水盖识别为沙井,将货车误认为豪华轿车等。 虽然研究人员说这些“自然对抗性的例子”会骗过各种各样的视觉系统,但这并不意味着可以骗过所有系统。许多机器视觉系统非常专业,比如用于识别医学扫描图像中的疾病的那些专门系统。虽然这些系统有着自己的缺点,可能无法理解这个世界和人类,但这并不影响它们发现并诊断癌症。 机器视觉系统有时可能会很快且有瑕疵,但通常都会产生结果。这样的研究暴露了机器成像研究中的盲点和空白,我们下一步的任务就是如何填补这些盲点了。

August 7, 2019 · 1 min · jiezi

一个阿里产品经理眼中的垃圾分类

我叫切斯,是阿里巴巴的一名产品经理。今天和大家说说一个上线刚刚6天,已被500多万网友疯玩的AI——垃圾图像识别,可见垃圾分类苦天下网友久矣。 以下是一个产品经理的碎碎念~ 有人说它是“国内首款真正的垃圾图像识别产品”,对着物品拍照就可以知道这是哪一类垃圾。我不知道是不是真的首款,网友说是那就姑且是吧。 话说网上热议垃圾分类时,阿里的小二们也没闲着,内网里展开了热闹的讨论: “AR扫一扫”的解决方案被提了出来,但是质疑的声音也很大—— “到底能不能行”“用户真的需要这个吗”…… 真正让这个“孩子”获得准生证的理由,是因为公益与责任的力量。正如一位阿里合伙人所说,“AI的谐音是‘爱’,大家对‘AI’是有宽容度的;而且只有人人都能为这个‘AI’而努力,共同参与起来,才能让他更好”。“现在还是在上海这样的一线城市,用户对垃圾分类就已经如此困惑。未来这个意识扩展到中国的每一片土地时,人们一定会更加需要这样的帮助。阿里巴巴一定要为这个社会去承担责任”。 经过48小时的紧急开发,这个AI智能识别垃圾功能(测试版)在手机淘宝上线,功能通过阿里云搭建。 为了更准确实现AI识别,阿里的工程师志愿者们还与公益环保组织合作,紧急搭建了首个互联网垃圾分类数据库;天猫精灵团队甚至连夜支持了图像识别之外的文本识别的能力。 为了让它快速学习,程序员和设计师小哥让我把它扔到了阿里内网里接受测试和训练。 在这48个小时里,为了让孩子早点诞生,开发同学一下飞机就匆匆赶回公司;设计师小哥凌晨三点还在改视觉设计;程序员凌晨两点对我这个产品经理说:“你放心回去吧,今天不管多晚我一定把bug 改完发布上线……” 30多位志愿者分别来自社会公益、达摩院、天猫精灵、闲鱼、淘宝等团队。 “垃圾分类”的AI上线后,身边的每个人都拿着手机做测试,我的心情是既开心又紧张。兴奋的是越来越多的志愿者主动加入到了推广这个AI,“抚养”它“教育”它的行列,他们来自各行各业,有年过七旬的老人,也有在校的大学生……我知道这只是个开始,距离它真正长大还有很长很长的路要走。 在淘宝AI垃圾分类识别系统上线前后,支付宝、天猫精灵、盒马等APP也推出了不同的垃圾识别功能。就在刚刚,我们淘宝拍立淘还联动闲鱼对手淘AI识别功能进行了升级,闲鱼将免费上门回收网友识别出来的可回收垃圾。 改变世界的不是技术,而是技术背后的温度。改变世界的不是空想和讨论,而是从我做起、从此刻做起的决心与行动。希望未来的一天,每个人都会感谢自己给这个世界带来的那些微小而美好的变化。 每个人的一点点改变,终将汇聚成大大的能量,从今天开始就比明天开始早行动了24个小时。 垃圾分类,从我做起!爱护环境,人人有责! 本文作者:会分类的橙阅读原文 本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。

July 12, 2019 · 1 min · jiezi

阿里AI再出神器你是什么垃圾一拍便知

“干垃圾,还是湿垃圾?你是什么垃圾?” 相信魔都的小伙伴已经要被垃圾分类逼疯了,还要面临垃圾桶前,志愿者们的灵魂一问:“你是什么垃圾?” 更糟糕的是,垃圾分类,还要“自学成才”,没人可问。 想人之所想,急人之所急,阿里AI懂你。 经过48小时紧急开发,阿里志愿者紧急开发了AI智能识别垃圾功能(测试版)在手机淘宝上线,这款功能通过阿里云搭建。 直接进入拍立淘,点击“戳我识别垃圾分类”的按钮,即可进入垃圾识别功能。 或者,打开手机淘宝搜索“你是什么垃圾”,系统可以通过阿里云异构计算能力进行快速智能识别,直接进入垃圾识别功能。 对于AI难以识别的垃圾,公众可以手动输入垃圾信息,与阿里AI共建垃圾分类数据库,而数据库也将上传至云端,并不断自我训练以AI提升识别能力。 事情源于最近大热的垃圾分类话题,阿里多个部门的同学中也在自发的讨论。 基于手淘在图像识别方面的技术积累以及阿里云云原生的开发环境,志愿者们在48小时内快速开发出了这款AI识别垃圾功能。 为了更准确实现AI识别,阿里工程师志愿者们还与公益环保组织合作,紧急搭建了首个互联网垃圾分类数据库。 阿里巴巴产品专家说“他们的初衷是让分类垃圾不再苦恼,变得更有趣、方便一些”。更完善的新版本预计7月底上线。 他们能这么快将想法实现 背后离不开强大的阿里AI技术功底 前不久,阿里AI在第三届图像识别竞赛WebVision中,击败了全世界150多支参赛队伍,获得冠军。 目前,阿里AI不仅能够以超级速度对海量图片进行分类,还能识别超过100万种物理实体,例如5万种植物、1万种鸟、1千种不同型号的车……阿里AI正在帮助人类在线上世界里构建出一双全知全能的“上帝之眼”。 技术无止境,阿里云将实现“AI+5G+云”的深度融合,未来还有更大的想象空间。例如,探索更前沿的AI算法,机器能够自我学习,并具备语音、视觉等多模态交互和感知能力,更精准的识别物体;基于5G,可以充分发挥云边端的协同优势,公共基础设施也具备识别及信息传输能力,实现万物智能。 有温度的AI不止能拿奖 更能解决社会问题 他们不止一次这么做 去年7月,长春长生疫苗事件发生,阿里健康员工自发紧急成立了“疫苗快查”项目组,在20个小时内上线了疫苗快查工具,帮助父母更快排查问题疫苗。 2015年,阿里工程师用业余时间自愿支持研发了互联网打拐的“团圆”系统,三年来,“团圆”系统找回了3901个失踪的孩子,找回率达到98%。 此外,支付宝、天猫精灵、盒马等也推出了不同的垃圾识别功能。 阿里巴巴3小时公益平台将在上海市多个社区开展志愿服务活动,志愿者们将帮助社区阿姨学习使用智能AI进行垃圾分类。网友通过拍立淘识别、分享垃圾分类还可以获得0.1公益时,成为“3小时公益”参与者。 本文作者:阿里云App阅读原文 本文为云栖社区原创内容,未经允许不得转载。

July 9, 2019 · 1 min · jiezi

imageAI图像识别并用python搭建本地服务

imageai是一套开源免费的,可以用于图像智能识别的python应用包,使用门槛不高,基本上按照官方文档去写就可以简单实现利用已经训练好的模型识别图像中的物体。imageai图像预检目前实现了四种模型的算法支持,分别是SqueezeNet,ResNet,InceptionV3 和 DenseNet。不同的包对应的训练模型大小不一致,精度也不一致。 SqueezeNet(文件大小:4.82 MB,预测时间最短,精准度适中)ResNet50 by Microsoft Research (文件大小:98 MB,预测时间较快,精准度高)InceptionV3 by Google Brain team (文件大小:91.6 MB,预测时间慢,精度更高)DenseNet121 by Facebook AI Research (文件大小:31.6 MB,预测时间较慢,精度最高)imageai不仅可以用于图像识别,还可以进行图形对象检测,视频对象预测和跟踪,自定义训练模型等。对于机器学习不够深入的人员非常友好,可以几行代码实现一个AI应用。 更多深入的内容可以查看原文 下面,简单了解一下如何在python本地服务中搭建一个图像识别应用。 安装imageAI的依赖imageAI的依赖python(>=3.5.1)tensorflow(>=1.4.0)Numpy(>=1.13.1)SciPy(>=0.19.1)openCvpillowmatplotlibh5pykeras 若安装好了pip3 可以直接运行 pip3 install tensorflow numpy scipy opencv-python pillow matplotlib h5py keras imageai imageAI的训练模型imageAI支持使用在ImageNet-1000数据集上训练的4种不同的机器学习算法,也支持在CoCo数据集集上训练的对象检测。 图像预检需要下载一个训练模型。 这里就直接使用facebookAI的训练模型DenseNet121。 废话不多说,上代码: from imageai.Prediction import ImagePredictionimport os,jsonexecution_path = os.getcwd() # 当前命令行执行路径prediction = ImagePrediction() # 获取这个图像预测实例prediction.setModelTypeAsDenseNet() # facebook AI,此处要根据下一步加载的模型文件来确立对应的model类型,其他还有setModelTypeAsSqueezeNet(普通) setModelTypeAsResNet(微软模型) setModelTypeAsInceptionV3(谷歌模型),训练识别精确度依次提升,facebook最准确prediction.setModelPath(os.path.join(execution_path, "DenseNet-BC-121-32.h5")) # 加载模型文件,就是刚刚下载好的那个prediction.loadModel(prediction_speed="fast") # 速度调节,如果配置这个则需要使用精确度较高的模型,否则会出现识别率下降的问题predictions, probabilities =prediction.predictImage(os.path.join(execution_path, "test.jpg"), result_count=6) # 对应的图像识别路径,以及相应的返回结果数量predictionDict = {}for eachPrediction, eachProbability in zip(predictions, probabilities): predictionDict[eachPrediction] = eachProbabilityres = json.dumps(predictionDict)print(res) # 输出结果虽然这里设置了"fast",但其实对于单核来说运行速度仍然比较慢,如果你的运行服务器是多核的,可以试试并行计算,把多个核都用起来,效率会有不少提升。代码对应行都有相应注释,看一下打印结果: ...

July 8, 2019 · 2 min · jiezi

智东西公开课干货盘点-全方位解析人脸识别商用落地

近两周虹软携手智能行业第一媒体智东西,共同推出“虹软人脸识别技术公开课”线上直播课程。6月18日,虹软视觉开放平台产品总监徐科带来了第一课《人脸识别技术的商业落地及挑战》,6月25日,虹软视觉开放平台技术总监潘海波又以《如何从0到1快速搭建人脸识别应用》为题带来了第二讲。两节课分别从产品落地以及技术应用角度,全方位剖析了人脸识别商用的各个环节和关键点,好评如潮,累计观看过万,讨论及互动破千,堪称智东西公开课迄今为止最热的一个系列课程。 公开课干货盘点技术革新为落地提供有力支撑 深度学习、边缘计算等技术的革新为人脸识别大规模商业化落地提供了有力支撑。人脸识别相比于指纹、虹膜等其他生物识别方式,具有先天优势,非接触式的交互,可以满足更多的应用场景。现有大量摄像头部署、人脸设备成本的下降等基础设备的完善,也为人脸识别应用提供了有利的条件。技术的革新、国家政策的支撑以及先天优势为人脸识别带来的产业升级提供了非常有利的条件。 人脸识别的原理及应用流程 先通过海量数据,基于深度学习卷积网络训练出人脸特征模型。首先采用光线规整、图像增强、关键点分析、人脸对齐等先进行预处理,检测出人脸后采用训练出来的特征模型进行人脸特征值提取,并对提取出来的特征值进行比对。配合活体检测环节,增加人脸识别的应用安全性。 人脸识别的技术方案选型 针对不同场景,人脸识别算法上可根据不同的场景分为1:1模型或1:N模型,1:1人证核验主要证明你是你,主要应用于车站、机场、大型活动、机关单位、银行、酒店、网吧等人员流动频繁场所,而针对于社区、楼宇、工地、学校等较大规模的人脸考勤签到、人脸通行等应用场景,则可选择1:N的模型,1:N模型主要证明你是谁。虹软ArcFace SDK可以适配以上所有技术方案并100%保护客户隐私。 人脸识别产业链商用落地 人脸识别的产业链看,包含了算法提供商、硬件设备商、应用集成商,即一个人脸识别项目的落地会涉及到算法、硬件以及应用的结合,是三位一体的融合。目前,虹软视觉开放平台已经免费离线开放了人脸识别、人证核验、活体检测SDK,支持Android、Windows、Linux、iOS全平台。工程化上,虹软结合原有手机端上的积累,做了相应的优化,做到高性能、低功耗、低成本。帮助中小企业以最低的成本、快速实现产品的商用落地。 智慧景区解决方案案例 景区外部入口通过1:1人证比对方案,实现无人工核验,并完成人脸注册。景区内部,通过外部系统已经注册的人脸信息进行1:n人脸库实时比对,确认是否放行。针对部分外部通道未成功完成人脸比对的游客,通过内部通道时再次获取现场抓拍照与证件比对,比对成功即上传抓拍照至人脸库。 通过两节课程的介绍,虹软两位讲师系统地解释了人脸识别落地应用的各个环节,目前,人脸识别带来的产业升级也在智慧校园、智慧社区、智慧旅游、智慧楼宇、消费电子、金融等众多不同的领域得到了广泛应用。作为一家资深计算机视觉算法服务提供商和解决方案供应商,也通过虹软视觉开放平台,让大家快速实现产品落地,抓住刷脸时代红利。 对虹软免费的人脸识别算法感兴趣的话可以戳https://ai.arcsoft.com.cn/uce...

July 2, 2019 · 1 min · jiezi

利用百度文字识别API识别图像中的文字

本文将会介绍如何使用百度AI开放平台中的文字识别服务来识别图片中的文字。百度AI开放平台的访问网址为:http://ai.baidu.com/,为了能够使用该平台提供的AI服务,你需要事先注册一个百度账号。 创建百度AI文字识别应用 在百度AI开放平台中,登录自己的百度账号,点击“文字识别”服务中的“通用场景文字识别”,选择“创建应用”,填好应用名称,选择应用类型,填好应用描述,这样就创建好了“通用场景文字识别”服务,如下图: 在应用列表中,能够看到自己刚刚创建好的文字识别服务了,记住,这个应用中的“AppID”,“API Key”,“Secret Key”很重要,是你这个应用的唯一识别。 OK,创建好这个应用后,我们就能使用该应用来识别图片中的文字了~ 利用创建的应用来识别图片中的文字 接下来,我们将使用刚刚创建好的文字识别应用来识别图片中的文字,大致的步骤如下: 获取该应用的access_token;利用access_token来创建HTTP请求;解析请求成功后的json文件,获取识别后的结果。具体的参考文档可以参考网址:https://ai.baidu.com/docs#/OCR-API/top, 本文将不再具体讲述。 我们需要识别的图片为含有两个汉字的图片验证码,图片名称为test.png,如下: 参考该应用的官方文档说明,我们写下如下的Python脚本,即可识别图片中的文字,完整的代码如下: import jsonimport requestsimport base64import urllib.parseAPP_ID = '你的APP_ID'API_KEY ='你的API_KEY'SECRECT_KEY = '你的SECRECT_KEY'# 获取tokenurl = 'https://aip.baidubce.com/oauth/2.0/token'body = {'grant_type': 'client_credentials', 'client_id': API_KEY, 'client_secret': SECRECT_KEY }req = requests.post(url=url, data=body)token = json.loads(req.content)['access_token']# 获取百度api识别结果ocr_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=%s'%tokenheaders = {'Content-Type': 'application/x-www-form-urlencoded'}# 读取图片并进行base64加密body = base64.b64encode(open('./test.png' ,'rb').read())# 进行urlencodedata = urllib.parse.urlencode({'image': body})# post请求r = requests.post(url=ocr_url, headers=headers, data=data)# 输出请求结果print('请求码为: %s' %r.status_code)res_words = json.loads(r.content)['words_result'][0]['words']print('识别结果为: %s' % res_words)输出的结果如下: ...

May 11, 2019 · 1 min · jiezi

云+技术沙龙:计算机视觉的原理及最佳实践

还记得当年火爆朋友圈的军装照小应用吗?它背后的人脸融合技术,以及未来人脸融合的新趋势,你一定不能错过! 如何能够搭建一套有效稳定的图像识别系统呢? 如何通过使用腾讯云API搭建自己的图像识别应用? 腾讯人脸识别技术在交通、零售、安防等传统领域的实际应用场景和解决方案,以及教育行业文字识别技术难点与应用,人脸核身技术原理与行业应用,这些统统都有! 那么,作为一名开发者,该如何开发设计出关于AI计算机视觉方面的应用呢? 本期沙龙将从构建图像识别系统的方法切入,讲述腾讯云人脸识别、文字识别、人脸核身等技术能力原理与行业应用,给你带来一场人工智能领域的技术开拓实践之旅。搜索关注公众号“云加社区”,获取更多沙龙活动,学习最新技术干货!点击报名

April 1, 2019 · 1 min · jiezi

OCR 图像矫正

OCR(Optical Character Recognition,光学字符识别)是指电子设备检查纸上字符然后用字符识别方法将形状翻译成计算机文字的过程;采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。一般来说,OCR分为分割和识别两个部分。此文将探讨分割问题。通常我们第一步是将用户传入的照片进行扫描,提取待识别的区域,也就如图下面将文件抠出来。 具体步骤:(1)获取文件轮廓(2)获取文件四角的点坐标(3)透视变换导入库import numpy as npimport cv2import matplotlib.pyplot as pltimport math请输入代码获取文件轮廓image = cv2.imread(‘原始照片.jpg’) #读原始照片gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #二值化gray = cv2.GaussianBlur(gray, (5, 5), 0) #高斯滤波kernel = np.ones((3,3),np.uint8) dilation = cv2.dilate(gray,kernel) #膨胀edged = cv2.Canny(dilation, 30, 120) #边缘提取_, cnts, hierarchy = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)cv2.drawContours(image,cnts,-1,(0,0,255),3)获取文件四角点的坐标cnts0=cnts[0]cnts1=cnts[1]rect = np.zeros((4,2), dtype=“float32”)rect[0] = cnts1[np.argmin(np.sum(cnts1,axis=-1))]rect[2] = cnts0[np.argmax(np.sum(cnts0,axis=-1))]rect[1] = cnts1[np.argmin(np.diff(cnts1,axis=-1))]rect[3] = cnts0[np.argmax(np.diff(cnts0,axis=-1))]四角点的顺序:左上,右上,右下,左下左上坐标和最小,右下坐标和最大右上坐标差最小,左下坐标差最大(Y-X)根据四角点坐标求矫正后图像的尺寸(tl,tr,br,bl) = rect width1 = np.sqrt(((tr[0]-tl[0])**2)+((tr[1]-tl[1])**2))width2 = np.sqrt(((br[0]-bl[0])**2)+((br[1]-bl[1])**2))width = max(int(width1),int(width2)) height1 = np.sqrt(((tr[0]-br[0])**2)+((tr[1]-br[1])**2))height2 = np.sqrt(((tl[0]-bl[0])**2)+((tl[1]-bl[1])**2))height = max(int(height1),int(height2)) dst = np.array([ [0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]], dtype = “float32”)透视变换M = cv2.getPerspectiveTransform(rect, dst)warped = cv2.warpPerspective(image, M, (width, height)) ...

March 19, 2019 · 1 min · jiezi

tesseract-OCR 图像识别插件 node-tesr 了解一下?

前言该项目诞生于一次爬虫事件,当时一时兴起想把某租房网信息爬下来,前面进行的还是挺顺畅的,但是在租房价格信息上被摆了一道,房屋的价格信息为一个数字图片为底加上偏移量来显示的,和雪碧图一样的实现方式,当然,其中加上了一点小算法,具体如下。获取数字图片信息和 offset 信息{ “offset”: [ [1, 4, 2, 8], [5, 1, 7, 8], [5, 1, 3, 8], … ] }由 offset 信息加上一点算法得出 position 信息(background-position: xxx px)以数字图片为背景,加上偏移,append 到价格信息他应该在地方略一思索,倒也不是什么大事儿,只要加个识别的过程再辅以算法即可。在实行图像识别的过程中借助到了 google 的开源软件 tesseract-OCR,因为爬虫环境是 node,遂写了一个适用于 tesseract-OCR 最新版本的 node 插件,后续还添加了命令行使用的功能。演示命令行使用 — 1命令行使用 — 2模块使用 — 1项目在这里如果觉得我对你有帮助,不妨给我个 star 吧,蟹蟹~github node-tesr正文命令行使用想要使用图像识别首先要确保电脑中已经安装了 tesseract-OCR 点击下载。想要使用命令行建议全局安装npm install node-tesr -gtesr –from=./test/output.jpg –to=./output.txt参数说明–from 需要识别的图片路径(必须)–to 若传入此参数会将识别的文字输出到该文件下(非必须,默认会将识别内容输出到命令行)–l 识别语言,对中文稍微做了点处理,识别简体 –l=chs,识别繁体 –l=cht(非必须,默认为 eng)–p 见 lib/config.js 里的说明(非必须,默认为 3 自动模式)–o 见 lib/config.js 里的说明(非必须,默认为 3 自动模式)模块引入使用npm install node-tesrconst tesseract = require(’node-tesr’)tesseract(’./output.jpg’, { l: ’eng’, oem: 3, psm: 3 }, function(err, data) { // 此处获得识别内容 console.log(data)})// 或者如下也可tesseract(’./output.jpg’, function(err, data) { // 此处获得识别内容 console.log(data)})后语效果经测试效果还是不错的,但是有一点需要注意一下,上面提到该网站的数字图片是透明底的,测试发现 tesseract-OCR 对透明底的似乎无解,这个时候就需要结合一下 images 这个 node 插件let images = require(‘images’)images(500, 100) .fill(0xff, 0xff, 0xff, 1) .draw(images(‘demo.png’), 10, 10) .save(‘output.jpg’, { quality: 100 })将透明底填充为白底即可正常识别如何提高我的图像识别准确率老板!我的图像识别率很低怎么破!来,看这里,这个可以提高图像识别率。识别算法学习待办增加网络地址图片也可识别的功能使用 then 来处理回调页脚代码即人生,我甘之如饴。我在这里 gayhub@jsjzh 欢迎大家来找我玩儿。欢迎小伙伴们直接加我,拉你进群一起学习前端呀,记得备注一下你来自哪里哦。 ...

March 14, 2019 · 1 min · jiezi

阿里云RPA(机器人流程自动化)干货系列之二:认识RPA(下)

导读:本文是阿里云RPA(机器人流程自动化)干货系列之二,主要介绍了RPA的发展齐纳经和主要使用场景有哪些,目前国内外主流的RPA厂商以及RPA的未来在哪。一、RPA的发展前景根据Gartner的最新研究,2018年全球机器人流程自动化(RPA)软件的开支预计将达到6.8亿美元,同比增长57%,到2022年支出达到24亿美元。Gartner副总裁CathyTornbohm表示:“最终用户组织把RPA技术作为手动任务自动化的一种快速简便的方法。一些员工将继续执行那些要求他们手动剪切、粘贴和更改数据的日常任务。但是当RPA工具执行这些操作时,误差率会降低,数据质量会提高。”如今,RPA最主要的应用领域包括电商、财务/税务、银行、制造业、新零售、保险、物流、政府、公安等各行各业。Tornbohm表示:“通常,这些组织很难将财务和HR系统等不同元素结合在一起,他们正在转向采用RPA解决方案,实现现有的手动任务或流程的自动化,或者传统系统功能的自动化。”RPA工具结合使用多种用户界面交互描述技术,模仿人类工作者完成任务所去采取的“手动”路径。目前试产各种有广泛的解决方案,有很多工具可以在单个台式机或企业服务器上运行。Gartner估计,到2018年年底60%收入超过10亿美元的企业组织将部署RPA工具。到2022年底,85%的大型和超大型组织将部署某种形式的RPA。Tornbohm表示:“到2019年,随着采用率的提高,以及企业组织系统通过该技术实现更好的业务成果,例如降低成本、提高准确性、提高合规性,RPA的平均价格会下降10%至15%。”二、RPA的应用领域有哪些?目前的国内外RPA技术的应用已经日趋成熟,该技术的应用可让企业员工通过开发RPA机器人应用来捕获现有应用程序处理交易,操纵数据,与其他信息系统进行通信等,任何采用大规模人力执行的大量重复性工作,现在都可以由RPA机器人代劳,节省人力、金钱和时间。正如工业机器人是由创造更高的生产率和质量来提高和改造制造业,RPA机器人正在彻底改变我们对管理业务流程的认知,包括业务流程、工作流程、远程基础架构和后台的工作方式,显著改善工作的精确度和周期时间,并提高在企业事务处理上的生产效率。RPA的应用场景需要符合两大要点:大量重复(让RPA有必要)、规则明确(让RPA有可能)。在此基础上,RPA软件机器人可以应用于任何行业和业务场景,例如:应用于财务领域,RPA=财务机器人,用来实现财务处理自动化;应用于税务领域,RPA=税务机器人,用来实现税务处理自动化;应用于政府部门,RPA=政务机器人,用来实现政务处理自动化;应用于保险领域,RPA=保险机器人,用来实现保险业务自动化;应用于医疗领域,RPA=医疗机器人,用来实现医院业务自动化;应用于银行领域,RPA=银行机器人,用来实现银行业务自动化;应用于物流领域,RPA=物流机器人,用来实现物流业务自动化;应用于供应链,RPA=供应链机器人,用来实现供应链管理自动化;应用于销售链,RPA=销售链机器人,用来实现销售链管理自动化;应用于HR,RPA=HR机器人,用来实现企业人力资源管理自动化;应用于IT,RPA=IT机器人,用来实现企业IT工作自动化;等等三、国内外主流RPA厂商1)Blue prismBlue Prism(简称BP)是RPA领域的先行者,机器人流程自动化(RPA)这个术语就是由Blue Prism率先提出的。公司成立于2001年,是一家英国跨国软件公司,Blue Prism已经得到美国IT研究和咨询公司Gartner的认可,他们已经在全球拥有超过200个客户,并与NHS、埃森哲、Hexaware、Hewlett Packard Enterprise、Capgemini、IBM等大型巨头合作。目前Blue Prism产品已经更新到V6版本,正在和最新的人工智能产品进行不断整合和吸收。2)UipathUiPath是一家成立于2005年的全球软件公司,致力于开发机器人流程自动化(RPA)平台,是RPA领域的独角兽,他们与SAP、安永(EY)、J.P.Morgan、德勤(Deloitte)、埃森哲(Accenture)、凯捷(Capgemini)、BBC等公司已有合作关系。以下是UiPath提供的3个机器人过程自动化产品:UiPath StudioUiPath RobotsUiPath Orchestrator3)Automation AnywhereAutomation Anywhere(简称AA)是目前很强大、用户范围最大的RPA供应商,提供强大的、用户友好的RPA工具去处理复杂的任务。他们与EMC2、毕马威(KPMG),德勤(Deloitte)、埃森哲(Accenture)、 简柏特(Genpact)、印孚瑟斯(Infosys) 等公司合作。2017年7月IBM和Automation Anywhere宣布合作,助力企业简化运营,将交付IBM RPA和BPM。4)NICENICE是RPA业内领先的解决方案提供商,也有一些成功的案例。在NICE的官网上,有很多的白皮书及高质量的与RPA相关的博客,可以通过这些电子资料,了解更多干预机器人流程自动化相关的业务和案例。5)WorkFusionWorkFusion是一家致力于开发人工智能软件产品来改造工作的软件公司。公司总部位于纽约华尔街,在印度、美国和欧洲设有分支机构。主要的业务就是机器人流程自动化、人工智能和认知自动化。6)艺赛旗成立于2011年,总部位于上海,是一家做机器人流程自动化iS-RPA( i-Search Robotic Process Automation)产品、UEBA(User and Entity Behavior Analytics)和双录系统解决方案(CSM:Counter Service Monitor)的软件厂商,为客户提供企业内部数据跨平台整合、云安全管理、大数据安全分析、用户行为收集分析、应用操作录屏审计、客服行为可视化质检、银行柜面交易监控及分析。7)阿里云RPA2011年诞生于阿里巴巴集团淘宝平台,普遍赋能集团内部,如天猫、淘宝、飞猪、集团财务、菜鸟、蚂蚁金服等,曾经获得淘宝年度创新奖和集团特殊贡献奖。2016年正式上线后,已为电商、金融、制造、政务等多个领域输出行业解决方案,平均提高效能500%。目前阿里云RPA发布了3.0版本,采用python开发引擎,拥有强大的控件录制功能、丰富的SDK能力以及更私密的数据安全措施,并且在与Office相关的控件上有自己独特的优势。四、RPA的未来都说“未来已来”,RPA作为一种软件机器人,既然是“人”,那么就应该有眼睛、耳朵、嘴巴、有手,有脑袋,利用人工智能领域目前相对成熟的技术,RPA机器人就具有了类似于人的这些功能:眼睛,利用OCR、图像识别、语义识别等技术,RPA机器人可以“阅读”打印和手写的文字,实现例如发票识别,身份证识别,银行卡识别等功能,在过去两年我的团队已经开发了利用Google OCR和微软认知服务实现图像识别和文字识别功能。耳朵,利用语音识别技术,RPA机器人可以“听懂”人类对话,结合语义识别技术就可以实现例如会议记录(文字),实时翻译等功能,目前我的团队已经开发了利用微软认知服务实现语音识别和实时翻译的功能。嘴巴,利用语音合成技术,RPA机器人可以“说话”,结合语音识别和语义识别技术就可以实现例如职能导游,智能导购,智能Help Desk服务等功能;在2017年我的团队开发了一款Office机器人,具有声音提醒功能;手脚,利用机器手臂、自动驾驶等技术,RPA机器人可以“行动”,结合机器学习等技术就可以实现例如无人驾驶,无人物流,无人工厂等;同上,在2017年我的团队开发了一款Office机器人,具有在桌面上移动、转动头部和手臂的功能;脑袋,利用统计分析、机器学习等人工智能技术,RPA机器人就真正具有了智能可以像人一样“思考、学习和决策”。目前这些单项的技术已经相对成熟了,RPA可以将这些散落的珍珠串成美丽的项链,以客户可以承受的价格戴在企业的脖子上,使其以更加优雅的姿态参与到日益严酷的市场竞争中去,占据先机,成就未来。在Gartner公布的2018年人工智能技术成熟度曲线中,RPA工具目前位于膨胀期望的峰值,企业组织寻求利用RPA削减成本、连接传统应用、以及实现高投资回报率。但是,实现强大投资回报率的潜力完全取决于RPA是否符合个别组织的需求。“在短期内,我们预计会有越来越多的RPA厂商以及软件厂商越来越感兴趣,其中包括希望从这些功能中获得收益的软件测试厂商和业务流程管理厂商。”此外,另一个市场趋势正在出现:将人工智能功能集成到产品套件中,这是因为RPA提供商添加或集成了机器学习和AI技术,以提供更多类型的自动化。本文作者:琰珉阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 13, 2019 · 1 min · jiezi

google-colab平台训练模型案例

数据集介绍数据集来自Kaggle,质量很高,由知名医院的专业人员严格审核标注,如图所示数据有4种类别:CNV:具有新生血管膜和相关视网膜下液的脉络膜新血管形成DME:糖尿病性黄斑水肿与视网膜增厚相关的视网膜内液DRUSEN:早期AMD中存在多个玻璃疣NORMAL:视网膜正常,没有任何视网膜液或水肿文件大小约为5GB,8万多张图像,分为训练,测试,验证三个文件夹,每个文件夹按照种类不同分成4个子文件夹,其次是具体图像文件。数据集下载挂载文件夹:from google.colab import drivedrive.mount(’/content/gdrive/’)按照提示进行验证,结果如下:kaggle数据下载:创建kaggle账户并下载kaggle.json文件。创建账户这里就不介绍了,创建完账户后在“我的账户”-“API”中选择“CREATE NEW API TOKEN”,然后下载kaggle.json文件。创建kaggle文件夹:!mkdir -p ~/.kaggle将kaggle.json文件夹复制到指定文件夹:!cp /content/gdrive/My\ Drive/kaggle.json ~/.kaggle/测试是否成功:!kaggle competitions list下载数据集:!kaggle datasets download -d paultimothymooney/kermany2018解压文件:!unzip “/content/kermany2018.zip"将文件解压至google云盘:!unzip “/content/OCT2017.zip” -d “/content/gdrive/My Drive"数据读取训练,测试文件夹:import ostrain_folder = os.path.join(’/’,‘content’,‘gdrive’,‘My Drive’,‘OCT’, ’train’, ‘’, ‘*.jpeg’)test_folder = os.path.join(’/’,‘content’,‘gdrive’,‘My Drive’,‘OCT’, ’test’, ‘’, ‘.jpeg’)有人不知道这里的“ ** ”什么意思,我举例说明吧:Example: If we had the following files on our filesystem: - /path/to/dir/a.txt - /path/to/dir/b.py - /path/to/dir/c.py If we pass “/path/to/dir/.py” as the directory, the dataset would produce: - /path/to/dir/b.py - /path/to/dir/c.py数据处理def input_fn(file_pattern, labels, image_size=(224,224), shuffle=False, batch_size=64, num_epochs=None, buffer_size=4096, prefetch_buffer_size=None): table = tf.contrib.lookup.index_table_from_tensor(mapping=tf.constant(labels)) num_classes = len(labels) def _map_func(filename): label = tf.string_split([filename], delimiter=os.sep).values[-2] image = tf.image.decode_jpeg(tf.read_file(filename), channels=3) image = tf.image.convert_image_dtype(image, dtype=tf.float32) # vgg16模型图像输入shape image = tf.image.resize_images(image, size=image_size) return (image, tf.one_hot(table.lookup(label), num_classes)) dataset = tf.data.Dataset.list_files(file_pattern, shuffle=shuffle) # tensorflow2.0以后tf.contrib模块就不再维护了 if num_epochs is not None and shuffle: dataset = dataset.apply(tf.contrib.data.shuffle_and_repeat(buffer_size, num_epochs)) elif shuffle: dataset = dataset.shuffle(buffer_size) elif num_epochs is not None: dataset = dataset.repeat(num_epochs) # map默认是序列的处理数据,取消序列可加快数据处理 dataset = dataset.apply( tf.contrib.data.map_and_batch(map_func=_map_func, batch_size=batch_size, num_parallel_calls=os.cpu_count())) # prefetch数据预读取,合理利用CPU和GPU的空闲时间 dataset = dataset.prefetch(buffer_size=prefetch_buffer_size) return dataset模型训练import tensorflow as tfimport os# 设置log显示等级tf.logging.set_verbosity(tf.logging.INFO)# 数据集标签labels = [‘CNV’, ‘DME’, ‘DRUSEN’, ‘NORMAL’]# include_top:不包含最后3个全连接层keras_vgg16 = tf.keras.applications.VGG16(input_shape=(224,224,3), include_top=False)output = keras_vgg16.outputoutput = tf.keras.layers.Flatten()(output)predictions = tf.keras.layers.Dense(len(labels), activation=tf.nn.softmax)(output)model = tf.keras.Model(inputs=keras_vgg16.input, outputs=predictions)for layer in keras_vgg16.layers[:-4]: layer.trainable = False optimizer = tf.train.AdamOptimizer()model.compile(loss=‘categorical_crossentropy’, optimizer=optimizer, metrics=[‘accuracy’]) est_config=tf.estimator.RunConfig(log_step_count_steps=10)estimator = tf.keras.estimator.model_to_estimator(model,model_dir=’/content/gdrive/My Drive/estlogs’,config=est_config)BATCH_SIZE = 32EPOCHS = 2estimator.train(input_fn=lambda:input_fn(test_folder, labels, shuffle=True, batch_size=BATCH_SIZE, buffer_size=2048, num_epochs=EPOCHS, prefetch_buffer_size=4)) ...

February 25, 2019 · 1 min · jiezi

使用DeepLab进行语义分割

介绍DeepLab是谷歌使用tensorflow基于CNN开发的语义分割模型,至今已更新4个版本。最新版本是DeepLabv3+,在此模型中进一步将深度可分离卷积应用到孔空间金字塔池化和解码器模块,从而形成更快,更强大的语义分割编码器-解码器网络。本文从官方案例出发,介绍如何训练以及使用DeepLabv3+模型。模型安装1,下载tensorflow model,然后将解压后的文件重命名为”models“并移动到tensorflow文件夹下。2,添加环境变量cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchexport PYTHONPATH=$PYTHONPATH:pwd:pwd/slim3,测试是否安装成功cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/model_test.py结果出现如下错误:解决方法如下:准备数据下载数据:cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplab/datasets/sh download_and_convert_voc2012.sh具体执行步骤:下载并解压VOC2012数据集移除colormap在数据集中创建TFRecord文件下载预训练模型官方提供了多种模型,可以根据自己的实际需求下载安装。使用PASCAL VOC2012数据集训练文件结构:tensorflow deeplab文件夹:训练:cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research填写相关路径,执行训练python deeplab/train.py \ –logtostderr \ –training_number_of_steps=30000 \ –train_split=“train” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –train_crop_size=513 \ –train_crop_size=513 \ –train_batch_size=1 \ –dataset=“pascal_voc_seg” \ –tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \ –train_logdir=${PATH_TO_TRAIN_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_INITIAL_CHECKPOINT:初始checkpoint文件路径(迁移学习)PATH_TO_TRAIN_DIR:训练模型保存路径PATH_TO_DATASET:数据集路径需要注意的问题:当GPU显存不够,使用迁移学习方式进行训练并减少学习率大小,设置”fine_tune_batch_norm=False“当设置”output_stride=8“,”atrous_rates“取值区间应由[6,12,18]改为[12,24,36]。当不想使用解码器结构,需要注释掉”decoder_output_stride“。验证cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/eval.py \ –logtostderr \ –eval_split=“val” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –eval_crop_size=513 \ –eval_crop_size=513 \ –dataset=“pascal_voc_seg” \ –checkpoint_dir=${PATH_TO_CHECKPOINT} \ –eval_logdir=${PATH_TO_EVAL_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径PATH_TO_EVAL_DIR:评估模型保存路径PATH_TO_DATASET:数据集路径可视化模型输出cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/vis.py \ –logtostderr \ –vis_split=“val” \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –vis_crop_size=513 \ –vis_crop_size=513 \ –dataset=“pascal_voc_seg” \ –checkpoint_dir=${PATH_TO_CHECKPOINT} \ –vis_logdir=${PATH_TO_VIS_DIR} \ –dataset_dir=${PATH_TO_DATASET}PATH_TO_CHECKPOINT:训练阶段checkpoint文件路径PATH_TO_VIS_DIR:评估模型保存路径PATH_TO_DATASET:数据集路径需要注意的问题:当需要保存分割结果时,需要设置”also_save_raw_predictions = True“Tensorboardtensorboard –logdir=${PATH_TO_LOG_DIRECTORY}将同时显示”train“,”eval“,”vis“结果,如需要单独显示一类,可以指定显示类别,如:tensorboard –logdir train/对于voc2012这样的数据集,Tensorboard显示数据可能需要几分钟的时间。模型导出cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/researchpython deeplab/export_model.py \ –logtostderr \ –checkpoint_path="${PATH_TO_CHECKPOINT}" \ –export_path="${PATH_TO_EXPORT_PD}" \ –model_variant=“xception_65” \ –atrous_rates=6 \ –atrous_rates=12 \ –atrous_rates=18 \ –output_stride=16 \ –decoder_output_stride=4 \ –num_classes=21 \ –crop_size=513 \ –crop_size=513 \ –inference_scales=1.0PATH_TO_CHECKPOINT:checkpoint文件路径PATH_TO_EXPORT_PD:导出PD文件路径(加后缀.pd)案例cd /anaconda3/lib/python3.6/site-packages/tensorflow/models/research/deeplabsh local_test.shGoogle Colab在线测试地址,可选择预训练模型,测试分割照片来查看模型输出结果。总结基于深度学习的语义分割与传统基于随机森林的方法相比有了很大的进步,虽然目前基于深度学习的方法有多种思路,不过基本都是基于全卷积(FCN)衍变而来。FCN将网络全连接层使用卷积替代,因此可以接受任意大小的输入并且针对下采样存在位置信息丢失等问题,采用转置卷积用于恢复图片尺寸,方便后续进行逐像素预测。DeepLab模型为了改善分割效果,使用atrous卷积(空洞卷积),ASPP,全连接条件随机场等技术。 ...

January 21, 2019 · 1 min · jiezi

计算机如何在图像识别领域取得惊人突破

原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译者 李平海图片如无标示亦出自原文文末附有专业词汇对照表囿于专业知识水平,译文如有不达之处,望留言斧正。如今,我可以在GooglePhotos里输入“沙滩”,就可以看到过去一段时间里我去过的各个沙滩。我并没有管理过我的照片,给它们打标签。实际上是Google根据照片内容识别出沙滩。这个看似普通的功能基于深度卷积神经网络技术,此技术允许软件以一种复杂的方式理解图像,这是以前的技术做不到的。这些年来研究人员发现,随着他们建立更深层的网络,积累更大的数据集来训练它们,软件的准确性越来越高。这导致了对算力的需求几乎无法满足,让英伟达(Nvidia)和AMD等GPU制造商大赚一笔。Google几年前开发了自己定制的神经网络芯片,其他公司争相效仿。例如在特斯拉,深度学习专家Andrej Karpathy被任命为负责自动驾驶项目。这家汽车制造商在开发定制的芯片,以加速未来的自动驾驶版本中的神经网络操作。又例如苹果公司,最近几款的iPhone中的A11/A12芯片就包含“神经引擎”,可以加速神经网络运行,以提供更好的图像识别/语音识别应用。那些我为了写本文而采访的专家们认为,如今深度学习的热潮可以追溯到一篇专业论文——AlexNet(以该文首要作者Alex Krizhevsky的昵称命名)。“在我看来,AlexNet论文发表的2012年可谓里程碑。”机器学习专家、《智能机器如何思考》(How Smart Machines Think)作者Sean Gerrish如是说。2012年之前,深度神经网络只是机器学习领域中的死水泥潭。但随即Krizhevsky和他的多伦多大学团队向一个备受瞩目的图像识别竞赛提交了作品,准确率突破性地超越了以往任何技术。一夜之间,深度神经网络成为了图像识别的领衔技术。其他研究人员很快地利用这项技术使图像识别精度飞跃发展。在这篇文章中,我们将深入探讨深度学习。我会解释神经网络究竟是什么,它如何被训练,以及它为什么需要那么大的算力。然后我将解释一种特殊神经网络——深层卷积网络——为什么它特别擅长理解图像。别担心,我们会有很多配图。简单的单神经元的例子“神经网络”这个词可能比较含糊,让我们从一个简单例子开始吧。假设你想要一个根据红绿黄交通灯决定车子是否能走的神经网络。此神经网络可以用一个神经元来完成这项任务。这个神经元接收每个输入(1代表打开,0代表关闭),乘以各自权重(weight),并且把加权值(weighted value)相加。然后此神经元会加上偏置(bias),这决定了神经元“激活(activate)”的阈值。此情况下如果输出值为正,我们认为此神经元“激活”了,否则没“激活”。这个神经元相当于不等式“green - red - 0.5 > 0”。如果计算结果为true,就意味着绿灯亮了,红灯灭了,车子可以通过。在真正的神经网络中,虚拟神经元会有额外的一步。在加权值加上偏置求和后,神经元会调用非线性激活函数(Non-linear activation function)。一种流行的做法是sigmoid函数,一个S型函数,它总是产生一个0~1间的值。在我们简单的交通灯模型中,使用激活函数并不会改变结果(但不能用0,例子中我们用0.5)。但激活函数的非线性是让神经网络模拟更复杂函数的关键。没有了激活函数,无论多复杂的神经网络都可以简化为它的输入的线性组合。而且线性函数不可能模拟复杂的真实现象。非线性激活函数可以让神经网络更接近任何数学函数。一个神经网络样例当然,有很多办法可以近似函数。神经网络之所以特别,是因为我们知道如何用一些算式,一堆数据,以及海量算力来“训练”它们。我们可以建造一个合适的通用神经网络来替代用人类程序员专门写来执行特定任务的神经网络。刷过一堆打过标签的数据后,它会修改神经网络本身,让自己能尽可能打出正确的标签。我们希望得出的神经网络具有通用性,能为不在训练数据中的样本也正确地打标签。在AlexNet发表之前,这个努力已经开始了。1986年,三位研究人员发表了一篇关于反向传播(backpropagation)的里程碑式论文。该技术是一种有助于训练复杂神经网络的数学方法。为了直观地了解反向传播如何工作,让我们来看看Michael Nielsen在他杰出的在线深度学习教程中描述的一个简单神经网络。目标是让神经网络从28X28像素的图片上正确地识别一个手写的数字(例如0,1,2)。每个图片有28x28=784个输入值,每个都用0或1代表这个像素是深色还是浅色。Nielsen 构建了一个这样的神经网络:插图里中层和右层每个圆圈代表我们上一段说的那种神经元。每个神经元为输入值加权求平均,然后加上偏置,然后调用一个激活函数。值得注意的是左层的圆圈不是神经元,它们代表的是输入值。虽然只画了8个输入圈,但实际上有784个输入——每个代表一个像素。右层的10个神经元代表“亮灯”猜测不同的数字:假如是0,首个神经元应该被激活(其他神经元不激活),假如是1则是第二个神经元被激活(其余的不激活),如此类推。每个神经元接收上一层所有神经元的输入。所以中层的15个神经元都是收784个输入值。它们每个都为784个输入值设置权重。这意味着在此层有15X784=11760个权重参数。同理,输出层有10个神经元,每个都从中层的15个神经元接收输入值,所以又多了1510个权重参数。与此同时,整个网络25个神经元共有25个偏置。训练神经网络我们目标是调整这11935个参数,尽可能正确地得让代表对应手写数字的输出神经元亮灯。我们可以用一个叫MNIST的著名数据集来训练,它提供了60000个已经正确标注的28X28像素图像:此图是 MNIST 数据集里60000个图像种的160个Nielsen 示范了如何不依赖任何机器学习库,仅用74行正常Python代码来训练这个神经网络。训练从选取11935个随机的权重/偏置参数开始。软件将遍历每张图片样本,完成两步过程:根据输入图像和网络的当前参数,前馈步骤计算网络的输出值。反向传播步骤将计算结果与正确输出值的偏差,然后修改网络种的参数,以略微提高其在特定输入图像上的性能。下例中,假设网络收到了这张图片:如果网络经过良好调校,网络中“7”的输出值应该接近1,其他9个输出值应该都接近0。但假如收到此图时“0”值是0.8。那就太离谱了!训练算法会改变输入“0”输出神经元的各个权重,好让下次输入这张图片时,输出值会更接近0。为此,反向传播算法会为各个权重参数算出一个误差梯度。这是一个衡量输出错误有多大程度被输入权重所被改变的维度。算法会依照这个梯度决定多大程度改变每个输入值的权重——梯度越大,这个参数修改越多。换句话说,这个训练过程“教会”输出神经元更少地注意导向错误的输入方(即中层的神经元),更多地注意正确方向的输入方。算法一直为每个输出神经元重复此步骤。它将降低 “1,” “2,” “3,” “4,” “5,” “6," “8,” 和 “9” 神经元(除了神经元“7”)的输入方的权重,使输出神经元的值降低。输入值越大,反映此输入值的权重参数的误差梯度就越大,因此这个权重会减少越多。同理,训练算法会增加输出神经元“7”的输入值的权重。令下次遇到这个图像时,此神经元会产生更大的输出值。同样的,输入值越大,加权后的增加值也越大,这使得输出神经元“7”在以后的几轮学习中更加关注这些输入。接下来,算法需要对中层执行相同的计算:改变每个输入值的权重以减少网络的错误——同样,使“7”输出更接近1,其他输出更接近0。但每个中层神经元都会对向全部10个输出层神经元进行输出,这会导致两个方向的矛盾。首先,中层的误差梯度,不仅仅取决于输入值,也同时取决于下一层的误差梯度。这个算法之所以被称为反向传播,是因为网络里后层的误差梯度会反向传到前面层级(沿着算式中的关系链)并用来计算梯度。同时,每个中层神经元也是全部10个输出层神经元的输入源。因此,训练算法计算的误差梯度,必须反映输入权重的变化如何影响所有输出的平均误差。反向传播是一种爬坡算法:该算法的每一轮都会使输出结果更接近训练图像的正确结果,但只会更接近一点。随着算法经历越来越多的样本,它会“爬坡”到一个最优参数集,该参数集能够正确地分类尽可能多的训练样本。要获得较高的准确率,需要成千上万的训练样本,算法可能需要对训练集中的每个图像进行数十次循环,才能达到最优。Nielsen展示了如何用74行Python代码实现上述所言。值得注意的是,使用这个简单程序训练的神经网络能够识别MNIST数据库中95%以上的手写数字。通过一些额外的改进,像这样一个简单的两层神经网络能够识别98%以上的数字。AlexNet的突破你可能以为,上世纪80年代反向传播的发展会开启一段基于神经网络的机器学习的快速发展时期,但事实并非如此。在90年代和21世纪初,有一些人在研究这项技术。但对神经网络的热潮直到2010年代初才真正兴起。我们可以在由斯坦福大学计算机科学家李飞飞组织的年度机器学习竞赛《ImageNet》的结果中看到这一点。在每年的比赛中,参赛者都会得到一组由100多万张训练图片组成的通用图片,每张图片上都手工标注着1000种可能的分类,比如“消防车”、“蘑菇”或“猎豹”。参赛者的软件根据其对未被纳入训练集的其他图像进行分类的能力进行评判。程序可以进行多次猜测,如果前五次对图像的猜测中有一次与人类选择的标签相匹配,则该软件被认为是成功的。比赛从2010年开始举办,在前两届比赛中,深度神经网络并没有发挥主要作用。顶级团队使用了各种其他机器学习技术,但结果平平无奇。2010年获胜的那支球队,top5错误率(即五轮皆猜错)为28%。2011年度则是25%。然后就到了2012年。这个来自多伦多大学的团队提交了一份参赛作品,不啻于将选手们从死水泥潭中拖出。该参赛作品即后来以主要作者Alex krizhevsky名字命名的AlexNet。通过使用深度神经网络,该研究小组获得了16%的top5错误率。当年最接近的竞对手错误率达到26%。前文所说的手写识别网络有两层,25个神经元,以及将近12000个参数。AlexNet更大更复杂:8个可训练的层、65万个神经元和6000万个参数。训练这样规模的网络需要大量的算力,而AlexNet的设计就是利用现代GPU提供的大量并行算力。研究人员想出了如何在两个GPU之间分配网络训练的工作,从而使他们的算力提高了一倍。尽管进行了积极的优化,使用2012年水平的硬件(两个Nvidia GTX 580 GPU,每个有3GB内存)对网络训练依然耗费了5到6天。看看AlexNet结果的一些例子,对我们理解这是一个多么引人瞩目的突破很有帮助。以下是那篇论文的插图,展示了一些图片样本和AlexNet对应的top5分类猜测:AlexNet能够识别出第一张图片中包含了一只螨虫,尽管这只螨虫只是图片边缘的一小块。该软件不仅能正确识别美洲豹,它的其他先行猜测——美洲虎、猎豹、雪豹和埃及猫——都长得很像。AlexNet将蘑菇的图片标注为“伞菌”——蘑菇的一种。官方正确的标签“蘑菇”是AlexNet的第二选择。AlexNet的“错误结果”同样令人惊讶。照片上,一只斑点狗站在樱桃后面,旁边写着“斑点狗”,而官方的标签是“樱桃”。AlexNet意识到这张照片上有某种水果——“葡萄”和“接骨木果”是它的前五种选择——但它没有完全意识到它们是樱桃。给AlexNet展示一张马达加斯加猫在树上的照片,它会猜一系列的小型爬树哺乳动物。很多人(包括我)都会同样地猜错。这确实是一个引人瞩目的表现,表明软件可以识别各种方向和排布中的常见对象。深度神经网络迅速成为图像识别任务中最受欢迎的技术,机器学习的世界从此迈上快车道不回头。ImageNet的发起人写道:“随着基于深度学习的方法在2012年取得成功,2013年的绝大多数参赛作品都使用了深度卷积神经网络。”这种模式持续了好几年,后来的优胜者都是建立在AlexNet团队开创的基本技术之上。到2017年,使用深度神经网络的参赛者将top5错误率降至3%以下。考虑到这项任务的复杂度,可以说这使得计算机比许多人更擅长这项任务。这张来自ImageNet团队的条形图显示了每年top-5分类比赛中获胜团队的错误率。从2010年到2017年,错误率稳步下降。卷积网络的概念从技术上讲,AlexNet是一个卷积神经网络。在本节中,我将解释卷积网络的作用,以及为什么这项技术对现代图像识别算法至关重要。我们之前研究的简单手写识别网络是全连接的:第一层的每个神经元都是第二层神经元的输入源。此结构比较适合相对简单的任务,例如识别28×28像素图像中数字。但进一步扩展就很难了。在MNIST手写数字数据集中,字符总是居中的。这大大简化了训练,因为这意味7在图像的顶部和右侧总是有一些黑色像素,而左下方总是白色的。0总是中间白块,四周的像素则较暗。一个简单的、全连接的网络可以相当容易地检测这些类型的模式。但是假如你想建立一个神经网络来识别可能位于大图中的任何位置的数字。一个全连接的网络不擅长于此,因为它没有一种有效的方法来识别位于图像不同部分的形状之间的相似性。如果你的训练集的左上角恰好有大部分的7,那么你会得到一个网络,它比图像中其他地方更善于识别左上角的7。从理论上讲,你可以通过确保你的训练集在每个可能的像素位置上都有很多数字的样本来解决这个问题。但在实践中,这将是巨大的浪费。随着图像的大小和网络的深度的增加,连接的数量——也就是输入权重参数的数量——将会激增。你需要更多的训练图像和算力来达到足够的准确性。当神经网络学习识别图像中某个位置的形状时,它应该能够将这种学习应用于识别图像中其他位置的类似形状。卷积神经网络为这个问题提供了一个优雅的解决方案。“这就像拿一个模板或模式,然后将其与图像上的每一个点进行匹配,”人工智能研究员唐杰(音)说。“你有一个狗的模板轮廓,然后发现右上角和你的模板基本匹配——那里有条狗吧?”如果没有,可以稍微移动一下模板,遍历整张图片。狗出现在在图像哪个位置并不重要。模板会匹配到它。你不会想让网络的每个子部分都学习自己单独的狗识别器。试想一下,如果我们把一幅大图像分成2828像素的小块。然后,我们可以将每个小块输入到之前所述的全连接的手写识别网络中。如果这些小块中的“7”输出至少有一个被点亮,就意味着整个大图中可能有7的存在。这就是卷积网络的本质。卷积网络在AlexNet中如何工作?在卷积网络中,这些“模板”被称为特征检测器(feature detector),它们所观察的区域被称为接受域(receptive field)。真正的特征检测器的接受域往往比边长28像素小得多。在AlexNet中,第一个卷积层具有接受域为11×11像素的特征检测器。它随后的卷积层有3到5个单位宽的接受域。当特征检测器扫过输入图像时,它会生成一个特征图(feature map):一个二维网格,表示该检测器被图像的不同部分激活的强度。卷积层通常有多个特征检测器,每个检测器扫描输入图像以寻找不同的模式。在AlexNet中,第一层有96个特征检测器,生成了96个特征图。为了更具体地说明这一点,以下是经过网络训练的AlexNet第一层中的96个特征检测器所学习的视觉模式的可视化表示。特征检测器可以寻找水平或垂直的线条、从亮到暗的渐变、棋盘图形和其他形状。彩色图像用像素分布格式表示,每个像素有三个值:红值、绿值和蓝值。AlexNet的第一层会将红绿蓝三位表示的像素归纳为96个类型值之一。图像中的每个“像素”(指第一层分割的单元)有96种可能的值,对应96种特征检测器。在本例中,这96个值中的第一个值指示图像中的某个特定点是否与此模式匹配:第二个值指示某个特定点是否与此模式匹配:第三个值表示某个特定点是否与此模式匹配:如此类推,在AlexNet的第一层中,其他93个特征检测器也是如此。第一层将图像的每个“像素”用一种新表现形式输出——表示为96个值(类似96进制?)的向量(我稍后将解释,这个新表示形式也被按比例缩小四倍)。这是AlexNet的第一层。接下来是另外四个卷积层,每个层的输入都是前一层的输出。正如我们所看到的,第一层检测基本的模式,如水平和垂直的线,光到暗的变化,以及曲线。然后,第二层使用第一层的结果作为构建块来检测稍微复杂一些的形状。例如,第二层可能有一个特征检测器,它通过组合第一层特征检测器的输出来查找曲线,从而查找圆。第三层通过结合第二层的特征找到更复杂的形状。第4层和第5层可以找到更复杂的模式。研究人员Matthew Zeiler和Rob Fergus在2014年发表了一篇出色的论文,为可视化类似ImageNet的五层神经网络所识别的模式提供了一些有用的方法。在下列插图中,每张图片(第一张除外)都有两个部分。在右边,你将看到一些缩略图图像,它们高度匹配了特定的特征检测器。它们9个分为一组,每组对应一个不同的特征检测器。在左边是一个地图,它显示了缩略图图像中的哪些特定像素产生了高度匹配。你可以在第5层中最显著地看到这一点,因为有一些特性检测器可以高度匹配为狗、企业标识、独轮车轮子等。浏览这些图像,你可以看到每一层都能够识别比前一层更复杂的模式。第一层识别简单的像素模式,看起来也并不十分相像。第二层识别纹理和简单的形状。在第三层,我们可以看到可识别的形状,如汽车轮子和红橙色的球体(可能是西红柿、瓢虫或其他东西)。第一层的感受域为11X11单位大小,而后面的层的感受域大小则为3X3单位到5X5单位不等。但是请记住,后面的这些层接收的是前面的层生成的特征图,这些特征图中的每个“像素”表示原始图像中的n个像素。所以每一层的感受域都包含了原始图像中比前一层更大的部分。这就是为什么后期图层的缩略图看起来比早期图层更复杂的原因之一。感受域示意图,from深度神经网络中的感受野网络的第五层也是最后一层能够识别这些图像中最显眼的大尺度元素。例如这张图片,我从上面第5层图片的右上角截取的:右边的9张图片看起来可能不太相似。但是如果你看一下左边的9张热图,你会发现这个特定的特征检测器并没有聚焦于每张图像前景中的物体。相反,它关注的是每个图像背景中的绿色部分!显然,如果你要识别的类别之一是“草”,那么用“草检测器”就合适了,但是它同时也可能检测其他东西。在五个卷积层之后,AlexNet有三个层是全连接的,就像我们手写识别网络中的层一样。这些层会利用第五卷积层生成的每个特征图,尝试将图像分类为1000个类别中的一个。所以如果一幅画的背景是草,那么它更有可能是野生动物。另一方面,如果这幅画的背景是草,那么它不太可能是一幅室内家具的画。其他位于第五层的特征探测器提供了丰富的信息可用于猜测照片内容。网络的最后几层将这些信息综合起来,对整个图片所描绘的内容进行有理据的猜测。卷积层的独到之处:共享输入权重我们已经看到卷积层中的特征检测器执行了牛逼的模式识别,但是到目前为止,我还没有解释卷积网络实际上是如何工作的。卷积层是一层神经元。像任何神经元一样,这些神经元取其输入的加权平均值,然后应用一个激活函数。用我们讨论过的反向传播技术来训练当中的参数。但与上面的神经网络不同,卷积层没有全连接。每个神经元只接受前一层神经元的一小部分输入。更重要的是,卷积网络中的神经元共享输入权重。让我们放大AlexNet的第一个卷积层中的第一个神经元。这一层的接受域大小是11×11像素,所以第一个神经元接收某角落的11×11像素。这个神经元接受这121个像素的输入,每个像素有三个值——红、绿、蓝。神经元总共有363个输入。和任何神经元一样,这个神经元取363个输入值的加权平均值,然后应用一个激活函数。因为它有363个输入值,它也需要363个输入权重参数。AlexNet第一层中的第二个神经元与第一个神经元非常相似。它同样接收11×11像素,但它的接受域是从第一个神经元的接受域平移4个像素开始。这就在两个接受域之间产生了7个像素的重叠,这就避免了遗漏两个神经元之间的有趣模式。第二个神经元同样接收描述11×11像素的363个值,每个值乘以权重参数,求和,并调用一个激活函数。特殊的是,第二个神经元没有自己的一组363个输入权重,而是使用与第一个神经元相同的输入权重。第一个神经元的左上角像素使用与第二个神经元的左上角像素相同的输入权重。所以这两个神经元在寻找完全相同的模式。它们的接受域之间有4个像素的偏移。当然实际远不止两个神经元——图片分为55×55格共3025个神经元。这3025个神经元中的每一个都使用与开始两个神经元相同的363个输入权重。所有这些神经元共同“扫描”图像中可能存在的特定模式,组成一个特征检测器。请记住,AlexNet的第一层有96个特性检测器。我刚才提到的3025个神经元组成了96个特征探测器中的一个。其他95个特征探测器则是由各自的一组3025个神经元组成。每组3025个神经元与组内其他神经元共享其363个输入权重,但不是和其他95个特征检测器的神经元共享。卷积网络的训练使用与训练全连接网络相同的基础反向传播算法,但是卷积结构使得训练过程更加高效。“使用卷积非常有用,因为可以重用参数,”机器学习专家和作家Sean Gerrish告诉Ars(本文原作者机构)。这大大减少了网络需要学习的输入权重的数量,这使得网络可以用更少的训练样本产生更好的结果。从图像的一个部分学到的识别模式,可以转化用于识别其他图像的其他位置的相同模式。这使得网络可以通过更少的训练实例来实现高性能。深度卷积网络威名远扬AlexNet的论文在学术机器学习社区引起了轰动,它的重要性也很快得到了业界的认可。谷歌对这项技术特别感兴趣。2013年,谷歌收购了AlexNet论文作者创办的一家初创公司。他们利用这项技术为谷歌照片添加了一个新的图像搜索功能。谷歌的Chuck Rosenberg写道:“我们直接从一个学术研究实验室进行了前沿研究,并在短短6个多月的时间里启动了它。”与此同时,谷歌2013年的一篇论文描述了它如何使用深度卷积网络从谷歌街景(Google Street View )的照片中读取地址码。“我们的系统帮助我们从街景图像中提取了近1亿个实体街道编号,”作者写道。研究人员发现,随着神经网络的发展,其性能不断提高。谷歌街景团队写道:“我们发现这种方法的性能随着卷积网络的深度而提高,在我们训练层级最多的架构中,性能最好。我们的实验表明,更深层次的架构可能获得更好的准确性,但效率会逐渐降低。”所以在AlexNet之后,神经网络变得越来越深。一个谷歌的团队在2014年ImageNet竞赛中提交的作品获得了优胜——就在2012年AlexNet获胜的两年后。和AlexNet一样,它也是基于一个深度卷积神经网络,但是谷歌使用了一个更深层的22层网络,从而获得了6.7 %的top5错误率——这比AlexNet的16%错误率有了很大的提高。不过,更深层的网络只对大型训练集有用。基于这个原因,Gerrish认为ImageNet数据集和竞争对深度卷积网络的成功起到了关键作用。大家还记得吗?ImageNet竞赛给了参赛者一百万张图片,要求他们从1000个不同的类别中选择一个。Gerrish说:“拥有100万张图片来训练你的神经网络,意味着每个类别有1000张图片(1m/1000 = 1000)。”他说,如果没有这么大的数据集,“你训练网络的参数就多得多。”近年来,人们聚焦于收集更大的数据,以便训练更深入、更准确的网络。这是自动驾驶汽车公司如此专注于在公共道路上积累里程的一大原因——来自测试的图像和视频被送回总部,用于培训公司的图像识别网络。深度学习计算的繁荣更深层次的网络和更大的训练集可以提供更好的性能,这一发现对更多的算力产生了无法满足的需求。AlexNet成功的一个重要原因是意识到,神经网络训练涉及矩阵运算,可以使用显卡高度并行的算力高效地执行这些运算。“神经网络是可并行的,”机器学习研究员唐杰说。显卡本来是为视频游戏提供大规模并行算力的,结果非常适合神经网络使用。“GPU的核心运算是极快的矩阵乘法,最终成为神经网络的核心运算,”唐说。这为英伟达(Nvidia)和AMD这两家行业领先的GPU制造商带来了滚滚财源。这两家公司都致力于开发适应机器学习应用程序独特需求的新芯片,而人工智能应用程序目前在这些公司的GPU销售中占据了相当大的比例。2016年,谷歌公开了一个定制芯片,称为张量处理单元(TPU),专门用于神经网络操作。谷歌2017年写道,虽然他们早在2006年就考虑过为神经网络构建专用集成电路(ASIC),但2013年这种情况变得紧迫起来。“就在那时,我们意识到神经网络快速增长的计算需求可能要求我们将运营的数据中心数量增加一倍。”最初,TPU仅允许谷歌自己的专有服务使用,但后来,谷歌开始允许任何人通过它的云计算平台使用这项技术。当然,谷歌并不是唯一一家致力于人工智能芯片的公司。一个小例子是,iPhone最新版本的芯片就包括一个为神经网络操作优化的“神经引擎”。英特尔正在开发自己的针对深度学习的优化芯片系列。特斯拉最近宣布放弃英伟达的芯片,转而采用自制神经网络芯片。亚马逊据说也在开发自己的AI芯片。为何深层神经网络难以理解我已经解释了深度神经网络是如何工作的,但我还没有真正解释它们的工作何以那么出色。大量的矩阵运算可以让计算机区分美洲虎和猎豹,接骨木和醋栗,这真令人惊讶。但也许神经网络最值得注意的地方是它们做不到的事。卷积使神经网络能够理解平移——它们可以判断一幅图像的右上角的模式是否与另一幅图像的左上角的模式相似。但除此之外,卷积网络并没有真正的理解几何图形。如果图像旋转45度或放大2倍,他们就无法识别出这两幅图像是否相似。卷积网络并没有尝试去理解三维物体的结构,而且它们也不能识别不同的光照条件。然而,深度神经网络能够识别狗的图片,无论它们是正面还是侧面拍摄的,无论它们是占据了图片的一小部分还是很大一部分。神经网络是怎么做到的?事实证明,有了足够的数据,暴力统计方法就足以完成这项工作。卷积网络的设计初衷并不是“想象”如果从不同的角度或在不同的环境下,一张特定的图像会是什么样子,但是有了足够多的标记样本,它可以通过纯粹的重复来学习所有可能的排列。有证据表明,人类的视觉系统实际上是以类似的方式工作的。我们来看这两张图片(在看第二张图片之前,确保你仔细看了第一幅图片):显然,这张照片的创作者把人像的眼睛和嘴巴颠倒过来,再把整张照片翻过来。当你把图像倒过来看时,它看起来相对正常,因为人类的视觉系统已经习惯了在这个方向上看眼睛和嘴。但是当你看后者时,就会发现人像面容变得畸形。这表明人类视觉系统依赖于一些与神经网络相同的粗糙模式匹配技术。如果我们看到的东西几乎都是同一个方向的——就如人类的眼睛——我们就能更好地识别出它们通常的方向。神经网络善于利用图片中的所有环境来理解它所显示的内容。例如,汽车通常出现在道路上。裙子通常要么出现在女性的身体上,要么挂在衣橱里。飞机要么在蓝天的衬托下出现,要么在跑道上滑行。没有人明确地教神经网络这些相关性,但有足够多的标记样本,网络可以自动学习它们。2015年,谷歌的一些研究人员试图通过“反向操作”来更好地理解神经网络。他们不是用图像来训练神经网络,而是用训练过的神经网络来修改图像。比如,他们从一幅包含随机噪声的图像开始,然后逐渐修改它,使其强烈地“点亮”神经网络的输出之一——要求神经网络高效地“绘制”一个它被训练识别的类别。在一个有趣的例子中,他们用一个被训练用来识别哑铃的神经网络来画图。研究人员在研究报告中写道:“这些是哑铃没错,但似乎都画出了肌肉发达的举重运动员来举哑铃。”乍一看,这似乎很奇怪,但实际上这与人类的行为并没有太大的不同。如果我们在一幅图像中看到一个小的或模糊的物体,我们就会观察周围的环境,寻找图片中可能发生的事情的线索。很明显,人类通过不同的方式对图像进行推理,利用我们对周围世界复杂的概念理解。总而言之,深层神经网络擅长于图像识别,是因为它们充分利用了图片中显示的所有环境,这与人类的识别方式并没有太大的不同。(完)专业词汇对照表neural network 神经网络computing power 算力convolutional network 卷积网络neuron 神经元weight 权重bias 偏置activation function 激活函数Non-linear activation function 非线性激活函数light up 亮灯(即匹配)layer 层receptive field 感受域backpropagation 反向传播top-five error rate top5错误率error gradient 误差梯度matrix 矩阵fully connected layer 全连接层pattern 模式feature detector 特征检测器brute-force statistical 暴力统计 ...

January 16, 2019 · 1 min · jiezi

揭秘人工智能(系列):深度学习是否过分夸大?

摘要: 深度学习可能不是过分夸大,也许它只是没有很好地被理解!2012年左右,多伦多大学的研究人员首次使用深度学习来赢下了ImageNet,它是一项非常受欢迎的计算机图像识别竞赛。对于那些参与AI行业的人来说,这是一个大问题,因为计算机视觉是使计算机能够理解图像背景的学科,也是人工智能中最具挑战性的领域之一。当然,与任何其他产生巨大影响的技术一样,深度学习成为炒作的焦点。不同的公司和组织开始应用它来解决不同的问题(或假装应用它)。许多公司开始使用深度学习和先进的人工智能技术重塑其产品和服务。与此同时,媒体也经常撰写有关人工智能和深度学习的故事,这些故事充满误导性,并且大多是由那些对技术运作方式没有正确理解的人撰写。他们大多使用关于人工智能的耸人听闻的头条来博眼球,这些也促成了围绕深度学习的炒作。经过媒体的炒作后,许多专家认为深度学习被夸大了,它最终会消退并可能导致另一个人工智能冬季,从而使人们对人工智能的兴趣和资金投入大幅下降。其中一些著名专家也承认,深度学习已经触底,其中包括一些深入学习的先驱者。但根据著名数据科学家和深度学习研究员杰里米·霍华德的说法,“深度学习过度夸大”的论点有点夸张。霍华德是fast.ai的创始人,<u style=“box-sizing: border-box;">fast.ai</u>是一个非营利性的在线深度学习课程。今年,霍华德在USENIX Enigma会议上发表的演讲中发表了许多反对深度学习的论点。整个视频非常清楚地说明了深度学习究竟做了什么和不做什么,这个演讲可以帮助你清楚地了解该领域。以下是霍华德演讲主要反驳的几个论点:深度学习只是一种时尚-明年它将是另一回事(NO!)许多人认为深度学习是突然冒出来,最终也会突然消失。霍华德反驳解释到:“你今天在深度学习中实际看到的是几十年研究的结果,而这几十年的研究终于达到了实际上给出最先进成果的程度。”人工神经网络的概念是深度学习算法的主要组成部分,它已存在数十年,第一个神经网络可以追溯到20世纪50年代。但是,由于数十年的研究以及数据和计算资源的可用性,深度学习的概念已经从实验室走出并进入实际领域。霍华德说:“利用深度学习,人们可以减少很多复杂的繁琐的事务,我们应该期待看到[深度学习]继续发展下去而不是消失。”深度学习和机器学习是一回事(NO!)滥用人工智能词汇很容易导致了从业人员对行业的混淆和怀疑。有人说深度学习只是机器学习的另一个别称,而其他人则认为它与其他AI技术(如支持向量机(SVM),随机森林和逻辑回归)属于同一水平。但深度学习和机器学习并不相同,深度学习是机器学习的一个子集。通常,机器学习适用于基于训练数据的数学模型和行为规则的所有技术。ML技术已经投入生产使用了很长时间。在深度学习之前,科学家们必须在编写“功能”或模块方面投入大量精力,这些功能可以执行模型想要执行的任务的一小部分。例如,如果你想创建一个可以检测猫的图像的AI模型,你将不得不编写较小的程序来检测猫的特征,如耳朵、尾巴、鼻子、皮毛。而且你必须使这些程序足够强大,以便从不同角度和不同光照条件下检测这些特征,并告诉不同猫种之间的差异。最后你才能在这些功能之上进行机器学习。如果你想解决更复杂的问题,如通过MRI扫描检测乳腺癌,那么创建特征将变得更具挑战性。霍华德说:“你将需要数十名领域专家与数十名计算机程序员和数学家合作,提出这些功能概念并对其进行编程。最后使用一个经典的机器学习模型,如逻辑回归。”这项工作大概需要数年的工作。![经典的机器学习方法涉及许多复杂的步骤,需要数十名领域专家、数学家和程序员的合作](https://upload-images.jianshu…深度学习用神经网络取代了艰苦的经典机器学习过程。霍华德将神经网络描述为“无限灵活的函数”。这意味着神经网络可以应用于机器学习解决的大多数问题,而无需通过以前必须执行的所有特定于域的特征工程。要想神经网络解决特定问题,你需要调整其参数。为此,深度学习使用“梯度下降”,这是一种通用优化算法,可以将神经网络的参数与其想要解决的问题相匹配。最后,深度学习利用了近年来可用的GPU和专用硬件的强大功能,以合理快速和可扩展的方式执行这些任务。霍华德说:“只有在过去的几年里,这三件事情才能让我们真正使用神经网络来获得最先进的结果。”因此,深度学习不是通过以前机器学习方法所涉及的专业知识密集型和容易出错的过程,而是提供样本数据(例如标记为猫图片,标记为癌症或非癌症的MRI扫描…)并训练神经元使用梯度下降的网络。神经网络比较并找到这些数据样本中的常见模式,并学习应用相同的知识来分类以前从未见过的新数据样本。这种方法在过去几年中深入学习了最流行的人工智能技术,并引发了使用深度学习的应用程序的爆炸式增长。深度学习只对图像识别有益(NO!)很多人都承认深度学习是一种非常有用的人工智能技术,但很多批评者都抱怨它的使用仅限于解决涉及图像分类的问题!“图像识别非常重要!”霍华德说。几年前,霍华德和一组研究人员在肺部CT扫描上训练了一个深度神经网络,并创建了一种算法,可以检测恶性癌症肿瘤,这个算法的结果诊断的结果与四名人类放射科医师相比,假阳性和阴性率更低。霍华德还指出,许多问题可以重新理解为图像识别问题。例如,在中国古代游戏围棋中击败世界冠军的深度学习算法AlphaGo实际上是一个图像识别的卷积神经网络(CNN)。“具体来说,AlphaGo所做的是看了很多在真人玩过的围棋的例子”霍华德解释道。“基本上,他们最终做了一个图像识别神经网络,他们试图学习的东西不是这张照片是猫还是狗,而是这是一张白子赢或黑赢的围棋照片。”这种方法一直是AlphaGo和许多掌握不同棋盘和视频游戏的AI算法成功的关键因素。关键是,许多问题可以转化为图像识别问题,并通过深度学习解决。例如,霍华德深度学习课程的学生创建了一个神经网络,该网络在鼠标移动和点击的图像行为上进行训练。在这种情况下,他创建了一个卷积神经网络,试图根据这些图片预测欺诈行为。也就是说,深度学习也证明了其超越计算机视觉和图像识别领域的价值。霍华德指出,深度学习现在也适用于大多数自然语言处理(NLP)问题,这包括机器翻译和文本摘要等领域。NLP是一个关键组件,它可以使Siri,Alexa和Cortana等AI助手理解你的命令。(有一点要知道:深度学习对人类语言的掌握有限)深度学习还可以解决涉及结构化数据的问题,例如电子表格中的行和列。例如,你可以为神经网络提供一组代表金融交易及结果(欺诈或正常)的行,并对其进行训练以预测欺诈性交易。霍华德指出,深度学习也可以应用于时间序列和信号问题,例如连接到网络的不同IP地址的事件顺序或随时间收集的传感器数据。深度学习的痛点霍华德还指出了一些深度学习成效有限的领域,这些领域包括强化学习,对抗模型和异常检测。一些专家认为强化学习是当前人工智能的圣杯。强化学习涉及开发AI模型而不向他们提供大量标记数据。在强化学习中,你为模型提供问题域的约束,并让它开发自己的行为规则。AlphaGo的高级版AlphaGo Zero就是使用强化学习从头开始训练自己,然后超过了AlphaGo。虽然深度强化学习是人工智能研究中比较有趣的领域之一,但它在解决现实问题方面没有明显的进展。Google Brain AI研究员Alex Irpan在深度强化学习的极限上有一篇引人深思的文章。对抗模型是霍华德提及的另一个深度学习痛点。对抗性示例是操纵输入可能导致神经网络以非理性方式运行的实例。有很多研究人员展示了对抗性<u style=“box-sizing: border-box;">示例</u>如何能够成为对AI模型的攻击<u style=“box-sizing: border-box;">者</u>。虽然已经做了一些努力来加强深层学习模式以对抗对抗性攻击,但到目前为止,成功有限。部分挑战源于神经网络非常复杂且难以解释的事实。异常检测,霍华德谈到的第三个深度学习痛点也非常具有挑战性。一般概念是在基线数据上训练神经网络,并让它确定偏离基线的行为。这是在网络安全中使用AI的主要方法之一,一些公司正在探索这一概念。但是,它仍然无法将自己确立为对抗安全威胁的非常可靠的方法。深度学习是一个黑盒子这是一个真正令人担忧的问题,尤其是在人工智能模型被赋予关键决策的领域,例如医疗保健、自动驾驶汽车和刑事司法。那些愿意让深度学习代表他们做出决定的人需要知道推动这些决策的因素是什么?不幸的是,当你在训练神经网络时获得的性能优势会降低你在决策过程中获得的可见性。这就是深度学习通常被称为“黑匣子”的原因。但是,现在已经有了很多有趣的研究来解释AI决策,并帮助工程师和最终用户理解影响神经网络输出的元素。深度学习需要大量数据一般认为,要创建一个新的深度学习模型,需要访问数百万和数十亿个带标签的示例,这就是为什么只有大型科技公司才能创建它。“需要大量数据的说法通常不正确,因为大多数人在实践中使用迁移学习”霍华德说。迁移学习是机器学习中的一门学科,其中一个模型获得的知识被转移到执行类似任务的另一个模型。与人类如何将知识从一个领域转移到另一个领域相比,它非常原始。但是,迁移学习在深度学习领域是一个非常有用的工具,因为它使开发人员能够用更少的数据创建新模型。霍华德解释说:“你从一个预先训练好的[神经]网络开始,然后为你的特定任务微调权重。一般来说,如果你有大约1,000个示例,你应该能够建立一个良好的神经网络。”你需要博士学位才能进行核心深度学习深度学习是一个非常复杂的计算机科学领域,它涉及许多高级数学概念。但是在过去几年中,学术界已经创建了大量的工具和库来抽象出潜在的复杂性,并使你能够无须解决过多的数学问题来开发深度学习模型。Fast.ai和Keras就是两个现成的库,可用于快速开发深度学习应用程序。还有很多在线课程,包括霍华德的fast.ai,Coursera和其他课程,使你能够开始深入学习编程,只需要很少的编程知识。许多具有计算机科学以外背景的人已经能够将这些课程应用于现实世界的问题。需要明确的是,深度学习研究仍然是一个非常先进和复杂的领域,人才既稀缺又昂贵。开发新的深度学习技术的人是一些最令人垂涎和收入极高的研究人员。但这并不意味着其他人需要拥有相同水平的知识才能在他们的应用程序中使用这些研究项目的结果。深度学习需要大量的计算能力“你可能会担心你需要一个充满GPU的大房间,总的来说这并不是真的,我现在看到的绝大部分成功结果都是用一个GPU完成的。” 霍华德说大型公司和组织进行的大型研究项目需要大量的GPU,例如一款机器人手用6144 CPU和8个GPU进行训练出来的。另一个例子是OpenAI Five,一个训练有素的AI模型,可以玩著名的Dota 2在线战斗竞技游戏,OpenAI Five是用了128,000个CPU内核和256个GPU的训练的结果。但是,大多数实际问题都可以通过单个GPU解决。例如,你可以通过一个GPU来完成霍华德的Fast.ai课程。总结:我建议你观看整个视频,其中,霍华德深入研究了一些更专业的主题,例如你是否可以将深度学习应用于信息安全。重要的是我们要了解深度学习的范围和限制以及机会和优势,因为它是我们这个时代最有影响力的技术之一。深度学习不是过分夸大,也许它只是没有很好地被理解。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 14, 2019 · 1 min · jiezi

Python数据分析:手写数字识别初步

1.手写数字识别是python图像处理的基础,首先需要安装pillow,我们需要以管理员身份打开Windows命令行并输入pip install pillow,如果提示pip需要更新,我们输入python -m pip install –upgrade pip先更新pip,这时再安装pillow就没问题了。2.首先我们需要引入和图片识别有关的库,输入from PIL import Image进行引入,引入后我们就可以打开要进行操作的图片了,这里需要用到Image中的open()函数和save()函数,open()函数用来打开文件,save()函数用来将图片保存为我们需要的格式。3.然后我们需要确定图片的长和宽,调用size()函数可以返回一个以图片的宽和高为元素的元组,这时获取图片的宽和高就可以用元素下标的方式。4.我们在识别时要得到一个用1标识出数字的文本文档,第一个图为我用电脑的画图随便写的数字6,第二个图是经过识别得出的文本文档,我们可以看出,第二个图中用1标出了手写体的数字6的形状。因此我们在数字识别的过程中需要知道每一个位置的rgb编码,这个调用getpixel()即可实现,我们知道,黑色的rgb编码的三个数的和为0,我们要得到一个用0和1标识出来的图像,只需在rgb编码数之和为0的位置写入1,其余不为0的位置写入0。5.编码实现:from PIL import Imageim = Image.open(“C:/Users/21974/Desktop/handwrite.PNG”)im.save(“C:/Users/21974/Desktop/handwrite.bmp”)df = open(“C:/Users/21974/Desktop/practicePil.txt”, “a”) #打开一个文本用于接下来的写入操作width = im.size[0]height = im.size[1]for i in range(0, width): for j in range(0, height): k = im.getpixel((i, j)) #注意此处为两个括号,第二个括号内代表坐标为(i,j)处的色彩元素 sum = k[0]+k[1]+k[2] #rgb编码的三个数字相加 if sum == 0: df.write(“1”) else: df.write(“0”) df.write("\n")df.close()运行即可得到以0和1绘制的文本图像。

January 13, 2019 · 1 min · jiezi

YOLO目标检测模型原理介绍

YOLO-v1介绍YOLO是一个端到端的目标检测算法,不需要预先提取region proposal(RCNN目标检测系列),通过一个网络就可以输出:类别,置信度,坐标位置,检测速度很快,不过,定位精度相对低些,特别是密集型小目标。YOLO将图像resize到448x448作为输入,输出7x7x30,即:将图片划分为7x7,每个单元格独立检测。这里需要注意,不是那种滑动窗口将每个单元格都输入到网络中进行预测,这里的划分只是物体中心点位置的划分之用(划分越多越准确),物体的中心落在哪个单元格,就由那个单元格负责预测。说完7x7我们再说下另一个维度30,30=(2*5=20),其中“2:每个单元格预测数量(box数量)”,“5:(x,y,w,h,score)”,“20:模型可以预测20个种类”。YOLO-v1训练模型首先会将ImageNet作为训练集预训练模型,最终达到88%精度,然后使用迁移学习将预训练的模型应用到当前标注的训练集进行训练。模型输出5维信息(x,y,w,h,score),使用Leaky Relu作为激活函数,全连接层后添加Dropout层防止过拟合。在得到输出值之后,我们需要计算每个box与ground true的Iou值,然后通过非极大值抑制筛选box。YOLO-v1损失函数损失函数包含三部分分别是:坐标损失,置信度损失(7x7x2),类别损失(7x7x20)。坐标损失:我们使用SSE损失函数(就是MSE损失函数的累加版本),如图所示我们在“w,h”中加了根号,加根号的原因是,“w,h”的损失在大框和小框之间“权重”应该不同。因为,对应图像中较大的物体而言,box有些偏移一般并不会影响预测结果。但是对应小物体而言,同样的偏移可能会脱离预测目标。置信度损失:如图所示,损失函数分为两部分:有物体,没有物体,其中没有物体损失部分还增加了权重系数。添加权重系数的原因是,对于一幅图像,一般而言大部分内容是不包含待检测物体的,这样会导致没有物体的计算部分贡献会大于有物体的计算部分,这会导致网络倾向于预测单元格不含有物体。因此,我们要减少没有物体计算部分的贡献权重,比如取值为:0.5。类别损失:当有物体的中心点落在单元格中,此单元格就负责预测该物体。YOLO-v2改进使用批标准化:随着神经网络的训练,网络层的输入分布会发生变动,逐渐向激活函数取值两端靠拢,如:sigmoid激活函数,此时会进入饱和状态,梯度更新缓慢,对输入变动不敏感,甚至梯度消失导致模型难以训练。BN,在网络层输入激活函数输入值之前加入,可以将分布拉到均值为0,标准差为1的正态分布,从而使激活函数处于对输入值敏感的区域,从而加快模型训练。此外,BN还能起到类似dropout的正则化作用,由于我们会有‘强拉’操作,所以对初始化要求没有那么高,可以使用较大的学习率。High Resolution Classifier:在介绍YOLO-v1的时候我们说到,模型需要先在ImageNet上预训练模型,因此,此时图像输入为224x224,使用迁移学习训练后我们的图像输入是448x448,因此模型需要适应图像分辨率的改变。在YOLO-v2中,我们在预训练模型中先224x224训练160个epoch,然后将输入调整到448x448,再跑10个epoch,也就是在ImageNet数据集中两种分辨率跑两次。YOLO大神作者实现表明,这样操作可以提高4%的map。Convolutional With Anchor Boxes: 1,加入anchor boxes,提高box数量。 2,删除全连接层和最后一个池化层,保留更高分辨率特征。 3,用416x416代替448x448输入大小,使特征图有奇数大小的高和宽。Dimension Clusters:使用k-means的方式对训练集的bounding boxes做聚类,但是该方法存在不同尺寸的box误差权重不同,我们希望误差与尺寸没有关系,因此通过IOU定义如下函数:Multi-Scale Training:训练阶段,采用32的倍数作为图像尺寸动态输入,如【320,352。。。608】。这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。使用Darknet-19作为后端网络:YOLO-v3YOLO-v3结构图以来自木盏,表示感谢,也欢迎关注他的博客。DBL:指Darknetconv2d_BN_Leaky。resn:指:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit,使用残差结构可以让网络更深。concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。后端网络使用darknet-53:我们发现,在YOLO-v3网络中没有池化层和全连接层,那么张量尺寸的变化是通过改变卷积核步长来实现。同YOLO-v2一样,输出尺寸为输入尺寸的1/32,即:一般要求输入图像尺寸是32的倍数。类别预测由softmax改为logistic(使用sigmoid):用于处理预测物体之间存在包含关系问题,解决多标签对象支持。比如woman和person,softmax输出:person,logistic输出两者。使用多尺度特征预测物体:上图是YOLO-v3在COCO数据集上使用聚类得到的9种先验框,一个代表宽度一个代表高度。在不同的感受野中使用不同的先验框。如果先验框不是最佳的,即使超过预设定的阈值,也不会进行预测。logistic回归用来从9个先验框中找到最佳的那个。补充:Iou计算总结YOLO好不好,我们就以一张图作为总结吧:祝大家2018年圣诞节快乐!

December 25, 2018 · 1 min · jiezi

YOLO目标检测模型重新训练

介绍YOLO目标检测快速上手这篇文章我们通过简短的代码就实现了一个视频目标检测功能。本文将介绍如何使用其他数据集重新训练YOLO模型,文章将会详细介绍每一步。下载数据集我们将使用Pascal VOC数据集训练我们的模型,该数据集可以用来做图像分类、目标检测、图像分割。下载并解压文件后,我们介绍下相关文件的作用。“Annotations”文件夹:用于存放图片描述,文件格式为.xml,具体内容如下图所示:如图所示,文件保存了图片文件名,尺寸,标注,坐标,是否分割等信息。“ImageSets”文件夹:保存了不同用途的图片名字列表,文件格式是.txt。“layout”文件夹:保存具有人体部位的图片名字列表。“main”文件夹:保存用于图像物体识别的图片名字列表。“segmenttions”文件夹:保存用于图像分割的图片名字列表。因为本次项目使用“main”文件夹,所以我们再详细看下:文件夹一共有20个分类的文件,通过文件名字我想大家肯定也知道作用了。这里介绍下文件里的正负数代表正负样本,如:“JPEGImages”文件夹:保存全部图片源文件。这里我们要留意的是图片名字,以后我们在自己创建数据集的时候,最好也参考此命名方式。“SegmentationClass”,“SegmentationObject”保存用于图像分割的源图片,两者区别如图所示:创建标签标签的结构是四维分别是(“类别”,“中心点x坐标”,“中心点y”坐标,“图片宽度”,“图片高度”),其实就是上面所说的图片xml文件中的内容。我们可以通过官方提供的python文件来执行此操作。# 获取py文件wget https://pjreddie.com/media/files/voc_label.py执行此文件之前留意下相关路径是否正确import xml.etree.ElementTree as ETimport pickleimport osfrom os import listdir, getcwdfrom os.path import joinsets=[(‘2007’, ’train’), (‘2007’, ‘val’), (‘2007’, ’test’)]classes = [“aeroplane”, “bicycle”, “bird”, “boat”, “bottle”, “bus”, “car”, “cat”, “chair”, “cow”, “diningtable”, “dog”, “horse”, “motorbike”, “person”, “pottedplant”, “sheep”, “sofa”, “train”, “tvmonitor”]def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = xdw w = wdw y = ydh h = hdh return (x,y,w,h)def convert_annotation(year, image_id): in_file = open(‘VOCdevkit/VOC%s/Annotations/%s.xml’%(year, image_id)) out_file = open(‘VOCdevkit/VOC%s/labels/%s.txt’%(year, image_id), ‘w’) tree=ET.parse(in_file) root = tree.getroot() size = root.find(‘size’) w = int(size.find(‘width’).text) h = int(size.find(‘height’).text) for obj in root.iter(‘object’): difficult = obj.find(‘difficult’).text cls = obj.find(’name’).text if cls not in classes or int(difficult) == 1: continue cls_id = classes.index(cls) xmlbox = obj.find(‘bndbox’) b = (float(xmlbox.find(‘xmin’).text), float(xmlbox.find(‘xmax’).text), float(xmlbox.find(‘ymin’).text), float(xmlbox.find(‘ymax’).text)) bb = convert((w,h), b) out_file.write(str(cls_id) + " " + " “.join([str(a) for a in bb]) + ‘\n’)wd = getcwd()for year, image_set in sets: if not os.path.exists(‘VOCdevkit/VOC%s/labels/’%(year)): os.makedirs(‘VOCdevkit/VOC%s/labels/’%(year)) image_ids = open(‘VOCdevkit/VOC%s/ImageSets/Main/%s.txt’%(year, image_set)).read().strip().split() list_file = open(’%s_%s.txt’%(year, image_set), ‘w’) for image_id in image_ids: list_file.write(’%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n’%(wd, year, image_id)) convert_annotation(year, image_id) list_file.close()执行py文件:python voc_label.py执行成功后会生成一个label文件夹和三个txt文件,分别是“2007_train.txt”,“2007_test.txt”,“2007_val.txt”(我只下载了2007的数据集),文件保存的是对应功能的全部图片路径:label文件夹内文件格式:分别是:(“类别”,“中心点x坐标”,“中心点y”坐标,“图片宽度”,“图片高度”)修改配置文件打开darknet/cfg/voc.data,修改“train”,“valid”文件路径。“classes”:数据集中图片分类数量。“train”:用于训练的图片数据集绝对路径。“valid”:用于验证的图片数据集绝对路径。“names”:数据集中图片分类名字,如:“dog”,“person”等。“backup”:模型训练完成后,权重文件保存路径。模型训练首先下载YOLOv3模型:wget https://pjreddie.com/media/files/darknet53.conv.74训练之前,我们先看下yolov3-voc.cfg文件里都是什么:[net]# Testing# batch=1# subdivisions=1 # 模型训练模式Training # batch_sizebatch=64# 用于进一步分割batch_size,分割后的batch_size大小为:batch_size/subdivisionssubdivisions=16# 模型输入图像宽width=416# 模型输入图像高height=416# 图像通道数channels=3# 使用带动量优化函数的动量参数momentum=0.9# 权重衰减率,用于防止过拟合decay=0.0005# 以下4项是通过改变图像角度,饱和度,曝光量,色调来生成更多样本,可用于防止过拟合angle=0saturation = 1.5exposure = 1.5hue=.1# 初始学习率learning_rate=0.001burn_in=1000# 迭代次数max_batches = 50200# 当迭代到40000,45000时更改学习率policy=stepssteps=40000,45000scales=.1,.1[convolutional]# BN标准化处理,可以通过改变数据分布,处理梯度过小问题,加快模型收敛batch_normalize=1# 输出特征大小filters=32# 卷积核大小3x3size=3# 卷积步长为1stride=1# pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/2pad=1# 激活函数,和relu的区别是当输入值小于0时,输出不为0activation=leaky**。。。。。省略。。。。。。**[yolo]mask = 0,1,2# 预选框,可手动指定也可通过聚类学习得到anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326# 识别种类classes=20# 每个cell预测box数量,yolov1时只有一个num=9# 增加噪声jitter=.3ignore_thresh = .5truth_thresh = 1random=1执行训练:./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74训练完成后,权重文件保存在backup文件夹内。总结如果训练我们自己的数据,数据准备工作参考VOC数据集,在模型训练之前还要更改cfg/yolov3-voc.cfg文件,修改classes类别数量和filter数量,其中filter计算方式:3*(classes+1+4),然后训练即可。 ...

December 23, 2018 · 2 min · jiezi

YOLO目标检测快速上手

介绍YOLO是基于深度学习端到端的实时目标检测系统,YOLO将目标区域预测和目标类别预测整合于单个神经网络模型中,实现在准确率较高的情况下快速目标检测与识别,更加适合现场应用环境。本案例,我们快速实现一个视频目标检测功能,实现的具体原理我们将在单独的文章中详细介绍。下载编译我们首先下载Darknet开发框架,Darknet开发框架是YOLO大神级作者自己用C语言编写的开发框架,支持GPU加速,有两种下载方式:下载Darknet压缩包git clone https://github.com/pjreddie/darknet下载后,完整的文件内容,如下图所示:编译:cd darknet# 编译make编译后的文件内容,如下图所示:下载权重文件我们这里下载的是“yolov3”版本,大小是200多M,“yolov3-tiny”比较小,30多M。wget https://pjreddie.com/media/files/yolov3.weights下载权重文件后,文件内容如下图所示:上图中的“yolov3-tiny.weights”,“yolov2-tiny.weights"是我单独另下载的。C语言预测./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg如图所示,我们已经预测出三种类别以及对应的概率值。模型输出的照片位于darknet根目录,名字是“predictions.jpg”,如下图所示:让我们打开模型输出照片看下:Python语言预测我们首先需要将“darknet”文件夹内的“libdarknet.so”文件移动到“darknet/python”内,完成后如下图所示:我们将使用Darknet内置的“darknet.py”,进行预测。预测之前,我们需要对文件进行修改:默认py文件基于python2.0,所以对于python3.0及以上需要修改print由于涉及到python和C之间的传值,所以字符串内容需要转码使用绝对路径修改完成后,如下图所示:打开“darknet/cfg/coco.data”文件,将“names”也改为绝对路径(截图内没有修改,读者根据自己的实际路径修改):我们可以开始预测了,首先进入“darknet/python”然后执行“darknet.py”文件即可:结果如下图所示:对模型输出的结果做个简单的说明,如:# 分别是:类别,识别概率,识别物体的X坐标,识别物体的Y坐标,识别物体的长度,识别物体的高度(b’dog’, 0.999338686466217, (224.18377685546875, 378.4237060546875, 178.60214233398438, 328.1665954589844)视频检测from ctypes import import randomimport cv2import numpy as npdef sample(probs): s = sum(probs) probs = [a/s for a in probs] r = random.uniform(0, 1) for i in range(len(probs)): r = r - probs[i] if r <= 0: return i return len(probs)-1def c_array(ctype, values): arr = (ctypelen(values))() arr[:] = values return arrclass BOX(Structure): fields = [(“x”, c_float), (“y”, c_float), (“w”, c_float), (“h”, c_float)]class DETECTION(Structure): fields = [(“bbox”, BOX), (“classes”, c_int), (“prob”, POINTER(c_float)), (“mask”, POINTER(c_float)), (“objectness”, c_float), (“sort_class”, c_int)]class IMAGE(Structure): fields = [(“w”, c_int), (“h”, c_int), (“c”, c_int), (“data”, POINTER(c_float))]class METADATA(Structure): fields = [(“classes”, c_int), (“names”, POINTER(c_char_p))]lib = CDLL(”../python/libdarknet.so", RTLD_GLOBAL)lib.network_width.argtypes = [c_void_p]lib.network_width.restype = c_intlib.network_height.argtypes = [c_void_p]lib.network_height.restype = c_intpredict = lib.network_predictpredict.argtypes = [c_void_p, POINTER(c_float)]predict.restype = POINTER(c_float)set_gpu = lib.cuda_set_deviceset_gpu.argtypes = [c_int]make_image = lib.make_imagemake_image.argtypes = [c_int, c_int, c_int]make_image.restype = IMAGEget_network_boxes = lib.get_network_boxesget_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)]get_network_boxes.restype = POINTER(DETECTION)make_network_boxes = lib.make_network_boxesmake_network_boxes.argtypes = [c_void_p]make_network_boxes.restype = POINTER(DETECTION)free_detections = lib.free_detectionsfree_detections.argtypes = [POINTER(DETECTION), c_int]free_ptrs = lib.free_ptrsfree_ptrs.argtypes = [POINTER(c_void_p), c_int]network_predict = lib.network_predictnetwork_predict.argtypes = [c_void_p, POINTER(c_float)]reset_rnn = lib.reset_rnnreset_rnn.argtypes = [c_void_p]load_net = lib.load_networkload_net.argtypes = [c_char_p, c_char_p, c_int]load_net.restype = c_void_pdo_nms_obj = lib.do_nms_objdo_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]do_nms_sort = lib.do_nms_sortdo_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]free_image = lib.free_imagefree_image.argtypes = [IMAGE]letterbox_image = lib.letterbox_imageletterbox_image.argtypes = [IMAGE, c_int, c_int]letterbox_image.restype = IMAGEload_meta = lib.get_metadatalib.get_metadata.argtypes = [c_char_p]lib.get_metadata.restype = METADATAload_image = lib.load_image_colorload_image.argtypes = [c_char_p, c_int, c_int]load_image.restype = IMAGErgbgr_image = lib.rgbgr_imagergbgr_image.argtypes = [IMAGE]predict_image = lib.network_predict_imagepredict_image.argtypes = [c_void_p, IMAGE]predict_image.restype = POINTER(c_float)def convertBack(x, y, w, h): xmin = int(round(x - (w / 2))) xmax = int(round(x + (w / 2))) ymin = int(round(y - (h / 2))) ymax = int(round(y + (h / 2))) return xmin, ymin, xmax, ymaxdef array_to_image(arr): # need to return old values to avoid python freeing memory arr = arr.transpose(2,0,1) c, h, w = arr.shape[0:3] arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0 data = arr.ctypes.data_as(POINTER(c_float)) im = IMAGE(w,h,c,data) return im, arrdef detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): im, image = array_to_image(image) rgbgr_image(im) num = c_int(0) pnum = pointer(num) predict_image(net, im) dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum) num = pnum[0] if nms: do_nms_obj(dets, num, meta.classes, nms) res = [] for j in range(num): a = dets[j].prob[0:meta.classes] if any(a): ai = np.array(a).nonzero()[0] for i in ai: b = dets[j].bbox res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h))) res = sorted(res, key=lambda x: -x[1]) if isinstance(image, bytes): free_image(im) free_detections(dets, num) return resif name == “main”: cap = cv2.VideoCapture(0) ret, img = cap.read() fps = cap.get(cv2.CAP_PROP_FPS) net = load_net(b"/Users/xiaomingtai/darknet/cfg/yolov2-tiny.cfg", b"/Users/xiaomingtai/darknet/yolov2-tiny.weights", 0) meta = load_meta(b"/Users/xiaomingtai/darknet/cfg/coco.data") cv2.namedWindow(“img”, cv2.WINDOW_NORMAL) while(True): ret, img = cap.read() if ret: r = detect(net, meta, img) for i in r: x, y, w, h = i[2][0], i[2][17], i[2][18], i[2][19] xmin, ymin, xmax, ymax = convertBack(float(x), float(y), float(w), float(h)) pt1 = (xmin, ymin) pt2 = (xmax, ymax) cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2) cv2.putText(img, i[0].decode() + " [" + str(round(i[1] * 100, 2)) + “]”, (pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 255, 0], 4) cv2.imshow(“img”, img) if cv2.waitKey(1) & 0xFF == ord(‘q’): break模型输出结果:模型视频检测结果:没有GPU的条件下还是不要选择yolov3了,很慢。总结本篇文章主要是YOLO快速上手,我们通过很少的代码就能实现不错的目标检测。当然,想熟练掌握YOLO,理解背后的原理是十分必要的,下篇文章将会重点介绍YOLO原理。 ...

December 19, 2018 · 3 min · jiezi

如何精准实现OCR文字识别?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由云计算基础发表于云+社区专栏前言2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识别——智能图像分享活动,活动举办期间用户耐心听分享嘉宾的介绍,并提出了相关的问题,智能图像团队的科学家和工程师也耐心解答可用户的疑问。以下就是活动分享的全部内容。正文在日常生活工作中,我们难免会遇到一些问题,比如自己辛辛苦苦写完的资料,好不容易打印出来却发现源文件丢了。难的收集了一些名片,却要很麻烦的一个一个录入信息。快递公司的业务越来越好,但每天却需要花费很多时间登记录入运单,效率非常的低。那么,有没有什么技术能帮助我们解决这些难题呢?有的,那就是OCR文字识别技术。今天我们请到了腾讯云大数据AI产品中心的AI科学家冀永楠、产品经理Florali、陈英恬,高级工程师肖西华为咱们分享一下腾讯云近年来在这一领域的探索情况。什么是OCR?OCR 是实时高效的定位与识别图片中的所有文字信息,返回文字框位置与文字内容。支持多场景、任意版面下整 图文字的识别,以及中英文、字母、数字的识别。通俗的来说,就是将图片上的文字内容,智能识别成为可编辑的文本,例如:OCR的技术原理是什么?OCR本质是图像识别。其原理也和其他的图像识别问题基本一样。包含两大关键技术:文本检测和文字识别。先将图像中的特征的提取并检测目标区域,之后对目标区域的的字符进行分割和分类。以深度学习兴起的时间为分割点,直至近五年之前,业界最为广泛使用的仍然是传统的OCR识别技术框架,而随着深度学习的崛起,基于这一技术的OCR识别框架以另外一种新的思路迅速突破了原有的技术瓶颈(如文字定位、二值化和文字分割等),并已在工业界得到广泛应用。首先文本定位,接着进行倾斜文本矫正,之后分割出单字后,并对单字识别,最后基于统计模型(如隐马尔科夫链,HMM)进行语义纠错。OCR技术的难点是什么?复杂背景、艺术字体、低分辨率、非均匀光照、图像退化、字符形变、多语言混合、文本行复杂版式、检测框字符残缺,等等。如克服这些难点的?从几个方面入手。一是使用场景,另一方面是从技术上的改进腾讯优图实验室在文本检测技术方进行了深度优化,提出了Compact Inception,通过设计合理的网络结构来提升各尺度的文字检测/提取能力。同时引入RNN多层自适应网络和Refinement结构来提升检测完整性和准确性。img腾讯云OCR目前支持什么功能?基于腾讯优图实验室世界领先的深度学习技术,目前我们已支持: 身份证识别,银行卡识别,名片识别,营业执照识别,行驶证驾驶证识别,车牌号识别,通用印刷体识别,手写体识别。大家可以扫文章头部的小程序二维码体验下我们的小程序。通用印刷体的技术难点,使用场景我们知道身份证识别可广泛应用在金融行业中,有用户的身份认证中,可以减少用户的信息输入,提升效率,提高用户体验,营业执照的识别完全省去了手工录入的繁琐,还可以为企业省去大量的人力资源成本,这些场景大家都已经比较熟悉。对于通用印刷体,腾讯优图实验室自主设计一整套全方位多尺度文字识别引擎,可攻破模糊,散焦,透视,文字部分遮挡的问题,识别准确率高达90%以上,处于业界领先水平。使用场景广泛,例如对任意版面上图像的文字识别,可广泛应用在印刷文档、广告图、医疗、物流等行业中的识别。对于通用印刷体有没有什么好的例子?例如这个广告,内容多字体,中英文与数字混合,背景也比较随意。咱们的OCR通过透视矫正、去模糊等,能大幅还原图像真实度,极大提升算法的鲁棒性。再例如识别文字密集,行间距小,透视畸变等的海报。人工识别需要不仅耗费时间,肉眼也比较难识别。但腾讯云OCR 设计了小而精的特征提取网络,配合先进的预处理技术,识别准确率高达93%以上。有时候也会遇到识别率不理想的情况,如何可以提高识别准确率?首先会确认下当前的场景,造成准确度不高的原因。评估可提高的空间设计,之后做出相应的修改,列入预处理等等。关于腾讯云手写体识别这块有没有什么案例?腾讯是国内首家将手写体识别应用在复杂场景下的服务商,数字识别准确率高达90%以上,单字识别速度在15ms以内,复杂汉字准确率超过80%。 腾讯云手写体OCR已运用到的运单识别场景,解决了物流行业每日快递单人工输入工作量极大且极易出错,非常低效等问题。img运单识别与传统人工识别有什么区别呢?如果传统人工识别按照3min/单,1000单需要6.25个人/天,保证运单时效则需要耗费大量人力,考虑人力成本则影响运单及时性,成本和服务难两全。我们的运单识别速度可以达到毫秒级/单,并支持24小时识别服务 ,业务增长时只需要投入计算用服务器资源即可,弹性较大。与传统识别相比,不仅成本可以降低,提高准确性,还可以保护用户的隐私泄露风险。目前OCR应用现实中有很广泛的应用场景,腾讯云OCR有什么优势?咱们的OCR文字识别技术,目前支持中文简繁体、英文、数字、标点共10000+标签,覆盖上百种字体,生僻字版本更支持2W+标签 。那咱们在行业中也有不少落地客户了吧?新版手Q就用到了咱们的技术,在扫一扫、聊天窗口和空间图片大图预览共三个入口上支持了提取图片中文字的功能。方便用户阅读、编辑、保存图片上的文字,从而可以对提取出的文字进行翻译、搜索。在多种场景下可以极大提升用户对图片上文字的阅读和记录效率。企业微信中的名片识也用到了咱们OCR技术。用户只需拍照或选择名片图片,就能准确快速地识别出名片中的文字,并自动提取为对应的字段,极大简化了名片录入流程,也避免了手动录入过程可能出现的错误。互动QA经过上面的分享,用户也提出了不少问题,我们来看看用户都问了什么?Q:您好,我想问下OCR 识别是否支持H5开发呢?A:支持,接口是基于http协议,只要支持http协议都可以使用。Q:通用印刷体识别剩下的10%,有提高的思路吗?A:整体思路还是要回到我们的三大引擎上。逐一进行优化。背景识别定位引擎字段识别引擎Q:目前印刷体识别上使用的思路是先分割后识别吗?OCR支持离线识别吗?A:思路是先分割后识别,我们的OCR支持离线识别的。Q:OCR遇到无法分割或者分割错误的情况如何处理呢A:很少有无法分割的情况。分割错误肯定会对最后的结果又影响。我们的技术,即便是再字符重叠的情况下也可以做出正确的分割。Q:我想问下如果针对运单识别场景,请问是否可以智能纠正客户的地址呢?例如深圳,写成了深土川。A:我们会结合NLP技术,结合上下文进行智能纠错。Q:目前市面已提供有相关服务,那么咱们在这块有什么与众不同的地方或者更有优势的一面呢?A:我们在OCR上积累的很多的相关经验,也是国内首家将手写体识别应用在复杂场景下的服务商。Q:那请问腾讯云OCR业务支持什么语言呀,对文字大小字体等有要求嘛?A:中文(简体和繁体),英文及数字。Q:之前有提到总的分类高达2w+,这种大分类模型是怎么训练的。A:分级,分批训练。Q:那我还想问您下车牌自动识别已应用于日常生活场景中。想了解下这个的技术难点是什么呢?A:相比于证照类输入图来说,车牌输入图受限于实际场景配置的摄像监控设备,及车辆位置的随机变化,产生各种极端角度及光照案例,其质量变化范围远大于证照类采集图像。Q:您刚才展示都是平整的图片,对于手机拍的纸质文档有一定弧度,比如折过的纸没压平,就会有一定弧度,这个能处理吗?A:轻微的弧度我们可以通过技术处理,严重变形的相对比较困难。Q:除了支持标准车牌,我们支持识别新能源车吗?A:支持的,我们目前已支持蓝牌、黄牌、军牌、警牌、教练车牌、新能源车牌等,目前识别率可达到97%-98%Q:请问针对物流公司司机手机拍的照片,一是面单不平整,二是光线有的不理想,三是拍照角度有倾斜。针对以上情况技术方面有没有解决办法?A:拍照角度可以通过几何算法矫正。光线的问题也可以通过图像的归一化增强。单面不平整,这个得看不平整到什么程度了。Q:车辆运行中,您这个80%的准确率是指车辆运动过程中拍摄下来的图还是车辆停止时候拍的图?A:我们是按帧处理的。Q:是否可以经过一定数据积累,纠错等训练,从而使其能识别手写文字?A:我们已实现手写体识别Q:OCR对运动模糊的场景识别率有多高A:模糊的程度差异性很大。不好做标准化的统计。图像质量不佳,最直白的处理方法是做图像的增强。Q:贵司技术有相关paper可以查阅吗?A:https://cloud.tencent.com/dev…https://cloud.tencent.com/dev...https://cloud.tencent.com/dev…可以看看咱们社区的文章哦很多文章都是鹅厂的精华呢~Q:图片有点模糊,能不能说下比较好具体算法,这个太笼统了A:有很多的滤波器都可以处理不同程度的模糊图像。也有采用神经网络的的方式处理。我们看到不管是复杂文字识别场景还是小程序应用腾讯云OCR都可以解决,对本文提问有任何疑问的同学,大家都可以去腾讯云问答社区(https://cloud.tencent.com/developer/ask)提出自己的疑问,届时会有邀请相关的产品同学回答您的问题。感谢大家对腾讯云云+社区及腾讯云智能图像的支持,如需了解更多腾讯云OCR识别,请点击:https://cloud.tencent.com/pro…)。腾讯云OCR接入流程第 1 步:登陆账号注册并通过实名认证后,您可以登录【腾讯云控制台】(链接:https://console.cloud.tencent.com/ai)进行使用。如果没有账号,请参考 【账号注册教程】(链接:https://cloud.tencent.com/document/product/378/9603)。第 2 步:创建秘钥完成注册后,您需要在【访问管理】(链接:https://console.cloud.tencent.com/cam/capi )创建秘钥。AppID、SecretID和SecretKey是您进行应用开发的唯一凭证,请妥善保管。第 3 步:生成签名通过签名来验证请求的合法性,用户可以使用AppID、SecretID和SecretKey生成签名,具体签名生成方法请参阅【签名鉴权】(链接:https://cloud.tencent.com/document/product/641/12409)第 4 步:调用API我们为您提供了丰富多样的API接口,您可以查看并调用【OCR】(链接:https://cloud.tencent.com/document/product/641/12407)服务。第 5 步:查看调用您可以登录【腾讯云控制台】(链接:https://console.cloud.tencent.com/ai/ocr/namecard),查OCR的各服务调用情况。问答OCR文字识别技术有哪些应用?相关阅读文字识别OCR知识资料全集(入门/进阶/论文/综述/代码/专家,附查看)我的AI之路 —— OCR文字识别快速体验版借你一双“慧眼”:一文读懂OCR文字识别︱技术派 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

October 25, 2018 · 1 min · jiezi