谷歌Pixel 2人像模式代码曝光,你看懂了吗?

thbcm阅读(278)

谷歌把他们所应用的 AI 图像分层算法 DeepLab-v3+ 变成开源代码,让第三方相机 app 都可以利用借此神经网络。

 开源代码:

 import tensorflow as tf

 from deeplab.core import feature_extractor

 

 slim = tf.contrib.slim

 

 _LOGITS_SCOPE_NAME = ‘logits’

 _MERGED_LOGITS_SCOPE = ‘merged_logits’

 _IMAGE_POOLING_SCOPE = ‘image_pooling’

 _ASPP_SCOPE = ‘aspp’

 _CONCAT_PROJECTION_SCOPE = ‘concat_projection’

 _DECODER_SCOPE = ‘decoder’

 

 

 def get_extra_layer_scopes():

 “””Gets the scopes for extra layers.

 

 Returns:

 A list of scopes for extra layers.

 “””

 return [

 _LOGITS_SCOPE_NAME,

 _IMAGE_POOLING_SCOPE,

 _ASPP_SCOPE,

 _CONCAT_PROJECTION_SCOPE,

 _DECODER_SCOPE,

 ]

 

 

 def predict_labels_multi_scale(images,

 model_options,

 eval_scales=(1.0,),

 add_flipped_images=False):

 “””Predicts segmentation labels.

 

 Args:

 images: A tensor of size [batch, height, width, channels].

 model_options: A ModelOptions instance to configure models.

 eval_scales: The scales to resize images for evaluation.

 add_flipped_images: Add flipped images for evaluation or not.

 

 Returns:

 A dictionary with keys specifying the output_type (e.g., semantic

 prediction) and values storing Tensors representing predictions (argmax

 over channels). Each prediction has size [batch, height, width].

 “””

 outputs_to_predictions = {

 output: []

 for output in model_options.outputs_to_num_classes

 }

 

 for i, image_scale in enumerate(eval_scales):

 with tf.variable_scope(tf.get_variable_scope(), reuse=True if i else None):

 outputs_to_scales_to_logits = multi_scale_logits(

 images,

 model_options=model_options,

 image_pyramid=[image_scale],

 is_training=False,

 fine_tune_batch_norm=False)

 

 if add_flipped_images:

 with tf.variable_scope(tf.get_variable_scope(), reuse=True):

 outputs_to_scales_to_logits_reversed = multi_scale_logits(

 tf.reverse_v2(images, [2]),

 model_options=model_options,

 image_pyramid=[image_scale],

 is_training=False,

 fine_tune_batch_norm=False)

 

 for output in sorted(outputs_to_scales_to_logits):

 scales_to_logits = outputs_to_scales_to_logits[output]

 logits = tf.image.resize_bilinear(

 scales_to_logits[_MERGED_LOGITS_SCOPE],

 tf.shape(images)[1:3],

 align_corners=True)

 outputs_to_predictions[output].append(

 tf.expand_dims(tf.nn.softmax(logits), 4))

 

 if add_flipped_images:

 scales_to_logits_reversed = (

 outputs_to_scales_to_logits_reversed[output])

 logits_reversed = tf.image.resize_bilinear(

 tf.reverse_v2(scales_to_logits_reversed[_MERGED_LOGITS_SCOPE], [2]),

 tf.shape(images)[1:3],

 align_corners=True)

 outputs_to_predictions[output].append(

 tf.expand_dims(tf.nn.softmax(logits_reversed), 4))

 

 for output in sorted(outputs_to_predictions):

 predictions = outputs_to_predictions[output]

 # Compute average prediction across different scales and flipped images.

 predictions = tf.reduce_mean(tf.concat(predictions, 4), axis=4)

 outputs_to_predictions[output] = tf.argmax(predictions, 3)

 

 return outputs_to_predictions

 

 

 def predict_labels(images, model_options, image_pyramid=None):

 “””Predicts segmentation labels.

 

 Args:

 images: A tensor of size [batch, height, width, channels].

 model_options: A ModelOptions instance to configure models.

 image_pyramid: Input image scales for multi-scale feature extraction.

 

 Returns:

 A dictionary with keys specifying the output_type (e.g., semantic

 prediction) and values storing Tensors representing predictions (argmax

 over channels). Each prediction has size [batch, height, width].

 “””

 outputs_to_scales_to_logits = multi_scale_logits(

 images,

 model_options=model_options,

 image_pyramid=image_pyramid,

 is_training=False,

 fine_tune_batch_norm=False)

 

 predictions = {}

 for output in sorted(outputs_to_scales_to_logits):

 scales_to_logits = outputs_to_scales_to_logits[output]

 logits = tf.image.resize_bilinear(

 scales_to_logits[_MERGED_LOGITS_SCOPE],

 tf.shape(images)[1:3],

 align_corners=True)

 predictions[output] = tf.argmax(logits, 3)

 

 return predictions

 

 

 def scale_dimension(dim, scale):

 “””Scales the input dimension.

 

 Args:

 dim: Input dimension (a scalar or a scalar Tensor).

 scale: The amount of scaling applied to the input.

 

 Returns:

 Scaled dimension.

 “””

 if isinstance(dim, tf.Tensor):

 return tf.cast((tf.to_float(dim) – 1.0)
scale + 1.0, dtype=tf.int32)
 else:
 return int((float(dim) – 1.0)
scale + 1.0)

 

 

 def multi_scale_logits(images,

 model_options,

 image_pyramid,

 weight_decay=0.0001,

 is_training=False,

 fine_tune_batch_norm=False):

 “””Gets the logits for multi-scale inputs.

 

 The returned logits are all downsampled (due to max-pooling layers)

 for both training and evaluation.

 更多查看:
https://github.com/tensorflow/models/tree/master/research/deeplab

基于docker的AI-Codereview-Gitlab部署实战

thbcm阅读(297)

当用户在 GitLab 上提交代码(如 Merge Request 或 Push 操作)时,GitLab 将自动触发 webhook事件,调用本系统的接口。系统随后通过第三方大模型对代码进行审查,并将审查结果直接反馈到对应的 Merge Request 或 Commit 的Note 中,便于团队查看和处理。

2018编程语言排行榜 Ruby杀回前十

thbcm阅读(289)

  在TIOBE发布的最新一期的编程语言排行榜中, C语言的涨幅最高,达到了6.66%,此外,Ruby也成功压下Perl,重回前十行列。

  编程语言排行榜前20名如下:


  目前,在前20的排行中,Objective-C和Perl下降幅度最大,都下滑了3个名次以上。

  Objective-C下滑的原因主要是因为Swift的出现,从而导致Objective-C被苹果所抛弃。此外,App开发也在转向独立于平台的语言和框架,而Swift 只适用于Apple的系统,目前的生存环境也并不理想。

  至于Perl,直到2005年,它还一直是最主要的脚本语言之一。在2008年,TIOBE曾预测Perl将会走向死亡,但被众多Perl的拥护者所否决。Stevan Little在2013年曾发表过一次演讲,名为“Perl没有死,它只是走进了一个死胡同”,其中就有提到一旦软件工程师放弃使用Perl语言,就不会再次选择使用它。

  TIOBE表示,Perl语言一直止步不前,是广大开发者们寻找诸如Python和Ruby之类替代品的主要原因。直到今天,Perl社区仍然没有一个明确的未来,因此它还会继续走下坡路,如今只是苦苦挣扎罢了。

  相关推荐:

  
Python微课:Python快速自学入门

  Ruby微课:Ruby轻松上手

  值得一提的是,SQL在上上个月被重新添加到了TIOBE排行榜中,这个月排在第九


      SQL自学推荐:SQL微课

  Top 10 编程语言 TIOBE 指数走势(2002-2018)


  编程语言“名人榜”( 2003-2017)

  “年度编程语言”获奖名单如下图所示,该奖项授予一年中评分最高的编程语言:

用AI开发AI翻译助手:初学者也能轻松做出第一个应用

thbcm阅读(253)

我最近完成了一个小项目:一个由AI驱动的翻译助手 ——
LinguaLens。最有趣的是,我基本上是
在AI的帮助下完成整个开发过程的。这个经历让我想和更多对编程感兴趣、但还没有迈出第一步的朋友们分享:
现在是学习编程最好的时代,而AI正是你最值得信赖的学习伙伴。

编程入门先学什么 初学者编程入门指南

thbcm阅读(329)

  编程入门先学什么?相信这是很多想要自学编程的小伙伴都会有的疑惑,本文将为大家带来初学者编程入门指南。

      明确学习编程的目的

  对于一个没有任何基础的小白来说,学习编程最重要的是要保持初心。明确自己学习编程的目的,是想开发APP、网站,还是要求解专业方向上的问题,或者完成一个游戏、制作一个交互动画效果,还是别的什么。在学习时,时刻记得自己是为什么来学习编程的,学一点用一点,感受到每天都在进步,这样就有坚持下来的动力了。

  语言怎么选择?

  语言选择是由学习的目的决定的,比如你想做Andriod应用开发,那么就学Java;想做iOS应用开发则是Objective-C或者Swift,做网页学JavaScript,大数据考虑Python或者R,想做游戏得花可以学C/C++。

  其实对于零基础的爱好者,随大流才是明智的,哪种语言流行学哪种,至于哪种语言最流行的,可以参考TIOBE发布的编程语言排行榜。

  如果只有泛泛的兴趣,一律推荐学JavaScript,其实如果纯考虑语言的话,Java其实更好,学习单,容易上手。不过JavaScript拿来做页面效果,比较容易有成就感,环境依赖也比较小。

      推荐阅读:
  JavaScript教程,JS轻松快速入门
  JavaScript微课,边学边实践

  语言怎么入门?

  那么语言本身怎么入门呢?对初学者,我喜欢推荐
W3Cschool上的教程,尤其是里面的微课教程更是强烈推荐。这些教程让你在学习的同时,又可以动手进行实例演练,同时又省去了配置环境麻烦。别小看最后一点,软件开发的环境配置实在是一个比较烦人的事儿,非常容易掉坑里。

  所以,零基础的爱好者尽量选择解释型语言学起,用好的集成开发环境( IDE )工作,比如学习Windows应用开发用Visual Studio,学习PHP考虑Zend Studio或者PHPStorm,学web开发的WebStorm/Sublime/Visual Studio Code等。

  实践比理论更重要

  埋头学理论是不可取的,编程是个手艺活,手熟是一切的基础。学一点就要写写练手的程序,当然一下子叫你写复杂的大程序那是给自己找坑,从简单的hello world开始最适合。

  其实视频教程非常具有欺骗性,看这视频中老师行云流水地演示,然后自己抄一遍顺利出了正确结果,就以为自己也学会了。但是关了视频后,你看还记得多少?自己出个题目写一下试试?立即就发现记忆里缺很多细节。

  所以拿新学的语言元素写练习程序是学会编程的非常重要的途径,对于心急的初学者,学到能够自己不查书写出在字符串数组里找到输入的字符串,基本就有足够的表达能力去书写所需要的逻辑了。

  语言入门之后,就可以试着写点自己感兴趣的东西,语言肯定还不够熟,所以手边准备一本语言参考书随时备查吧。要自己写点东西,难免碰到一大堆平台、系统相关的背景知识,有时间找本入门本书或者课程系统学一下基本概念最好。

  刚开始动手写程序时,出错是必然的,不要怕出错,要学会看出错信息,有不明白的地方就拿着完整的出错信息去网上查,问别人的时候尽可能提供详细的信息,尽最大努力不要让别人猜,这样得到帮助的可能性会大很多。

  总结一下,学编程是为了解决问题,把你的问题分解细化,让它一步一步驱动你的学习过程,学起来就没那么难啦。

LangChain4j比SpringAI强在哪?一文读懂

thbcm阅读(318)

LangChain4j 和 Spring AI 的功能是比较类似的,甚至两者可以配合使用,例如使用 Spring AI 实现 MCP 服务器端,再使用 LangChain4j 实现 MCP 客户端调用 Spring AI,二者可以无缝对接。那二者的区别是啥呢?

学java还是javascript好?哪个更有前途?

thbcm阅读(334)


  对于哪种语言好这种问题,其实并没有固定的答案,最重要的还是
兴趣!兴趣!兴趣!重要的事情说三遍。无论做什么开发,永远要以兴趣来驱动自己学习。

      先大致的说一下,Java学习是一个需要耗费长周期的过程,考验一个人的逻辑能力,如果你现在还在学校,时间比较充裕,建议从学习Java开始。

  选择学java,后面你有两条路可以走,第一个是javaweb做各种网站软件开发,第二个是android开发。

      java相关教程:
  java入门教程
  java微课

  而相比较而言,javascript属于纯前端页面开发,门槛较低,入门稍快,可以在短时间内看到收益,但是由于前端变化特别快,需要永远保持积极学习的态度,如果你急需找工作,没太多时间,可以选择javascript。

  如果你选择前端,往后面学可以学jQuery、easy UI等各种基于js的扩展。你还可以学HTML5,现在HTML5前景很广的。

      javascript相关教程:
  javascript入门教程
  javascript微课
      javascript实战演练

  当然,最终不管你选择哪个方向,只要用心学,到最后都会有一个好的发展。

联系我们