要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或下载 .NET 10 SDK。
谷歌Pixel 2人像模式代码曝光,你看懂了吗?
谷歌把他们所应用的 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部署实战
当用户在 GitLab 上提交代码(如 Merge Request 或 Push 操作)时,GitLab 将自动触发 webhook事件,调用本系统的接口。系统随后通过第三方大模型对代码进行审查,并将审查结果直接反馈到对应的 Merge Request 或 Commit 的Note 中,便于团队查看和处理。
2018编程语言排行榜 Ruby杀回前十
在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快速自学入门
值得一提的是,SQL在上上个月被重新添加到了TIOBE排行榜中,这个月排在第九
SQL自学推荐:SQL微课
Top 10 编程语言 TIOBE 指数走势(2002-2018)

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

用AI开发AI翻译助手:初学者也能轻松做出第一个应用
我最近完成了一个小项目:一个由AI驱动的翻译助手 ——
LinguaLens。最有趣的是,我基本上是
在AI的帮助下完成整个开发过程的。这个经历让我想和更多对编程感兴趣、但还没有迈出第一步的朋友们分享:
现在是学习编程最好的时代,而AI正是你最值得信赖的学习伙伴。
Java的”伪泛型”变”真泛型”后,会对性能有帮助吗?
泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法。
编程入门先学什么 初学者编程入门指南
编程入门先学什么?相信这是很多想要自学编程的小伙伴都会有的疑惑,本文将为大家带来初学者编程入门指南。
明确学习编程的目的
对于一个没有任何基础的小白来说,学习编程最重要的是要保持初心。明确自己学习编程的目的,是想开发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强在哪?一文读懂
LangChain4j 和 Spring AI 的功能是比较类似的,甚至两者可以配合使用,例如使用 Spring AI 实现 MCP 服务器端,再使用 LangChain4j 实现 MCP 客户端调用 Spring AI,二者可以无缝对接。那二者的区别是啥呢?
学java还是javascript好?哪个更有前途?

对于哪种语言好这种问题,其实并没有固定的答案,最重要的还是
兴趣!兴趣!兴趣!重要的事情说三遍。无论做什么开发,永远要以兴趣来驱动自己学习。
先大致的说一下,Java学习是一个需要耗费长周期的过程,考验一个人的逻辑能力,如果你现在还在学校,时间比较充裕,建议从学习Java开始。
选择学java,后面你有两条路可以走,第一个是javaweb做各种网站软件开发,第二个是android开发。
而相比较而言,javascript属于纯前端页面开发,门槛较低,入门稍快,可以在短时间内看到收益,但是由于前端变化特别快,需要永远保持积极学习的态度,如果你急需找工作,没太多时间,可以选择javascript。
如果你选择前端,往后面学可以学jQuery、easy UI等各种基于js的扩展。你还可以学HTML5,现在HTML5前景很广的。
javascript相关教程:
javascript入门教程
javascript微课
javascript实战演练
当然,最终不管你选择哪个方向,只要用心学,到最后都会有一个好的发展。
解密AI知识库

小狮博客