當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]這是一個(gè)手把手教你學(xué)習(xí)深度學(xué)校的教程。一步一步,我們將要嘗試去解決Kaggle challenge中的臉部關(guān)鍵點(diǎn)的檢測(cè)問(wèn)題。這份教程介紹了Lasagne,一個(gè)比較新的基于Python和Thean

這是一個(gè)手把手教你學(xué)習(xí)深度學(xué)校的教程。一步一步,我們將要嘗試去解決Kaggle challenge中的臉部關(guān)鍵點(diǎn)的檢測(cè)問(wèn)題。

這份教程介紹了Lasagne,一個(gè)比較新的基于Python和Theano的神經(jīng)網(wǎng)絡(luò)庫(kù)。我們將用Lasagne去模擬一系列的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),討論一下數(shù)據(jù)增強(qiáng)(data augmentaTIon)、流失(dropout)、結(jié)合動(dòng)量(momentum)和預(yù)先訓(xùn)練(pre-training)。這里有很多方法可以將我們的結(jié)果改善不少。

我假設(shè)諸位已經(jīng)知道了一些關(guān)于神經(jīng)網(wǎng)絡(luò)的只是。所以我們就不介紹神經(jīng)網(wǎng)絡(luò)的背景知識(shí)了。這里也提供一些好的介紹神經(jīng)網(wǎng)絡(luò)的書(shū)籍和視頻,如Neural Networks and Deep Learning online book。Alec Radford的演講Deep Learning with Python’s Theano library也是一個(gè)快速介紹的好例子。以及ConvNetJS Browser Demos

預(yù)先準(zhǔn)備

如果你只需要看懂的話,則不需要自己寫(xiě)一個(gè)代碼然后去執(zhí)行。這里提供一些安裝的教程給那些配置好CUDA的GPU并且想要運(yùn)行試驗(yàn)的那些人。

我假設(shè)你們已經(jīng)安裝了CUDA toolkit, Python 2.7.x, numpy, pandas, matplotlib, 和scikit-learn。安裝剩下的依賴包,比如Lasagne和Theano都可以運(yùn)行下面的指令

pip install -r https://raw.githubusercontent.com/dnouri/kfkd-tutorial/master/requiremen...

注意,為了簡(jiǎn)潔起見(jiàn),我沒(méi)有在命令中創(chuàng)建虛擬環(huán)境,但是你需要的。

譯者:我是在windows10上面配置這個(gè)環(huán)境的,安裝anaconda(再用此環(huán)境安裝依賴包)、VS2013(不推薦2015)、CUDA工具即可。

如果一切都順利的話,你將會(huì)在你的虛擬環(huán)境下的src/lasagne/examples/目錄中找到mnist.py并運(yùn)行MNIST例子。這是一個(gè)對(duì)于神經(jīng)網(wǎng)絡(luò)的“Hello world”程序。數(shù)據(jù)中有十個(gè)分類,分別是0~9的數(shù)字,輸入時(shí)28&TImes;28的手寫(xiě)數(shù)字圖片。

cd src/lasagne/examples/

python mnist.py

此命令將在三十秒左右后開(kāi)始打印輸出。 這需要一段時(shí)間的原因是,Lasagne使用Theano做重型起重; Theano反過(guò)來(lái)是一個(gè)“優(yōu)化GPU元編程代碼生成面向數(shù)組的優(yōu)化Python數(shù)學(xué)編譯器”,它將生成需要在訓(xùn)練發(fā)生前編譯的C代碼。 幸運(yùn)的是,我們組需要在第一次運(yùn)行時(shí)支付這個(gè)開(kāi)銷的價(jià)格。

譯者:如果沒(méi)有配置GPU,用的是CPU的話,應(yīng)該是不用這么久的編譯時(shí)間,但是執(zhí)行時(shí)間有一些長(zhǎng)。如果用GPU,在第一次跑一些程序的時(shí)候,會(huì)有提示正在編譯的內(nèi)容。

當(dāng)訓(xùn)練開(kāi)始的時(shí)候,你會(huì)看到

Epoch 1 of 500

training loss: 1.352731

validaTIon loss: 0.466565

validaTIon accuracy: 87.70 %

Epoch 2 of 500

training loss: 0.591704

validation loss: 0.326680

validation accuracy: 90.64 %

Epoch 3 of 500

training loss: 0.464022

validation loss: 0.275699

validation accuracy: 91.98 %

如果你讓訓(xùn)練運(yùn)行足夠長(zhǎng),你會(huì)注意到,在大約75代之后,它將達(dá)到大約98%的測(cè)試精度。

如果你用的是GPU,你想要讓Theano去使用它,你要在用戶的主文件夾下面創(chuàng)建一個(gè).theanorc文件。你需要根據(jù)自己安裝環(huán)境以及自己操作系統(tǒng)的配置使用不同的配置信息:

[global]

floatX = float32

device = gpu0

[lib]

cnmem = 1

譯者:這是我的配置文件。

[cuba]

root = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

[global]

openmp = False

device = gpu

floatX = float32

allow_input_downcast = True

[nvcc]

fastmath = True

flags = -IC:\Anaconda2\libs

compiler_bindir = C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

base_compiledir = path_to_a_directory_without_such_characters

[blas]

ldflags =

[gcc]

cxxflags = -IC:\Anaconda2\MinGW

數(shù)據(jù)

面部關(guān)鍵點(diǎn)檢測(cè)的訓(xùn)練數(shù)據(jù)集包括7049(96x96)個(gè)灰度圖像。 對(duì)于每個(gè)圖像,我們應(yīng)該學(xué)習(xí)找到15個(gè)關(guān)鍵點(diǎn)的正確位置(x和y坐標(biāo)),例如

left_eye_center

right_eye_outer_corner

mouth_center_bottom_lip

一個(gè)臉部標(biāo)記出三個(gè)關(guān)鍵點(diǎn)的例子。

數(shù)據(jù)集的一個(gè)有趣的變化是,對(duì)于一些關(guān)鍵點(diǎn),我們只有大約2,000個(gè)標(biāo)簽,而其他關(guān)鍵點(diǎn)有7,000多個(gè)標(biāo)簽可用于訓(xùn)練。

讓我們編寫(xiě)一些Python代碼,從所提供的CSV文件加載數(shù)據(jù)。 我們將編寫(xiě)一個(gè)可以加載訓(xùn)練和測(cè)試數(shù)據(jù)的函數(shù)。 這兩個(gè)數(shù)據(jù)集的區(qū)別在于測(cè)試數(shù)據(jù)不包含目標(biāo)值; 這是預(yù)測(cè)這些問(wèn)題的目標(biāo)。 這里是我們的load()函數(shù):

# file kfkd.py

import os

import numpy as np

from pandas.io.parsers import read_csv

from sklearn.utils import shuffle

FTRAIN = '~/data/kaggle-facial-keypoint-detection/training.csv'

FTEST = '~/data/kaggle-facial-keypoint-detection/test.csv'

def load(test=False, cols=None):

"""Loads data from FTEST if *test* is True, otherwise from FTRAIN.

Pass a list of *cols* if you're only interested in a subset of the

target columns.

"""

fname = FTEST if test else FTRAIN

df = read_csv(os.path.expanduser(fname)) # load pandas dataframe

# The Image column has pixel values separated by space; convert

# the values to numpy arrays:

df['Image'] = df['Image'].apply(lambda im: np.fromstring(im, sep=' '))

if cols: # get a subset of columns

df = df[list(cols) + ['Image']]

print(df.count()) # prints the number of values for each column

df = df.dropna() # drop all rows that have missing values in them[!--empirenews.page--]

X = np.vstack(df['Image'].values) / 255. # scale pixel values to [0, 1]

X = X.astype(np.float32)

if not test: # only FTRAIN has any target columns

y = df[df.columns[:-1]].values

y = (y - 48) / 48 # scale target coordinates to [-1, 1]

X, y = shuffle(X, y, random_state=42) # shuffle train data

y = y.astype(np.float32)

else:

y = None

return X, y

X, y = load()

print("X.shape == {}; X.min == {:.3f}; X.max == {:.3f}".format(

X.shape, X.min(), X.max()))

print("y.shape == {}; y.min == {:.3f}; y.max == {:.3f}".format(

y.shape, y.min(), y.max()))

你沒(méi)有必要看懂這個(gè)函數(shù)的每一個(gè)細(xì)節(jié)。 但讓我們看看上面的腳本輸出:

$ python kfkd.py

left_eye_center_x 7034

left_eye_center_y 7034

right_eye_center_x 7032

right_eye_center_y 7032

left_eye_inner_corner_x 2266

left_eye_inner_corner_y 2266

left_eye_outer_corner_x 2263

left_eye_outer_corner_y 2263

right_eye_inner_corner_x 2264

right_eye_inner_corner_y 2264

mouth_right_corner_x 2267

mouth_right_corner_y 2267

mouth_center_top_lip_x 2272

mouth_center_top_lip_y 2272

mouth_center_bottom_lip_x 7014

mouth_center_bottom_lip_y 7014

Image 7044

dtype: int64

X.shape == (2140, 9216); X.min == 0.000; X.max == 1.000

y.shape == (2140, 30); y.min == -0.920; y.max == 0.996

首先,它打印出了CSV文件中所有列的列表以及每個(gè)列的可用值的數(shù)量。 因此,雖然我們有一個(gè)圖像的訓(xùn)練數(shù)據(jù)中的所有行,我們對(duì)于mouth_right_corner_x只有個(gè)2,267的值等等。

load()返回一個(gè)元組(X,y),其中y是目標(biāo)矩陣。 y的形狀是n×m的,其中n是具有所有m個(gè)關(guān)鍵點(diǎn)的數(shù)據(jù)集中的樣本數(shù)。 刪除具有缺失值的所有行是這行代碼的功能:

df = df.dropna() # drop all rows that have missing values in them

這個(gè)腳本輸出的y.shape == (2140, 30)告訴我們,在數(shù)據(jù)集中只有2140個(gè)圖像有著所有30個(gè)目標(biāo)值。

一開(kāi)始,我們將僅訓(xùn)練這2140個(gè)樣本。 這使得我們比樣本具有更多的輸入大小(9,216); 過(guò)度擬合可能成為一個(gè)問(wèn)題。當(dāng)然,拋棄70%的訓(xùn)練數(shù)據(jù)也是一個(gè)壞主意。但是目前就這樣,我們將在后面談?wù)摗?/p>

第一個(gè)模型:一個(gè)單隱層

現(xiàn)在我們已經(jīng)完成了加載數(shù)據(jù)的工作,讓我們使用Lasagne并創(chuàng)建一個(gè)帶有一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò)。 我們將從代碼開(kāi)始:

# add to kfkd.py

from lasagne import layers

from lasagne.updates import nesterov_momentum

from nolearn.lasagne import NeuralNet

net1 = NeuralNet(

layers=[ # three layers: one hidden layer

('input', layers.InputLayer),

('hidden', layers.DenseLayer),

('output', layers.DenseLayer),

],

# layer parameters:

input_shape=(None, 9216), # 96x96 input pixels per batch

hidden_num_units=100, # number of units in hidden layer

output_nonlinearity=None, # output layer uses identity function

output_num_units=30, # 30 target values

# optimization method:

update=nesterov_momentum,

update_learning_rate=0.01,

update_momentum=0.9,

regression=True, # flag to indicate we're dealing with regression problem

max_epochs=400, # we want to train this many epochs

verbose=1,

)

X, y = load()

net1.fit(X, y)

我們使用相當(dāng)多的參數(shù)來(lái)初始化NeuralNet。讓我們看看他們。首先是三層及其參數(shù):

layers=[ # 三層神經(jīng)網(wǎng)絡(luò):一個(gè)隱層

('input', layers.InputLayer),

('hidden', layers.DenseLayer),

('output', layers.DenseLayer),

],

# 層的參數(shù):

input_shape=(None, 9216), # 每個(gè)批次96x96個(gè)輸入樣例

hidden_num_units=100, # 隱層中的單元數(shù)

output_nonlinearity=None, # 輸出用的激活函數(shù)

output_num_units=30, # 30個(gè)目標(biāo)值

這里我們定義輸入層,隱藏層和輸出層。在層參數(shù)中,我們命名并指定每個(gè)層的類型及其順序。參數(shù)input_shape,hidden_??num_units,output_nonlinearity和output_num_units是特定層的參數(shù)。它們通過(guò)它們的前綴引用層,使得input_shape定義輸入層的shape參數(shù),hidden_??num_units定義隱藏層的num_units等等。(看起來(lái)有點(diǎn)奇怪,我們必須指定像這樣的參數(shù),但結(jié)果是它讓我們對(duì)于受使用scikit-learn的管道和參數(shù)搜索功能擁有更好的兼容性。)

我們將input_shape的第一個(gè)維度設(shè)置為None。這轉(zhuǎn)換為可變批量大小。如果你知道批量大小的話,也可以設(shè)置成固定值,如果為None,則是可變值。

我們將output_nonlinearity設(shè)置為None。因此,輸出單元的激活僅僅是隱藏層中的激活的線性組合。

DenseLayer使用的默認(rèn)非線性是rectifier,它其實(shí)就是返回max(0, x)。它是當(dāng)今最受歡迎的激活功能選擇。通過(guò)不明確設(shè)置hidden_??nonlinearity,我們選擇rectifier作為我們隱藏層的激活函數(shù)。

神經(jīng)網(wǎng)絡(luò)的權(quán)重用具有巧妙選擇的間隔的均勻分布來(lái)初始化。也就是說(shuō),Lasagne使用“Glorot-style”初始化來(lái)計(jì)算出這個(gè)間隔。

還有幾個(gè)參數(shù)。 所有以u(píng)pdate開(kāi)頭的參數(shù)用來(lái)表示更新方程(或最優(yōu)化方法)的參數(shù)。 更新方程將在每個(gè)批次后更新我們網(wǎng)絡(luò)的權(quán)重。 我們將使用涅斯捷羅夫動(dòng)量梯度下降優(yōu)化方法(nesterov_momentum gradient descent optimization method)來(lái)完成這項(xiàng)工作。Lasagne實(shí)現(xiàn)的其他方法有很多,如adagrad和rmsprop。我們選擇nesterov_momentum,因?yàn)樗呀?jīng)證明對(duì)于大量的問(wèn)題很好地工作。[!--empirenews.page--]

”’ optimization method: ””

update=nesterov_momentum,

update_learning_rate=0.01,

update_momentum=0.9,

update_learning_rate定義了梯度下降更新權(quán)重的步長(zhǎng)。我們稍后討論學(xué)習(xí)率和momentum參數(shù),現(xiàn)在的話,這種健全的默認(rèn)值已經(jīng)足夠了。

上圖是不同的最優(yōu)化方法的對(duì)比(animation by?Alec Radford)。星標(biāo)位置為全局最優(yōu)值。注意到不添加動(dòng)量的隨機(jī)梯度下降是收斂最慢的,我們?cè)诮坛讨袕念^到尾都是用Nesterov加速過(guò)的梯度下降。

在我們的NeuralNet的定義中,我們沒(méi)有指定一個(gè)目標(biāo)函數(shù)來(lái)實(shí)現(xiàn)最小化。這里使用的還有一個(gè)默認(rèn)值:對(duì)于回歸問(wèn)題,它是均方誤差(MSE)。

最后一組參數(shù)聲明我們正在處理一個(gè)回歸問(wèn)題(而不是分類),400是我們?cè)敢庥?xùn)練的時(shí)期數(shù),并且我們想在訓(xùn)練期間通過(guò)設(shè)置verbose = 1:

regression=True, # flag to indicate we're dealing with regression problem

max_epochs=400, # we want to train this many epochs

verbose=1,

最后兩行加載了數(shù)據(jù),然后用數(shù)據(jù)訓(xùn)練了我們的第一個(gè)神經(jīng)網(wǎng)絡(luò)。

X, y = load()

net1.fit(X, y)

運(yùn)行這兩行會(huì)輸出一個(gè)表格,每次完成一代就輸出一行。每一行里,我們可以看到當(dāng)前的訓(xùn)練損失和驗(yàn)證損失(最小二乘損失),以及兩者的比率。NeuroNet將會(huì)自動(dòng)把輸入數(shù)據(jù)X分成訓(xùn)練集和測(cè)試集,用20%的數(shù)據(jù)作驗(yàn)證。(比率可以通過(guò)參數(shù)eval_size=0.2調(diào)整)

$ python kfkd.py

...

InputLayer (None, 9216) produces 9216 outputs

DenseLayer (None, 100) produces 100 outputs

DenseLayer (None, 30) produces 30 outputs

Epoch | Train loss | Valid loss | Train / Val

--------|--------------|--------------|----------------

1 | 0.105418 | 0.031085 | 3.391261

2 | 0.020353 | 0.019294 | 1.054894

3 | 0.016118 | 0.016918 | 0.952734

4 | 0.014187 | 0.015550 | 0.912363

5 | 0.013329 | 0.014791 | 0.901199

...

200 | 0.003250 | 0.004150 | 0.783282

201 | 0.003242 | 0.004141 | 0.782850

202 | 0.003234 | 0.004133 | 0.782305

203 | 0.003225 | 0.004126 | 0.781746

204 | 0.003217 | 0.004118 | 0.781239

205 | 0.003209 | 0.004110 | 0.780738

...

395 | 0.002259 | 0.003269 | 0.690925

396 | 0.002256 | 0.003264 | 0.691164

397 | 0.002254 | 0.003264 | 0.690485

398 | 0.002249 | 0.003259 | 0.690303

399 | 0.002247 | 0.003260 | 0.689252

400 | 0.002244 | 0.003255 | 0.689606

在相對(duì)較快的GPU上訓(xùn)練,我們能夠在1分鐘之內(nèi)完成400個(gè)epoch的訓(xùn)練。注意測(cè)試損失會(huì)一直減小。(如果你訓(xùn)練得足夠長(zhǎng)時(shí)間,它將會(huì)有很小很小的改進(jìn))

現(xiàn)在我們有了一個(gè)很好的結(jié)果了么?我們看到測(cè)試誤差是0.0032,和競(jìng)賽基準(zhǔn)比試一下。記住我們將目標(biāo)除以了48以將其縮放到-1到1之間,也就是說(shuō),要是想計(jì)算均方誤差和排行榜的結(jié)果比較,必須把我們上面得到的0.003255還原到原來(lái)的尺度。

>>> import numpy as np

>>> np.sqrt(0.003255) * 48

2.7385251505144153

這個(gè)值應(yīng)該可以代表我們的成績(jī)了。當(dāng)然,這得假設(shè)測(cè)試集合的數(shù)據(jù)和訓(xùn)練集合的數(shù)據(jù)符合相同的分布,但事實(shí)卻并非如此。

測(cè)試網(wǎng)絡(luò)

我們剛剛訓(xùn)練的net1對(duì)象已經(jīng)保存了訓(xùn)練時(shí)打印在控制臺(tái)桌面中的記錄,我們可以獲取這個(gè)記錄通過(guò)train_history_相關(guān)屬性,讓我們畫(huà)出這兩個(gè)曲線。

train_loss = np.array([i["train_loss"] for i in net1.train_history_])

valid_loss = np.array([i["valid_loss"] for i in net1.train_history_])

pyplot.plot(train_loss, linewidth=3, label="train")

pyplot.plot(valid_loss, linewidth=3, label="valid")

pyplot.grid()

pyplot.legend()

pyplot.xlabel("epoch")

pyplot.ylabel("loss")

pyplot.ylim(1e-3, 1e-2)

pyplot.yscale("log")

pyplot.show()

我們能夠看到我們的網(wǎng)絡(luò)過(guò)擬合了,但是結(jié)果還不錯(cuò)。事實(shí)上,我們找不到驗(yàn)證錯(cuò)誤開(kāi)始上升的點(diǎn),所以那種通常用來(lái)避免過(guò)擬合的early stopping方法在現(xiàn)在還沒(méi)有什么用處。注意我們沒(méi)有采用任何正則化手段,除了選擇節(jié)點(diǎn)比較少的隱層——這可以讓過(guò)擬合保持在可控范圍內(nèi)。

那么網(wǎng)絡(luò)的預(yù)測(cè)結(jié)果是什么樣的呢?讓我們選擇一些樣例來(lái)看一看。

def plot_sample(x, y, axis):

img = x.reshape(96, 96)

axis.imshow(img, cmap='gray')

axis.scatter(y[0::2] * 48 + 48, y[1::2] * 48 + 48, marker='x', s=10)

X, _ = load(test=True)

y_pred = net1.predict(X)

fig = pyplot.figure(figsize=(6, 6))

fig.subplots_adjust(

left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)

for i in range(16):

ax = fig.add_subplot(4, 4, i + 1, xticks=[], yticks=[])

plot_sample(X[i], y_pred[i], ax)

pyplot.show()

第一個(gè)模型預(yù)測(cè)的結(jié)果(從測(cè)試集抽出了16個(gè)樣例)

預(yù)測(cè)結(jié)果看起來(lái)還不錯(cuò),但是有點(diǎn)時(shí)候還是有一點(diǎn)偏。讓我們?cè)囍龅母靡恍?/p>

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉