OSCR

RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features.

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
  1. [1] § Methodology › TSLANet module ↔ tools/VisualizationTech.py, lines 113–156 · score 0.57 · Power Spectral Density, PSD, adaptive
  2. [2] § Experimental setup › Datasets ↔ bciciv2a/general_processor.py, lines 199–218 · score 0.56 · notch filter, band pass, BCICIV2a
  3. [3] § Experimental setup › Datasets ↔ bciciv2a/general_processor_BCICIV.py, lines 103–122 · score 0.56 · notch filter, band pass, BCICIV2a
  4. [4] § Methodology › TSLANet module ↔ bciciv2a/MIBCICIV2a_mat_generate_TE.py, the whole file · a weak match · score 0.55 · Power Spectral Density, PSD, channel
  5. [5] § Experimental setup › Data preprocessing and division ↔ bciciv2a/LoaderBCICIV2a.py, lines 235–311 · score 0.53 · Riemannian alignment, Covariance matrices, LOSO, raw, training

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 345 lines · 15 KB · no license · 1 match

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Sep 2, 18:17:29 2019
  4. @author: JIAN
  5. """
  6. import torch
  7. import numpy as np
  8. import torch.optim as optim
  9. import matplotlib.pyplot as plt
  10. from matplotlib.collections import LineCollection
  11. from scipy.integrate import simps
  12. from mne.time_frequency import psd_array_multitaper
  13. import matplotlib.gridspec as gridspec
  14. # from CompactCNN import CompactCNN
  15. from EEGConformerG4 import Conformer
  16. from bciciv2a.LoaderBCICIV2a import BCICIV2Amatdataloader2D
  17. from bciciv2a.general_processor_BCICIV_mat_TE import Utils as UtilsmatTE
  18. plt.rcParams.update({'font.size': 12})
  19. torch.cuda.empty_cache()
  20. torch.manual_seed(0)
  21. class FeatureVis:
  22. def __init__(self, model):
  23. self.model = model
  24. self.model.eval()
  25. def generate_heatmap(self, allsignals, sampleidx, subid, samplelabel, multichannelsignal, likelihood):
  26. """
  27. input:
  28. allsignals: all the signals in the batch 每个batch中的所有信号
  29. sampleidx: the index of the sample 样本索引
  30. subid: the ID of the subject 被试编号
  31. samplelabel: the ground truth label of the sample 样本的标签
  32. multichannelsignal: the signals from all channels for the sample 样本全部通道的信号
  33. likelihood: the likelihood of the sample to be classified into alert and drowsy state
  34. 样本被分为警觉和嗜睡状态的可能性,原文中的任务为识别司机驾驶是否为 清醒 还是 昏昏欲睡
  35. 那么我们自己的任务为4分类 左 右 脚 舌
  36. """
  37. # 相关性谁大选谁(对于二分类来说)
  38. # if likelihood[0] > likelihood[1]:
  39. # state = 0
  40. # else:
  41. # state = 1
  42. # 得到最大的类别的位置,后边能用到
  43. likelihoodlist = likelihood.tolist()
  44. state = likelihoodlist.index(max(likelihoodlist))
  45. if samplelabel == 0:
  46. labelstr = 'Left'
  47. elif samplelabel == 1:
  48. labelstr = 'Right'
  49. elif samplelabel == 2:
  50. labelstr = 'Foot'
  51. else:
  52. labelstr = 'Tongue'
  53. # 画布宽度为14英寸 高度为6英寸
  54. fig = plt.figure(figsize=(28, 12))
  55. # 顶部中央放置一个标签
  56. fig.suptitle('Subject:' + str(int(subid)) + ' ' + 'Label:' + labelstr
  57. + ' $P_{Left}=$' + str(round(likelihood[0], 2))
  58. + ' $P_{Right}=$' + str(round(likelihood[1], 2))
  59. + ' $P_{Foot}=$' + str(round(likelihood[2], 2))
  60. + ' $P_{Tongue}=$' + str(round(likelihood[3], 2))
  61. ) # , fontsize=12)
  62. # devide the figure layout
  63. # 创建一个grid网格图形,2列3行,可以存放多个子图
  64. gridlayout = gridspec.GridSpec(ncols=2, nrows=3, figure=fig, wspace=0.2, hspace=0.5)
  65. # 在网格中创建一个子图,占据前两行,第一列的位置
  66. axis0 = fig.add_subplot(gridlayout[0:2, 0])
  67. # 占据第三行
  68. axis1 = fig.add_subplot(gridlayout[2, 0])
  69. # 占据前三行,第二列
  70. axis2 = fig.add_subplot(gridlayout[0:3, 1])
  71. # do some preparations 准备一下
  72. # 获得某个样本的信号
  73. rawsignal = allsignals[sampleidx].cpu().detach().numpy().squeeze()
  74. # 通道数
  75. channelnum = multichannelsignal.shape[0]
  76. # 样本长度
  77. samplelength = multichannelsignal.shape[1]
  78. # 信号中的最大值
  79. maxvalue = np.max(np.abs(rawsignal))
  80. # 卷积核长度
  81. convkernelLength = self.model.kernelLength
  82. # calculate the heatmap for the sample 为样本计算热力图
  83. # 通过model也就是自定义的网路,以此运行里面的结构来计算 conv batch 最后激活函数
  84. # 计算了所有的信号
  85. source = self.model.conv(allsignals)
  86. source = self.model.batch(source)
  87. source = torch.nn.ELU()(source)
  88. # 得到运行结束后的激活结果 取出其中特定的一个信号
  89. activations = source[sampleidx].cpu().detach().numpy().squeeze()
  90. # 得到最大的类别(也就是训练出来的类别)的权重
  91. weights = self.model.fc.weight[state].cpu().detach().numpy().squeeze()
  92. # 得到cam Class Activation Mapping 计算激活后的结果与权重的乘积
  93. cam = np.matmul(weights, activations)
  94. # 得到长度为samplelength的零元素数组 热力图
  95. heatmap = np.zeros(samplelength)
  96. # 计算卷积长度一半
  97. halfkerlength = int(convkernelLength / 2)
  98. # 首先这个CAM的内容(权重*运行结果)放入到热力图当中 [32:(1000 - 32 + 1)] 这个长度应该是网络训练后自动计算好的
  99. heatmap[halfkerlength:(samplelength - halfkerlength + 1)] = cam
  100. # 将热力图前边和后边空缺部分填充:空缺为头或尾的平均值
  101. for i in range(halfkerlength - 1):
  102. heatmap[i] = heatmap[halfkerlength] * i / (halfkerlength - 1)
  103. for i in range((samplelength - halfkerlength), samplelength):
  104. heatmap[i] = heatmap[halfkerlength] * (samplelength - halfkerlength + 1 - i) / halfkerlength
  105. # 将热力图标准化
  106. heatmap = (heatmap - np.mean(heatmap)) / np.sqrt(np.sum(heatmap ** 2) / samplelength)
  107. # calculate the band power components
  108. # 计算多窗功率谱密度,psd,返回存储的频率值 freqs, 输入时域信号,自适应选择带宽
  109. psd, freqs = psd_array_multitaper(rawsignal, 250, adaptive=True, normalization='full', verbose=0)
  110. freq_res = freqs[1] - freqs[0] # 计算出频率间隔,这里应该都是相同的
  111. bandpowers = np.zeros(4)
  112. # 产生一个bool数组,每个元素对应频率是否在范围[1, 4]内,可以用作筛选Alpha波段
  113. idx_band = np.logical_and(freqs >= 1, freqs <= 4)
  114. # 计算特定频率范围内的频带功率,并将结果存储在bandpowers当中
  115. bandpowers[0] = simps(psd[idx_band], dx=freq_res)
  116. idx_band = np.logical_and(freqs >= 4, freqs <= 8)
  117. bandpowers[1] = simps(psd[idx_band], dx=freq_res)
  118. idx_band = np.logical_and(freqs >= 8, freqs <= 12)
  119. bandpowers[2] = simps(psd[idx_band], dx=freq_res)
  120. idx_band = np.logical_and(freqs >= 12, freqs <= 30)
  121. bandpowers[3] = simps(psd[idx_band], dx=freq_res)
  122. # 计算总能量 dx为积分的步长,freq_res是频率分辨率,及频率轴上相邻频率值的间隔
  123. totalpower = simps(psd, dx=freq_res)
  124. if totalpower < 0.00000001:
  125. bandpowers = np.zeros(4)
  126. else:
  127. bandpowers /= totalpower
  128. barx = np.arange(1, 5) # 【1,2,3,4】
  129. # 绘制一个条形图,x轴由barx决定,高度y由bandpowers数组中的功率谱值决定,这代表频带功率在不同频带上的分布
  130. axis1.bar(barx, bandpowers)
  131. # 设置xy轴的范围
  132. axis1.set_xlim([0, 5])
  133. axis1.set_ylim([0, 0.8])
  134. # 标签
  135. axis1.set_ylabel("Relative power")
  136. # 设置刻度
  137. axis1.set_xticks([1, 2, 3, 4])
  138. axis1.set_xticklabels(['Delta', 'Theta', 'Alpha', 'Beta'])
  139. # draw the heatmap
  140. # 绘制样本长度
  141. xx = np.arange(1, (samplelength + 1))
  142. axis0.set_xticks([])
  143. axis0.set_ylim([-maxvalue - 10, maxvalue + 10])
  144. axis0.set_xlim([0, (samplelength + 1)])
  145. axis0.set_ylabel("mV")
  146. # 将信号索引与信号拼接 并且让索引与信号对应
  147. points = np.array([xx, rawsignal]).T.reshape(-1, 1, 2)
  148. # 将相邻的数据点结合成线段(用于表示线段?),存储在segments数组中
  149. segments = np.concatenate([points[:-1], points[1:]], axis=1)
  150. # 将数据归一化到
  151. norm = plt.Normalize(vmin=-1, vmax=1)
  152. # 创建了一组线段的集合 segments表示需要连接的线段,每个数据点由两个值,表示x和y坐标
  153. # camp 表示颜色映射方案
  154. lc = LineCollection(segments, cmap='viridis', norm=norm)
  155. # 将标准化好后的heatmap放入集合中
  156. lc.set_array(heatmap)
  157. lc.set_linewidth(2)
  158. # 将多条线段放入坐标轴中
  159. axis0.add_collection(lc)
  160. # 为图像加入颜色条 lc表示多条线段的集合,ax表示坐标轴位置,指定颜色条在水平方向显示
  161. fig.colorbar(lc, ax=axis0, orientation="horizontal", ticks=[-1, -0.5, 0, 0.5, 1])
  162. # draw all the signals
  163. # 计算多通道信号的第98%分位数
  164. thespan = np.percentile(multichannelsignal, 98)
  165. # 为多通道信号创建刻度位置 间隔为thespan
  166. yttics = np.zeros(channelnum)
  167. for i in range(channelnum):
  168. yttics[i] = i * thespan
  169. # 在位置三设置xy轴
  170. axis2.set_ylim([-thespan, thespan * channelnum])
  171. axis2.set_xlim([0, samplelength + 1])
  172. # 脑电位置 需要自定义(BCICIV2a)
  173. labels = ['Fp1', 'Fp2', 'F7', 'F3', 'Fz', 'F4', 'F8', 'FT7', 'FC3', 'FCZ', 'FC4', 'FT8', 'T3', 'C3', 'Cz', 'C4',
  174. 'T4', 'TP7', 'CP3', 'CPz', 'CP4', 'TP8', 'T5', 'P3', 'PZ', 'P4', 'T6', 'O1', 'Oz', 'O2']
  175. # 设置会话操作的焦点
  176. plt.sca(axis2)
  177. plt.yticks(yttics, labels)
  178. # 创建热力图1
  179. heatmap1 = np.zeros((channelnum, samplelength)) - 1
  180. # 复制热力图到热力图1倒数第二行
  181. heatmap1[-2, :] = heatmap
  182. # 由创建了一个xx,也就是样本序列
  183. xx = np.arange(1, samplelength + 1)
  184. # 对每个通道数据操作
  185. for i in range(0, channelnum):
  186. # 增加偏移量避免不同通道的数据重叠
  187. y = multichannelsignal[i, :] + thespan * i
  188. # 绘制导数图?
  189. dydx = heatmap1[i, :]
  190. # 将序列与单个通道匹配
  191. points = np.array([xx, y]).T.reshape(-1, 1, 2)
  192. # segments 是存储线段的数据,以便在绘图中显示连接的线段,一个是除了最后的数据点,还有一个是除了第一个数据点,组合创建了相连的数据点
  193. segments = np.concatenate([points[:-1], points[1:]], axis=1)
  194. norm = plt.Normalize(-1, 1)
  195. lc = LineCollection(segments, cmap='viridis', norm=norm)
  196. # dydx 表示要更新线段集合 lc 的颜色映射数据,通常这个数组将用于决定线段的颜色
  197. lc.set_array(dydx)
  198. lc.set_linewidth(2)
  199. axis2.add_collection(lc)
  200. def run():
  201. # 文件地址
  202. # filename = r'dataset.mat'
  203. # tmp = sio.loadmat(filename)
  204. # xdata = np.array(tmp['EEGsample']) # 得到原数据
  205. # label = np.array(tmp['substate']) # 得到标签
  206. # subIdx = np.array(tmp['subindex']) # 得到哪个人id
  207. # label.astype(int)
  208. # subIdx.astype(int)
  209. # 这里看出sample就是每次运行的结果,反映到BCICIV数据集即每4s为一个sample
  210. # samplenum = label.shape[0]
  211. # xdata 原始数据 包含所有人的
  212. # label 每个人的标签
  213. channelnum = 22
  214. classes = 4
  215. subjnum = 9
  216. samplelength = 1000
  217. lr = 5e-5 # for smalle net
  218. sf = 250
  219. batch_size = 64
  220. n_epoch = 100
  221. # ydata = np.zeros(samplenum, dtype=np.longlong)
  222. # for i in range(samplenum):
  223. # ydata[i] = label[i]
  224. # ydata 标签数据
  225. selectedchan = [22] # 选择的通道
  226. # rawx = xdata
  227. # rawx 是 xdata 的副本,也就是没有处理过的x
  228. # xdata = xdata[:, selectedchan, :] # 全选即可
  229. # 得到了xdata现在都是自己需要的通道了 其实和 rawx 和 xdata 一模一样
  230. # channelnum = len(selectedchan)
  231. # you can set the subject id here
  232. for i in range(2, 3):
  233. # 选择哪个被试作为测试集
  234. # trainindx = np.where(subIdx != i)[0]
  235. # xtrain = xdata[trainindx]
  236. # x_train = xtrain.reshape(xtrain.shape[0], 1, channelnum, samplelength * sf)
  237. # y_train = ydata[trainindx]
  238. # 从xdata中取出了当作被试的训练数据x_train
  239. # x_train为训练数据
  240. #
  241. # testindx = np.where(subIdx == i)[0]
  242. #
  243. # xtest = xdata[testindx]
  244. # rawxdata = rawx[testindx]
  245. # x_test = xtest.reshape(xtest.shape[0], 1, channelnum, samplelength * sf)
  246. # y_test = ydata[testindx]
  247. # 这个可以从自己的数据提取
  248. # train = TensorDataset(torch.from_numpy(x_train), torch.from_numpy(y_train))
  249. # train_loader = DataLoader(train, batch_size=batch_size, shuffle=True)
  250. # 自己的数据集提取方法
  251. source_path = "..\\..\\OwnDataset\\BCICIV2a\\mat\\TE\\oriprocessed\\blackman\\"
  252. x_train, y_train, xtest, ytest = UtilsmatTE.loadLOSO(subjects=[2],
  253. base_path=source_path,
  254. aug=0)
  255. y_test = ytest
  256. rawxdata = xtest
  257. train_loader, valid_loader, test_loader = BCICIV2Amatdataloader2D(path=source_path,
  258. batch_size=32,
  259. random_state=21,
  260. asubject=2,
  261. aug=0,
  262. addBase=False,
  263. newaxis=True,
  264. squeeze=False,
  265. mix=1)
  266. # 自己的Net
  267. my_net = Conformer().double().cuda()
  268. #
  269. optimizer = optim.Adam(my_net.parameters(), lr=lr)
  270. loss_class = torch.nn.CrossEntropyLoss().cuda()
  271. for p in my_net.parameters():
  272. p.requires_grad = True
  273. for epoch in range(n_epoch):
  274. for j, data in enumerate(train_loader, 0):
  275. inputs, labels = data
  276. input_data = inputs.cuda()
  277. class_label = labels.cuda().long()
  278. my_net.zero_grad()
  279. my_net.train()
  280. class_output = my_net(input_data)
  281. err_s_label = loss_class(class_output, class_label)
  282. err = err_s_label
  283. err.backward()
  284. optimizer.step()
  285. print("step: " + str(epoch))
  286. my_net.train(False)
  287. with torch.no_grad():
  288. x_test = torch.DoubleTensor(xtest).cuda()
  289. answer = my_net(x_test)
  290. probs = np.exp(answer.cpu().numpy())
  291. sampleVis = FeatureVis(my_net)
  292. # you can set the sample index here
  293. sampleidx = 1
  294. sampleVis.generate_heatmap(allsignals=x_test,
  295. sampleidx=sampleidx,
  296. subid=i,
  297. samplelabel=y_test[sampleidx],
  298. multichannelsignal=rawxdata[sampleidx],
  299. likelihood=probs[sampleidx])
  300. if __name__ == '__main__':
  301. run()

VisualizationTech.py at commit 1a83f9a, no license · at the source

Overview

Authors: Yun Zhao1, Dongyi He2, Fudai Ren2, Qingling Xia2, Linhao Xu3, Guanghui Xie1, Xiaoling Zhang1, Renqiang Yang1, Shuaidong Zou1, Bin Jiang2
ORCID iDs: Bin Jiang
  1. School of Smart Health, Chongqing Polytechnic University of Electronic Technology, Chongqing, China
  2. School of Artificial Intelligence, Chongqing University of Technology, Chongqing, China
  3. College of Computer Science and Engineering, Chongqing University of Technology, Chongqing, China
Journal: PloS one, volume 21, issue 4, article e0347671
Dates: received 22 December 2025; accepted 6 April 2026; published online 22 April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1371/journal.pone.0347671 · PMID 42018586 · PMCID PMC13102224 · OpenAlex W4412649727
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: EEG (modality), human (organism), methods / tools (subfield)
Methods: Spectral & time-frequency, Preprocessing, Connectivity, Machine learning
MeSH: Brain-Computer Interfaces*, Electroencephalography*, Imagination*, Signal Processing, Computer-Assisted*, Algorithms, Deep Learning, Humans (* major topic)
Journal subjects: Research and Analysis Methods, Bioassays and Physiological Analysis, Electrophysiological Techniques, Brain Electrophysiology, Electroencephalography, Biology and Life Sciences, Physiology, Electrophysiology, Neurophysiology, Neuroscience, Brain Mapping, Medicine and Health Sciences, Clinical Medicine, Clinical Neurophysiology, Imaging Techniques, Neuroimaging, Mathematical and Statistical Techniques, Mathematical Functions, Convolution, Physical Sciences, Mathematics, Probability Theory, Random Variables, Covariance, Geometry, Non-Euclidean geometry, Topology, Manifolds, Computer and Information Sciences, Artificial Intelligence, Machine Learning, Deep Learning, Neural Networks, Engineering and Technology, Signal Processing, Signal Filtering
Topic: EEG and Brain-Computer Interfaces (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: Scientific and Technological Research Program of the Chongqing Education Commission (KJZD-K202303103, KJQN202501104); Natural Science Foundation of Chongqing (CSTB2025NSCQ-GPX0794)
Citations: not cited yet (Europe PMC); 40 references in the paper

Abstract

Motor imagery electroencephalogram (MI-EEG) analysis is essential for natural interaction and autonomous control in brain-computer interfaces (BCIs). However, deep learning models often struggle with inter-subject variability, which limits their ability to generalize across subjects. This study proposes RMETNet, a novel framework that integrates TSLANet, a spatio-temporal convolution module, and a multi-scale Riemannian geometry feature module. TSLANet suppresses noise and captures complex temporal patterns for preliminary signal decoding, while the spatio-temporal convolution module extracts higher-order representations. The Riemannian branch learns geometry-based distribution features across subjects, and the fused features are used for classification. To address inter-subject distribution shifts, RMETNet incorporates Maximum Mean Discrepancy (MMD) loss for domain adaptation, aligning feature distributions between source and target domains. Experiments show that on the four-class BCI Competition IV 2a (BCICIV2a) dataset, RMETNet achieved accuracies of 71.39% in the cross-subject setting and 80.71% in the subject-dependent setting; on the two-class BCI Competition IV 2b (BCICIV2b) dataset, it achieved 80.93% and 86.76%, respectively. The model consistently outperformed baseline algorithms. Ablation and visualization analyses further validated its effectiveness in reducing inter-subject feature distribution disparities and enhancing MI-EEG decoding. The code is available at: https://github.com/rokanfeermecer486/RMETNet.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.

rokanfeermecer486/RMETNet

License: none: the authors keep all their rights
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Commit: 1a83f9a75de39faffeb1890c6b6677db9b7873c2, 29 May 2025
Languages: Python (51)
Size: 58 files, 51 scripts
Software Heritage: not archived
Found in: “Data Availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (45 files), PyTorch (36 files), scikit-learn (19 files), Matplotlib (10 files), SciPy (10 files), MNE-Python (7 files), imbalanced-learn (2 files), pandas (2 files), PyTorch Geometric (2 files), seaborn (2 files), Braindecode (1 file), CuPy (1 file), pyRiemann (1 file), TensorFlow (1 file)
Availability: 1 check, the latest on 29 September 2026: the link answers
  • 29 September 2026: the link answers
51 files

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 51 scripts, each with its path and the digest of its content;
  • 5 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data Availability

The code of this is available at: https://github.com/rokanfeermecer486/RMETNet.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 29 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 10 authors, 7 MeSH terms, 2 funders, 35 references.

Cite

This paper

Zhao, Y., He, D., Ren, F., Xia, Q., Xu, L., Xie, G., Zhang, X., Yang, R., Zou, S., & Jiang, B. (2026). RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features. PloS one, 21(4), e0347671. https://doi.org/10.1371/journal.pone.0347671

BibTeX

@article{zhao2026rmetnet,
author = {Zhao, Yun and He, Dongyi and Ren, Fudai and Xia, Qingling and Xu, Linhao and Xie, Guanghui and Zhang, Xiaoling and Yang, Renqiang and Zou, Shuaidong and Jiang, Bin},
title = {{RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features}},
journal = {PloS one},
year = {2026},
month = apr,
volume = {21},
number = {4},
pages = {e0347671},
publisher = {PLOS},
issn = {1932-6203},
doi = {10.1371/journal.pone.0347671},
url = {https://doi.org/10.1371/journal.pone.0347671},
pmid = {42018586},
pmcid = {PMC13102224}
}

RIS

TY - JOUR
AU - Zhao, Yun
AU - He, Dongyi
AU - Ren, Fudai
AU - Xia, Qingling
AU - Xu, Linhao
AU - Xie, Guanghui
AU - Zhang, Xiaoling
AU - Yang, Renqiang
AU - Zou, Shuaidong
AU - Jiang, Bin
TI - RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features
T2 - PloS one
J2 - PLoS One
PY - 2026
DA - 2026/04/22
VL - 21
IS - 4
SP - e0347671
SN - 1932-6203
PB - PLOS
DO - 10.1371/journal.pone.0347671
UR - https://doi.org/10.1371/journal.pone.0347671
LA - en
ER -

CSL-JSON

{
"id": "10.1371/journal.pone.0347671",
"type": "article-journal",
"title": "RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features",
"container-title": "PloS one",
"author": [
{
"family": "Zhao",
"given": "Yun"
},
{
"family": "He",
"given": "Dongyi"
},
{
"family": "Ren",
"given": "Fudai"
},
{
"family": "Xia",
"given": "Qingling"
},
{
"family": "Xu",
"given": "Linhao"
},
{
"family": "Xie",
"given": "Guanghui"
},
{
"family": "Zhang",
"given": "Xiaoling"
},
{
"family": "Yang",
"given": "Renqiang"
},
{
"family": "Zou",
"given": "Shuaidong"
},
{
"family": "Jiang",
"given": "Bin"
}
],
"container-title-short": "PLoS One",
"volume": "21",
"issue": "4",
"page": "e0347671",
"DOI": "10.1371/journal.pone.0347671",
"PMID": "42018586",
"PMCID": "PMC13102224",
"ISSN": "1932-6203",
"publisher": "PLOS",
"URL": "https://doi.org/10.1371/journal.pone.0347671",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
22
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.3389/fpsyg.2026.1774068 [code]
Analysis of cognitive mechanisms in phoneme perception and pronunciation errors among Korean language learners.
Journal: Frontiers in psychology
In common: Braindecode, pyRiemann, TensorFlow, 8 other tools, EEG, 1 reference
[2] doi:10.3390/bios16080437 [code]
Deep Learning for Ear-EEG-Based Brain-Computer Interface: A Systematic Comparison and Design Insights.
Journal: Biosensors
In common: Braindecode, MNE-Python, PyTorch, 4 other tools, EEG, 5 references
[3] doi:10.1038/s41598-026-68186-2 [code]
NeuroStream: spectral-spatio-temporal deep learning for visual stimulus classification from EEG.
Journal: Scientific reports
In common: Braindecode, PyTorch, seaborn, 5 other tools, methods / tools, EEG, 4 references
[4] doi:10.3390/s26175327 [code]
Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER.
Journal: Sensors (Basel, Switzerland)
In common: pyRiemann, imbalanced-learn, TensorFlow, 7 other tools, EEG
[5] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: imbalanced-learn, CuPy, TensorFlow, 7 other tools
[6] doi:10.1038/s41598-026-52330-z [code]
SHAP analysis of an improved EEG-based mental workload classification framework: utilizing data augmentation and explainable AI.
Journal: Scientific reports
In common: imbalanced-learn, TensorFlow, MNE-Python, 5 other tools, methods / tools, EEG, 1 reference
[7] doi:10.1371/journal.pone.0354976 [code]
Improved motor imagery BCI performance via task-unaware compression in the BELT Bayesian Edge-Cloud architecture.
Journal: PloS one
In common: TensorFlow, MNE-Python, seaborn, 4 other tools, methods / tools, EEG, 2 references
[8] doi:10.3389/fnins.2026.1874302 [code]
Architecture-data matching for EEG-EMG decoding: compact deep models match classical spectral decoders on the WAY-EEG-GAL grasp-and-lift dataset.
Journal: Frontiers in neuroscience
In common: PyTorch, scikit-learn, pandas, 3 other tools, methods / tools, EEG, 4 references
[9] doi:10.7554/elife.110588 [code]
Opening the black box toward a modular approach to spike sorting.
Journal: eLife
In common: imbalanced-learn, TensorFlow, PyTorch, 6 other tools, methods / tools
[10] doi:10.1038/s41592-026-03057-2 [code]
CREsted: modeling genomic and synthetic cell-type-specific enhancers across tissues and species.
Journal: Nature methods
In common: CuPy, TensorFlow, PyTorch, 6 other tools, methods / tools

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.